【发布时间】:2015-11-10 17:14:48
【问题描述】:
这是我们的用例:
我们有 4-8 个节点来实现分布式 hazelcast 缓存 每个节点可以通过 JMS 获取具有相同事务密钥的多条消息,我们将缓存中的所有消息添加一个键-对象对,其中对象是可缓存项的列表
聚合是通过 apache-camel 完成的,我们有一个运行 300 MILLISECS 的聚合器 在 300 MILLISECS 之后,我们关闭聚合窗口并从与事务键对应的缓存中逐出所有项目并以编程方式聚合它们。 Hazelcast 的作用只是在缓存映射中收集消息并保持所有节点同步,因为所有节点都知道缓存中有哪些项目 问题场景:
- 节点 1 在 17:01:01:100 在缓存中为 transaction-key=tx1 添加 item1 - 我们假设 hazelcast 将此信息广播到其他节点,以便所有节点都获得缓存项目的副本。
- 节点 2 在 17:01:01:105 在缓存中为 transaction-key=tx1 添加 item2
- 节点 3 在 17:01:01:350 在缓存中为 transaction-key=tx1 添加 item3 现在,假设在 17:01:01:400 我们尝试关闭聚合窗口并使用 transaction-key=tx1 以编程方式从缓存中驱逐所有项目
问题在于 node1、node2 知道 item1 和 item2,因为他们有时间同步他们的缓存项。但是 node3 添加 item3 太晚了,以至于 node1 和 node2 在 17:01:01:400 不知道 item3。 假设我们在 17:01:01:400 从不知道 item3 的节点 1 开始驱逐,它将给我们一个只有 2 个项目的对象 然后 node1 将广播给每个人以驱逐 transaction-key=tx1 的所有缓存项,作为响应,所有节点都将清除他们的 transaction-key=tx1 缓存 这会导致物品丢失(item3)
感谢任何帮助。。
【问题讨论】:
-
我已尝试在下面回答您的问题。如果您需要更多帮助,请在您的问题中添加更多相关详细信息。