我有一个红魔哨兵1主和2从。我已经在集群上部署了一个web dotnet核心web API应用程序3 pod。所以每个pod都有一个后台worker来访问文件系统,做自己的工作,并用一个key(done=true)更新redis。每个pod运行相同的worker。所以如果done=false,每个pod在相同的时间运行相同的作业。所以我想运行第一个访问的pod做的工作,其他人不做。我该怎么做?
bprjcwpo1#
一个解决方案是在Redis中添加另一个密钥,它将成为一个带有pod ID或其他内容的锁定机制。所以如果done = true那么locked = false。当done = false获得信息并成功设置locked的第一个pod可以启动文件系统作业。作业完成后,pod会更新done = true和locked = false。为了避免竞争条件,您必须在更新值时使用WATCH的transactions。如果监视值被更新,则事务将失败。伪代码:
done = true
locked = false
done = false
locked
WATCH
WATCH locked res = GET locked IF res == false MULTI SET locked pod123 EXEC
您还需要处理当pod停止运行而锁仍保留在locked = pod123中时的场景。
locked = pod123
1条答案
按热度按时间bprjcwpo1#
一个解决方案是在Redis中添加另一个密钥,它将成为一个带有pod ID或其他内容的锁定机制。所以如果
done = true
那么locked = false
。当done = false
获得信息并成功设置locked
的第一个pod可以启动文件系统作业。作业完成后,pod会更新done = true
和locked = false
。为了避免竞争条件,您必须在更新值时使用
WATCH
的transactions。如果监视值被更新,则事务将失败。伪代码:
您还需要处理当pod停止运行而锁仍保留在
locked = pod123
中时的场景。