【问题标题】:Efficient way to check whether SQS queue is empty检查SQS队列是否为空的有效方法
【发布时间】:2016-05-10 17:03:47
【问题描述】:

我有一个SQS Queue,多个主机从中读取消息。在处理完队列中的所有消息后,我想运行一些工作(业务逻辑)。

如何检查队列是否为空?

是的,我可以检查 ApproximateNumberOfMessagesApproximateNumberOfMessagesNotVisible 队列属性,但这些是近似数字。当没有消息时,我想停止我的主机轮询队列中的消息,然后运行所需的作业。

有什么想法吗?谢谢

【问题讨论】:

    标签: amazon-web-services amazon-sqs


    【解决方案1】:

    您可以在轮询时简单地记下来自 API 响应的空接收。关于 CloudWatch,还有另一个更适合此的指标。来自documentation

    NumberOfEmptyReceives

    未返回消息的 ReceiveMessage API 调用数。

    单位:计数

    有效统计:平均值、最小值、最大值、总和、数据样本 (在 Amazon SQS 控制台中显示为 Sample Count)

    一些附加信息:

    • 此指标仅每 5 分钟填充一次。如果您根据此指标设置警报,这意味着您的最短时间应为 5 分钟。
    • 对于您的用例来说,总和是最合理的统计数据。如果 NumberOfEmptyReceives > 0,则您的轮询作业检查了队列并且没有收到任何消息。

    我个人使用此指标设置了一个 cloudwatch 警报,该警报将在 NumberOfEmptyReceives > 0 的总和连续几个周期后缩减托管我的轮询作业的自动缩放组。我喜欢做连续的时间段,因为这样可以更清楚地表明队列不仅是空的,而且一直是空的。

    【讨论】:

    • 嗨,我现在使用ReceiveMessageRequestApproximateNumberOfMessagesApproximateNumberOfMessagesNotVisible 的输出组合以及长轮询来确定队列是否为空。如果ReceiveMessageRequest的结果是null&&ApproximateNumberOfMessages == 0&&ApproximateNumberOfMessagesNotVisible==0,那么我能确定队列中不会有消息吗?
    • 这样想。 ApproximateNumberOfMessagesNotVisible 对此可能不是很有用; CloudWatch 采样的同一实例中可能存在正在传输的消息,并为您提供队列深度的误报。对于 cloudwatch 指标,请确保您在多个时间段内进行抽样,以验证队列实际上是空的,并且不仅仅是侥幸或 CloudWatch 服务错误。
    【解决方案2】:

    您可以在与队列深度相关的云观察指标上触发您的帖子业务逻辑。当深度为 0 时,您可以发送 SNS 通知或启动 lambda 函数。

    此外,此云监视指标优于其他指标,因为这是 sqs 服务报告的实际消息计数。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2011-12-19
      • 2019-12-02
      • 1970-01-01
      • 2021-02-01
      • 2012-09-14
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多