Nodejs中如何实现互斥锁和自定义的原子性操作
发布于 7 年前 作者 electrmc 6967 次浏览 来自 问答

场景: 开发微信公众号,对于Accesstoken需要两小时请求一次。 假设处理A用户请求任务时要用Accesstoken,此时发现Accesstoken过期了,就需要向腾讯服务器去请求Accesstoken并写入到本地。但,恰好在腾讯服务器未返回或者写入本地未完成的时候,服务器又接收到B用户请求,这时又要操作Accesstoken。 问题: 有什么方式可以保证Accesstoken操作的原子性。而且,当有多个任务要操作Accesstoken时,任务能排队进行,等待前一个任务完成后再进行下一个。其实就是实现一个类似于互斥锁功能。

6 回复

借助于redis的 setnx 应该可以实现,但是这样会强依赖 redis

来自酷炫的 CNodeMD

有比价成熟的分布式共享锁算法Redlock解决这个问题,Redis的作者Antired提出的

我刚接触到Nodejs。有没有原生的解决方案?我看网上上Nodejs号称可以同时处理数万个请求,它的优势在于异步回调处理。这个场景应该是普遍遇到的吧?还是我处理这种场景的思路错了,不应该用锁处理。

或者说,各位遇到这种场景是怎么处理的?

@electrmc redlock 是正解,借助的就是 redis 的 setnx,楼上几位说的都对,我目前很多地方都这么用的,node.js 启动服务基本上都是多进程的,所以不可能仅靠node自身来实现锁机制。

回到顶部