Websocket асинхронные запросы клиентов к одной async функции сервера как организовать?
пишу систему сбора данных, использую WebSoket на Node.JS.
Клиенты обращаются к серверу, сервер в свою очередь, запрашивает с помощью асинхронной функции данные от "железки" (т.е. надо подождать пока ответит "железка").
Данные запрашиваются клиентом с максимально возможной частотой (около 300 раз в сек), как только сервер ответил, сразу отправляется новый запрос.
Пока клиент один - всё отлично. Когда добавляется второй клиент, то, так как обращаются к одой и той же асинхронной функции, начинаю друг другу мешать, порой на несколько секунд подвешивая связь.
Как правильно спроектировать приложение сервера в такой ситуации? Напрашивается создание очереди доступа к асинхронной функции с ожиданием ответа на запрос к данной функции от конкретного сокета. Наверняка кто-то сталкивался с подобным поведением (например асинхронная функция - запрос с длительным обращением к БД) и как-то побеждал проблему.
Я менял эту функцию на синхронную (выдаёт некий похожий на реальный JSON) - тогда все сервер работает без сбоев.
Cокеты вызывают одну и туже async функцию, передавая ей различные (ведь у каждого сокета свой запрос) параметры. Функция возвращает Promice... но это же не выстраивает автоматически очередь вызовов данной функции с разными параметрами, результат работы которой должен вернуться вызвавшему её сокету?
Вам стоит разделить запрос от клиент к серверу и запрос от сервера к "железке".
Получится так - сервер отдельным процессом поддерживает актуальность данных с "железки" сохраняя, к примеру, сами данные и время их получения.
Клиент делает запрос к серверу и получает от него последние актуальные данные с объекта.
я уже так сделал
структура такая:
1) сервис опрашивающий железки по СОМ-портам (ничего не знает о железках только запрос-ответ, и это долго). В зависимости от интерфейса, к сервису может быть подключено от 1 до N - железок.
2) сервис который постоянно опрашивает сервис №1 держа данные актуальными и в быстром доступе для следующего сервиса. Таких сервисов могут быть десятки в системе.
3) сервис который запрашивает данные от нескольких сервисов №2 (сервис №3 знает всё о железках, и их протоколах, а так же предоставляет данные в виде Параметр=Значние, а не в бинарном виде)
Общение между 1-2-3 производится по WebSoсket, тут всё просто точка-точка, нет сторонних клиентов.
А к сервису №3 тянутся несколько клиентов.
Так вот, когда клиенты тянут данные от сервиса №3 по классическому REAST API, всё ок, но неспешно (ведь есть WebSocket!).
Я для ускорения решил перевести №3 на общение с клиентами на WebSoket и ловлю какие-то баги,
Клиент делает ws.send в сторону №3 и заводит таймер на 3 сек в ожидании таймаута. Получается что все клиенты бодро выгребают данные от №3 со скоростью около 300 сообщений в секунду, так длится секунд 5-6. Потом один из клиентов (рандомно) ловит 2-3 штуки "тайм-аутов" (т.е. №3 не ответил ему в течение 3 сек, хотя казалось бы почему?!), далее запрос-ответ возобновляется с прежней скоростью, потом опять "затык" - в общем такими волнами...