确保对数据库和 SQS 的调用都成功

Posted

技术标签:

【中文标题】确保对数据库和 SQS 的调用都成功【英文标题】:Ensure both calls to database and SQS succeed 【发布时间】:2022-01-08 12:29:35 【问题描述】:

基本上,我要做的是将数据发送到 RDS mysql 数据库,并将消息发送到应用层中的 SQS 队列,并确保它们都成功。

流程如下:当用户请求 API 时,调用 lambda 函数将数据插入数据库,并向 SQS 队列发送消息,由另一个 lambda 函数拉取,然后将相同的数据发送到 elasticsearch。我在这里使用 SQS 队列来处理重试等。

为了确保这个流程正常工作,我只需要,否则整个事情都会失败。例如如果数据库成功并且对 SQS 队列的调用失败,则数据将不会进入 elasticsearch,因此它们应该同时成功或失败。

任何想法如何做到这一点?

【问题讨论】:

【参考方案1】:

一旦将消息发送到 Amazon SQS 队列,您就无法“撤消”它。因此,我会建议:

将数据插入到数据库中 如果失败,请重试几次 如果所有重试均失败,则退出并返回 FAIL 状态 发送消息到 SQS 如果失败,请重试几次 如果所有重试都失败,则反向插入数据库退出并返回 FAIL 状态 返回成功状态

【讨论】:

但是如果 SQS 出现故障,即使是数据库,一切都会失败,从解耦的角度来看,这是一件好事吗? 如果 SQS 失败,我的建议是反向插入数据库作为“回滚”机制。顺便说一句,在 AWS 的 10 多年历史中,我认为您不会发现 SQS 失败了(至少,不是单独失败 - 如果出现区域范围的问题,它可能会失败)。到达 AWS 可能会出现网络故障,但 AWS 内部的实际故障非常罕见。 根据您的经验,您认为将数据发送到数据库并将消息发送到 SQS 更好(最终会将相同的数据发送到 elasticsearch)或者可能将数据发送到数据库然后直接发送到 elasticsearch仅当弹性搜索失败时,我才会将其发送到 SQS?

以上是关于确保对数据库和 SQS 的调用都成功的主要内容,如果未能解决你的问题,请参考以下文章

SQS DeleteMessage阻止并且不返回响应

作为 SQS 事件处理程序的 Lambda 函数未运行部分代码并成功完成

AWS Cognito Post-Confirmation [已结束]

AWS Beanstalk:SQS 的指数退避?

AWS Lambda 在向 SQS 发送消息之前完成

MongoDB - 如何确保多次更新都成功?