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

时间:2018-12-13 15:26:38

标签: javascript multithreading asynchronous websocket

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

竞争条件问题会在同时调用两个回调时发生(例如:一个任务可能开始处理,然后另一个任务可能开始处理并更新数据库,然后第一个任务可能会更新竞争)数据库-最终导致数据库更新不正常。

解决方案,我想到的是记录调用回调的确切时间,处理数据,然后将时间附加到传递给数据库的数据中数据库将此时间与上次更新时间进行比较并采取相应措施。 一个可能的问题,我想到的是时间记录可能是乱序的(例如:考虑以下情况:调用第一个回调,然后调用第二个回调并记录时间,然后时间已记录到第一次回调中。)

您将如何正确执行操作?解决此问题的方法或其他解决方案?

编辑要更加具体,因为我希望程序尽可能实时,所以我希望允许最新的回调可以毫不延迟地进行处理(无需等待所有其他先前的回调完全处理),但要确保处理的最终结果(如数据库中记录的那样)符合回调到达的顺序(未损坏)< / em>

1 个答案:

答案 0 :(得分:0)

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

每次从套接字获取新数据时,在处理该诺言之前都要等待该诺言,然后存储所产生的诺言以便下一个数据等待。

它看起来像这样:

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));
});