gpt4 book ai didi

node.js - 避免 Node.js Web 应用程序中的竞争条件

转载 作者:太空宇宙 更新时间:2023-11-03 23:40:48 24 4
gpt4 key购买 nike

我想知道如何设计这样的网络服务:

假设我有一个服务器正在监听请求,它会接收一些 key 并检查它是否已缓存(例如使用某些数据库),如果没有,它会进行一些处理,生成答案,将其存储在缓存数据库中并将答案返回给客户端。

这似乎工作正常,但是如果两个客户端请求相同的不存在的 key 会发生什么?在这种情况下,会发生竞争条件,因此看起来像

client 1 -> check cache DB -> generate answer -> store in cache -> reply to client
client 2 -> check cache DB -> generate answer -> store in cache -> reply to client

避免此问题的一种方法是在数据库中使用独特的功能,因此每当生成第二个答案并将其写入数据库时​​,就会发生一些错误。这很好,但看起来更像是一个补丁而不是真正的解决方案。特别地,想象一下生成答案需要大量处理的情况,那么其他的东西会更好。

我能想到的一个选项是使用作业队列,因此每当收到 key 时,该 key 就会附加到现有作业,或者将新作业添加到队列中。

我已经使用 Node.js 几个星期了,令我惊讶的是我还没有找到展示这种用例的示例。所以我想知道对于这样的情况这是否是可接受的解决方案,或者存在更好的解决方案?

最佳答案

以下是在单进程设置中执行此操作的方法:

var Emitter = require('events').EventEmitter;

var requests = Object.create(null);

function getSomething (key, callback) {

var request = requests[key];

if (!request) {
request = requests[key] = new Emitter;

getSomethingActually(key, function (err, result) {
delete requests[key];
if (err) return request.emit('error', err);
request.emit('result', result);
});
}

request.once('result', function (result) {
callback(null, result);
});

request.once('error', function (err) {
callback(err);
});

}

如果你想扩展它,你需要使用一些外部存储+事件总线,比如redis。

关于node.js - 避免 Node.js Web 应用程序中的竞争条件,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/24152434/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com