egg多进程实现锁的最佳实践是什么?
现在egg多个进程间对资源的争抢是怎么设计这个锁的呢?目前我们自己都是使用redis.incr来争抢某个key,值为1的进程就可以操作该资源,其他进程放弃操作或者循环等待。 看到有博客提到Atomics这个模块,不知道egg中是否可以使用这个实现锁?
5 回复
模块解决不了集群锁问题
@atian25 刚才自己试验了一下,很不规范。 修改了一下egg-redis插件
// /egg-redis/lib/redis.js
const Redlock = require('redlock');
...
const redlock = new Redlock([client]);
app.redlock = redlock;
// 具体业务代码上
async try() {
const lock = await this.app.relock.lock('lockName', 11);
const index = await this.app.redis.get('index'); // 这里已经提前赋值为1了
await this.app.redis.set('index', Number(index) + 1);
await lock.unlock();
this.ctx.body = 'success';
}
这样似乎可以达到我的目的。
@atian25 这两个模块不知道有没有整合的可能和必要?
冒昧试答一下: 二者场景不同,没必要整合 其次,虽然都使用redis,但仍然可以使用不同的redis服务,更没必要整合了
@974806047 建议fork出来修改,改个名重新推npm,这样在作者暂时不能改的时候,至少能满足自己需求