Java 使用Hazelcast的分布式缓存用例

Java 使用Hazelcast的分布式缓存用例,java,memcached,hazelcast,Java,Memcached,Hazelcast,以下是我们的用例: 我们有4-8个节点,它们实现了分布式hazelcast缓存 每个节点都可以通过JMS获得多个具有相同事务密钥的消息,我们使用一个密钥对象对将所有消息添加到缓存中,其中对象是可缓存项的列表 聚合是通过ApacheCamel完成的,我们有一个运行300毫秒的聚合器 300毫秒后,我们关闭聚合窗口,从与事务键对应的缓存中逐出所有项,并以编程方式聚合它们。 Hazelcast的角色只是收集缓存映射中的消息,并使所有节点保持同步,因为所有节点都知道缓存中有哪些项 问题场景: 节点1在1

以下是我们的用例:

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

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

节点1在17:01:01:100在缓存中为transaction key=tx1添加一个item1,我们假设hazelcast将此信息广播到其他节点,以便所有节点都获得缓存项的副本。 节点2在17:01:01:105在事务密钥=tx1的缓存中添加一个item2 节点3在17:01:01:350处为事务密钥=tx1在缓存中添加一个项3 现在,假设在17:01:01:400,我们尝试关闭聚合窗口,并使用transaction key=tx1以编程方式从缓存中逐出所有项 问题是node1、node2知道item1和item2,因为它们有时间同步缓存项。但是node3添加item3的时间太晚了,以至于node1和node2在17:01:01:400不知道item3。 假设我们在17:01:01:400从节点1开始逐出,节点1不知道项目3,它将给我们一个只有2个项目的对象 然后,节点1将广播给所有人,以逐出事务密钥=tx1的所有缓存项,所有节点将清除其事务密钥=tx1的缓存 这将导致丢失项目3


谢谢你的帮助。�

我认为您的IMap设计如下:

IMap transactionMessagesMap

问题是节点1、节点2知道item1和item2,因为它们 有时间同步他们的缓存项。但是node3这么晚才添加第3项 该节点1和节点2不知道17:01:01:400的第3项

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

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

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

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。希望这有帮助

我试着回答你下面的问题。如果您需要更多帮助,请在问题中添加更多相关细节。