1

拥有一个 Hazelcast 集群,我如何确保我对 an 所做的更改IMap完全传播到QueryCaches所有集群节点上,然后我调用EntryProcessor使用来自这些节点的更改数据QueryCaches

我要实现的简化方案:

  • 我有一个算法可以根据一些参数重新评估项目
  • 有多达 10 亿个项目,因此它们被保存在一个IMap
  • 还有十万个参数也保存在一个IMap
  • 每个节点都有一个完整的所有参数副本,QueryCache以加快速度
  • 向应用发出请求,更改几个参数并重新评估所有项目
  • 通过simple改变参数,然后在每个节点上的项目上调用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

4

1 回答 1

0

当您map.put之后执行并运行 EntryProcessor 时,EP 在服务器端的键值存储上运行,因此它始终在服务器上最后更新的值上运行。对 QueryCache 的更新map.put是异步的,与您在 EntryProcessor 中的操作和时间无关。

此外,供您参考,EntryProcessor 在分区线程上运行,这意味着负责更新值的线程也负责运行 EntryProcessor。因此,当 EntryProcessor 正在运行时,没有其他线程可以更新该值。

于 2019-03-02T13:21:49.577 回答