簡體   English   中英

Amazon SQS 中的消息數

[英]Number of messages in Amazon SQS

我正在嘗試學習 Amazon SQS。 我正在向我的 SQS 發送多個消息請求,例如

    sendMessage(sqs, qUrl, "message 1");
    sendMessage(sqs, qUrl, "message 2");
    sendMessage(sqs, qUrl, "message 3");
    sendMessage(sqs, qUrl, "message 4");
    sendMessage(sqs, qUrl, "message 5");

注意:我傳的參數中, sqsqUrl都是一樣的。

//發送消息方法:

public void sendMessage(AmazonSQS sqs, String queueUrl, String msg){
        SendMessageRequest smr = new SendMessageRequest(queueUrl, msg);
        sqs.sendMessage(smr);
    }

但是當我嘗試計算隊列中的 numberOfRequests 時,它仍然是 1 而不是 5。

public int countRequests(AmazonSQS sqs, String queueUrl){
        // Receive messages
        int numberOfMessages=0;
        System.out.println("Receiving messages");
        ReceiveMessageRequest receiveMessageRequest = new ReceiveMessageRequest(queueUrl);
        messages = sqs.receiveMessage(receiveMessageRequest).getMessages();
        for (Message message : messages) {
            numberOfMessages++;
            System.out.println("  Message");
            System.out.println("    MessageId:     " + message.getMessageId());
            System.out.println("    ReceiptHandle: " + message.getReceiptHandle());
            System.out.println("    MD5OfBody:     " + message.getMD5OfBody());
            System.out.println("    Body:          " + message.getBody());
            for (Entry<String, String> entry : message.getAttributes().entrySet()) {
                System.out.println("  Attribute");
                System.out.println("    Name:  " + entry.getKey());
                System.out.println("    Value: " + entry.getValue());
            }
        }
        return numberOfMessages;
    }

在這里

ReceiveMessageRequest receiveMessageRequest = new ReceiveMessageRequest(queueUrl);
  messages = sqs.receiveMessage(receiveMessageRequest).getMessages();

“消息”僅接收最后一條消息,而不接收前 4 條消息。

我的理解是我的隊列中應該有 5 個消息請求。 我錯過了什么? 還是我理解錯了? 請糾正我。

默認情況下,ReceiveMessage 只會檢索一條消息。 您可以傳入 MaxNumberOfMessages 選項以在一次調用中檢索多條消息。

但是,請注意,即使您已將 5 條消息寫入隊列,即使您將 MaxNumberOfMessages 設置為最大值 10,您也可能無法通過單個 ReceiveMessage 調用將它們全部取回。這是因為 SQS 實現的方式保證送達 - 系統實際上會在許多服務器上存儲您的郵件的許多副本,以確保即使服務器出現故障,您的郵件仍能通過。 您發布的每條消息都必須在 SQS 系統內跨多個服務器進行復制,並且這種復制不是即時的。 這就是為什么消息可能無序到達,為什么 ApproximateNumberOfMessages 是近似值,以及為什么 receiveMessage 可能不會總是返回與您期望的一樣多的消息。 這起初是違反直覺的,但如果您設計合適的系統,在實踐中對於許多用例並不重要,這就是 SQS 能夠提供如此高的可用性和可擴展性的方式。

如果您重復調用 receiveMessage,您將收到所有消息。

receiveMessage返回的消息數量是不確定的 - 要獲得更可靠的隊列大小計數,請使用getQueueAttributes並請求ApproximateNumberOfMessages 在此調用之前插入一小段延遲,以便給隊列時間來處理您發送的消息。

下面給出了總數:

['ApproximateNumberOfMessages']+['ApproximateNumberOfMessagesDelayed']+['ApproximateNumberOfMessagesNotVisible'];

您可以從 PHP 中的$messageData->get('Attributes')數組中獲取

var AWS = require('aws-sdk');

// Set the region 
AWS.config.update({
  region: 'REGION'
});

// Create the SQS service object
var sqs = new AWS.SQS({
    apiVersion: '2012-11-05'
});

// Set params
var params = {
    QueueUrl: queueURL,
    AttributeNames : ['ApproximateNumberOfMessages'],
};

sqs.getQueueAttributes(queParams, function(err, data){
    if (err) {
        console.log("Error", err);
    } else {
        console.log(data);
    }
 });

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM