我在支持高可用性的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);
}
}