IIS? Apache? Node.js? Или может быть Go?

27.09.24

Интеграция - WEB-интеграция

Маленький эксперимент об альтернативном подходе к обработке HTTP запросов в 1С с помощью прослойки на Go.

Скачать файл

ВНИМАНИЕ: Файлы из Базы знаний - это исходный код разработки. Это примеры решения задач, шаблоны, заготовки, "строительные материалы" для учетной системы. Файлы ориентированы на специалистов 1С, которые могут разобраться в коде и оптимизировать программу для запуска в базе данных. Гарантии работоспособности нет. Возврата нет. Технической поддержки нет.

Наименование По подписке [?] Купить один файл
exp.zip
.zip 49,21Kb
0
0 Скачать (1 SM) Купить за 1 850 руб.

Предисловие

Статья вдохновлена публикацией IIS? Apache? А может быть, Node.js?. Рекомендую сначала прочитать её, а потом уже мой "отчет об эксперименте".

 

Проблема

Наткнувшись недавно на статью IIS? Apache? А может быть, Node.js? я узнал о новом способе обработки HTTP запросов, о котором я даже никогда не задумывался. Суть была в том, что бы использовать в качестве обработчика HTTP запросов не 1С, а Node JS, в коде которого создается COM соединение с 1С которое выполняет в себе обработку запроса. Идея прекрасна, так как в таком раскладе можно использовать NGINX, который гораздо лучше ведет себя в нагрузках, да и в целом он более современный и является де-факто в современном мире WEB. 

В комментариях основной претензией к такому способу стало использование COM объекта, так как этот механизм стар и уже изжил своё (с чем я не могу не согласится). И я задумался о том, как еще можно обрабатывать HTTP запросы в 1С не используя HTTP сервисы.

 

Идея

Мне пришла в голову идея: что если создать сервис, который будет принимать на себя HTTP запросы и иметь HTTP интерфейс для обработки этих запросов.

Алгоритм следующий:

  1. Запрос, например /test попадает в Сервис обработки запросов (далее СОЗ) и ждёт, когда его смогут обработать.
  2. В 1С запущен фоновый обработчик (или обработчики, что бы увеличить количество потоков обработки), который в бесконечном цикле делает long-polling запрос к СОЗ (например /request) и ждёт от него запрос для обработки.
  3. 1С получает в ответ на /request запрос для обработки с какими то данными, что-то с ними делает и снова отправляет HTTP запрос в СОЗ (например /response) с результатом обработки.
  4. СОЗ получает результат обработки и отвечает клиенту.

 

Реализация

Для написания простейшего СОЗ я выбрал Go так как он, по моему мнению, лучше всего подходит для этих целей. Он "простой", быстрый, надежный и многие позиционируют его как язык для написания микросервисов, коим наш СОЗ и является.

Сервис написан в стиле "простыня" или "на коленке" и не является "production ready" решением. Если хотите использовать его для себя, то необходимо внести доработки: сделать хоть какую то модульность, предусмотреть обработку ошибок, логирование и т.д.

 
 Код СОЗ

 

На стороне 1С реализация тоже максимально простая:

 
 Код 1С

API.Тест(...) делает довольно простую работу: немного математики, преобразование в JSON, один запрос константы. Но в нагрузке способен заставить поработать процессор, что нам и нужно. При N = 1000 на моей машине этот код выполняется ~10мс.

 

Тесты

Для тестирования я использовал свой рабочий компьютер

 
 Параметры системы

Для нагрузки на API использовался k6. Настройка простая: тестируется один путь, 50 виртуальных пользователей в течении 5-ти минут.

import http from 'k6/http';
import { randomString } from 'https://jslib.k6.io/k6-utils/1.2.0/index.js';

export const options = {
    duration: "5m",
    vus: 50,
};

export default function () {
    const body = randomString(1, 30)
    http.post('http://localhost:8090/test', body);
}

Для тестирования классического HTTP сервиса конфигурация такая же, только другой путь к конечной точке.

Классический HTTP сервис:

Обработка через СОЗ (10 потоков обработчиков запросов):

 

Выводы

Результаты тестирования показали, что обработка запросов через СОЗ дало ~20% прироста производительности в рамках req/s (запросы в секунду). Так же можно увидеть  значительное улучшение результатов во времени обработки запроса.

Так же во время тестирования я наблюдал за нагрузкой на систему и в связке СОЗ + 1С можно заметить больший процент утилизации процессора rphost'ом ~89-93% против ~71-75%, что скорее всего и дало положительные результаты по производительности.

Еще из положительных аспектов: работа через СОЗ дает контролируемое количество сеансов 1С.

Из минусов: повышенная сложность алгоритма обработки запроса и баги, которые пока еще не выявлены.

 

Для кого подошло бы такое решение?

Наверное только для тех, у кого есть большие нагрузки на HTTP сервис, который дает просадки по производительности, случайные длинные ответы и другие артефакты HTTP сервисов от 1С.

 

P.S.

В архиве, приложенном к статье, лежит файл GO, файлы k6 и dt базы в которой я делал тестирование.

 

UPD

Проект СОЗ на Github

web http-сервисы http go

См. также

WEB-интеграция Платформа 1С v8.3 1С:ERP Управление предприятием 2 1С:Управление торговлей 11 1С:Комплексная автоматизация 2.х 1С:Управление нашей фирмой 3.0 1С:Розница 3.0 Россия Платные (руб)

Функциональное решение для торговли на всех популярных маркетплейсах. Работает со схемами FBO и FBS. Простое в использовании и установке, не вносит изменения в код программы. Существенно упрощает работу с товарным ассортиментом, обработку заказов с площадок, работу с поставками, а также ведение аналитики по продажам и остаткам.

72000 руб.

19.07.2024    1429    52    0    

3

WEB-интеграция Программист Платформа 1С v8.3 Бухгалтерский учет 1С:Бухгалтерия 3.0 Бытовые услуги, сервис Платные (руб)

Внешняя обработка разрабатывалась для загрузки документов из Ветменеджер в 1С: Бухгалтерия 3.0

12000 руб.

02.02.2021    17782    49    50    

29

WEB-интеграция 8.3.8 Конфигурации 1cv8 Автомобили, автосервисы Беларусь Украина Россия Казахстан Управленческий учет Платные (руб)

Расширение предназначено для конфигурации "1С:Предприятие 8. Управление Автотранспортом. ПРОФ". Функционал модуля: 1. Заполнение регистров сведений по подсистеме "Мониторинг", а именно: события по мониторингу, координаты по мониторингу, пробег и расход по мониторингу, текущее местоположение ТС по мониторингу 2. Заполнение путевого листа: пробег по мониторингу, время выезда/заезда, табличная часть ГСМ, места стоянок по геозонам. 3. Отчеты по данным загруженным в регистры сведений. 4. Предусмотрена автоматическая загрузка данных в фоновом режиме (условия работы данной загрузке читайте в описании товара) Модуль работает без включенной константы по настройкам мониторинга. Модуль формы предоставляется с открытым кодом, общий модуль защищен. Любой заинтересованный пользователь, имеет возможность скачать демо-версию расширения.

22656 руб.

25.05.2021    14165    41    8    

16

Обмен с ГосИС Мастера заполнения WEB-интеграция Бухгалтер Пользователь Платформа 1С v8.3 Бухгалтерский учет Оперативный учет Управляемые формы 1С:Управление производственным предприятием 1С:ERP Управление предприятием 2 1С:Бухгалтерия 3.0 1С:Управление торговлей 11 1С:Комплексная автоматизация 2.х Россия Платные (руб)

Универсальное расширение конфигурации для автоматической загрузки и заполнения реквизитов контрагентов (партнеров) из ОГРН для 1С:ERP Управление предприятием 2 (1С:ERP Управление предприятием 2, редакция 2.4), 1С:ERP Управление предприятием 2 (1С:ERP Управление предприятием 2, редакция 2.2), 1С:Управление торговлей 8 (Управление торговлей, редакция 11.5), 1С:Управление торговлей 8 (Управление торговлей, редакция 11.4), 1С:Управление торговлей 8 (Управление торговлей, редакция 11.3), 1С:Управление торговлей 8 (Управление торговлей, редакция 11.2), 1С:Комплексная автоматизация 8 (1С:Комплексная автоматизация, редакция 2.4), 1С:Комплексная автоматизация 8 (1С:Комплексная автоматизация, редакция 2.2), 1С:Комплексная автоматизация 8 (1С:Комплексная автоматизация, редакция 2.0) и 1С:Бухгалтерия 8 (Бухгалтерия предприятия, редакция 3.0).

3900 руб.

08.11.2017    63116    404    295    

72

ККМ WEB-интеграция Программист Пользователь Платформа 1С v8.3 Конфигурации 1cv8 Платные (руб)

Универсальный драйвер для фискализации чеков для сервиса Бизнес.РУ. Чеки (https://online-check.business.ru/). Работает с любой кассой, подключенной к сервису, в том числе и без физической кассы (Аренда облачной ККТ в датацентре). Принцип работы аналогичен наличию физической кассы, подключенной к рабочему месту 1С. Фискализация выполняется с любого рабочего места через интернет. Нет ограничений на количество рабочих мест, касс, компьютеров. Поддерживает печать с нескольких рабочих мест на одну кассу. Работает в любой операционной системе (Windows, Linux) и в любом клиенте (Тонкий, Толстый, Web, Мобильный клиент).

6000 руб.

03.06.2021    13864    12    0    

8
Комментарии
Подписаться на ответы Инфостарт бот Сортировка: Древо развёрнутое
Свернуть все
1. efin 28.09.24 12:12 Сейчас в теме
еще идея, на стороне СОЗ организовать очередь, какую-то обработку (дедупликацию, модификацию) и запросы делать из СОЗ в 1С. Т.о. модификация 1С вообще не понадобится. А еще мы получаем преимущество рулить в СОЗ потоком (нагрузкой) на сервис 1С, управляя количеством запросов в единицу времени.

P.S. где-то в 2000-х, в 1С 8.1.5 я писал такую прокладку для web-сервиса, на php, так как 1С упорно не хотела кушать soap, который ей присылала внешняя система, наприсанная на java. Прокладка очищала запрос от лишних данных и передавала его в 1С.
2. andreysidor4uk 220 28.09.24 13:16 Сейчас в теме
(1) Если делать запросы из СОЗ в 1С, то получается, что мы пришли к тому, от чего ушли используя СОЗ =) Только если делать не HTTP запросы, а каким то другим способом коннектиться к 1С, но у нас вариантов кроме как COM нет, а от него мы тоже хотим уйти.
3. stopa85 39 29.09.24 12:59 Сейчас в теме
Производительность - это хорошо. Но есть еще больший и важный потенциал для вашего решения - безопасность.

У меня подобный сервис проверяет заголовок x-auth. В заголовке токен. Если с ним что-то не так - до 1С-ки запрос даже не дойдет.
4. andreysidor4uk 220 29.09.24 15:52 Сейчас в теме
(3) Согласен. В целом можно придумать много потенциальных применений, существует много веб технологий которые не поддерживаются в 1С нативно, а в других языках реализовано через 2 строки кода.
5. Lars Ulrich 625 29.09.24 16:52 Сейчас в теме
Верно понял, что тест целиком на локальной машине был? Было бы интересно увидеть разницу на полноценном контуре, с выделенным web-сервером. Пока есть предположение, что сетевое взаимодействие нивелирует или снизит разницу между классическим http-сервисом и СОЗ.
6. andreysidor4uk 220 29.09.24 19:59 Сейчас в теме
(5) Да, тест целиком был на локальной машине. К сожалению нет времени делать подобные тесты, но я уверен, что если с сетью все в порядке, то разницы особо не будет. Опять же сетевое взаимодействие увеличит длительность обработки на 2 * пинг до 1С, что в хорошей сети примерно 1-2 мс. А длительность обработки запроса 1С в реальности будет куда больше!
9. stopa85 39 30.09.24 11:42 Сейчас в теме
(6) быть уверенным и проверить - разные вещи. Есть много мест, где можно чего-то упустить.
10. andreysidor4uk 220 30.09.24 11:48 Сейчас в теме
(9) Ну выше писалось про сетевое взаимодействие, по нему, исходя из моего опыта, я могут быть уверен, что ничего особо не изменится. По поводу других мест - да, согласен, можно много чего упустить, но я об этом написал в публикации
Сервис написан в стиле "простыня" или "на коленке" и не является "production ready" решением.

Это просто эксперимент о котором я хотел рассказать.
11. stopa85 39 30.09.24 11:54 Сейчас в теме
(10) я бы всеравно проверил, при возможности.
7. sikuda 677 30.09.24 08:48 Сейчас в теме
Новое, современное, не 1С я поддерживаю. И как ответ на то что сама 1С скорость своего движка не увеличивает, а обвес (отладка) становиться сложнее и в результате скорость и так падает.
Но если Вам нужна именно реакция программы 1С, то я думаю надо настроить пул в 1С (число переиспользуемых сеансов):
Число попыток,
Время ожидания
Время жизни соединения
И другие параметры
triviumfan; andreysidor4uk; +2 Ответить
8. starik-2005 3081 30.09.24 10:51 Сейчас в теме
Имха, львиную долю того, зачем внешние сервисы дергают 1С, можно вынести из 1С. Те же изменения статусов, задолженности, да даже остатков. Ну поменялось что в 1С - ну выгрузи в файло (миллисекундная операция), а сервис на том же Го прочитает эту инфу и будет предоставлоять внешним нуждающимся за те же миллисекунды. Ну или через редис можно связать 1С и внешний сервис на том же Го. Меняется что в 1С из нужного внешним кому - 1С пишет в редис, а Го берет из редиса и отправляет всем, кто нуждается.
Оставьте 1Су учетные и отчетные задачи. Зачем в него все тащить без разбору?
Bassgood; +1 Ответить
13. andreysidor4uk 220 30.09.24 13:22 Сейчас в теме
(8) Не могу не согласится, но когда в организации есть команда(ы) 1С разработчиков и разработчиков на других языках нет - всё начинает писаться только на 1С. Тут как говорится: когда в руках молоток, всё превращается в гвозди. По этому и пытаемся решить проблемы, которых, по идее, вообще на должно было случится.
Bassgood; +1 Ответить
12. Rusmus 45 30.09.24 12:56 Сейчас в теме
Напишет ли кто статью "IIS? Apache? Node.js? Go? Или может быть Winow?" ...
14. starik-2005 3081 30.09.24 15:08 Сейчас в теме
(12)
Напишет ли кто статью
Можно и без прокладок: https://infostart.ru/1c/articles/1543746/
15. morozov88 30.09.24 23:12 Сейчас в теме
А теперь представим, что до того как 1С заберет запрос отключиться питание. Все пропадет. Значит нужна db + разнесенная, вдруг что-то перезагрузится/упадет. И приходим к старому доброму брокеру сообщений..
16. andreysidor4uk 220 01.10.24 07:29 Сейчас в теме
(15) Ну если кто-то упадет, то запрос клиента просто упадёт с таймаутом! Эти риски есть в любом способе взаимодействия!
17. yermak 51 01.10.24 07:45 Сейчас в теме
так можно договориться и до прямых запросов к БД 1с из СОЗ
18. andreysidor4uk 220 01.10.24 08:00 Сейчас в теме
(17) Можно!) Но зачастую логика обработки запроса сложная, что делает задачу ее переноса совсем не тривиальной! А если обработчиков с десяток и более, то вообще вешалка!)
19. evvakra 309 01.10.24 18:40 Сейчас в теме
Как насчет таймаута http-запроса? Иначе сеанс фонового задания выполняющий лонг пуллинг запоос не завершишь, пока не придет внешний запрос от «прослойки» для обработки, верно?
20. andreysidor4uk 220 01.10.24 21:22 Сейчас в теме
(19) Да, там есть таймаут, 60 секунд в моем случае.
Мы делаем длительный запрос, если в течении 60 секунд в СОЗ не пришло запросов для обработки, то в 1С HTTP запрос упадет в исключение по таймауту, мы его проигнорируем, перейдем на следующую итерацию цикла и снова сделаем запрос и так бесконечно! Завершать сеанс можно как раз в промежутке между запросами.
21. rabid_otter 134 03.10.24 19:32 Сейчас в теме
хз легче сразу на go сделать, а потом избавиться от 1С )))) 1С тут как лишнее колесо, имхо.
а так да, похоже на очередь, имхо тут брокер сообщений надо, в который как раз пишет go.
если это асинхронщина какая-то.
kamisov; andreysidor4uk; +2 Ответить
22. dreamadv 156 05.10.24 01:56 Сейчас в теме
С приходом найтивного websocket в 8.3.27 можно будет убрать long polling и будет еще лучше.
Самое печальное почему сделали только клиент. Хотелось бы и сервер :) чтобы прям напрямую в rphost подключаться без apache и iis.
andreysidor4uk; +1 Ответить
23. andreysidor4uk 220 05.10.24 11:57 Сейчас в теме
(22) Да, про websocket'ы слышал, это уже хоть что-то! 1С мало развивает (возможно совсем нет) серверную часть web и http сервисов и всего что с ними связано, видимо есть задачи поважнее, но тут уж им виднее!
Оставьте свое сообщение