[英]Using Amazon SQS with multiple consumers
我有一個基於服務的應用程序,它使用具有多個隊列和多個使用者的 Amazon 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.