检查所有查询手机是否在Hazelcast群集中从IMAP收到更新



拥有一个榛子集群,我如何确保我对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在分区线程上运行,这意味着负责更新值的线程也负责运行输入处理程序。因此,当输入过程正在运行时,没有其他线程可以更新该值。

相关内容

  • 没有找到相关文章

最新更新