初次接觸。從昨天下午弄到現在,終於添加好了一個簡單的服務。
先簡單瞭解一下tuxedo 的原理:
The heart of the Tuxedo system is the Bulletin Board (BB). This is a shared memory segment that contains the state of a Tuxedo domain.
看來IPC真是個很重要的知識些。tuxedo 這些大名鼎鼎的分布式系統,用的無非就是IPC技術。
1、服務(service )是 tuxedo 的核心概念。每個服務對應c 中的一個函數。服務是阻塞啟動並執行。
兩個請求先後到達時,後來的必須等先到的處理完畢才能被處理。為瞭解決排隊的問題,可以把一個程式啟動多份執行個體(啟動的進程數量在 *.ubb中指定 ),tuxedo 會自動地找到閒置進程。這就是所謂的負載平衡(load balance )。
2、程式(server)是服務的集合。一個程式中可以有多個服務。編譯時間使用 -s 選項將這些服務匯出,以供 tmboot識別。
2、一個程式可以運行多個進程執行個體。同一主機上有若干程式/進程,一個進程可以提供若干服務。這些服務可通過函數呼叫(tpcall())的方式來相互調用,無論進程內部還是進程之間。
3、進程的類型:一個主機上可以有三種進程:管理進程(admin process 或者叫 bbl process )、網關進程(gateway processes )、服務進程( server processes ),用來同步主機間的資訊。
4、tuxedo 的長/短串連,阻塞/非阻塞的概念。
tpconnect() 是長串連。可以是阻塞模式(request/response communication )。也可以是非阻塞模式(Conversational communication )。
tpcall() 是一種阻塞的短串連。
程式開發:
tuxedo 使用了 dispatch機制:在編譯時間提供了 service_name 和 service_instance 的映射關係。client 可以指定 service-name 向管理進程申請調用相關的 service。( connect 或 call )。管理進程則根據 service_name 來將處理請求 dispatch 到指定的 service(進程)。
管理進程和 service_name 是通過資料結構 tpsvcinfo 來實現資料交換的:
struct tpsvcinfo {
#define XATMI_SERVICE_NAME_LENGTH 32
char name[XATMI_SERVICE_NAME_LENGTH];// service name invoked
long flags; // describes service attributes
char *data; // pointer to data
long len; // request data length
int cd; // connection descriptor
long appkey; // application authentication client key
CLIENTID cltid; // client identifier for originating client
};
以上,date 和 len 指定了 client 的資料輸入緩衝的地址和長度。 cd 即 socket 控制代碼。可以看出,無論 call 還是 connect ,內部都是使用了 socket 來實現的。
添加一個服務的完整過程:
1、寫程式,編譯。編譯時間用 -s 來指定服務名稱
2、將程式放到指定的目錄下。
3、在 .ubb 中添加 service 。這裡可以指定進程最大數量,最小數量,所屬的 group 等等。
4、編寫 Bulletin Board config file ( ubbconfig file ),並使用 tmloadcf 命令編譯將其編譯為二進位檔案,稱做 TUXCONFIG 檔案。該檔案的檔案名稱在環境變數中設定的:
$env |grep TUXCONFIG
TUXCONFIG=/hbtest/bin/bill.tux
5、編寫工作站設定檔( domain configure file,用於發布服務和註冊路由 )使用 dmloadcf 命令編譯為二進位檔案。
6、tmboot -s serviename 啟動服務。
縮減語介紹:
ATMI:Application-to-Transaction Monitor Interface
相關資料:
維基百科上的 Tuxedo (software)
化繁為簡來學習編寫BEA TUXEDO會話的程式