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С:ITIL(ИТИЛ), 1С:ITILIUM, Управление IT-отделом 8 через интернет с любого устройства посредством браузера, увеличивая эффективность работы пользователей и снижая нагрузку на сервер. Быстрая инсталляция портала за пару часов, удобный и интуитивно понятный интерфейс и безопасность данных помогут упростить работу с порталом и ускорить выполнение бизнес-процессов компании.

128000 руб.

19.12.2023    2917    5    0    

11

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

Модуль "Подсистема интеграции AmoCRM с 1С" позволяет обеспечить единое информационное пространство, в котором пользователи могут эффективно управлять клиентской базой, следить за статусами сделок и поддерживать актуальность данных как в AmoCRM, так и в 1С.

60000 руб.

07.05.2019    34993    69    45    

27

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

Онлайн-заказ - это решение для автоматизации процесса оформления заказов на сайте в торговых организациях. Продукт обеспечивает легкое взаимодействие между компанией и клиентами через веб-интерфейс, интегрированный с 1С:Предприятие. Система позволяет снизить операционные расходы, повысить лояльность клиентов и оптимизировать работу отдела продаж.

57600 руб.

26.11.2024    2658    2    3    

5

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

Модуль "Экспортер" — это расширение для 1С, предназначенное для автоматизации процессов выгрузки данных. Оно позволяет эффективно извлекать, преобразовывать и передавать данные из систем 1С в интеграционную платформу Spot2D. Подсистема упрощает настройку, снижает количество ручных операций и обеспечивает удобный контроль данных.

14400 руб.

20.12.2024    1008    6    2    

8

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

Расширение значительно упрощает написание API на 1С. Веб программисты получают простой и понятный доступ к 1С. Описание API создаётся автоматически и представляется в виде удобном как для человека, так и для программной обработки.

24000 руб.

27.09.2024    4541    4    2    

5

Сайты и интернет-магазины WEB-интеграция Системный администратор Программист Пользователь Платформа 1С v8.3 1C:Бухгалтерия 1С:Управление торговлей 11 Автомобили, автосервисы Россия Управленческий учет Платные (руб)

Интеграционный модуль обмена между конфигурацией Альфа Авто 5 и Альфа Авто 6 и порталом AUTOCRM. Данный модуль универсален. Позволяет работать с несколькими обменами AUTOCRM разных брендов в одной информационной базе в ручном и автоматическом режиме.

36000 руб.

03.08.2020    19240    23    22    

20

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

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

12000 руб.

02.02.2021    19003    54    50    

31

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

Обработка является альтернативой механизму, разработанному фирмой 1С и заполняющему реквизиты контрагента по ИНН или наименованию. Не требуется действующей подписки ИТС. Вызывается как внешняя дополнительная обработка, т.е. используется, непосредственно, из карточки контрагента. Заполнение по ИНН или наименованию реквизитов контрагента по данным сайта ФНС (egrul.nalog.ru) для БП 2.0, БП 3.0, БГУ 1.0, БГУ 2.0, УТ 10.3, УТ 11.x, КА 1.1, КА 2.x, УПП 1.x, ERP 2.x, УНФ 1.5, УНФ 1.6, УНФ 3.0, ДО 2.1

2400 руб.

28.04.2016    93402    195    217    

344
Комментарии
Подписаться на ответы Инфостарт бот Сортировка: Древо развёрнутое
Свернуть все
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 226 28.09.24 13:16 Сейчас в теме
(1) Если делать запросы из СОЗ в 1С, то получается, что мы пришли к тому, от чего ушли используя СОЗ =) Только если делать не HTTP запросы, а каким то другим способом коннектиться к 1С, но у нас вариантов кроме как COM нет, а от него мы тоже хотим уйти.
3. stopa85 43 29.09.24 12:59 Сейчас в теме
Производительность - это хорошо. Но есть еще больший и важный потенциал для вашего решения - безопасность.

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

Это просто эксперимент о котором я хотел рассказать.
11. stopa85 43 30.09.24 11:54 Сейчас в теме
(10) я бы всеравно проверил, при возможности.
7. sikuda 678 30.09.24 08:48 Сейчас в теме
Новое, современное, не 1С я поддерживаю. И как ответ на то что сама 1С скорость своего движка не увеличивает, а обвес (отладка) становиться сложнее и в результате скорость и так падает.
Но если Вам нужна именно реакция программы 1С, то я думаю надо настроить пул в 1С (число переиспользуемых сеансов):
Число попыток,
Время ожидания
Время жизни соединения
И другие параметры
triviumfan; andreysidor4uk; +2 Ответить
8. starik-2005 3168 30.09.24 10:51 Сейчас в теме
Имха, львиную долю того, зачем внешние сервисы дергают 1С, можно вынести из 1С. Те же изменения статусов, задолженности, да даже остатков. Ну поменялось что в 1С - ну выгрузи в файло (миллисекундная операция), а сервис на том же Го прочитает эту инфу и будет предоставлоять внешним нуждающимся за те же миллисекунды. Ну или через редис можно связать 1С и внешний сервис на том же Го. Меняется что в 1С из нужного внешним кому - 1С пишет в редис, а Го берет из редиса и отправляет всем, кто нуждается.
Оставьте 1Су учетные и отчетные задачи. Зачем в него все тащить без разбору?
Bassgood; +1 Ответить
13. andreysidor4uk 226 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 3168 30.09.24 15:08 Сейчас в теме
(12)
Напишет ли кто статью
Можно и без прокладок: https://infostart.ru/1c/articles/1543746/
15. morozov88 30.09.24 23:12 Сейчас в теме
А теперь представим, что до того как 1С заберет запрос отключиться питание. Все пропадет. Значит нужна db + разнесенная, вдруг что-то перезагрузится/упадет. И приходим к старому доброму брокеру сообщений..
16. andreysidor4uk 226 01.10.24 07:29 Сейчас в теме
(15) Ну если кто-то упадет, то запрос клиента просто упадёт с таймаутом! Эти риски есть в любом способе взаимодействия!
17. yermak 51 01.10.24 07:45 Сейчас в теме
так можно договориться и до прямых запросов к БД 1с из СОЗ
18. andreysidor4uk 226 01.10.24 08:00 Сейчас в теме
(17) Можно!) Но зачастую логика обработки запроса сложная, что делает задачу ее переноса совсем не тривиальной! А если обработчиков с десяток и более, то вообще вешалка!)
19. evvakra 312 01.10.24 18:40 Сейчас в теме
Как насчет таймаута http-запроса? Иначе сеанс фонового задания выполняющий лонг пуллинг запоос не завершишь, пока не придет внешний запрос от «прослойки» для обработки, верно?
20. andreysidor4uk 226 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 226 05.10.24 11:57 Сейчас в теме
(22) Да, про websocket'ы слышал, это уже хоть что-то! 1С мало развивает (возможно совсем нет) серверную часть web и http сервисов и всего что с ними связано, видимо есть задачи поважнее, но тут уж им виднее!
Оставьте свое сообщение