2012-01-26 95 views
5

當消費者沒有聽力時,發佈到虛擬主題的消息會發生什麼?經紀人會持有一段時間,直到訂戶可用?虛擬主題/隊列和耐用性

更具體地說: 在T0和T1消息中發佈M0和M1。在T2,消費者C1連接,他會收到M0和M1嗎?很明顯,在T3和T4發佈的消息M2和M3將被C1接收,但是在T5連接的新消費者C2將接收什麼?所有消息,M2和M3,還是沒有?

+0

我不得不問,到目前爲止你有什麼嘗試? – Eugene

+0

還沒有時間嘗試,會做。現在對我來說只是理論上的事情,但我需要知道 –

回答

4

這取決於主題的性質: 如果主題是持久的(持久消費者訂閱了該主題),那麼代理將持有主題中的消息,直到所有持久消費者都使用該消息。 如果主題是非持久性的(沒有持久消費者),則該消息甚至不會被髮送到該主題,因爲將不會有持久訂閱。

對於你的榜樣,我會考慮你正在使用持久訂閱/消費者: 案例1:

  • T-2 C1和C2使長期訂閱的話題
  • T-1 C1和C2斷開
  • T0:M0張貼
  • T1:M1被張貼
  • T2:C1連接。 C1收到M0和M1
  • T3:M3已過帳。 C1收到M3
  • T4:M4已過帳。 C1接收M4
  • T5:C2連接,C2接收M0,M1,M2,M3,M4

這是因爲他們持有durable subscriptions 您使用耐用的話題時需要非常小心/隊列:如果消費者未取消訂閱,則代理將持有消息,直到消息存儲庫爆炸。您需要確保它不會發生(通過設置eviction policies和/或在消息上放置一段時間)。 當然,前面的示例會因消費者進行持久訂閱而有所不同。

如果使用非持久主題:

  • T-2 C1和C2進行正常訂閱的話題
  • T-1 C1和C2斷開
  • T0:M0張貼
  • T1:M1發佈
  • T2:C1連接。 C1沒有收到任何東西
  • T3:M3已過帳。 C1收到M3
  • T4:M4已過帳。C1接收M4
  • T5:C2連接,C2不接收任何東西
0

爲什麼不能有是觀察者/可觀察到的圖案 - 以上面的例子:

當M0是發佈,C1和C2(消費者訂閱)醒來並可以消費該事件?我認爲這種模式比耐用和非耐用 - 混合方式更好。

1

有兩種方法可以讓發佈到虛擬主題的消息充滿活力。第一個是通過持久訂閱者,另一個是發佈者以傳遞模式「PERSISTENT」發送消息。當消息以「PERSISTENT」的傳送模式發佈時,消息將保存在磁盤上,否則將保存在內存中。