Работа с несколькими сокетами в одном потоке с использованием ZeroMQ. js - PullRequest
0 голосов
/ 04 августа 2020

Я пытаюсь реализовать услугу, используя ZeroMQ и Node.js.
Я использую ZeroMQ. js привязки для него. Руководство ZeroMQ показывает, как обрабатывать несколько сокетов в одном потоке: используя zmq_poller .
Я пытаюсь реализовать что-то подобное в Node.js, но не могу найти подходящего способ как это сделать.
Я пробовал использовать Promise.race () вот так:

while(true) {
  const message = await Promise.race([socket1.receive(), socket2.receive()]);
  // process message, start over again
}

Но это вызывает ошибку при вводе while-l oop во второй раз с момента сокета который был медленнее в первой итерации, уже находится в режиме приема.
Вызов receive() на нем во второй раз приведет к ошибке.
Итак, мой вопрос: есть ли способ mimi c zmq_poller с ZeroMQ. js или есть другой разумный способ обрабатывать несколько сокетов.
Я хочу избежать разветвления, поскольку варианты использования, которые я пытаюсь реализовать, требуют, чтобы я использовал несколько сокетов для одного варианта использования.

1 Ответ

1 голос
/ 10 августа 2020

Если вы просто пытаетесь прочитать два сокета без какой-либо синхронизации, тогда могут помочь два асинхронных цикла, ожидающих данных:

async function sub(){
  const sock = new zmq.Subscriber
  sock.connect('tcp://127.0.0.1:3000')
  sock.subscribe('rabbits')
  for await (const [topic, msg] of sock) {
    console.log('received [%s]', topic, msg)
  }
}

async function pull(){
  const sock = new zmq.Pull
  sock.connect('tcp://127.0.0.1:3001')
  for await (const [msg] of sock) {
    console.log('pulled', msg)
  }
}

pull().catch(e => {console.error(e); process.exit(1)})
sub().catch(e => {console.error(e); process.exit(1)})
console.log('waiting for data')

await на сокете zeromq - это неблокирующая операция, поэтому JS событие l oop продолжается. Не беспокойтесь о реализации потока нижнего уровня.

...