利用 msmq(microsoft message queue),應用程式開發人員可以通過傳送和接收訊息方便地與應用程式進行快速可靠的通訊。訊息處理為您提供了有保障的訊息傳遞和執行許多業務處理的可靠的防故障方法。
msmq與xml web services和.net remoting一樣,是一種分布式開發技術。但是在使用xml web services或.net remoting元件時,client端需要和server端實時交換資訊,server需要保持聯機。msmq則可以在server離線的情況下工作,將message臨時儲存在client端的訊息佇列中,以後聯機時再傳送到server端處理。
顯然,msmq不適合於client需要server端及時響應的這種情況,msmq以非同步的方式和server端互動,不用擔心等待server端的長時間處理過程。
雖然xml web services和.net remoting都提供了[oneway]屬性來處理非同步呼叫,用來解決server端長方法呼叫長時間阻礙client端。但是不能解決大量client負載的問題,此時server接受的請求快於處理請求。
一般情況下,[oneway]屬性不用於專門的訊息服務中。
1. 基本術語和概念(basic terms and concepts)
「訊息」是在兩台計算機間傳送的資料單位。訊息可以非常簡單,例如只包含文字字串;也可以更複雜,可能包含嵌入物件。
訊息被傳送到佇列中。「訊息佇列」是在訊息的傳輸過程中儲存訊息的容器。訊息佇列管理器在將訊息從它的源中繼到它的目標時充當中間人。佇列的主要目的是提供路由並保證訊息的傳遞;如果傳送訊息時接收者不可用,訊息佇列會保留訊息,直到可以成功地傳遞它。
「訊息佇列」是 microsoft 的訊息處理技術,它在任何安裝了 microsoft windows 的計算機組合中,為任何應用程式提供訊息處理和訊息佇列功能,無論這些計算機是否在同乙個網路上或者是否同時聯機。
「訊息佇列網路」是能夠相互間來回傳送訊息的任何一組計算機。網路中的不同計算機在確保訊息順利處理的過程中扮演不同的角色。它們中有些提供路由資訊以確定如何傳送訊息,有些儲存整個網路的重要資訊,而有些只是傳送和接收訊息。
「訊息佇列」安裝期間,管理員確定哪些伺服器可以互相通訊,並設定特定伺服器的特殊角色。構成此「訊息佇列」網路的計算機稱為「站點」,它們之間通過「站點鏈結」相互連線。每個站點鏈結都有乙個關聯的「開銷」,它由管理員確定,指示了經過此站點鏈結傳遞訊息的頻率。
「訊息佇列」管理員還在網路中設定一台或多台作為「路由伺服器」的計算機。路由伺服器檢視各站點鏈結的開銷,確定經過多個站點傳遞訊息的最快和最有效的方法,以此決定如何傳遞訊息。
2. 佇列型別(queue type)
有兩種主要的佇列型別:由您或網路中的其他使用者建立的佇列和系統佇列。
使用者建立的佇列可能是以下任何一種佇列:
「公共佇列」在整個「訊息佇列」網路中複製,並且有可能由網路連線的所有站點訪問。
「專用佇列」不在整個網路中發布。相反,它們僅在所駐留的本地計算機上可用。專用佇列只能由知道佇列的完整路徑名或標籤的應用程式訪問。
「管理佇列」包含確認在給定「訊息佇列」網路中傳送的訊息回執的訊息。指定希望 messagequeue 元件使用的管理佇列(如果有的話)。
「響應佇列」包含目標應用程式接收到訊息時返回給傳送應用程式的響應訊息。指定希望 messagequeue 元件使用的響應佇列(如果有的話)。
系統生成的佇列一般分為以下幾類:
「日記佇列」可選地儲存傳送訊息的副本和從佇列中移除的訊息副本。每個「訊息佇列」客戶端上的單個日記佇列儲存從該計算機傳送的訊息副本。在伺服器上為每個佇列建立了乙個單獨的日記佇列。此日記跟蹤從該佇列中移除的訊息。
「死信佇列」儲存無法傳遞或已過期的訊息的副本。如果過期或無法傳遞的訊息是事務性訊息,則被儲存在一種特殊的死信佇列中,稱為「事務性死信佇列」。死信儲存在過期訊息所在的計算機上。有關超時期限和過期訊息的更多資訊,請參見預設訊息屬性。
「報告佇列」包含指示訊息到達目標所經過的路由的訊息,還可以包含測試訊息。每台計算機上只能有乙個報告佇列。
「專用系統佇列」是一系列儲存系統執行訊息處理操作所需的管理和通知訊息的專用佇列。
在應用程式中進行的大多數工作都涉及訪問公共佇列及其訊息。但是,根據應用程式的日記記錄、確認和其他特殊處理需要,在日常操作中很可能要使用幾種不同的系統佇列。
3. 同步和非同步通訊(synchronous vs. asynchronous communication)
佇列通訊天生就是非同步的,因為將訊息傳送到佇列和從佇列中接收訊息是在不同的程序中完成的。另外,可以非同步執行接收操作,因為要接收訊息的人可以對任何給定的佇列呼叫 beginreceive 方法,然後立即繼續其他任務而不用等待答覆。這與人們所了解的「同步通訊」截然不同。
在同步通訊中,請求的傳送方在執行其他任務前,必須等待來自預定接收方的響應。傳送方等待的時間完全取決於接收方處理請求和傳送響應所用的時間。
4. 同訊息佇列互動(interacting with message queues)
訊息處理和訊息為基於伺服器的應用程式元件之間的程序間通訊提供了強大靈活的機制。同元件間的直接呼叫相比,它們具有若干優點,其中包括:
5. 在.net環境下編寫簡單的message queue程式
(1)先安裝message queuing services
通過control panel,「add/remove programs」 – 「add/remove windows components」步驟安裝msmq。
msmq可以安裝為工作組模式或域模式。如果安裝程式沒有找到一台執行提供目錄服務的訊息佇列的伺服器,則只可以安裝為工作組模式,此計算機上的「訊息佇列」只支援建立專用佇列和建立與其他執行「訊息佇列」的計算機的直接連線。
(2)配置msmq
開啟computer management – message queuing,在private queues下建立msmqdemo佇列
(3)編寫**-簡單演示msmq物件
messagequeue 類是「訊息佇列」周圍的包裝。messagequeue 類提供對「訊息佇列」佇列的引用。可以在 messagequeue 建構函式中指定乙個連線到現有資源的路徑,或者可在伺服器上建立新佇列。在呼叫 send、peek 或 receive 之前,必須將 messagequeue 類的新例項與某個現有佇列關聯。
// send message
private void btnsendmessage_click(object sender, system.eventargs e)
// open queue
system.messaging.messagequeue queue = new system.messaging.messagequeue(".\\private$\\msmqdemo");
// create message
system.messaging.message message = new system.messaging.message();
message.body = txtmessage.text.trim();
message.formatter = new system.messaging.xmlmessageformatter(new type );
// put message into queue
queue.send(message);
// receive message
private void btnreceivemessage_click(object sender, system.eventargs e)
// open queue
system.messaging.messagequeue queue = new system.messaging.messagequeue(".\\private$\\msmqdemo");
// receive message, 同步的receive方法阻塞當前執行執行緒,直到乙個message可以得到
system.messaging.message message = queue.receive();
message.formatter = new system.messaging.xmlmessageformatter(new type );
txtreceivemessage.text = message.body.tostring();
demo介面:
關於msmq訊息佇列介紹文字來自於msdn.
訊息佇列 訊息佇列
輪詢排程 一次性分發所有訊息,保證訊息平均分配,不管消費者是否能正常消費 訊息應答 保證消費端能確實消費,不丟失 公平 乙個乙個分發所有訊息,在保證分發到的執行緒確認回覆後,才分發下個訊息給下個空閒的消費者,訊息持久化 保證佇列中的訊息不丟失,包括3要素 交換器 訊息佇列 訊息都必須宣告持久化 發布...
訊息佇列 訊息佇列 kafka
kafka是乙個分布式的基於發布 訂閱模式的訊息佇列,主要用於大資料實時處理領域。要理解kafka首先要有分布式的概念,要有訊息佇列的概念。分布式系統最大的優勢就是解耦和削峰,這種情況下,a系統生成了乙個訊息,b系統非同步獲取,那麼就需要乙個存放訊息的訊息佇列 mq 相比較傳統的訊息佇列,訊息被消費...
linux訊息佇列 Linux訊息佇列
訊息佇列,unix的通訊機制之一,可以理解為是乙個存放訊息 資料 容器。將訊息寫入訊息佇列,然後再從訊息佇列中取訊息,一般來說是先進先出的順序。可以解決兩個程序的讀寫速度不同 處理資料速度不同 系統耦合等問題,而且訊息佇列裡的訊息哪怕程序崩潰了也不會消失。最簡單的訊息記憶體的使用流程 ftok函式生...