如何保证 websocket 回调的处理结果有序?



我有一个应用程序,它侦听websocket端点,处理从中接收的数据并将其保存到数据库

当同时调用两个回调时,就会出现争用条件的问题(例如:一个任务可能开始处理,然后另一个任务可以开始处理并更新数据库,然后第一个任务可能更新数据库,所以最终数据库更新不正常(。

我想到的解决方案记录调用回调的确切时间,处理数据,然后将时间附加到传递到数据库的数据上,并在数据库中将此时间与上次更新时间进行比较,并采取相应行动。我想到的一个可能的问题是时间可能被无序记录(例如:考虑这样的场景:调用第一个回调,然后调用第二个回调并记录时间,然后记录第一个回调的时间(。

你会怎么做才是正确的方式?这个问题的解决方案或其他解决方法?

编辑更具体地说,由于我希望程序尽可能实时,我希望能够毫不延迟地处理最新的回调(无需等待所有其他以前的回调完全处理(,但要确保处理的最终结果(记录在数据库中(符合回调的顺序到达(未损坏(

数据处理程序回调可以返回完成时的承诺。

每次从套接字中获取新数据时,在处理该promise之前,请等待该promise,然后将生成的promise存储为下一个要等待的数据。

看起来是这样的:

const ready = Promise.resolve();
socket.on(..., data => {
ready = ready.then(() => processData(data);
});

这对任何其他代码都没有影响。

编辑:要在锁外完成昂贵的工作,可以编写

socket.on(..., data => {
const result = doExpensiveWork(data); // Returns a promise
ready = Promise.all(result, ready).then(([result]) => insertData(result));
});

最新更新