我目前正在POC
开发distributed, fault tolerant, ETL ecosystem
。我为Hazelcast
目的选择了clustering (data+notification)
。通过Hazelcast资源搜索我的to this link,它完全符合我的想法,使用基于地图的解决方案。
我需要理解一点。在此之前,请允许我对我们的架构给出一个规范的想法:
说we have 2 nodes A,B running our server instance clustered through hazelcast
。其中一个是听众接受请求(但可以改变故障转移),比如A。
A获取请求并将其放入分布式地图。此映射由持久性存储进行直写支持,并在节点上配置单个内存备份。
每个实例都有一个本地映射条目侦听器,在条目添加事件时,(asynchronous/queuing)
将处理该条目,然后将其从分布式映射中删除。
这是按预期工作的。
问题:
假设已收到10个请求,并在每个节点上分配5个请求。已经处理了每个节点上的2个条目,现在两个实例都崩溃了。
因此,现在支持数据存储区中总共有6个条目。
现在我们调出两个实例。根据文档 - " As of 1.9.3 MapLoader has the new MapLoader.loadAllKeys API. It is used for pre-populating the in-memory map when the map is first touched/used"
我们只需加载商店中存在的所有键值即可实现loadAllKeys()
。
这是否意味着有可能两个实例现在都会加载6个条目并处理它们(从而导致重复处理)? 或是否以同步方式处理,以便在群集中只进行一次加载?
On server startup I need to process the pending entries
(如果有的话)。我看到数据已加载,但是不会触发entryAdded事件。如何使entryAdded事件触发(或任何其他优雅的方式,我将在启动时知道有待处理的条目)?
请求建议。
谢谢, Sutanu
答案 0 :(得分:1)
初始化时,将调用loadAllKeys(),它将返回持久存储中的所有6个键。然后每个节点将选择它拥有的密钥并仅加载它们。因此A可能会加载2个条目,而B会加载剩余的4个条目。
store.load不会触发条目侦听器。怎么样:在初始化之后,在注册你的监听器之后,你可以获得localEntries并处理现有的。