Redis, Node.js и Socket.io Вопросы

Я только что изучал redis и node.js. У меня есть два вопроса, на которые я не смог найти удовлетворительного ответа.

Мой первый вопрос касается повторного использования клиентов Redis в node.js. Я нашел этот вопрос и ответ: Как повторно использовать соединение redis в socket.io?, но меня это не удовлетворило.

Теперь, если я создам клиент redis в событии подключения, он будет создаваться для каждого подключения. Итак, если у меня 20 тысяч одновременных пользователей, будет 20 тысяч клиентов redis.

Если я помещу его вне события подключения, он будет создан только один раз.

Ответ гласит, что он создает по три клиента для каждой функции вне события соединения.

Однако из того, что я знаю MySQL, при написании приложения, которое порождает дочерние процессы и выполняется параллельно, вам необходимо создать клиент MySQL внутри функции, в которой вы создаете дочерние экземпляры. Если вы создадите его вне его, MySQL выдаст ошибку «Сервер MySQL ушел», поскольку дочерние процессы будут пытаться использовать то же соединение. Его нужно создавать для каждого дочернего процесса отдельно.

Итак, даже если вы создадите три разных клиента Redis для каждой функции, если у вас есть 30 тысяч одновременных пользователей, которые одновременно отправляют 2 тысячи сообщений, вы должны столкнуться с той же проблемой, верно? Итак, у каждого «пользователя» должен быть свой собственный клиент 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, и вы будете использовать результат во второй функции, вы должны инкапсулировать его в функцию redis get. В противном случае вторая функция будет работать без получения результата.

Итак, в этом случае, если мне нужно запустить 7 различных функций, а 8. функции потребуется результат всех из них, нужно ли мне записывать их вот так, рекурсивно? Или я что-то упускаю.

Надеюсь, это тоже было ясно.

Большое спасибо,

6
задан Community 23 May 2017 в 12:33
поделиться