#node.js #concurrency #redis #socket.io
#node.js #параллелизм #redis #socket.io
Вопрос:
Я использую SocketIO в экземпляре NodeJS с одним подключением к кешу Redis. Этот кэш используется как средство поддержания состояния в среде реального времени.
Мои предпосылки включают в себя то, что проблемы с параллелизмом, вероятно, возникнут из-за большого объема происходящих транзакций, однако я не уверен, какие именно проблемы с параллелизмом мне нужно учитывать…
В моем первоначальном проекте реализованы сценарии Lua и EVAL
(сценарий, вызываемый с EVAL
, считается атомарной транзакцией для Redis), чтобы включить проверки состояния данного ключа, но помимо этого я не уверен, нужно ли мне реализовывать блокировки где-либо еще.
Основная проблема, с которой я сталкиваюсь, заключается в том, что когда SocketIO перехватывает соединение и впоследствии событие для выполнения, что я могу гарантировать в отношении Redis EVAL
, который происходит в этом событии. Конкретный вариант использования:
1) Клиент A отправляет событие, которое перехватывается сервером
2) Сервер выполняет запрошенное событие, которое включает вызов EVAL
скрипта Lua на Redis
3) Клиент B отправляет событие, которое перехватывается сервером
4) Сервер выполняет запрошенное событие, которое включает вызов EVAL
другого сценария Lua на Redis
Из-за асинхронной природы NodeJS могу ли я предположить, что EVAL
от клиента A всегда будет приниматься сервером Redis перед клиентом B? Я совершенно неправильно понимаю цикл событий?
Ответ №1:
Ответ полностью зависит от вашего кода. В принципе, да, для событий такого типа nodejs будет обрабатывать их в порядке их появления в очереди цикла событий.
Однако вы говорите, что обработка запроса включает вызов EVAL
, это означает, что если ваша обработка включает в себя другой ввод-вывод (например, запрос к постоянной базе данных), порядок шагов при обработке запроса от клиента A может чередоваться с шагами при обработке запросов от клиента B.
В общем, вы должны стараться избегать создания логики, которая нарушает параллелизм, если это возможно. Если что-то нужно сделать в том же порядке, рассмотрите возможность создания очередей обработки (глобальная очередь, в которой следующий элемент может быть обработан только после завершения предыдущего) или локализуйте критические части в атомарных последовательностях (например, сценарий LUA).