egg多进程实现锁的最佳实践是什么?
发布于 4 年前 作者 974806047 2831 次浏览 来自 问答

现在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,这样在作者暂时不能改的时候,至少能满足自己需求

回到顶部