Карта мира HazelCast со слушателем

С Hazelcast, я предполагаю, что общий сценарий состоит в том, что потребители хотят знать о текущем состоянии мира (то, что когда-либо в настоящее время находится на карте), а затем обновляются, ничего не потеряв между ними.

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

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

Мы могли бы разделить блокировку между перечислителем карты и слушателем, но это похоже на запах кода.

В общем, мой вопрос: если мы хотим транслировать SoTW, а затем обновлять, как мы можем это сделать? Есть ли что-то встроенное в Hazelcast, которое может помочь нам?

Спасибо за помощь

1 ответ

Решение

Прежде всего, и я думаю, что это просто неудачно объяснено, карта не имеет порядка!

Во-вторых, карта Hazelcast - это непостоянная, непостоянная структура данных. Как и в ConcurrentHashMap, изменения в структуре данных отражаются в итераторе и наоборот.

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

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

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