Может ли одно соединение Redis обслуживать тысячу одновременных пользователей?

#node.js #redis #node-redis

#node.js #redis #узел-redis

Вопрос:

Контекст: Я создаю приложение, к которому одновременно будут обращаться 1000 пользователей, и использую Redis в качестве базы данных. Я использую клиент node-redis. Я читал, что рекомендуется открывать только одно или несколько соединений из каждого экземпляра приложения, потому что открытие соединений обходится дорого.

Вопрос: Предположим, клиент отправляет команду Redis. Эта команда передается в Redis или выполняется (по сути, не завершена), когда приложению требуется отправить другую команду. Ожидает ли клиент завершения первой команды или сразу отправляет вторую команду Redis?

Это важно, потому что, если клиент ожидает, приложение не сможет в полной мере использовать асинхронность, и сетевые вызовы станут большим узким местом, когда команды от тысячи пользователей пытаются получить доступ к Redis. Лучше, чтобы команды уже были поставлены в очередь в Redis, вместо того, чтобы заставлять их ждать завершения предыдущей команды перед передачей по сети.

Спасибо!

Ответ №1:

Это зависит от того, как реализован клиент Redis.

На стороне сервера Redis все команды выполняются сериализуемо. Таким образом, одно соединение не будет проблемой для сервера Redis.

На стороне клиента, если ваш фреймворк использует блокирующее TCP-соединение (например, Jedis), несколько подключений будут «бутылочным горлышком», поскольку ваши команды будут заблокированы на стороне клиента в ожидании незанятых подключений.

Но если клиент использует async / nio (например, Lettuce), одно соединение будет в порядке, поскольку соединения могут быть повторно использованы между потоками.

Кроме того, тысячи одновременных пользователей не будут проблемой для Redis, но вам также следует сосредоточиться на своем веб-сервисе, если вы используете один веб-сервер.

Комментарии:

1. Спасибо, это отвечает на этот вопрос! Да, я масштабирую веб-сервер по горизонтали. Кроме того, серверная часть находится в Node.js таким образом, каждый веб-сервер будет однопоточным. Я полагаю, что это не будет проблемой из-за асинхронности.

Ответ №2:

Вы можете запустить несколько экземпляров своего приложения node, а затем сбалансировать нагрузку с помощью Nginx (при условии, что вы его используете). Клиенту не придется ждать, и нагрузка будет сбалансирована.

Используйте Redis Pub / Sub для создания соединений.

Вот документация для справки.

Обновление: Найдено подробное пошаговое объяснение здесь

Комментарии:

1. Спасибо @arrxo, на самом деле меня не беспокоит балансировка нагрузки, поскольку я буду создавать несколько экземпляров приложения, чтобы уменьшить нагрузку на каждый поток. Меня беспокоит, выполняется ли вторая команда клиентом Redis, в то время как первая еще не завершена. Не могли бы вы, пожалуйста, помочь с этим? Спасибо!