我正在嘗試使用 spring boot(v2.2.6.RELEASE) 實作 AWS SQS FIFO 佇列。
在 aws 中創建了一個佇列“Testing.fifo”。創建佇列時將所有其他欄位保留為默認值。
我的生產者和消費者佇列運行在單個服務上。
將訊息放入佇列的代碼
private void sendMessageToSqsFiFo(String queueName, Object obj, String messageGroupId, String messageDeduplicationId) {
// TODO Auto-generated method stub
if (messageGroupId == null) {
// setting a default group
messageGroupId = "default_group_id";
}
if (messageDeduplicationId == null) {
// setting unique deduplication id for all messages
messageDeduplicationId = "sqs-fifo-deduplication-" UUID.randomUUID();
}
Map<String, Object> headers = new HashMap<>();
headers.put("message-group-id", messageGroupId);
headers.put("message-deduplication-id", messageDeduplicationId);
queueMessagingTemplate.convertAndSend(queueName, obj, headers);
System.out.println("Message sent to FIFO " queueName);
}
佇列偵聽器代碼
@SqsListener(value = "Testing.fifo", deletionPolicy = SqsMessageDeletionPolicy.NEVER)
private void getMessageFromgeneralQdasd(Map<String, String> msg, @Header("MessageId") String messageId, Acknowledgment ack) {
System.out.println("Message from FIFO: " msg.toString());
ack.acknowledge();
}
我在服務啟動時將一些訊息放入佇列
@EventListener(ApplicationReadyEvent.class)
public void doSomethingAfterStartup() {
System.out.println("hello world, I have just started up");
for(int i=0;i<25;i ) {
Map<String, String> data = new HashMap<String, String>();
data.put("message", i "th msg");
sendMessageToSqsFiFo("Testing.fifo", data, null, null);
}
}
我期待這樣的系統日志
Message from FIFO: {message=0th msg}
Message from FIFO: {message=1th msg}
Message from FIFO: {message=2th msg}
Message from FIFO: {message=3th msg}
......
Message from FIFO: {message=24th msg}
按照我將資料推送到佇列的順序
但我得到了
Message from FIFO: {message=0th msg}
Message from FIFO: {message=2th msg}
Message from FIFO: {message=3th msg}
Message from FIFO: {message=1th msg}
Message from FIFO: {message=4th msg}
Message from FIFO: {message=6th msg}
Message from FIFO: {message=7th msg}
Message from FIFO: {message=5th msg}
Message from FIFO: {message=8th msg}
Message from FIFO: {message=9th msg}
Message from FIFO: {message=10th msg}
Message from FIFO: {message=11th msg}
Message from FIFO: {message=12th msg}
Message from FIFO: {message=13th msg}
Message from FIFO: {message=14th msg}
Message from FIFO: {message=15th msg}
Message from FIFO: {message=16th msg}
Message from FIFO: {message=17th msg}
Message from FIFO: {message=19th msg}
Message from FIFO: {message=18th msg}
Message from FIFO: {message=20th msg}
Message from FIFO: {message=21th msg}
Message from FIFO: {message=22th msg}
Message from FIFO: {message=23th msg}
Message from FIFO: {message=24th msg}
我做錯了什么。?
使用依賴 aws-java-sdk 1.11.586
uj5u.com熱心網友回復:
這可能會有所幫助:訊息組 ID 用于按組對 SQS 訊息進行排序。
因此,如果您有多個組 ID,例如 1 和 2,那么在這些組中,SQS 訊息將始終按順序排列。將相對于組而不是整個佇列保留排序。
這可以用于以下情況:如果您為不同的用戶詳細資訊更新發送事件,您希望按順序對特定用戶的資料進行分組,同時您不關心佇列的排序作為一個整體。在這種情況下,您可以將組 ID 設定為唯一的用戶 ID。
如果沒有創建組的用例,并且只有一個組并且您希望將訊息順序作為一個整體保留,則只需對所有訊息使用相同的 groupID。
更多資訊:https : //docs.aws.amazon.com/AWSSimpleQueueService/latest/SQSDeveloperGuide/using-messagegroupid-property.html
uj5u.com熱心網友回復:
一個原因可能是您的 SQSListener在默認創建的執行緒池上運行。由于不同的執行緒從有序佇列中獲取訊息,但發布這一切都取決于執行緒調度,因此基本上您不能保證順序。如果在消費者端有多個執行緒處理,您可以獲得水平擴展的好處,但不能保證順序. 如果執行緒在執行緒池中是單個執行緒,那么它將是有序的。同樣,如果有多個消費者實體在運行(即使每個消費者都有單執行緒),也將無法保證順序。您可以通過在程式中列印線??程 id/name 來驗證這一點,這可以判斷是否有多個執行緒正在處理。
轉載請註明出處,本文鏈接:https://www.uj5u.com/ruanti/373302.html
標籤:亚马逊网络服务 弹簧靴 亚马逊-sqs aws-sqs-fifo
