2017-09-26 207 views
2

我們計劃使用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文檔中沒有提到可以複製多少信息)

+0

我不確定其中哪些「更好」。最簡單的肯定是使用啓用了ContentBasedDeduplcation的FIFO隊列。選擇你最喜歡的解決方案。 –

+0

帶FIFO的SQS保證在特定的時間範圍內(大概5分鐘)沒有重複的消息,所以如果有重複的條目到達那裏,您將得到重複的消息。 所以你需要解決這個與設計。 –

+0

生產者(網絡服務)通常在幾百毫秒內完成。那麼,5分鐘就夠了嗎?基本上,我試圖看看在代碼邏輯/緩存服務器中執行「DeDuplication」還是依靠FIFO隊列更好? – Raymond

回答

0

您正在使您的系統變得複雜的SQS。

我們已經轉移到Kinesis Streams,它的工作完美無瑕。下面是我們已經看到了好處,

  1. 活動
  2. 觸發時,數據顯示在流
  3. 交付批量
  4. 把責任處理錯誤給接收事件的順序
  5. 圍棋隨着時間的推移發生問題 Buggier實施過程
  6. 性能比SQS更高

希望它有幫助。

+0

感謝您的快速響應。 Kinesis Streams看起來很有趣。但是,在我們的簡單情況下,我們只是使用SQS作爲離線批處理的緩衝區,因爲我們無法儘快處理所有請求(有幾個第三方api調用)。對於簡單的用例和成本,SQS似乎更適合[鏈接](https://stackoverflow.com/questions/26623673/why-should-i-use-amazon-kinesis-and-not-sns-sqs)。除此之外,Kinesis也有重複的記錄問題[鏈接](http://docs.aws.amazon.com/streams/latest/dev/kinesis-record-processor-duplicates.html) – Raymond

0
  • 我的第一個問題是,爲什麼它是如此重要,你不會得到重複的消息?一個理想的解決方案是使用標準隊列並設計你的工作人員是冪等的。例如,如果消息包含類似任務ID的內容並將已完成的任務的結果存儲在數據庫中,請忽略那些已在數據庫中存在其任務ID的人。
  • 請勿使用收據處理來處理應用程序重複數據刪除,因爲每次收到消息時都會發生更改。換句話說,SQS不保證重複消息的相同收據處理。
  • 如果你堅持重複數據刪除,那麼你的要使用FIFO隊列。