Socket.io, Redis, кластеры и передачи в один сокет с подтверждением - PullRequest
0 голосов
/ 14 марта 2019

Когда работает только один экземпляр, код внизу работает нормально, и если я использую более традиционный

io.sockets.to(clientId).emit('Message', Object);

Это также будет работать со сценарием socket.io / redis / cluster. В этой ситуации мне нужен ответ от клиента, однако я обнаружил, что, скажем, в моем кластере есть два экземпляра, и у меня есть 50% -ная вероятность того, что сообщение действительно достигнет определенного socketId. Опять же, когда я ограничиваю это одним запущенным экземпляром, я не вижу этой проблемы, поэтому она, по-видимому, будет связана с аспектом redis / cluster. Запутался, что мне здесь не хватает.

var io = require('socket.io')(server);
io.set('transports', ['websocket']);
const redisAdapter = require('socket.io-redis');
io.adapter(redisAdapter({ host: SERVER, port: PORT }));

var data = upload.single('data');
app.post('/getData', data, function(req, res) {
  var clientId = req.body.targetId

  io.in(clientId).clients((err, clients) => {
    if (err) {
      res.sendStatus(500)
      console.log(err)
      return
    }
    if (!clients) return
    var object = {
        token: req.body.dataToken,
        patid: req.body.patId
    }
    var client = clients[0]

    console.log(client) //client will console log just fine here as the socketid

    io.sockets.connected[client].emit('FOO', object, response=> {  
      res.send(JSON.stringify({"data": response}))
    })
  })
})

Edit:

После небольшого копания в объекте может показаться, что io.sockets.connected специфичен для экземпляра, что соответствует тому, что я видел. Я предполагаю, что мой вопрос, то есть, есть ли способ с обратным вызовом с помощью socket.io-redis?

...