【问题标题】:Auto Delete SQS queue自动删除 SQS 队列
【发布时间】:2018-06-21 11:39:51
【问题描述】:

有没有办法完全自动删除 SQS 队列。我有一个解决方案,其中服务器在启动时创建一个 SQS 并订阅 SNS 主题。

但是,可能存在服务器崩溃且无法恢复的情况。在这种情况下,我会用另一台服务器替换服务器,它会在启动时创建自己的队列。现在不再使用之前的队列了。

有没有办法让队列自动删除,我会明确地删除它(也许如果队列保持空 5 天,它会自动删除或其他替代方法)?

【问题讨论】:

  • 考虑使用 CloudFormation 部署您的 SQS 队列、SNS 主题、EC2 实例以及此工作负载所需的任何其他内容。当您决定启动新服务器时,因为您检测到旧服务器存在问题,只需删除旧 CloudFormation 堆栈并创建一个新堆栈即可。
  • 如果我正确理解您的答案:即使在这种情况下,我是否也不需要手动删除旧的 CloudFormation 堆栈。
  • 您已表明必须更换现有服务器。这大概是人工干预的明确决定。我是说用一个删除旧堆栈并创建一个新堆栈的进程替换该进程(一步)。如果您真的不想这样做,那么您可以在新的 EC2 实例上放置一个启动时脚本(在 userdata 中),它可以删除旧部署的残余(基于标签或其他方式来识别它需要删除)。
  • 另一种选择是使用 Auto Scaling 来确保您始终拥有一个并且只有一个健康的服务器。正确设置健康检查,Auto Scaling 将杀死不健康的服务器,并启动一个新服务器(使用相同的 SQS 队列和 SNS 主题)。将其包装在 CloudFormation 模板中以便于部署。不知道为什么要在每次启动 EC2 实例时创建一个新队列——您不会冒丢失消息的风险吗?
  • 自动集成测试是队列自我清理有用的一个例子。我的测试想在自己的沙箱中工作,但由于各种原因,测试结束时的清理代码并不总是运行。理想情况下,队列的配置会导致它们在合理的时间后过期,正如 OP 所建议的那样。

标签: amazon-web-services amazon-sqs


【解决方案1】:

没有自动删除队列的方法。您可以使用标签来标记已连接的资源(即在创建时使用其各自的实例 ID 标记队列或其他资源),并使用一个简单的脚本来读取所述标签并在该实例 ID 不存在时删除。

以下是如何在 cli 上执行此操作: https://docs.aws.amazon.com/cli/latest/reference/sqs/tag-queue.html

(我假设服务器是指 EC2 实例。也可以使用 IP)

【讨论】:

    【解决方案2】:

    目前,AWS SQS 不提供在队列为空一定天数时自动删除队列的机制。即使我觉得这是一个必要的功能。但是有一些方法可以解决这个问题。

    下面提到了根据您问题中的场景删除 AWS SQS 的几种方法。您可以选择最适合您的。

    1. 维护一个小型数据库表,用于保存服务器 IP 和队列 URL 之间的映射。当服务器自行启动时,您可以将值插入此表。维护一个将调用 LambdaCloudwatch 规则,该规则将检查表中的值以查看服务器是否正在运行(可能通过心跳)。如果特定服务器未运行,只需获取相关的SQS URL删除该特定队列。 (我在这里推荐了 Lambda,因为它很便宜)

    sqs.deleteQueue(new DeleteQueueRequest(myQueueUrl));

    1. 每当服务器启动时,它都可以使用 SNS 向具有服务器 IP 和 SQS URL 的人发送 电子邮件。使用 CloudWatch 规则,不时调用 Lambda,获取所有实例,并检查是否有任何实例停机。如果某个实例已关闭,请使用 SNS 向相关人员发送一封电子邮件,告知此服务器已关闭。它是半自动的,用户可以在看到邮件后手动删除队列。

    2. 让 Empty 队列独立存在。在 AWS 中可以创建多少个队列没有限制。那么,如果该过程很困难,为什么还要麻烦删除它们。只需创建新队列即可。 (见:No Max number of SQS Queue Limitation

    【讨论】:

      猜你喜欢
      • 2015-04-23
      • 2020-03-24
      • 2022-01-20
      • 1970-01-01
      • 1970-01-01
      • 2016-04-29
      • 1970-01-01
      • 2020-12-30
      • 2015-12-14
      相关资源
      最近更新 更多