Hazelcast 竞争条件?

问题描述 投票:0回答:1

我们运行一个由 3 台机器组成的 Hazelcast 集群,每台机器都有相同的进程实例。他们共享一个名为 waitingMap 的 IMap。在方法 activateAnotherBatch() 中,我们检查地图是否为空。如果地图不为空,那么我们调用地图上的某个方法。

如果我在一台机器上开发,我会让这个构造正常同步。然而,同步内容仅适用于每个进程/机器,现在我们有 3 台机器。

这是否安全,或者其他机器是否能够在检查为空之后、调用 waitingMap.entrySet().iterator().next() 之前清空映射,从而导致异常?

如果是这样,我该如何解决这个问题,以便它在 N 台机器上安全工作?

public Scheduler(HazelcastInstance hci) {
    waitingMap = hci.getMap(CMDS_WAITING);
}

private void activateAnotherBatch() {
    if (waitingMap.isEmpty())
        return;

    var batchNr = waitingMap.entrySet().iterator().next().getValue();
    waitingMap.forEach((k,v) -> {
        if (v.equals(batchNr))
            addCmdNr(k, batchNr, Prio.NORMAL); 
    });
}

private ConcurrentMap<Integer, Integer> waitingMap;
java concurrency hazelcast
1个回答
0
投票

您是否考虑过使用 IQueue 代替 IMap?

IQueue<String> queue = hci.getQueue("my-queue");
while (true) {
   String next = queue.take();
   doStuff(next);
}

所有三个节点都可以并行处理队列,每个节点处理一个单独的条目。

© www.soinside.com 2019 - 2024. All rights reserved.