消息隊列
消息傳輸過程中保存消息的容器
“消息隊列”是在消息的傳輸過程中保存消息的容器。
“消息”是在兩台計算機間傳送的數據單位。消息可以非常簡單,例如只包含文本字元串;也可以更複雜,可能包含嵌入對象。
消息被發送到隊列中。消息隊列管理器在將消息從它的源中繼到它的目標時充當中間人。隊列的主要目的是提供路由並保證消息的傳遞;如果發送消息時接收者不可用,消息隊列會保留消息,直到可以成功地傳遞它。
“消息隊列”是 Microsoft 的消息處理技術,它在任何安裝 Microsoft Windows 的計算機組合中,為任何應用程序提供消息處理和消息隊列功能,無論這些計算機是否在同一個網路上或者是否同時聯機。
“消息隊列網路”是能夠相互間來回發送消息的任何一組計算機。網路中的不同計算機在確保消息順利處理的過程中扮演不同的角色。它們中有些提供路由信息以確定如何發送消息,有些保存整個網路的重要信息,而有些只是發送和接收消息。
“消息隊列”安裝期間,管理員確定哪些伺服器可以互相通信,並設置特定伺服器的特殊角色。構成此“消息隊列”網路的計算機稱為“站點”,它們之間通過“站點鏈接”相互連接。每個站點鏈接都有一個關聯的“開銷”,它由管理員確定,指示了經過此站點鏈接傳遞消息的頻率。
消息隊列(也叫做報文隊列)能夠克服早期unix通信機制的一些缺點。作為早期unix通信機制之一的信號能夠傳送的信息量有限,後來雖然POSIX 1003.1b在信號的實時性方面作了拓廣,使得信號在傳遞信息量方面有了相當程度的改進,但是信號這種通信方式更像"即時"的通信方式,它要求接受信號的進程在某個時間範圍內對信號做出反應,因此該信號最多在接受信號進程的生命周期內才有意義,信號所傳遞的信息是接近於隨進程持續的概念(process-persistent);管道及有名管道則是典型的隨進程持續IPC,並且,只能傳送無格式的位元組流無疑會給應用程序開發帶來不便,另外,它的緩衝區大小也受到限制。
消息隊列就是一個消息的鏈表。可以把消息看作一個記錄,具有特定的格式以及特定的優先順序。對消息隊列有寫許可權的進程可以向消息隊列中按照一定的規則添加新消息;對消息隊列有讀許可權的進程則可以從消息隊列中讀走消息。消息隊列是隨內核持續的。
目前主要有兩種類型的消息隊列:POSIX消息隊列以及系統V消息隊列,系統V消息隊列目前被大量使用。考慮到程序的可移植性,新開發的應用程序應盡量使用POSIX消息隊列。
系統V消息隊列是隨內核持續的,只有在內核重起或者顯示刪除一個消息隊列時,該消息隊列才會真正被刪除。因此系統中記錄消息隊列的數據結構(struct ipc_ids msg_ids)位於內核中,系統中的所有消息隊列都可以在結構msg_ids中找到訪問入口。消息隊列就是一個消息的鏈表。每個消息隊列都有一個隊列頭,用結構struct msg_queue來描述。隊列頭中包含了該消息隊列的大量信息,包括消息隊列鍵值、用戶ID、組ID、消息隊列中消息數目等等,甚至記錄了最近對消息隊列讀寫進程的ID。讀者可以訪問這些信息,也可以設置其中的某些信息。
“消息隊列”管理員還在網路中設置一台或多台作為“路由伺服器”的計算機。路由伺服器查看各站點鏈接的開銷,確定經過多個站點傳遞消息的最快和最有效的方法,以此決定如何傳遞消息。