Проверка, все ли 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 работает, никакой другой поток не может обновить это значение.

Другие вопросы по тегам