JMS兩種訊息模型
前段時間學習EJB,接觸到了JMS(Java訊息服務),JMS支援兩種訊息模型:Point-to-Point(P2P)和Publish/Subscribe(Pub/Sub),即點對點和釋出訂閱模型。
個人覺得這兩個模型挺容易理解的,因為生活中的例子還挺多的。
1, P2P模型
有以下概念:訊息佇列(Queue)、傳送者(Sender)、接收者(Receiver)。每個訊息都被髮送到一個特定的佇列,接收者從佇列獲取訊息。佇列保留著訊息,直到它們被消費或超時。
(1) 每個訊息只有一個消費者(Consumer)(即一旦被消費,訊息就不再在訊息佇列中)
(2) 傳送者和接收者之間在時間上沒有依賴性,也就是說當傳送者傳送了訊息之後,不管接收者有沒有正在執行,它不會影響到訊息被髮送到佇列。
(3) 接收者在成功接受訊息之後需要向佇列應答成功
注:如果希望傳送的每個訊息都被成功處理,或被特定的消費者消費,那麼需要採用P2P模型。
使用場合:想讓接收者進行且只進行一次處理,元件之間進行同步通訊。
個人理解:這種模型的應用很常見,例如:qq/微信/飛信聊天(私聊),(1)小A和小B互加qq好友,小A給小B發一條訊息”你幹嘛呢?”,這條訊息只有小B能接收到,別人接收不到——每個訊息只有一個消費者;(2)如果小B沒有登入qq,也沒關係,當小B登入qq後,就會看到這條訊息——傳送者和接收者之間在時間上沒有依賴性,也就是說,當傳送者傳送了訊息之後,不管接收者有沒有正在執行,它不會影響到訊息被髮送到佇列;
2,Pub/Sub模型
有以下概念:主題(Topic)、釋出者(Publisher)、訂閱者(Subscriber)。客戶端將訊息傳送到主題。多個釋出者將訊息傳送到Topic,系統將這些訊息傳遞給多個訂閱者。
(1) 每個訊息可以有多個消費者
(2) 釋出者和訂閱者之間有時間上的依賴性。針對某個主題(Topic)的訂閱者,它必須建立一個訂閱之後,才能消費釋出者的訊息,而且,為了消費訊息,訂閱者必須保持執行的狀態。
為了緩和這種嚴格的時間上的依賴性,JMS允許訂閱者建立一個可持久化的訂閱(即,傳送者和接收者之間在時間上沒有依賴性。這樣的話,即使訂閱者沒有執行,它也能接收到釋出者的訊息。)
如果希望傳送的訊息可以被一個/多個消費者消費,那麼可以採用Pub/Sub模型。
個人理解:這種模型的應用也很常見,例如,如果qq群聊天是這樣的:小A、小B、小C都是”聊天群”中的成員,小A、小B線上,小C不線上,小A釋出一條訊息”明天放假”,那麼只有小B能接收到,當小C上線後也接收不到。這樣是不是很不合理——釋出者和訂閱者之間有時間上的依賴性;因此,為了緩和這種嚴格的時間上的依賴性,JMS允許訂閱者建立一個可持久化的訂閱(即,傳送者和接收者之間在時間上沒有依賴性。這樣的話,即使訂閱者沒有執行,它也能接收到釋出者的訊息。)——還是上面的例子,小A、小B、小C都是”聊天群”中的成員,小A、小B線上,小C不線上,小A釋出一條訊息”明天放假”,小B可以接收到,當小C上線後也可以接收到。
以上只是目前的個人理解,可能與實際有所偏差。
3,總結:
P2P模型與Pub/Sub模型的根本區別:對於p2p模型的每個訊息只能有一個消費者 ; pub/sub模型可以有多個消費者 。