我们假设以下情况:
有一个后端服务,它具有用于“插入”、“更新”和“删除”请求的 CRUD 端点。
每个端点更新关系数据库,然后立即向 SQS(或 Kinesis)发送数据修改消息。
SQS 已配置为 FIFO,即记录将按照交付时的顺序被消耗,并且不会出现重复。而且 Kinesis 无论如何都是 FIFO 的。
现在假设三个请求按顺序到达。
id=5
创建一条记录,然后将插入事件发送到SQSid=5
更新记录,然后将更新事件发送到SQSid=5
的记录,然后将删除事件发送到SQS我们还假设
request 1
在插入记录后立即被另一个任务抢占,例如被垃圾收集器抢占。
因此,插入事件最后到达 SQS,尽管按时间顺序最先执行(因此交付顺序为
update
,然后是 delete
,然后是 insert
)。
我的问题是,如何保证传递顺序与数据修改查询的实际顺序相同(在我的例子中,
insert
,后跟update
,后跟delete
)?
查看 AWS Prescriptive Guidance 中的事务发件箱模式 https://docs.aws.amazon.com/prescriptive-guidance/latest/cloud-design-patterns/transactional-outbox.html
为了保证消息到 Amazon SQS(或 Kinesis)的传递顺序与数据库修改的实际顺序匹配,您可以实现发件箱模式。我们在我们的一个项目中考虑过这一点,并认为这是一种矫枉过正,但这似乎解决了订单问题