2016-11-14 6 views
1

У меня есть реплицированный кластер, состоящий из нескольких узлов (до 30), на которых есть один процесс JAVA, доступ к кешу связности, и я использую метод map.invoke (ключ, агент) для создания и обновления агентов. Создание и обновление выполняются с установкой значения в методе процесса.Oracle coherence: есть ли способ принудительно вызвать вызов агента на конкретном узле?

Пример (агент представляет собой экземпляр ConcreteEntryProcessor, реализующего интерфейс EntryProcessor):

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

Что вы подразумеваете под «Я использую метод' map.invoke (key, agent) 'для создания и обновления агентов». «agent» в этом случае является экземпляром «EntryProcessor», который работает с входом в кэш, указанным «ключом», и я не понимаю, как вы создаете/обновляете агенты («EntryProcessor's») с помощью 'map.invoke'. Пожалуйста, покажите пример того, что вы пробовали до сих пор. –

+0

Я изменил вопрос, чтобы ответить на ваш комментарий .. – Fernando

ответ

0

Все зависит от конфигурации кэша. Если вы используете распределенный (секционированный) кеш, то действительно существует некоторая форма собственности на данные. В этом случае входной процессор вызывается на узле, которому принадлежит данный ключ.

И в соответствии с вашими проблемами производительности, я вижу две возможности:

  1. Выполнение map.invoke(key, agent) уменьшается, но производительность EntryProcessor.process(entry) стабильна. В этом случае проблемы с производительностью, вероятно, вызваны сериализацией и сетевым трафиком, необходимым для отправки результата обработки на узел, который называется map.invoke(key, agent). Если вам не нужно это значение на этом узле, просто верните null из вашего процессора ввода.

  2. Показатели EntryProcessor.process(entry) уменьшаются. В этом случае ваша логика создания/обновления нуждается в некоторых данных с узла, который вызвал map.invoke(key, agent). Таким образом, это снова проблема сериализации/сетевого трафика, но, не зная подробностей вашей конкретной логики, трудно найти решение вашей проблемы.