【发布时间】:2020-09-20 08:55:52
【问题描述】:
我正在使用 CQRS 模式实现微服务架构。我有一个使用 API Gateway、Lambda 和 DynamoDB 的有效实现,但有一个例外 - 事件溯源。
事件溯源让应用程序将通知发布到平台中的其他服务可以使用的事件流。此通知表示作为原始 HTTP 请求的一部分发生的事件。例如,如果用户使用完整的“将患者送入医院”模型进行 HTTP POST,则 Lambda 将分解该模型并按顺序发布多个事件。
患者登记(包括患者 ID、医院 ID + 就诊 ID)
房间分配(包括房间号,+访问ID)
已测试患者(包括已测试 + 就诊 ID)
患者结账(就诊 ID)
此模式的目的是提供对患者住院期间发生的所有事件的审计跟踪。这个示例(不是我实际构建的)将存储在可以随时重放的事件源中。如果在所有服务中都删除了 VisitId,我们可以一次重播一个事件,并按顺序复制原始记录的精确副本。您认为所有记录都是不可变的以实现这一点。每个 POST 都会推入事件源,然后进入数据库,在 HTTP GET 请求期间将数据拉出。它还会有订阅者获取这些数据片段并做其他事情 - 例如“访问调查”服务,该服务将听取患者结账事件并准备术后调查。
我查看了几个 AWS 服务来提供此功能。我知道 Kinesis Data Streams,但我不喜欢定价结构,也不想处理分片(无自动缩放)。由于我的整个平台是建立在基于消费的定价(Dynamo、Lambda 等)之上的,我希望以相同的方式保持我的事件源。这让我可以更轻松地估算每位用户的成本,因为我只是根据每位用户每月的预估请求数进行数学运算。
我一直在将 SNS 用于流本身,传递通知,这很棒。超级快,在开发时没有任何重大问题。但问题是这不适合重播存储 - 仅传递事件消息。对于回放商店,我认为 Kinesis Firehose 很有意义......同时将其发送到 S3 + SNS。事实证明,SNS 不是可用的交付目的地。我可以自己放入 S3,然后发布到 SNS,但这似乎是代码库中的重复工作,因为我可以设置 S3 触发器来触发 Lambda,并且只有另一个小 Lambda 对 S3 中的事件着陆做出反应并执行插入进入 DynamoDB。我已经看到这可能比仅通过 SNS 发布要慢得多。我也不确定 Put 事件的重试策略。这简化了重试,因为我可以重复使用触发的 Lambda 中的代码来重播存储桶路径中的所有事件。
我可以只使用 PutObject,然后在同一个 HTTP POST Lambda 中发布到 SNS。如果 SNS 发布失败,那么我现在在 S3 中有一个从未发布过的对象。我必须编写一个不同的 Lambda 来处理修复和发布。不是世界末日——不管怎样,我都有两个 Lambda 可以部署。我只是不确定在 AWS 服务的这种模式中哪种方式更有意义。
有没有人做过类似的事情并有什么建议?我是否正在努力进入一个以后难以管理的技术漏洞?如果我可以保持基于消费的定价模型,我也愿意接受其他途径。谢谢!
【问题讨论】:
标签: amazon-s3 microservices amazon-sns cqrs event-sourcing