distributed-computing - 检查是否所有 QueryCaches 从 Hazelcast 集群中的 IMap 接收更新
问题描述
拥有一个 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
。
解决方案
当您map.put
之后执行并运行 EntryProcessor 时,EP 在服务器端的键值存储上运行,因此它始终在服务器上最后更新的值上运行。对 QueryCache 的更新map.put
是异步的,与您在 EntryProcessor 中的操作和时间无关。
此外,供您参考,EntryProcessor 在分区线程上运行,这意味着负责更新值的线程也负责运行 EntryProcessor。因此,当 EntryProcessor 正在运行时,没有其他线程可以更新该值。
推荐阅读
- django - django-fluent-contents 没有在 django.settings.installedApps 中正确安装
- c# - 使用字节存储图像
- php - 如何将字符串数组转换为具有可变块大小的块数组?
- bash - 如何存储文件列表;做一个测试;在 bash 中对列表采取行动?
- c++ - 如何解决此错误:未定义对“距离(浮点数,浮点数,浮点数,浮点数)”的引用
- c# - Windbg 中的高锁计数!heap -s,接下来我可以做些什么来检测非托管内存泄漏?
- angular - 更改 ngbDatepicker 输入模板
- r - 在 ggplot2 中绘制与预测值的低级交互
- css - 运行两个 CSS 动画类在两个之间但无限延迟
- javascript - 反应路由器:TypeError:渲染不是函数