0

只是想知道从持久事件源演员到 lagom 中的读取处理器的事件通知传递的保证,对于将更新查询端的读取处理器的事件通知是否存在或没有消息持久性?

我知道最终的一致性很好,但我正在谈论对 Cassandra 读取处理器的事件处理程序通知。

4

1 回答 1

3

通过在持久实体中使用事件源和在读取端处理中使用偏移跟踪来保证事件处理。

当您的持久化实体命令处理程序持久化事件时,每个事件都以有序的“偏移量”存储。

读取端处理器通过轮询数据库以查找偏移量大于已处理的最后一个偏移量的事件来工作。因为所有事件和每个读取端处理器的最新偏移量都保存在数据库中,这样可以确保即使读取端处理器崩溃并重新启动也不会丢失事件。

Lagom 的 Cassandra 读取端处理器返回一个CompletionStageor Future,它产生一个 CassandraBoundStatement实例列表,这些实例与偏移量更新一起在原子批量更新中执行。只要您的读取端事件处理程序的所有效果都被捕获在它产生的更新列表中,这将确保事件将被有效地处理一次:如果部分更新失败,它将自动重试。

如果您在事件处理程序中执行任何其他操作,则需要确保仅当您的事件处理程序成功时才会发生偏移量更新。或事件处理程序返回必须仅在您的副作用完成后完成,并且应该传播您的操作的成功或失败CompletionStageFuture请注意,如果偏移量未更新,您的事件处理程序将被重试,因此如果您的事件处理程序与外部服务交互,例如,您需要确保它是幂等的。

您还应该了解最终一致性如何影响事物。配置akka-persistence-cassandra 参考有一些细节:

返回的事件流按偏移量(时间戳)排序,这与写入日志存储事件的顺序相对应,但由于不同节点之间的时钟偏差而导致不准确。在尽力而为的基础上,为查询的多次执行返回相同的流元素(以相同的顺序)。该查询使用 Cassandra Materialized View 进行查询,并且最终是一致的,因此不同的查询可能会看到最新事件的不同事件,但最终结果将按时间戳排序(Cassandra timeuuid 列)。为了补偿查询延迟到不读取最新事件的最终一致性,此延迟的持续时间由此配置属性定义。

但是,这只是尽力而为,在网络分区或其他可能延迟物化视图更新的情况下,事件可能会以不同的顺序传递(不严格按其时间戳)。

重要的后果是,如果最终一致性的延迟比配置的最终一致性延迟长(可能是由于 Cassandra 节点之间的网络分区),那么就有可能发生事件“丢失”。读取端处理程序可能已经处理了较新的事件并在较旧的事件被传递到它正在读取的节点之前存储了它的偏移量。您可能需要相应地调整配置。

于 2017-02-20T00:22:14.737 回答