2017-06-04 78 views
0

我是使用AWS服務的初學者。我最近有一個要求,我想從服務1發送一些數據到服務2和服務3.所以,我想要做的是,我將推送通知到SNS從服務1和服務2和服務3將是訂閱此SNS主題。所以,這是訂閱同一主題的多個訂閱者的情況,並且兩個訂閱者都需要相同的數據。AWS SNS:多個訂戶的情況

我對AWS SNS的基本功能有些懷疑。如果有人能幫上忙,那真的很有幫助。

  1. 假設有2個通知A,B推送到SNS主題,那麼這兩個訂閱者是否都會收到通知?

  2. 對於相同的情況,2個通知何時從SNS主題中刪除?

  3. SNS是否將通知存儲在某處?或者它只是通過消息傳遞給訂戶?

  4. 如果其中一個訂戶失敗並且無法獲得某些通知會發生什麼?當它再次連接到SNS主題時它會得到這些通知嗎?或者它不會得到這些通知?

請提供您對以上問題的回答。這些將幫助我理解SNS如何在內部工作。

感謝您的幫助。

回答

1

發送到SNS主題的郵件發送給所有訂戶。

發佈者將消息發送給主題。發佈新消息後,Amazon SNS會嘗試將該消息傳遞給訂閱該主題的每個端點(強調)

http://docs.aws.amazon.com/sns/latest/dg/PublishTopic.html

消息實際上並沒有得到由一個主題「刪除」(你可能會想SQS的)......但他們不堅持,無論是。他們出版了,然後他們走了。

一個明顯的例外 - retry policies - 並不是一個例外。在這種情況下,消息已經發布並且概念上已經從主題中消失了,但是SNS仍然可以重試交付給特定目標。

SNS所做的一切都是推動。訂閱者不會連接到SNS並要求提供消息。一旦消息發佈,它就會發布。沒有未來的用戶會看到舊信息,沒有任何「錯過」它的用戶可以回來獲得它。

但是...... SNS fanout可以發送消息到多個SQS隊列。在這種情況下,您將隊列訂閱到主題,並使用隊列中的消息。每個隊列都會獲取每條消息的副本,並且每當進行輪詢SQS時,每個隊列中的一位消費者就會收到一份副本。

SQS隊列也是一個很好的備份臨時消息保留位置。如果您將SNS消息發送到其他類型的端點(例如HTTPS或Lambda),則也可以將消息發送到SQS隊列,但在正常操作下,不要實際輪詢隊列。消息將在maximum message retention period後自動從隊列中清除,默認爲4天,但可以配置爲最多14天。如果主題訂閱者出現任何問題並且消息丟失,則可以從此備份隊列中檢索它們,否則當超時到期時它們最終會自行消失。在隊列中可以等待未讀的消息數量沒有限制。

+1

如果多個用戶共享相同的SQS會怎麼樣?他們都會收到這個消息嗎?或者爲了實現這個目標,每個人都必須擁有自己的SQS註冊主題?謝謝 – Chorinator

+2

@Chorinator如果你正在向多個消費者發送消息,並且他們每個都應該得到每條消息的副本,那麼每個消息都需要它自己的SQS隊列。無論收聽隊列的消費者數量多少,單個SQS隊列應該只向一個消費者傳遞一次消息。 (在極少數情況下,SQS可能會失去跟蹤您已收到消息的事實,並且在這種情況下爲避免丟失數據,它將再次發送它,因此從技術上講,標準隊列會將每條消息「至少一次,但實際上這與「只有一次」相同。) –

+0

如上所述,每當隊列中的**一個**消費者在輪詢SQS時都會收到一份副本。 –