redis - 两个实例轮流取自Hazelcast阻塞队列,如何尽可能避免读取重复项
问题描述
这里有一些背景:我们有几个服务实例共享一个Hazelcast阻塞quque,该服务主要有两个任务:
有一个调度程序将项目放入队列中,假设每 5 分钟放入 100 个项目
另一个类观察队列,只要它有任何项目就会开始处理(基本上一个项目可能需要 1 到 2 秒来处理)
我对上述解决方案有几个问题:
如果任何两个实例同时运行调度程序,如何避免将重复项添加到队列中(例如,如果队列中有'A','B',instanceA将放入'A','D',肯定可以过滤掉A,因为它在队列中,所以instanceA会将D放入queur,同时instanceB也放入D,因为它是本地队列,此时没有D)
如何 aovid instanceA 和 instanceB 取重复项(例如,实例 A 取第一项,但队列尚未与实例 B 同步,实例 B 也会取相同的第一项吗?)我们可能不需要严格避免重复项,但尝试尽可能避免。
电话编辑,如有拼写问题请见谅。也许更好的解决方案是转向redis或其他集中方式?
解决方案
我对 Hazelcast 不熟悉。但我知道 Redis 有解决方案。
- 如何避免重复项到队列?
您可以使用Redis Set
存储无重复项,在将项推送到redis消息队列之前,只需检查项Redis Set
是否存在,如果存在,则退出推送操作。
- 如何避免物品被重复拿走?
可以Redis List
作为消息队列使用,配合rpop
原子操作,instanceA和instanceB不能取重复项。
推荐阅读
- java - Why i'm getting a error using ScriptEngineManager by passing a string formula?
- c# - 如何让用户选择特定文件?(C#)
- python - 如何在 pywin32 中处理 VBA 的关键字参数?
- python - 在excel中通过网格组件编辑Flask前端中的csv,例如
- android - Android:如何防止键盘在我的布局中向上推某个视图?
- virtualbox - “minikube start”停止在 Ubuntu 18.04 上运行
- git - 将本地 git repo 与远程同步
- javascript - 即使单击按钮,PHP isset() 函数也会返回 false
- flutter - CustomPainter 位置随方向变化 Flutter
- android - Android - BitmapFactory 将所有图像视为风景