检查所有QueryCaches是否在Hazelcast群集中从IMap接收更新

问题描述 投票:1回答:1

有一个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可以使用的参考数据的同步“复制”。

distributed-computing hazelcast in-memory-data-grid
1个回答
0
投票

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

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

© www.soinside.com 2019 - 2024. All rights reserved.