【问题标题】:Get number of messages in an Amazon SQS Queue获取 Amazon SQS 队列中的消息数
【发布时间】:2014-10-10 15:34:07
【问题描述】:

只是一个简单的问题,但我无法找到答案。

是否可以使用 API 来获取 AWS SQS 队列的队列大小(等待处理的消息/作业的数量)?

最好使用 cURL 或 PHP SDK。

【问题讨论】:

标签: php amazon-web-services amazon-sqs


【解决方案1】:

对于PHP,试试这个,

        $sqsClient = new  SqsClient([
            'region' => env('AWS_REGION'),
            'version' => '2012-11-05',
            'credentials' => [
                'key'    => env('AWS_ACCESS_KEY'),
                'secret' => env('AWS_SECRET_KEY'),
            ],
        ]);

        $sqs = new SqsQueue($sqsClient,null,null);
        $size = $sqs->size(env('AWS_SQS_URL'));

        echo $size;

【讨论】:

    【解决方案2】:

    还有一些代码示例:

    aws sqs get-queue-attributes --queue-url https://sqs.<region>.amazonaws.com/<accountId>/<SQS name> --attribute-names All
    
    
    {
        "Attributes": {
            "QueueArn": "arn:aws:sqs:<region>:<accountId>:<SQS name>",
            "ApproximateNumberOfMessages": "0",
            "ApproximateNumberOfMessagesNotVisible": "3",
            "ApproximateNumberOfMessagesDelayed": "0",
            "CreatedTimestamp": "1594729555",
            "LastModifiedTimestamp": "1595845586",
            "VisibilityTimeout": "60",
            "MaximumMessageSize": "262144",
            "MessageRetentionPeriod": "900",
            "DelaySeconds": "0",
            "RedrivePolicy": "{\"deadLetterTargetArn\":\"arn:aws:sqs:<region>:<accountId>:<DLQ name>\",\"maxReceiveCount\":3}",
            "ReceiveMessageWaitTimeSeconds": "0"
        }
    }
    

    获取已定义属性的值:

     aws sqs get-queue-attributes --queue-url https://sqs.<region>.amazonaws.com/<accountId>/<SQS name> --attribute-names VisibilityTimeout ApproximateNumberOfMessages ApproximateNumberOfMessagesNotVisible ApproximateNumberOfMessagesDelayed
    
    {
        "Attributes": {
            "VisibilityTimeout": "60",
            "ApproximateNumberOfMessages": "0",
            "ApproximateNumberOfMessagesNotVisible": "3",
            "ApproximateNumberOfMessagesDelayed": "0"
        }
    }
    

    警告

    ApproximateNumberOfMessagesDelayed 、 ApproximateNumberOfMessagesNotVisible 和 ApproximateNumberOfMessagesVisible 指标可能要在生产者停止发送消息后至少 1 分钟才能实现一致性。队列元数据需要这段时间才能达到最终的一致性。

    【讨论】:

      【解决方案3】:

      使用 PHP:

      putenv('AWS_ACCESS_TOKEN=xxxx');
      putenv('AWS_ACCESS_TOKEN_SECRET=xxxx'); 
      
      $sqs = new \Aws\Sqs\SqsClient([
          'profile' => 'default',
          'region' => 'REGION',
          'version' => 'latest'
      ]);
      
      $queueUrl = 'https://sqs.REGION.amazonaws.com/xxxxxxxx/queue-name';
      
      $x = $sqs->getQueueAttributes([
          'QueueUrl' => $queueUrl, 
          'AttributeNames' => ['All']
      ]);
      
      echo json_encode($x->toArray(), JSON_PRETTY_PRINT);
      

      会输出一些类似的东西:

      {
          "Attributes": {
              "QueueArn": "arn:aws:sqs:REGION:xxxxxxx:queue-name",
              "ApproximateNumberOfMessages": "0",
              "ApproximateNumberOfMessagesNotVisible": "0",
              "ApproximateNumberOfMessagesDelayed": "0",
              "CreatedTimestamp": "1587472818",
              "LastModifiedTimestamp": "1587473783",
              "VisibilityTimeout": "30",
              "MaximumMessageSize": "262144",
              "MessageRetentionPeriod": "345600",
              "DelaySeconds": "0",
              "ReceiveMessageWaitTimeSeconds": "0",
              "KmsMasterKeyId": "alias\/aws\/sqs",
              "KmsDataKeyReusePeriodSeconds": "300",
              "FifoQueue": "true",
              "ContentBasedDeduplication": "false"
          },
          "@metadata": {
             ....
          }
      }
      

      【讨论】:

        【解决方案4】:

        您可以检索Attributes of the Queue 并查找相关属性(请参阅此link)。您可能想查看以下两个属性。

        ApproximateNumberOfMessages - 返回可见的近似数量 队列中的消息

        ApproximateNumberOfMessagesNotVisible - 返回未超时且未删除的消息的大致数量。

        如果要包含等待添加的消息,也可以考虑以下属性。

        ApproximateNumberOfMessagesDelayed - 返回大约 等待添加到队列中的消息。

        最后对以上属性返回的值进行求和,得到当前队列的大小。

        【讨论】:

        • 这些值是相对较快还是实时更新的?关于入队/出队后更新值的延迟有什么想法吗?
        【解决方案5】:

        我相信您正在寻找的是get-queue-attributes,可能是在询问 ApproximateNumberOfMessages 属性。

        【讨论】:

        • 也可用于 PHP 的 AWS 开发工具包:docs.aws.amazon.com/aws-sdk-php/latest/…
        • "ApproximateNumberOfMessages" 是一个好方法。但如果有多个消费者从队列中消费,这可能是不准确的。
        • 这个值是相对较快还是实时更新的?关于在入队/出队后更新此值的延迟有什么想法吗?
        猜你喜欢
        • 1970-01-01
        • 2013-10-17
        • 1970-01-01
        • 2019-12-31
        • 2016-07-01
        • 2012-11-15
        • 2018-08-29
        • 2017-02-07
        • 1970-01-01
        相关资源
        最近更新 更多