【问题标题】:Distributed Caching use case with HazelcastHazelcast 的分布式缓存用例
【发布时间】:2015-11-10 17:14:48
【问题描述】:

这是我们的用例:

我们有 4-8 个节点来实现分布式 hazelcast 缓存 每个节点可以通过 JMS 获取具有相同事务密钥的多条消息,我们将缓存中的所有消息添加一个键-对象对,其中对象是可缓存项的列表

聚合是通过 apache-camel 完成的,我们有一个运行 300 MILLISECS 的聚合器 在 300 MILLISECS 之后,我们关闭聚合窗口并从与事务键对应的缓存中逐出所有项目并以编程方式聚合它们。 Hazelcast 的作用只是在缓存映射中收集消息并保持所有节点同步,因为所有节点都知道缓存中有哪些项目 问题场景:

  1. 节点 1 在 17:01:01:100 在缓存中为 transaction-key=tx1 添加 item1 - 我们假设 hazelcast 将此信息广播到其他节点,以便所有节点都获得缓存项目的副本。
  2. 节点 2 在 17:01:01:105 在缓存中为 transaction-key=tx1 添加 item2
  3. 节点 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)

感谢任何帮助。。

【问题讨论】:

  • 我已尝试在下面回答您的问题。如果您需要更多帮助,请在您的问题中添加更多相关详细信息。

标签: java memcached hazelcast


【解决方案1】:

我想你的 IMap 是这样设计的:

IMap<TransactionKey,List<CacheItem>> transactionMessagesMap.

问题是node1,node2知道item1和item2,因为他们 有时间同步他们的缓存项目。但是 node3 这么晚才添加 item3 那 node1 和 node2 在 17:01:01:400 不知道 item3。

您如何将条目放入 IMap ?您使用的是set()put() 还是putAsync()put()set() 是同步调用,因此节点 3 所做的更改将以同步方式反映。

请注意,IMap 上的 put() / set() 操作是同步的。但是,如果您想确保当一个节点在您的列表上运行时(例如添加一个新项目),来自其他节点的所有其他后续请求都应该看到更新的列表,那么您可能需要使用分布式锁针对相关键。即

添加新项目的代码可能如下:

transactionMessagesMap.lock(transactionKey);
list = transactionMessagesMap.get(transactionKey);
list.add(newItem);
transactionMessagesMap.set(transactionKey, list);
transactionMessagesMap.unlock(transactionKey);

驱逐物品的代码可能如下:

// In your case node1 will block here until node3 has successfully updated 
// item3 in the list.
transactionMessagesMap.lock(transactionKey);
list = transactionMessagesMap.get(transactionKey);
for(CacheItem item : list)
{
   // perform your eviction logic here.
}
transactionMessagesMap.unlock(transactionKey);

您可以根据自己的逻辑决定何时释放锁。基本思想是根据您的用例使用一些分布式锁定机制,如IMap.lock()ILock。希望这可以帮助。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-06-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多