【InfoQ】Zocdoc 的事件驱动架构实践( 五 )


另一个缺点是使用服务必须检测和处理无序、重复或丢失的事件 。 虽然 DynamoDB 流结合 Lambda、SNS 和 SQS 可以在很大程度上缓解这些问题 , 但是仍然存在差距(特别是因为 SNS 目前不支持将消息转发到 SQS FIFO 队列) 。
其他可选方法
如果你特别关注最终一致性 , 那么你可以采用另一种方法 。 与使用 Lambda 侦听 DynamoDB 流并更新投影表不同 , 你可以在接收请求时以事务方式同时写入事件存储和状态表 , 从而消除读取存储更新的任何延迟 。 这是事务性发件箱模式和事件源模式的混合 , 后者提供了额外的好处 , 允许你在持久化任何更改之前使用状态表验证命令 。
虽然 DynamoDB 确实提供了 API 以事务方式更新多个表 , 但是你必须使用它们的底层 API , 而不是更流畅的文档或对象持久性模型 。 使用这种方法 , 还会失去读写独立伸缩的能力 , 并可能增加写 API 的整体延迟 。 因此我们发现 , 更好的方法是使用 CQRS 方法 , 但是在将来可能会考虑转向其他方法(特别是当 AWS SDK 开始使用对象持久性 API 支持多个事务时) 。
【InfoQ】Zocdoc 的事件驱动架构实践
本文插图

还有其他解决最终一致性的方法 , 它们也可能适合你的用例 , 这取决于你的需要 , 比如维护数据的内存缓存和在读取期间检查事件存储 。
小结
事件驱动架构是分离微服务并获得更好的可伸缩性的最佳选择 。 在设计事件驱动的系统时 , 我们需要对导致域实体更改的事件建模 , 并自动将它们发布到事件流 。 在 AWS 中 , DynamoDB 流为我们提供了一种很好的方式来实现这一点 。
当我们希望永远保留这些事件并将它们用作事实来源时 , 我们可以采用事件源模式 。 在此模式中 , 事件被持久化到充当记录系统的事件存储中 。 它通常与 CQRS 模式结合使用 , 从存储的事件创建物化视图 。 虽然这种方法有几个好处 , 比如完全可重放性、可审计性和原子性 , 但它不是银弹 。 你最终会创建更复杂的系统 , 并被迫处理最终一致性 。
关于作者
Anwesha Das 是 Zocdoc 提供商团队的一名工程师 。 此前 , 她曾在金融行业开发实时交易应用程序 。 她有物理学背景 , 对云计算、系统架构和数据工程有着浓厚的兴趣 。
InfoQ 读者交流群上线啦!各位小伙伴可以扫描下方二维码 , 添加 InfoQ 小助手 , 回复关键字“ 进群 ”申请入群 。 大家可以和 InfoQ 读者一起畅所欲言 , 和编辑们零距离接触 , 超值的技术礼包等你领取, 还有超值活动等你参加 , 快来加入我们吧!
点个在看少个 bug


推荐阅读