Какие предположения я могу сделать при использовании Redis с одним подключением с сервера NodeJS

#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).