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;
}
}
我注意到如果更新是由创建代理的节点进行的,我的性能会很好,否则如果更新是由不同的节点进行的,我的性能会下降。似乎有一种数据的所有权。
有没有办法强制在本地节点上执行代理或更改数据的所有权?
这完全取决于缓存配置。如果您使用分布式(分区)缓存,那么确实存在某种数据所有权。在这种情况下,在拥有给定密钥的节点上调用入口处理器。
并且根据你的性能问题,我看到两种可能:
map.invoke(key, agent)
性能下降,但EntryProcessor.process(entry)
性能稳定。在那种情况下,您的性能问题可能是由序列化和将处理结果发送回调用 map.invoke(key, agent)
的节点所需的网络流量引起的。如果您不需要该节点上的此值,则只需从您的入口处理器 return null
。
EntryProcessor.process(entry)
的性能下降。在那种情况下,您的 create/update 逻辑可能需要来自调用 map.invoke(key, agent)
的节点的一些数据。所以这又是 serialization/network 交通问题,但在不知道您的特定逻辑的细节的情况下,很难找到解决您问题的方法。
我有一个由多个节点(最多 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;
}
}
我注意到如果更新是由创建代理的节点进行的,我的性能会很好,否则如果更新是由不同的节点进行的,我的性能会下降。似乎有一种数据的所有权。
有没有办法强制在本地节点上执行代理或更改数据的所有权?
这完全取决于缓存配置。如果您使用分布式(分区)缓存,那么确实存在某种数据所有权。在这种情况下,在拥有给定密钥的节点上调用入口处理器。
并且根据你的性能问题,我看到两种可能:
map.invoke(key, agent)
性能下降,但EntryProcessor.process(entry)
性能稳定。在那种情况下,您的性能问题可能是由序列化和将处理结果发送回调用map.invoke(key, agent)
的节点所需的网络流量引起的。如果您不需要该节点上的此值,则只需从您的入口处理器 returnnull
。EntryProcessor.process(entry)
的性能下降。在那种情况下,您的 create/update 逻辑可能需要来自调用map.invoke(key, agent)
的节点的一些数据。所以这又是 serialization/network 交通问题,但在不知道您的特定逻辑的细节的情况下,很难找到解决您问题的方法。