CNode

egg多进程实现锁的最佳实践是什么?

问答
9974806047发布于6 年前最后回复6 年前5 回复4231 浏览0 收藏

现在egg多个进程间对资源的争抢是怎么设计这个锁的呢?目前我们自己都是使用redis.incr来争抢某个key,值为1的进程就可以操作该资源,其他进程放弃操作或者循环等待。 看到有博客提到Atomics这个模块,不知道egg中是否可以使用这个实现锁?

查看回复

回复 (5)

A
atian25#1·6 年前

模块解决不了集群锁问题

9
974806047#2·6 年前
引用 atian25模块解决不了集群锁问题

@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';
}

这样似乎可以达到我的目的。

9
974806047#3·6 年前
引用 atian25模块解决不了集群锁问题

@atian25 这两个模块不知道有没有整合的可能和必要?

Z
zhennann#4·6 年前

冒昧试答一下: 二者场景不同,没必要整合 其次,虽然都使用redis,但仍然可以使用不同的redis服务,更没必要整合了

Z
zy445566#5·6 年前
引用 974806047@atian25 这两个模块不知道有没有整合的可能和必要?

@974806047 建议fork出来修改,改个名重新推npm,这样在作者暂时不能改的时候,至少能满足自己需求

参与回复
登录后即可参与回复。登录