天天看點

Queue與Topic差別

隊列(Queue)和主題(Topic)是JMS支援的兩種消息傳遞模型:

1、點對點(point-to-point,簡稱PTP)Queue消息傳遞模型:

        通過該消息傳遞模型,一個應用程式(即消息生産者)可以向另外一個應用程式(即消息消費者)發送消息。在此傳遞模型中,消息目的地類型是隊列(即Destination接口實作類執行個體由Session接口實作類執行個體通過調用其createQueue方法并傳入隊列名稱而建立)。消息首先被傳送至消息伺服器端特定的隊列中,然後從此對列中将消息傳送至對此隊列進行監聽的某個消費者。同一個隊列可以關聯多個消息生産者和消息消費者,但一條消息僅能傳遞給一個消息消費者。如果多個消息消費者正在監聽隊列上的消息,,JMS消息伺服器将根據“先來者優先”的原則确定由哪個消息消費者接收下一條消息。如果沒有消息消費者在監聽隊列,消息将保留在隊列中,直至消息消費者連接配接到隊列為止。這種消息傳遞模型是傳統意義上的懶模型或輪詢模型。在此模型中,消息不是自動推動給消息消費者的,而是要由消息消費者從隊列中請求獲得。 

2、釋出/訂閱(publish/subscribe,簡稱pub/sub)Topic消息傳遞模型:

        通過該消息傳遞模型,應用程式能夠将一條消息發送給多個消息消費者。在此傳送模型中,消息目的地類型是主題(即Destination接口實作類執行個體由Session接口實作類執行個體通過調用其createTopic方法并傳入主題名稱而建立)。消息首先由消息生産者釋出至消息伺服器中特定的主題中,然後由消息伺服器将消息傳送至所有已訂閱此主題的消費者。主題目标也支援長期訂閱。長期訂閱表示消費者已注冊了主題目标,但在消息到達目标時該消費者可以處于非活動狀态。當消費者再次處于活動狀态時,将會接收該消息。如果消費者均沒有注冊某個主題目标,該主題隻保留注冊了長期訂閱的非活動消費者的消息。與PTP消息傳遞模型不同,pub/sub消息傳遞模型允許多個主題訂閱者接收同一條消息。JMS一直保留消息,直至所有主題訂閱者都接收到消息為止。pub/sub消息傳遞模型基本上是一個推模型。在該模型中,消息會自動廣播,消息消費者無須通過主動請求或輪詢主題的方法來獲得新的消息。 

具體差別對比如下:

類型

Topic

Queue

概要

Publish Subscribe messaging 釋出訂閱消息

Point-to-Point 點對點

有無狀态

topic資料預設不落地,是無狀态的。

Queue資料預設會在mq伺服器上以檔案形式儲存,比如Active MQ一般儲存在$AMQ_HOME\data\kr-store\data下面。也可以配置成DB存儲。

完整性保障

并不保證publisher釋出的每條資料,Subscriber都能接受到。

Queue保證每條資料都能被receiver接收。

消息是否會丢失

一般來說publisher釋出消息到某一個topic時,隻有正在監聽該topic位址的sub能夠接收到消息;如果沒有sub在監聽,該topic就丢失了。

Sender發送消息到目标Queue,receiver可以異步接收這個Queue上的消息。Queue上的消息如果暫時沒有receiver來取,也不會丢失。

消息釋出接收政策

一對多的消息釋出接收政策,監聽同一個topic位址的多個sub都能收到publisher發送的消息。Sub接收完通知mq伺服器

一對一的消息釋出接收政策,一個sender發送的消息,隻能有一個receiver接收。receiver接收完後,通知mq伺服器已接收,mq伺服器對queue裡的消息采取删除或其他操作。

繼續閱讀