Node JS Socket.IO Emitter (и Redis)

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

Нормальное взаимодействие между разными игроками легко реализовать через socket.io в сочетании с node js.

Что мне трудно понять, так это; У меня есть задание cron, которое выполняется в другом процессе, который каждую минуту получает новую информацию, которую затем необходимо отправить каждому из этих игроков. Так как это другой процесс, я не знаю, как отправить эту информацию определенным клиентам.

У socket.io есть информация для этого, и я цитирую ее ниже:

В некоторых случаях вы можете захотеть отправлять события в сокеты в пространствах имен/комнатах Socket.IO вне контекста ваших процессов Socket.IO. Есть несколько способов решить эту проблему, например, реализовать собственный канал для отправки сообщений в процесс. Чтобы облегчить этот вариант использования, мы создали два модуля: socket.io-redis socket.io-emitter.

Насколько я понимаю, мне нужны эти два модуля, чтобы делать то, что я упоминал ранее. Однако я не понимаю, почему в уравнении есть redis, когда мне просто нужно отправить несколько сообщений.

Используется ли он для временного хранения сообщений?

Любая помощь будет оценена.


person Zain Syed    schedule 14.02.2016    source источник


Ответы (4)


Есть несколько способов добиться этого, если вам просто нужно произвести выброс после внешнего события. Это зависит от того, что вы используете для отправки этих новых данных:

/*    if the other process is an http post incoming you can use for example
 express and use your io object in a custom middleware : */

//pass the io in the req object
app.use( '/incoming', (req, res, next) => {
      req.io = io;
})  

//then you can do : 

app.post('/incoming', (req, res, next) => {
   req.io.emit('incoming', req.body);
   res.send('data received from http post request then send in the socket');
})

//if you fetch data every minute, why don't you just emit after your job : 

var job = sheduledJob('* */1 * * * *', io => {
    axios.get('/myApi/someRessource').then(data => io.emit('newData', data.data));
})

person adnls    schedule 04.04.2018

Что ж, в случае их предоставления socket.io, я читал, что вам действительно нужны оба. Однако это не обязательно должно быть тем, что вы хотите. Но да, redis, вероятно, просто используется для временного хранения данных, где он также делает действительно хорошую работу, приближаясь к тому, что делает очередь сообщений.

Теперь вашему cron не понадобится очередь сообщений или подобное поведение.

Мое предложение, однако, состояло бы в том, чтобы запустить cron с некоторым пакетом узла из вашего процесса в качестве child_process ловушки на его читаемый поток, а затем нажать непосредственно на ваши сокеты.

person eljefedelrodeodeljefe    schedule 14.02.2016
comment
Я планирую использовать кластер для создания нескольких процессов (socket.io), которые, я надеюсь, не вызовут каких-либо нарушений. Я не знаю, является ли разветвление этих процессов лучшей идеей. Я ожидаю не менее 10-50 тысяч одновременных подключений. Поэтому мне нужно несколько процессов через кластер для обработки трафика. - person Zain Syed; 14.02.2016

Если процесс задания cron также является процессом nodejs, вы можете обмениваться данными через механизм клиента redis.io pub-sub.

Дайте мне знать, в чем заключается ваш процесс работы cron, и если потребуется дополнительная помощь в механизме pub-sub.

Redis — это одно из хранилищ памяти, используемых socket.io (на случай, если вы настроите)

person Rajeev Dutta    schedule 16.02.2016

Вы должны использовать redis только в том случае, если у вас есть конфигурация с несколькими серверами (кластер), чтобы установить соединение и синхронизировать комнату/пространство имен между этими экземплярами node.js. В данном случае это не имеет ничего общего с хранением данных, оно работает как pub/sub машина.

person Max Kachanov    schedule 28.04.2017