我們計劃使用AWS SQS服務對從Web服務創建的事件進行排隊,然後使用多個工作人員來處理這些事件。一個事件只能處理一次。根據AWS SQS文檔,AWS SQS標準隊列可以「偶爾」產生重複消息,但吞吐量無限。 AWS SQS FIFO隊列不會產生重複消息,但吞吐量限制爲每秒300個API調用(batchSize = 10,相當於每秒3000條消息)。我們目前的高峯時間流量僅爲每秒80條消息。所以,就吞吐量要求而言,這兩者都很好。但是,當我開始使用AWS SQS FIFO隊列時,發現我需要做額外的工作,如提供額外的參數 「MessageGroupId」和「MessageDeduplicationId」或需要啓用「ContentBasedDeduplication」設置。所以,我不確定哪一個是更好的解決方案。我們只需要不重複的消息。我們不需要該消息是FIFO。AWS SQS標準隊列或FIFO隊列何時不能重複消息?
解決方案#1: 使用AWS SQS FIFO隊列。對於每條消息,需要爲「MessageGroupId」和「MessageDeduplicationId」參數生成一個UUID。
解決方案#2: 使用啓用了「ContentBasedDeduplcation」的AWS SQS FIFO隊列。對於每條消息,都需要爲「MessageGroupId」生成一個UUID。
解決方案3: 對AWS ElasticCache(Redis或Memcached)使用AWS SQS標準隊列。對於每條消息,「MessageId」字段將被保存在緩存服務器中,並在稍後檢查是否有重複。存在意味着這條消息已被處理。 (順便提一下,緩存服務器中應該存在多長時間的「MessageId」,AWS SQS文檔中沒有提到可以複製多少信息)
我不確定其中哪些「更好」。最簡單的肯定是使用啓用了ContentBasedDeduplcation的FIFO隊列。選擇你最喜歡的解決方案。 –
帶FIFO的SQS保證在特定的時間範圍內(大概5分鐘)沒有重複的消息,所以如果有重複的條目到達那裏,您將得到重複的消息。 所以你需要解決這個與設計。 –
生產者(網絡服務)通常在幾百毫秒內完成。那麼,5分鐘就夠了嗎?基本上,我試圖看看在代碼邏輯/緩存服務器中執行「DeDuplication」還是依靠FIFO隊列更好? – Raymond