我在支持高可用性的Spring Boot MVC应用程序中使用Hazelcast,它具有4个具有相同逻辑的实例,这些实例以双活模式运行。 这4个对象全部共享一个分布式对象图。
由于用户操作(访问特定控制器)的结果,我在共享地图上触发了EntryProcessor(map.submitToKey)。我以为这样的动作只会在一个节点上运行一次处理器,但是相反,所有4个节点都同时运行同一处理器。
是否可以在单个节点上执行分布式地图的EntryProcessor?
答案 0 :(得分:1)
如果您的地图不需要任何备份,那么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);
}
}
逻辑。例如:
class Recipe
include HTTParty
key_value = ENV['FOOD2FORK_KEY'] || 'YOUR_API_KEY_HERE'
base_uri "http://food2fork.com/api"
default_params key: key_value
default_options.update(verify: false)
format :json
def self.for(search_string)
get('/search', { query: { q: search_string}})["recipes"]
end
end