2014-03-05 49 views
7

在RabbitMQ中,可以創建交換,然後將其綁定到多個隊列,每個隊列都使用路由密鑰。這使得消息的架構是這樣的:將消息從Amazon SNS路由到SQS並進行過濾

  message_x 
     / |  \ 
foo-msg_q bar-msg_q msg-logger_q 

客戶端發佈信息到message_x交換,這路線信息與路由鍵「富」到foo-msg_q隊列,具有路由鍵「欄中的」郵件到bar-msg_q隊列,和全部消息到msg-logger_q隊列。

我在解決如何在AWS中執行此操作時遇到問題。我首先想到的是基於主題設置權限在各個隊列接受消息,但對於許可條件唯一可用的字段有:

  • AWS:CURRENTTIME
  • AWS:EpochTime
  • AWS:MultiFactorAuthAge
  • AWS:principaltype
  • AWS:SecureTransport
  • AWS:SourceArn
  • AWS:SOURCEIP
  • AWS:用戶代理
  • AWS:用戶ID
  • AWS:用戶名的這些

無看起來他們可以通過我發佈到message_x主題的任何消息的影響。

當使用Amazon Simple Notification Service扇出多個Simple Queue Service隊列時,是否可以這樣做?每個隊列接收發布到該主題的消息子集?

+0

您使用了錯誤的。平臺。使用Azure主題,你可以在幾秒鐘內完成... –

+2

@OlivierAlbertini這不是很有幫助。如果你注意到上面,我提到這是你可以在RabbitMQ中做的事情,所以我知道還有其他平臺具有這種功能。我特別詢問了SNS/SQS。 –

+1

你有沒有找到任何優雅的方式來解決你的問題? – vercin

回答

6

不,這是不可能的。雖然他們可以添加一個很棒的功能。

我知道的唯一選擇是爲每個路由規則創建一個主題,然後發佈到正確的主題。這不太好,但它完成了任務。如果你有很多規則,你可能需要超過他們允許的3000個話題。您可以按照此處的說明http://docs.aws.amazon.com/general/latest/gr/aws_service_limits.html#limits_ses_quota來請求AWS在其網站上增加主題限制。

+1

現在我的解決方案是'(defn send-message [routing-key msg])',它首先將消息發佈到主題,所以任何訂閱的隊列都會收到它,然後發送到'routing-key'命名的隊列。所以訂閱全局主題的隊列具有「*」的模擬路由密鑰。 –

+1

@JoshGlover我沒有得到你的解決方案,請你再解釋一次如果你有時間。 – vercin

+0

SNS最近發佈了這個功能,作爲Puji的回答,下面是https://stackoverflow.com/a/47479409/179138 –

4

這可以通過在SNS中使用消息屬性過濾來實現。將不同的SQS隊列訂閱到SNS主題後,可以使用SNS API SetSubscriptionAttributes指定要過濾的屬性。這將允許具有不同屬性的消息被路由到正確的SQS隊列。

這也不限於SQS隊列,而是SNS主題上的任何訂閱源。例如,一個SNS主題可以將一組消息發佈到Lambda,另一組則發佈到SQS。

SDK參考: http://docs.aws.amazon.com/sns/latest/api/API_SetSubscriptionAttributes.html

更多細節在這裏給出的例子: https://aws.amazon.com/blogs/compute/simplify-pubsub-messaging-with-amazon-sns-message-filtering/