Akka Persistence Cassandra: метка времени != смещение. Или как обрабатывать события только один раз?

В настоящее время я создаю приложение, основанное на событиях, с Akka Persistence и плагином Cassandra Journal. У меня есть несколько представлений, которым необходимо фиксировать события нескольких идентификаторов сохраняемости, поэтому я использую запросы eventsByTag для обновления (например) моих представлений mongodb.

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

Сначала я планировал использовать смещение последнего обработанного события, поскольку плагин Cassandra использует TimeUUID внутри, и оно должно быть уникальным. Проблема здесь в том, что Akka Journal поддерживает только длинные значения в качестве смещения, поэтому TimeUUID преобразуется обратно в обычную метку времени.

So e.g.:

2d2504b1-31f8-11e6-af83-9f34c8060f40 и 2d2504b2-31f8-11e6-af83-9f34c8060f40

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

Есть ли у кого-нибудь идеи о том, как лучше подойти к этому?

РЕДАКТИРОВАТЬ


CassandraReadJournal предоставляет перегруженную версию потока getEventsByTag, который возвращает UUIDEventEnvelopes. Он содержит смещение как UUID, а не как Long.


person thwiegan    schedule 14.06.2016    source источник
comment
Можете ли вы найти способ сделать ваши обновления идемпотентными? Если нет, можете ли вы использовать управление версиями документа, чтобы отклонить уже примененное изменение, пытаясь сопоставить версию документа с порядковым номером, относящимся к событиям для этого persistenceId?   -  person cmbaxter    schedule 15.06.2016
comment
Я подумаю об идемпотентности, но мое первое предположение будет заключаться в том, что в моем случае это неосуществимо. Что касается управления версиями, некоторые представления объединяют события нескольких идентификаторов сохранения, поэтому я не могу использовать его в качестве версии (представления с одним идентификатором сохранения не будут проблемой).   -  person thwiegan    schedule 15.06.2016


Ответы (1)


CassandraReadJournal предоставляет перегруженную версию потока getEventsByTag, которая возвращает UUIDEventEnvelopes. Он содержит смещение как UUID, а не Long, и поэтому является уникальным.

person thwiegan    schedule 18.06.2016
comment
возвращаемые UUID не являются реальными UUID, а скорее временной меткой unix, вставленной в UUID и, следовательно, не уникальными. См. github.com/tfredrich/cassandra-java-driver/blob/master/ - person Kim Stebel; 29.01.2018