我在支持高可用性的Spring Boot MVC应用程序中使用Hazelcast,它具有4个具有相同逻辑的实例,这些实例以双活模式运行。
所有这四个共享一个对象的分布式地图。

由于用户操作(访问特定控制器)的结果,我在共享地图上触发了EntryProcessor(map.submitToKey)。我以为这样的操作只会在一个节点上运行一次处理器,但是相反,所有4个节点都同时运行同一处理器。

是否可以在单个节点上执行分布式地图的EntryProcessor?

最佳答案

如果您的地图不需要任何备份,则EntryProcessor可以从getBackupProcessor()安全地返回null。返回null后,备份节点将不执行任何EntryBackupProcessor

否则,如果您为地图配置了备份,但为EntryBackupProcessor返回了null,则该条目将不会复制到备份节点。它将被视为没有为地图配置任何备份。主数据库和备份数据库最终将变得不一致。当主崩溃时,您将丢失由EntryProcessor完成的更新。

在这种情况下,如果需要备份,则可以编写一个自定义的EntryBackupProcessor,它只能复制主要EntryProcessor的执行结果,而不是执行EntryProcessor的逻辑。例如:

class CustomEntryBackupProcessor implements EntryBackupProcessor {

    private Object resultOfEntryProcessor;

    @Override
    public void processBackup(Map.Entry entry) {
        entry.setValue(resultOfEntryProcessor);
    }
}

09-13 06:22