Как иметь транзакции через основной поток и прослушиватель записей в Hazelcast? - PullRequest
0 голосов
/ 20 декабря 2018

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

Я использую Hazelcast и у меня есть 2 кэша:
1.ReferenceObject для графа
2.IMap для крупных объектов
3.IMap для ребер в графе

Когда я вставляю большой объект, у меня есть приемник записей, который обновит этот график в кеше.Точно так же, когда я добавляю данные ребер, есть также слушатель записи, который обновит график.

Однако у меня есть 1 проблема, когда, если я создаю ребро и создаю цикл, он терпит неудачу (поскольку это dag)но IMap сохраняет записи.

Любые идеи, как я могу иметь транзакции через основной поток и прослушиватель записей?

Ответы [ 2 ]

0 голосов
/ 28 декабря 2018

Хотя это совершенно другой подход, вы смотрели на Hazelcast Jet?Это основанный на DAG механизм обработки потока событий, построенный поверх Hazelcast IMDG.Это может лучше соответствовать вашему варианту использования и позаботиться о вещах более низкого уровня для вас.

https://jet.hazelcast.org

У вас был бы кластер Jet, который также является кластером Hazelcast, но вы получаете все необходимое для обработки.Он расширяет модель программирования Java Streams, поэтому вы просто пишете свое приложение, как если бы оно было потоком Java, и запускаете его в кластере.В любом случае, о чем подумать.

0 голосов
/ 20 декабря 2018

@ Пило, проблема в EntryListener прослушивает события, запущенные после того, как данные уже заполнены на карте.Поэтому, когда вы вставляете данные на свою первую карту и слушаете событие обновления, данные уже находятся на первой карте.

Вы можете либо

  1. вручную удалить запись из первойmap, если операция завершается неудачно на второй.
  2. Используйте транзакции и убедитесь, что все или ни одна из карт обновлена, вместо использования прослушивателей.
...