BEA TUXEDO訊息佇列詳解

2021-06-07 17:25:56 字數 3809 閱讀 7807

system/q部件是tuxedo系統的乙個重要組成部分,它提供了一種佇列機制,允許訊息按某種排隊規則儲存到持續介質(如磁碟)或非持續介質(如記憶體)中,然後再**給其它處理程序。這種儲存**機制可以保證在兩個通訊實體之間傳遞的訊息不丟失、不重傳,從而保證交易的完整性。

system/q的佇列通訊

system /q用到了tuxedo系統提供的兩個伺服器:訊息佇列伺服器tmqeue和訊息**伺服器tmqforward。tmqeue用於對訊息進行出隊入隊管理,tmqforward用於將訊息從佇列中取出,**給伺服器進行處理,然後將處理結果放回響應佇列。

圖1system/q的佇列通訊可以分為兩類:客戶機對客戶機和客戶機對伺服器,差別在於前者訊息不需要**,而後者需要將訊息**到伺服器請求服務處理。因此,對於前者,配置檔案中就不用提供**伺服器tmqforward。

客戶機對客戶機的通訊

這種端對端的通訊模式是佇列系統的簡單應用,圖1是端對端非同步通訊模式的展示。左側客戶機通過tpenqueue()函式往佇列裡寫了一條訊息,然後接著做下面的工作;右側客戶機通過tpdequeue()函式接收訊息,並進行處理,之後再往佇列中寫訊息;左側客戶機從佇列中取出訊息;至此,乙個通訊週期完成。

若使用同步通訊,左側客戶往佇列中寫入訊息後,就處於阻塞狀態,只有等到取得右側客戶機的響應訊息後,流程才繼續往下執行。

客戶機對伺服器的通訊

這種通訊模式是system/q的常規應用,下面是客戶機和伺服器的通訊流程:

圖2圖2中左側為客戶機,右側為伺服器,中間為訊息佇列系統。右側伺服器提供了兩個服務:service1和service2。在訊息佇列系統中,tms_qm是system/q的事務管理伺服器,它定義了乙個佇列伺服器組,組中定義了乙個佇列空間,佇列空間中定義了有四個訊息佇列,service1和service2分別是對應於同名的兩個服務的佇列(這是一種習慣的命名規則,客戶機若請求伺服器中的service1服務,就把請求訊息放入service1佇列中)。client_rply1是service1服務對請求的響應佇列,failureq是伺服器操作失敗的響應佇列。圖中流程說明:①客戶機提出對service1的請求;②tmqueue將請求訊息入隊;③tmqueue向客戶機匯報入隊是否成功;④tmqforward取出請求訊息;⑤將請求訊息傳給service1;⑥service1對請求作出響應;⑦tmqforward將響應訊息入隊;⑧客戶機要求取回響應訊息;⑨tmqueue取出響應訊息;⑩tmqueue取訊息是否成功。

佇列管理

在使用system/q部件之前,需要先建立佇列空間和佇列。tuxedo對佇列的操作和管理基本上是通過qmadmin來完成的,在nt下,qmadmin是乙個dos應用程式,執行前,先要設定環境變數qmconfig,如:

set qmconfig=c:\qsample\que

qmadmin通過這個變數決定在c:\qsample目錄下建立佇列裝置que。執行qmadmin,出現乙個操作環境,按照如下命令依次建立佇列裝置、佇列空間和訊息佇列:

> crdl c:\qsample\que 0 400

… …> qspacecreate -n 100b

queue space name: qspace

ipc key for queue space: 62839

size of queue space in disk pages: 100

number of queues in queue space: 6

…> qopen qspace

> qcreate

queue name: string

queue order (priority, time, expiration, fifo, lifo): fifo

crdl命令建立了乙個佇列裝置,名為que,大小為400個磁碟塊;接著用qspacecreate命令建立了乙個佇列空間,名為qspace,大小為100個磁碟塊;最後用qcreate命令在qspace中建立了乙個名為string的佇列,它使用了先進先出(fifo)的排隊規則。為了完成本文中介紹的例子,還必須建立另外兩個佇列:rplyq和errque。

system/q的應用例項

qsample是tuxedo用於演示system/q的例子,客戶機將乙個包含字串的訊息放入string佇列中,tmqforward將該訊息**到string服務,要求它將訊息體內的字串轉換成大寫。處理完畢後,tmqforward把響應訊息放入響應佇列rplyq,客戶機再從rplyq中取出響應訊息,進行列印輸出。

qsample的服務程式

服務程式server.c的內容如下,其中第2行定義了乙個名為 string的服務,第9行完成字母的大寫轉換,第11行通過tpreturn函式將轉換結果傳回給tmqforward伺服器,並表明轉換成功。

1. #include "atmi.h"

2. string(msg)

3. tpsvcinfo msg;

4. 11. tpreturn(tpsuccess, 0, msg->data, 0l, 0);

設定環境變數

建立訊息佇列

qsample用到了乙個佇列空間qspace和三個佇列string、rplyq與errque。在nt平台下建立它們的最好辦法是使用nmake命令,即「c:\qsample\nmake/f qsapme.nt que」,當然也可以手工建立。

建立事務日誌

tms_qm在佇列事務管理時,需要用到日誌裝置,建立辦法也是用nmake命令:

c:\qsample\nmake/f qsapme.nt tlog

它執行了qsample.nt中預定義的一組tuxedo命令。

qsample的客戶程式

#include "uunix.h"

#include "atmi.h"

main()

修改配置檔案

配置檔案ubb.sample定義了三個伺服器:server、tmqueue、tmqforward和兩個組:group1和que1。server提供string服務,tmqueue和tmqforward屬於que1組。que1組中的openinfo引數定義了佇列資源管理器tuxedo/qm、佇列裝置和佇列空間。最後一行clopt引數中定義了將訊息**給string服務。

groups

group1

lmid = site1 grpno = 1

tmsname=tms tmscount=2

que1

lmid = site1 grpno = 2

tmsname = tms_qm tmscount = 2

openinfo = "tuxedo/qm:c:\qsample\que;qspace"

servers

default: clopt="-a"

server srvgrp=group1 srvid=1

tmqueue

srvgrp = que1 srvid = 1

grace = 0 restart = y conv = n maxgen=10

clopt = "-s qspace:tmqueue -- "

tmqforward

srvgrp=que1 srvid= 5 grace=0 restart=y conv=n maxgen=10

編譯和執行

確保make檔案qsample.nt中include和lib變數已經包含了tuxedo系統的標頭檔案和庫檔案,然後使用如下命令進行編譯:

c:\qsample\nmake/f qsample.nt all

成功後,用tmloadcf命令載入配置檔案,用tmboot命令啟動應用程式,最後,執行客戶程式client.exe,就可以看到string服務的處理結果。

BEA Tuxedo的訊息佇列系統詳解

system q部件是tuxedo系統的乙個重要組成部分,它提供了一種佇列機制,允許訊息按某種排隊規則儲存到持續介質 如磁碟 或非持續介質 如記憶體 中,然後再 給其它處理程序。這種儲存 機制可以保證在兩個通訊實體之間傳遞的訊息不丟失 不重傳,從而保證交易的完整性。system q的佇列通訊 sys...

訊息佇列 訊息佇列

輪詢排程 一次性分發所有訊息,保證訊息平均分配,不管消費者是否能正常消費 訊息應答 保證消費端能確實消費,不丟失 公平 乙個乙個分發所有訊息,在保證分發到的執行緒確認回覆後,才分發下個訊息給下個空閒的消費者,訊息持久化 保證佇列中的訊息不丟失,包括3要素 交換器 訊息佇列 訊息都必須宣告持久化 發布...

訊息佇列 訊息佇列 kafka

kafka是乙個分布式的基於發布 訂閱模式的訊息佇列,主要用於大資料實時處理領域。要理解kafka首先要有分布式的概念,要有訊息佇列的概念。分布式系統最大的優勢就是解耦和削峰,這種情況下,a系統生成了乙個訊息,b系統非同步獲取,那麼就需要乙個存放訊息的訊息佇列 mq 相比較傳統的訊息佇列,訊息被消費...