Websocket - куда денется следующий колбэк, если предыдущий еще не обработался?
У меня есть непонимание работы Websocket
Я использую SDK одной криптобиржи на Python для организации Websocket. Сервер отправляет моему клиенту информацию о случившихся сделках. На каждую сделку срабатывает колбэк, в котором я имею возможность как-то эту информацию обработать (посчитать технические индексы, отправить в базу данных и т.д.). Временная дельта между сделками (а значит и между вызовом колбэка) может быть ничтожной, буквально микросекунды. При этом код, который выполняет колбэк может отрабатывать медленнее, чем придет следующий вызов.
Вопрос - куда денется следующий колбэк? Пропадет? Встанет в какую-то очередь/стэк/буфер и отработает позже? Зависит от реализации или нет?
Ответы (1 шт):
Особая благодарность выражается CrazyElf и Kromster за ценные советы!
Эксперимент
В колбэк-функцию добавляем sleep(10)
, тем самым гарантируя, что часть колбэков "упрется" в занятую функцию. Далее сравниваем текущее время и время события, которое приходит вместе с информацией о сделке.
Ожидаем два варианта:
- Разница во времени будет постоянной - это будет означать, что колбэки, которые "стучались" в занятую функцию пропали, а в функцию поступают только текущие.
- Разница будет нарастать - это будет означать, что колбэки ожидают освобождения функции и поступают в нее по очереди.
В результате получили второй вариант
Фидбэк от разработчиков
На серверной стороне этого Websocket организован кэш. Сервер от клиента получает информацию свободна ли колбэк функция. Если свободна - сервер пушит сообщение, если занята - сообщение отправляется в кэш и ожидает освобождения функции. На мой вопрос - есть ли ограничение у этого кэша ответ был, дословно "It does, but It will send the data eventually normally" (Да, есть, но в конечном итоге он отправит данные в обычном режиме)
Итог
При занятой колбэк-функции колбэки не теряются, а заносятся в кэш и передаются по освобождению функции.