2017-07-06 60 views
0

我正在構建一個系統,兩個不同的實體需要處理來自同一個源的消息(以不同的方式 - 例如,一個會記錄所有消息,而另一個實體可能需要聚合數據)。理想情況下,每個實體對於性能和彈性都是完全可擴展的,因此我們有多個發佈者,多個日誌訂閱者和多個聚合訂閱者,但每個發佈的每個消息仍然由一個日誌訂閱者和一個聚合訂閱者處理。NATS發佈者可以將單個消息發送到多個隊列嗎?

通過AMQP,我們可以通過發佈到扇出交換機來實現此目的,該交換機將消息分發到兩個隊列,其中每個隊列擁有多個訂閱者。我明白,通過簡單地讓所有訂閱者在相同的「主題」上使用兩個不同的「隊列組名」基於他們的角色來監聽,NATS可以實現相同的行爲。

在這種情況下,到主題的消息將從每個隊列組傳送到一個用戶,即每個消息將被準確傳送n次,n是不同隊列組的數量,而不是用戶數量。它是否正確?

回答

3

事實上,你可以隨時隨地使用隊列的用戶(例如,它會是這樣的API:func (nc *Conn) QueueSubscribe(subj, queue string, cb MsgHandler) (*Subscription, error)

queue是組名稱。例如,它可以在你的榜樣logaggregation你。可以建立在每一組中,只有1個成員各組在儘可能多的隊列中的用戶會收到一個給定的消息。

例如,假設您發佈的主題foo一條消息,你有foo與隊列10個的隊列用戶名稱log和上的10個隊列訂戶,隊列名稱爲aggregation。該消息將傳送給2位訂戶,1組爲log,1組爲aggregation

希望這會有所幫助。

0

你的方法是正確的,nats.io中的隊列概念是在收聽隊列的用戶之間順序分發消息。這種分配以線性方式發生,假設你有10個用戶(S1-S10)正在監聽一個話題並在同一隊列中註冊,那麼第一個消息將以循環方式發送到S1,然後發送到S2等等。

您只需要確保所有訂戶都連接到服務器,就好像一個訂戶離線一樣,nats服務器會在某些未完成的PING-PONG請求之後意識到此事件,並且在此期間它將轉發發送到脫機節點的消息。因此,你需要仔細設置

  1. 乒乓間隔
  2. 最大優秀ping請求

https://nats.io/documentation/server/gnatsd-config/

+0

你是說,如果一個用戶崩潰,我們會丟失數據? – Guss

+0

如果訂戶脫機,那麼nats服務器會在某個超時後知道此事件,在此超時期間,我們的情況可能會丟失數據。 – ritesh4302

相關問題