Я только что изучил redis и node.js У меня есть два вопроса, на которые я не смог найти удовлетворительного ответа.
Мой первый вопрос касается повторного использования клиентов Redis в файле node.js. Я нашел этот вопрос и ответ: Как повторно использовать соединение redis в socket.io?, но это меня не удовлетворило достаточно.
Теперь, если я создам клиента redis в событии подключения, он будет порождаться для каждого подключения. Таким образом, если у меня 20k одновременных пользователей, будет 20k redis-клиентов.
Если я поставлю его вне события подключения, оно будет порождено только один раз.
В ответе говорится, что он создает три клиента для каждой функции вне события подключения.
Однако из того, что я знаю MySQL, при написании приложения, которое порождает дочерние процессы и работает параллельно, вам необходимо создать клиент MySQL в функции, в которой вы создаете дочерние экземпляры. Если вы создадите его вне его, MySQL выдаст ошибку «Сервер MySQL ушел», поскольку дочерние процессы будут пытаться использовать то же соединение. Он должен быть создан для каждого дочернего процесса отдельно.
Итак, даже если вы создадите три разных клиента redis для каждой функции, если у вас есть 30k одновременно работающих пользователей, которые одновременно отправляют 2k сообщения, вы должны столкнуться с той же проблемой, верно? Таким образом, каждый «пользователь» должен иметь свой собственный клиент Redis в событии подключения. Я прав? Если нет, то как node.js или redis обрабатывают параллельные запросы, в отличие от MySQL? Если он имеет собственный механизм и создает что-то вроде дочерних процессов в клиенте Redis, зачем нам тогда создавать три разных клиента Redis? Одного должно быть достаточно.
Надеюсь, вопрос был ясен.
- ОБНОВЛЕНИЕ -
Я нашел ответ на следующий вопрос. http://howtonode.org/control-flow
Не нужно отвечать, но мой первый вопрос остается в силе.
- ОБНОВЛЕНИЕ -
Мой второй вопрос такой. Я также не очень хорош в JS и Node.js. Итак, насколько я знаю, если вам нужно ждать события, вам нужно инкапсулировать вторую функцию в первой. (Я еще не знаю терминологию). Позвольте мне привести пример;
socket.on('startGame', function() {
getUser();
socket.get('game', function (gameErr, gameId) {
socket.get('channel', function (channelErr, channel) {
console.log(user);
client.get('games:' + channel + '::' + gameId + ':owner', function (err, owner) { //games:channel.32:game.14
if(owner === user.uid) {
//do something
}
});
}
});
});
Так что, если я учусь правильно, мне нужно запустить каждую функцию внутри функции, если мне нужно дождаться ответа ввода / вывода. В противном случае неблокирующий механизм node.js позволит запустить первую функцию, в этом случае он получит результат параллельно, но вторая функция может не иметь результата, если для ее получения потребуется время. Итак, если вы получаете результат от Redis, например, и будете использовать результат во второй функции, вы должны инкапсулировать его в функцию get Redis. В противном случае вторая функция будет запущена без получения результата.
Итак, в этом случае, если мне нужно запустить 7 различных функций, а функция 8. будет нуждаться в результате их всех, мне нужно написать их рекурсивно так? Или я что-то упустил.
Надеюсь, это тоже понятно.
Большое спасибо,