Проверка, все ли QueryCaches получили обновления от IMap в кластере Hazelcast
Имея кластер Hazelcast, как мне убедиться, что изменения, которые я внес в IMap
полностью размножаются QueryCaches
на всех узлах кластера, прежде чем я вызову EntryProcessor
который использует измененные данные из тех, QueryCaches
?
Упрощенный сценарий того, чего я пытаюсь достичь:
- У меня есть алгоритм, который переоценивает элементы на основе некоторых параметров
- Есть до одного миллиарда предметов, поэтому они хранятся в
IMap
- Есть сотни тысяч параметров, также хранящихся в
IMap
- Каждый узел имеет полную копию всех параметров в виде
QueryCache
ускорить процесс - В приложение приходит запрос, чтобы изменить пару параметров и переоценить все элементы
- Параметры меняются простыми
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
}
Есть ли способ добиться чего-то подобного?
1 ответ
Когда вы делаете map.put
и после запуска EntryProcessor EP запускается в хранилище значений ключей на стороне сервера, поэтому он всегда работает с последним обновленным значением на сервере. Обновление до QueryCache через map.put
является асинхронным и не связано с тем, что вы делаете в EntryProcessor и когда.
Кроме того, для вашей информации, EntryProcessor работает в потоке разделов, что означает, что поток, отвечающий за обновление значения, также отвечает за запуск EntryProcessor. Таким образом, пока EntryProcessor работает, никакой другой поток не может обновить это значение.