Cassandra Akka持久性卡桑德拉:时间戳!=抵消。或者如何只处理一次事件?

Cassandra Akka持久性卡桑德拉:时间戳!=抵消。或者如何只处理一次事件?,cassandra,akka,akka-persistence,Cassandra,Akka,Akka Persistence,我目前正在使用Akka持久性和Cassandra日志插件构建一个事件源应用程序。 我有一些视图需要捕获多个持久性ID的事件,因此我使用eventsByTag查询来更新(例如)我的mongodb视图 如果重新启动应用程序,查询将被重放,因此我需要以某种方式存储视图的状态,这样它就不会重放已经处理过的事件 起初,我计划使用最后处理的事件的偏移量,因为Cassandra插件在内部使用TimeUUID,并且它应该是唯一的。这里的问题是,Akka日志只支持长值作为偏移量,因此TimeUUID被转换回正常的

我目前正在使用Akka持久性和Cassandra日志插件构建一个事件源应用程序。 我有一些视图需要捕获多个持久性ID的事件,因此我使用eventsByTag查询来更新(例如)我的mongodb视图

如果重新启动应用程序,查询将被重放,因此我需要以某种方式存储视图的状态,这样它就不会重放已经处理过的事件

起初,我计划使用最后处理的事件的偏移量,因为Cassandra插件在内部使用TimeUUID,并且它应该是唯一的。这里的问题是,Akka日志只支持长值作为偏移量,因此TimeUUID被转换回正常的时间戳

例如:

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

两者都会导致相同的偏移量,如果在同一ms内有多个事件,那么在确定最后处理的事件方面,这对我来说是无用的

有没有人对如何更好地处理这个问题有想法

编辑



CassandraReadJournal
提供了getEventsByTag流的重载版本,该流返回uuidenventenvelopes。这包含作为UUID且不长的偏移量。
CassandraReadJournal
提供了一个重载版本的
getEventsByTag
流,该流返回
UuidEventInvelopes
。它包含的偏移量为
UUID
,而不是
Long
,因此是唯一的。

您能找到一种方法使更新等幂吗?如果不是,您能否利用文档版本控制来拒绝已应用的更改,尝试将文档版本与该persistenceId的事件相关的序列号对齐?我将考虑幂等性,但我的第一个猜测是,在我的情况下,这是不可行的。至于版本控制,一些视图聚合了多个持久性ID的事件,因此我不能将其用作版本(单个持久性ID视图不会有问题)。返回的“UUID”不是真实的UUID,而是填充到UUID中的unix时间戳,因此不是唯一的。看见