我有一个应用程序,它监听websocket端点并处理从它接收到的数据并将其保存到数据库中。
当同时调用两个回调时(例如:一个任务可能开始处理,另一个任务可能开始处理和更新数据库,然后第一个任务可能更新数据库--因此最终数据库更新是无序的),就会出现争用条件的问题。
我想到的解决方案是记录调用回调的确切时间,处理数据,然后将时间附加到传递给数据库的数据上,并在数据库中与上次更新时间进行比较,并采取相应的措施。我想到的一个可能的问题是,时间可能会被按顺序记录下来(例如:考虑第一个回调被调用的场景,然后调用第二个回调,然后记录时间,然后记录第一个回调的时间)。
你怎么做才是对的呢?解决这个问题的方法还是其他方法?
编辑:更具体地说,正如我打算使程序尽可能实时,我希望允许毫不拖延地处理最最新的回调(无需等待所有其他以前的回调完全处理),但要确保处理的最终结果(记录在数据库中)符合回调到达的顺序(没有损坏)。
发布于 2018-12-13 15:43:07
您可以将数据处理程序回调返回到完成时的承诺。
每次从套接字获得新数据时,在处理它之前都要等待该承诺,然后存储下一个等待数据的承诺。
看起来是这样的:
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));
});https://stackoverflow.com/questions/53765102
复制相似问题