gpt4 book ai didi

java - 奇怪的 Hazelcast IMap#put() 行为

转载 作者:搜寻专家 更新时间:2023-10-30 19:45:46 25 4
gpt4 key购买 nike

我的基于 Hazelcast 的程序可以在两种模式下工作:提交者和 worker 。

提交者通过一些键将一些 POJO 放入分布式 map ,例如:hazelcastInstance.getMap(MAP_NAME).put(key, value);

Worker 有一个无限循环(内部有 Thread.sleep(1000L); 超时),它必须处理来自 map 的实体。现在我只是在这个循环中打印 map 大小。

问题来了。我启动 worker 应用程序。然后我同时启动四个提交者(每个提交者向 map 添加一个条目并终止其工作)。但是在所有提交者应用程序完成后,工作应用程序打印任意大小:有时它检测到只添加了一个条目,有时两个,有时三个(实际上它从未看到所有四个条目)。

这个简单的流程有什么问题?我在 Hazelcast 文档中读到 put() 方法是同步的,因此它保证在它返回后,条目被放置到分布式 map 并被复制。但在我的实验中似乎并非如此。

UPD(代码)

提交者:

public void submit(String key) {
Object mySerializableObject = ...
IMap<String, Object> map = hazelcastInstance.getMap(MAP_NAME);
map.putIfAbsent(key, mySerializableObject, TASK_TTL_IN_HOURS, TimeUnit.HOURS);
}

worker :

public void process() {
while (true) {
IMap<String, Object> map = hazelcastInstance.getMap(MAP_NAME);
System.out.println(map.size());

// Optional<Map.Entry<String, Object>> objectToProcess = getObjectToProcess();
// objectToProcess.ifPresent(objectToProcess-> processObject(id, objectToProcess));
try {
Thread.sleep(PAUSE);
} catch (InterruptedException e) {
LOGGER.error(e.getMessage(), e);
}
}
}

我注释掉了“处理”部分本身,因为现在我只是想获得 map 的一致状态。上面的代码每次打印不同的结果,例如:“4, 3, 1, 1, 1, 1, 1...”(所以它甚至可以暂时看到 4 个已提交的任务,但随后它们...消失了) .

UPD(日志)

worker :

...
tasksMap.size() = 0
tasksMap.size() = 0
tasksMap.size() = 0
tasksMap.size() = 0
tasksMap.size() = 1
tasksMap.size() = 2
tasksMap.size() = 2
tasksMap.size() = 2
tasksMap.size() = 2
tasksMap.size() = 2
...

提交者 1:

Before: tasksMap.size() = 0
After: tasksMap.size() = 1

提交者 2:

Before: tasksMap.size() = 1
After: tasksMap.size() = 4

提交者 3:

Before: tasksMap.size() = 1
After: tasksMap.size() = 2

提交者 4:

Before: tasksMap.size() = 3
After: tasksMap.size() = 4

最佳答案

嗯,我想,我已经解决了问题。据我了解,hazelcastInstance.getMap 返回的分布式 IMap 不能保证数据在集群中的所有现有节点上复制:数据的某些部分可以复制到一些节点,另一部分 - 到另一个节点。这就是为什么在我的示例中,一些提交的任务没有被复制到工作节点(永久工作),而是复制到其他一些提交者,这些提交者在提交后终止执行。因此,此类条目在提交者退出时丢失。

我通过将 hazelcastInstance.getMap 替换为 hazelcastInstance.getReplicatedMap 解决了这个问题。此方法返回 ReplicatedMap,据我所知,它保证放入其中的条目将被复制到集群的所有 节点。所以现在我的系统一切正常。

关于java - 奇怪的 Hazelcast IMap#put() 行为,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/36828569/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com