Oracle 一致性:有没有办法在特定节点上强制调用代理?

Oracle coherence: is there a way to force the invocation of an agent on a specific node?

我有一个由多个节点(最多 30 个)组成的复制集群,其中有一个 JAVA 进程访问一致性缓存,我使用 map.invoke(key, agent)创建和更新代理的方法。创建和更新是通过在 process 方法中设置值来执行的。

示例(代理是实现 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;
  }
}

我注意到如果更新是由创建代理的节点进行的,我的性能会很好,否则如果更新是由不同的节点进行的,我的性能会下降。似乎有一种数据的所有权。

有没有办法强制在本地节点上执行代理或更改数据的所有权?

这完全取决于缓存配置。如果您使用分布式(分区)缓存,那么确实存在某种数据所有权。在这种情况下,在拥有给定密钥的节点上调用入口处理器。

并且根据你的性能问题,我看到两种可能:

  1. map.invoke(key, agent)性能下降,但EntryProcessor.process(entry)性能稳定。在那种情况下,您的性​​能问题可能是由序列化和将处理结果发送回调用 map.invoke(key, agent) 的节点所需的网络流量引起的。如果您不需要该节点上的此值,则只需从您的入口处理器 return null

  2. EntryProcessor.process(entry) 的性能下降。在那种情况下,您的 create/update 逻辑可能需要来自调用 map.invoke(key, agent) 的节点的一些数据。所以这又是 serialization/network 交通问题,但在不知道您的特定逻辑的细节的情况下,很难找到解决您问题的方法。