首页 > 解决方案 > 两个实例轮流取自Hazelcast阻塞队列,如何尽可能避免读取重复项

问题描述

这里有一些背景:我们有几个服务实例共享一个Hazelcast阻塞quque,该服务主要有两个任务:

  1. 有一个调度程序将项目放入队列中,假设每 5 分钟放入 100 个项目

  2. 另一个类观察队列,只要它有任何项目就会开始处理(基本上一个项目可能需要 1 到 2 秒来处理)

我对上述解决方案有几个问题:

  1. 如果任何两个实例同时运行调度程序,如何避免将重复项添加到队列中(例如,如果队列中有'A','B',instanceA将放入'A','D',肯定可以过滤掉A,因为它在队列中,所以instanceA会将D放入queur,同时instanceB也放入D,因为它是本地队列,此时没有D)

  2. 如何 aovid instanceA 和 instanceB 取重复项(例如,实例 A 取第一项,但队列尚未与实例 B 同步,实例 B 也会取相同的第一项吗?)我们可能不需要严格避免重复项,但尝试尽可能避免。

电话编辑,如有拼写问题请见谅。也许更好的解决方案是转向redis或其他集中方式?

标签: redismessage-queuehazelcastdistributed-system

解决方案


我对 Hazelcast 不熟悉。但我知道 Redis 有解决方案。

  1. 如何避免重复项到队列?

您可以使用Redis Set存储无重复项,在将项推送到redis消息队列之前,只需检查项Redis Set是否存在,如果存在,则退出推送操作。

  1. 如何避免物品被重复拿走?

可以Redis List作为消息队列使用,配合rpop原子操作,instanceA和instanceB不能取重复项。


推荐阅读