2017-02-15 1 views
0

просто задается вопросом о гарантии доставки уведомления о событиях от постоянного участника, полученного от источника, обработчику чтения в lagom, есть ли какая-либо или нет долговечности сообщения для уведомления о событии для чтения процессор, который будет обновлять сторону запроса?Долговечность сообщения Lagom между постоянным субъектом и процессором чтения

Я понимаю, что есть возможная согласованность, которая прекрасна, но я говорю о уведомлении обработчика события для процессора чтения Cassandra.

ответ

1

Обработка событий гарантируется использованием источников событий в постоянном сущности и отслеживании смещения при обработке на стороне чтения.

Когда ваш постоянный обработчик команд сущности продолжает события, каждое из событий сохраняется с упорядоченным "offset".

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

ЛАГА Кассандра чтения сторона процессоры возвращают CompletionStage или Future, которые производят список Cassandra BoundStatement экземпляров, и они выполняются в атомном обновлении пакетного наряду с смещением обновления. Пока все эффекты вашего обработчика событий на стороне чтения фиксируются в списке произведенных обновлений, это гарантирует, что событие будет обработано эффективно один раз: если часть обновления не удалась, он будет автоматически повторен.

Если вы делаете что-либо еще в своем обработчике событий, вам нужно быть уверенным, что обновление смещения произойдет только в том случае, если обработчик событий прошел успешно. CompletionStage или Future возврат обработчика событий должен выполняться только после того, как ваш побочный эффект будет выполнен, и успех или сбой в работе должны быть распространены. Имейте в виду, что обработчик событий будет повторно принят, если смещение не будет обновлено, поэтому, если ваш обработчик событий взаимодействует с внешней службой, например, вам нужно быть уверенным, что он идемпотент.

Вы также должны знать, как конечная консистенция может повлиять на вещи. akka-persistence-cassandraconfiguration reference имеет некоторые детали:

возвращается поток событий упорядочено смещения (метки времени), что соответствует в том же порядке, что и журнал записи хранится события, с погрешностью в связи с Clock Skew между различными узлы. Те же самые элементы потока (в том же порядке) возвращаются для выполнения целых исполнений запроса в наилучшей степени. Запрос использует Cassandra Materialized Просмотр запроса, и это в конечном итоге является последовательным, поэтому разные запросы могут видеть различные события для последних событий, но в итоге результат будет упорядочен по отметке времени (колонка времени Cassandra timeuuid). Чтобы компенсировать возможную согласованность, запрос задерживается, чтобы не читать последние события, продолжительность этой задержки определяется этим свойством конфигурации .

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

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

Смежные вопросы