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С:Управление торговлей 10 1С:Управление производственным предприятием 1С:Управление нашей фирмой 1.6 1С:Управление торговлей 11 1С:Комплексная автоматизация 2.х 1С:Управление нашей фирмой 3.0 Платные (руб)

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

57600 руб.

26.11.2024    1231    1    1    

4

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

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

36000 руб.

03.08.2020    18352    20    22    

18

Сайты и интернет-магазины Интеграция WEB-интеграция Платформа 1С v8.3 Конфигурации 1cv8 Управленческий учет Платные (руб)

Интеграция 1С и Битрикс 24. Разработка имеет двухстороннюю синхронизацию 1С и Bitrix24 задачами. Решение позволяет создавать пользователя в 1С из Битрикс24 и наоборот. Данная разработка технически подходит под все основные конфигурации линейки продуктов 1С:Предприятие 8.3 (платформа начиная с 8.3.23): 1С:Управление торговлей, 1С:Управление Нашей фирмой 3, 1С:Комплексная автоматизация 2, Объединенное решение: Модуль 1С:CRM 3 (3.0.21.3) +1С:ERP Управление предприятием 2. При приобретении предоставляется 1 месяц бесплатных обновлений разработки. Доступна демо-версия продукта с подключением Вашего Битрикс24

7200 руб.

04.05.2021    20560    13    19    

18

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    318    2    0    

5

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

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

24000 руб.

27.09.2024    2463    1    0    

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

У меня подобный сервис проверяет заголовок x-auth. В заголовке токен. Если с ним что-то не так - до 1С-ки запрос даже не дойдет.
4. andreysidor4uk 223 29.09.24 15:52 Сейчас в теме
(3) Согласен. В целом можно придумать много потенциальных применений, существует много веб технологий которые не поддерживаются в 1С нативно, а в других языках реализовано через 2 строки кода.
5. Lars Ulrich 625 29.09.24 16:52 Сейчас в теме
Верно понял, что тест целиком на локальной машине был? Было бы интересно увидеть разницу на полноценном контуре, с выделенным web-сервером. Пока есть предположение, что сетевое взаимодействие нивелирует или снизит разницу между классическим http-сервисом и СОЗ.
6. andreysidor4uk 223 29.09.24 19:59 Сейчас в теме
(5) Да, тест целиком был на локальной машине. К сожалению нет времени делать подобные тесты, но я уверен, что если с сетью все в порядке, то разницы особо не будет. Опять же сетевое взаимодействие увеличит длительность обработки на 2 * пинг до 1С, что в хорошей сети примерно 1-2 мс. А длительность обработки запроса 1С в реальности будет куда больше!
9. stopa85 43 30.09.24 11:42 Сейчас в теме
(6) быть уверенным и проверить - разные вещи. Есть много мест, где можно чего-то упустить.
10. andreysidor4uk 223 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 3096 30.09.24 10:51 Сейчас в теме
Имха, львиную долю того, зачем внешние сервисы дергают 1С, можно вынести из 1С. Те же изменения статусов, задолженности, да даже остатков. Ну поменялось что в 1С - ну выгрузи в файло (миллисекундная операция), а сервис на том же Го прочитает эту инфу и будет предоставлоять внешним нуждающимся за те же миллисекунды. Ну или через редис можно связать 1С и внешний сервис на том же Го. Меняется что в 1С из нужного внешним кому - 1С пишет в редис, а Го берет из редиса и отправляет всем, кто нуждается.
Оставьте 1Су учетные и отчетные задачи. Зачем в него все тащить без разбору?
Bassgood; +1 Ответить
13. andreysidor4uk 223 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 3096 30.09.24 15:08 Сейчас в теме
(12)
Напишет ли кто статью
Можно и без прокладок: https://infostart.ru/1c/articles/1543746/
15. morozov88 30.09.24 23:12 Сейчас в теме
А теперь представим, что до того как 1С заберет запрос отключиться питание. Все пропадет. Значит нужна db + разнесенная, вдруг что-то перезагрузится/упадет. И приходим к старому доброму брокеру сообщений..
16. andreysidor4uk 223 01.10.24 07:29 Сейчас в теме
(15) Ну если кто-то упадет, то запрос клиента просто упадёт с таймаутом! Эти риски есть в любом способе взаимодействия!
17. yermak 51 01.10.24 07:45 Сейчас в теме
так можно договориться и до прямых запросов к БД 1с из СОЗ
18. andreysidor4uk 223 01.10.24 08:00 Сейчас в теме
(17) Можно!) Но зачастую логика обработки запроса сложная, что делает задачу ее переноса совсем не тривиальной! А если обработчиков с десяток и более, то вообще вешалка!)
19. evvakra 311 01.10.24 18:40 Сейчас в теме
Как насчет таймаута http-запроса? Иначе сеанс фонового задания выполняющий лонг пуллинг запоос не завершишь, пока не придет внешний запрос от «прослойки» для обработки, верно?
20. andreysidor4uk 223 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 157 05.10.24 01:56 Сейчас в теме
С приходом найтивного websocket в 8.3.27 можно будет убрать long polling и будет еще лучше.
Самое печальное почему сделали только клиент. Хотелось бы и сервер :) чтобы прям напрямую в rphost подключаться без apache и iis.
andreysidor4uk; +1 Ответить
23. andreysidor4uk 223 05.10.24 11:57 Сейчас в теме
(22) Да, про websocket'ы слышал, это уже хоть что-то! 1С мало развивает (возможно совсем нет) серверную часть web и http сервисов и всего что с ними связано, видимо есть задачи поважнее, но тут уж им виднее!
Оставьте свое сообщение