我有一个简单的api,用户可以发送一些数据。数据是JSON对象数组。我的目标是知道api当前正在处理多少个对象。我创建了一个全局计数器,对于我收到的每个请求,我将对象的数量添加到该计数器中,当我处理完对象时,我从计数器中减去该数量。我的问题是,这种方法是线程安全的吗?这意味着,我可以有两个请求吗?一个请求刚刚完成处理,因此会发生扣减,另一个新请求是我将请求数添加到计数器中,类似于竞争条件。
发布于 2019-01-31 23:09:14
如果您在一台服务器上运行一个应用程序,您应该不会注意到这一点。例如:
const counter = 0
router.get("/", (req, res) => {
counter++
res.send({counter: counter})
})
即使在并发请求期间,计数器也会按预期对请求进行计数,因为Node是单线程的,Event Loop会关心它。但是,如果您有多个服务器,该方法将无法工作,因为全局变量存储在每个服务器的RAM中。在这种情况下,您应该有一些联合数据库,如Redis (它是一个键值数据库,它将数据存储在内存中,因此速度非常快)来存储您的计数器。
https://stackoverflow.com/questions/54461059
复制相似问题