簡體   English   中英

將 Amazon SQS 與多個使用者一起使用

[英]Using Amazon SQS with multiple consumers

我有一個基於服務的應用程序,它使用具有多個隊列和多個使用者的 Amazon SQS。 我這樣做是為了實現基於事件的架構並解耦所有服務,其中不同的服務對其他系統的狀態變化做出反應。 例如:

  • 注冊服務
    • 當新用戶注冊時發出事件“registration-new”。
  • 用戶服務
    • 當用戶更新時發出事件 'user-updated'。
  • 搜索服務
    • 從隊列 'registration-new' 中讀取並在搜索中索引用戶。
    • 從隊列“用戶更新”中讀取並更新搜索中的用戶。
  • 指標服務
    • 從“注冊新”隊列中讀取並發送到 Mixpanel。
    • 從隊列“用戶更新”中讀取並發送到 Mixpanel。

我有很多問題:

  • 進行輪詢時可以多次收到一條消息。 我可以將很多系統設計為冪等的,但是對於某些服務(例如指標服務)來說,這會困難得多。
  • 在 SQS 中需要手動從隊列中刪除一條消息。 我想過實現一個“消息處理服務”,當所有服務都收到消息時處理消息的刪除(每個服務在處理消息后都會發出“消息確認”事件)。

我想我的問題是:我應該使用什么模式來確保 SQS 中的單個隊列可以有多個使用者,同時確保消息也能可靠地傳遞和刪除。 感謝您的幫助。

我認為你做錯了。

在我看來,您正在使用相同的隊列來做多種不同的事情。 您最好將單個隊列用於單一目的。

而不是將事件放入“注冊新”隊列,然后讓兩個不同的服務輪詢該隊列,並且兩者都需要讀取該消息並對其進行不同的處理(然后需要一個應該刪除該消息的第三個進程在其他 2 個處理后的消息)。

一個隊列應該用於一個目的。

  • 創建一個“index-user-search”隊列和一個“send to mixpanels”隊列,以便搜索服務從搜索隊列中讀取、索引用戶並立即刪除消息。

  • mixpanel-service 從 mix-panels 隊列中讀取,處理
    消息並刪除該消息。

注冊服務不再向單個隊列發送“registration-new”,現在將其發送到兩個隊列。

為了更好地邁出一步,在此處添加 SNS 並讓注冊服務向“注冊新”主題(不是隊列)發送 SNS 消息,然后將我上面提到的兩個隊列訂閱到該主題“扇出”模式。

https://aws.amazon.com/blogs/aws/queues-and-notifications-now-best-friends/

兩個隊列都將接收消息,但您只將其加載到 SNS 中一次 - 如果接下來第三個不相關的服務也需要處理“注冊新”事件,您可以創建另一個隊列並將其訂閱到該主題 - 它可以在不依賴或不了解其他服務正在做什么的情況下運行 - 這就是目標。

隊列的多個消費者的主要用例是橫向擴展

允許多個消費者的機制是Visibility Timeout ,它使消費者有時間處理和刪除消息,而不會被另一個消費者同時消費。

為了解決標准隊列的“至少一次交付”屬性,消費服務應該是冪等的 如果這不可能,一種可能的解決方案是使用FIFO 隊列,但這種模式的消息傳遞率有限,並且與 SNS 訂閱不兼容

他們甚至有關於如何使用 SNS+SQS 組合創建扇出場景的教程。

https://aws.amazon.com/getting-started/tutorials/send-fanout-event-notifications/

太糟糕了,它不支持 FIFO 隊列,因此您必須小心處理亂序消息。

如果他們有一個一致的散列解決方案,在尊重消息順序的同時擁有多個競爭消費者,那就太好了。

暫無
暫無

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

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