如何按传入顺序处理 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
我有以下设置:
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