有一个Hazelcast集群,在调用使用IMap
中更改数据的QueryCaches
之前,如何确保我对EntryProcessor
所做的更改完全传播到所有集群节点上的QueryCaches
?
我正在努力实现的简化方案:
IMap
IMap
中还有十万个参数QueryCache
形式的所有参数的完整副本,以加快速度map.put()
更改参数,然后在每个节点上的项目上调用EntryProcessor
形式的算法QueryCache
的更新是异步的,因此有时算法将使用旧的参数值public void handleRevaluationRequest(Object parametersChangeInstructions) {
TransactionContext transaction = hazelcastInstance.newTransactionContext();
transaction.beginTransaction();
TransactionalMap parameters = transaction.getMap("parameters");
parameters.set(...); // changes to a few parameters
parameters.put(...); // adding a few different parameters
transaction.commitTransaction();
IMap items = hazelcastInstance.getMap("items");
items.executeOnEntries(new RevaluationProcessor());
// processor uses new and/or existing parameters from QueryCache to revalue items
// but won't always see the changes to parameters that we've just made
}
有没有办法实现这样的目标?也许使用不同的数据结构而不是QueryCache
将更加适合实现EntryProcessor
可以使用的参考数据的同步“复制”。
当你执行map.put
并在之后运行EntryProcessor时,EP在服务器端的键值存储上运行,因此它始终适用于服务器上的最后更新值。通过map.put
更新到QueryCache是异步的,与您在EntryProcessor中执行的操作无关。
另外,为了您的信息,EntryProcessor在分区线程上运行,这意味着负责更新值的线程也负责运行EntryProcessor。因此,当EntryProcessor正在运行时,没有其他线程可以更新该值。