【发布时间】:2017-02-15 23:09:23
【问题描述】:
只是想知道从持久事件源actor到 lagom 中的读取处理器的事件通知传递的保证,对于将更新查询端的读取处理器的事件通知是否存在或没有消息持久性?
我知道最终的一致性很好,但我说的是事件处理程序通知 Cassandra 读取处理器。
【问题讨论】:
标签: akka reactive-programming lagom
只是想知道从持久事件源actor到 lagom 中的读取处理器的事件通知传递的保证,对于将更新查询端的读取处理器的事件通知是否存在或没有消息持久性?
我知道最终的一致性很好,但我说的是事件处理程序通知 Cassandra 读取处理器。
【问题讨论】:
标签: akka reactive-programming lagom
通过在持久实体中使用事件源和在读取端处理中使用偏移跟踪来保证事件处理。
当您的持久化实体命令处理程序持久化事件时,每个事件都以有序的"offset" 存储。
读取端处理器通过轮询数据库来查找偏移量大于已处理的最后一个偏移量的事件。因为所有事件和每个读端处理器的最新偏移量都保存在数据库中,这样可以确保即使读端处理器崩溃和重启也不会丢失事件。
Lagom 的 Cassandra 读取端处理器返回 CompletionStage 或 Future,它们会生成 Cassandra BoundStatement 实例的列表,这些实例与偏移量更新一起在原子批量更新中执行。只要你的读取端事件处理程序的所有效果都被捕获在它产生的更新列表中,这确保了事件将被有效地处理一次:如果部分更新失败,它将自动重试。
如果您在事件处理程序中执行其他任何操作,您需要确保仅当您的事件处理程序成功时才会发生偏移量更新。事件处理程序返回的CompletionStage 或Future 必须仅在您的副作用完成后完成,并且应该传播您的操作的成功或失败。请注意,如果偏移量未更新,您的事件处理程序将被重试,因此如果您的事件处理程序与外部服务交互,例如,您需要确保它是幂等的。
您还应该了解最终一致性如何影响事物。 akka-persistence-cassandra configuration reference 有一些细节:
返回的事件流按偏移量(时间戳)排序,对应 与写入日志存储事件的顺序相同,但由于时钟偏差而不准确 不同节点之间。为多个返回相同的流元素(以相同的顺序) 尽最大努力执行查询。该查询使用 Cassandra Materialized 查询的视图最终是一致的,因此不同的查询可能会看到不同的 最新事件的事件,但最终结果将按时间戳排序 (Cassandra timeuuid 列)。为了补偿查询的最终一致性 延迟不读取最新事件,此延迟的持续时间由此定义 配置属性。
但是,这只是尽力而为,并且在网络分区的情况下 或其他可能延迟物化视图更新的事件可能是 以不同的顺序交付(不严格按其时间戳)。
重要的后果是,如果最终一致性的延迟比配置的最终一致性延迟长(可能是由于 Cassandra 节点之间的网络分区),那么就有可能发生事件“丢失”。读取端处理程序可能已经处理了较新的事件并在较旧的事件被传递到它正在读取的节点之前存储了它的偏移量。您可能需要相应地调整配置。
【讨论】: