如何按传入顺序处理 socket.io 个事件

How to process socket.io events in their incoming order

我有以下设置:

async MyFunction(param) {
    //... Do some computation
    await WriteToDB()
}

io.on('connection', (socket) => {
    socket.on('AnEvent', (param) => MyFunction(param))
})

当一个事件到来时,它会调用一个异步函数来进行一些计算,最后通过另一个异步调用将结果写入数据库。

如果MyFunction最后没有异步调用写数据库,比如

MyFunction(param) {
    //... Do some computation
}

那么显然所有事件都将按传入顺序处理。只有在前一个事件处理完成后,才会开始处理下一个事件。但是,由于对数据库的异步调用,我不知道那些传入的事件是否仍会按顺序完全处理。恐怕下一个事件的处理会在前一个 await WriteToDB() 完成之前开始。如何更改代码以按顺序完全处理它们?

你说得对,不能保证传入的事件将按顺序处理。

要实现您的要求,您需要一个“消息队列”,它会定期检查新消息并一条一条地处理它们。

const messageQueue = [];

// SocketIO adding Message to MessageQueue
const eventHandler = (message) => {
  messageQueue.push(message);
}

const messageHandler = () => {
  if (messageQueue.length === 0) {
    return;
  }

  const message = messageQueue.shift();

  // Handle Message

  // If successful, ask for next message
  return messageHandler();
}

当然,我的示例非常幼稚,但我希望它能让您大致了解您的要求是如何完成的。

如果您发现自己需要更强大的消息队列,请查看 RabbitMQ、BullMQ、Kafka