我有一个由多个节点(最多30个)组成的复制集群,其中有一个JAVA进程访问一致性缓存,我使用map.invoke(密钥,代理)方法来创建和更新代理。执行创建和更新,在过程方法中设置值。
示例(agent是实现EntryProcessor接口的ConcreteEntryProcessor的实例):
map.invoke(key, agent);
调用以下代理对象代码:
public Object process(Entry entry) {
if (entry.isPresent())
{
//UPDATE
... some stuff which compute the new entry value...
entry.setValue(newValue, true);
return newValue
}
else
{
//CREATION
..other stuff to determine the value...
entry.setValue(value, true);
return value;
}
}
我注意到如果更新是由创建代理的节点进行的,那么我的性能会很好,否则如果更新来自不同的节点,我的性能会下降。似乎存在一种数据所有权。
有没有办法强制在本地节点上执行代理或更改数据的所有权?
答案 0 :(得分:0)
这完全取决于缓存配置。如果使用分布式(分区)缓存,那么确实存在某种数据所有权。在这种情况下,在拥有给定密钥的节点上调用条目处理器。
根据您的表现问题,我看到两种可能性:
map.invoke(key, agent)
的效果降低,但EntryProcessor.process(entry)
的效果稳定。在这种情况下,您的性能问题可能是由将处理结果发送回调用map.invoke(key, agent)
的节点所需的序列化和网络流量引起的。如果您在该节点上不需要此值,则只需从您的条目处理器返回null
。
EntryProcessor.process(entry)
的效果下降。在这种情况下,您的创建/更新逻辑可能需要来自调用map.invoke(key, agent)
的节点的一些数据。因此,这又是序列化/网络流量问题,但如果不了解特定逻辑的详细信息,很难找到解决问题的方法。