您可以在 Lambda 中使用 akka-persistence 进行事件溯源,如果您对(一些可配置的)最终一致性很好并且愿意也应用CQRS。
这样的设置如何?
您将拥有(1 个或更多)创建n 个 lambda 实例的lambda 函数(我们称它们为 QUERY-Lambda;其中 n 基本上是无限的或受您帐户中可用的并发限制的限制)能够处理您的读取端(处理通过阅读日志/快照存储然后回答查询),最大。每个聚合处理写入操作的 lambda 实例(使用 lambda 配置中的并发参数确保这一点)(我们称它们为 COMMAND-Lambda)。这对于确保期刊不会因为有多个参与者写信而被破坏很重要。
根据您的一致性保证,确保在处理查询后立即停止 QUERY-Lambdas 中的参与者,或者将接收超时设置为符合您的一致性保证的值,因为知道多个参与者可能会给您一个不同的状态.
如果您有 CRUD 操作,请确保在应用更改之前向用户显示当前状态的读取操作(例如,在更新之前在表单中显示客户对象的当前值)也由 WRITE-Lambda 处理,因此您可以确保您正在更改的状态是最后一个可用状态。
您不必为此创建多个 jar 文件,您可以简单地将同一个 jar 文件部署为多个 lambda 函数。您需要确保在您的 API 网关中,更改状态的请求被路由到 WRITE-Lambda(s),而那些一致性不那么重要的请求被路由到 READ-Lambda(s)。
还要确保在重放日志时不创建快照,而仅在执行命令处理时创建(因为 READ-Lambdas 也在重放日志,因此如果它们创建快照可能会破坏您的状态)
为了获得最佳性能,请在每个更改状态的命令之后或至少在关闭 actor 之前创建一个快照,这样下一次调用将必须进行最少的读取。AFAIK Java 中的 Lambda 也会在一段合理的时间内保持活跃,所以冷重启应该不是什么大问题。如果它们适合你,请创建一些每 5-10 分钟调用 lambda 的 cron 以使其保持活动状态。或者,您可以使用https://doc.akka.io/docs/alpakka/current/awslambda.html简单地每 x 分钟向自己发送一个请求。您可以使用Source.tick(3 minutes)
然后调用您的 WRITE-Lambda 函数,如图所示在 Alpakka 文档中。
还要确保您需要与两个聚合(Saga / Coordinator)对话的操作由相同的 WRITE-Lambda 处理。这可能会成为瓶颈,但当然您仍然可以通过 API 网关中的路由应用某种分片。它只是比拥有一个普通的 Akka 集群更努力。
如果有不清楚的地方,请发表评论,我会尽力回答。