[英]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");
注意:我傳的參數中, sqs和qUrl都是一樣的。
//發送消息方法:
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.