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

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

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

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

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

【问题讨论】:

    标签: amazon-web-services aws-lambda amazon-rds amazon-sqs


    【解决方案1】:

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

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

    【讨论】:

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