技術分享
HPE NonStop PathSockets
作者/黃仕奇
作者簡歷作者現職凌群電腦NSK服務處助理總工程師,主要負責HPE NonStop 證券、期貨、銀行客戶交易系統維運服務、軟體產品整合服務,專長為HPE NonStop系統整合。
前言
HPE NonStop System 提供NonStop TS/MP (Transaction Services/Massively Parallel) 中間平台,該平台提供了應用程式NonStop 特性,例如:可擴充性以及容錯能力。NonStop TS/MP 提供了讓您可以在 NonStop Server 開發和部署 OLTP 應用程式,這可以幫助開發者只要專注於實現業務邏輯,而不必關心像是負載平衡、通訊、I/O以及容錯的處理。
PathSockets library 是 NonStop FS (File System) 和 Pathsend API 的 abstraction。它繼承了 NonStop TS/MP 的獨特功能,並使開發人員能夠將使用標準C寫的socket程式配置在 NonStop TS/MP 上,如此可以消除應用程式使用 NonStop FS 和 NonStop API 的依賴。
PathSockets library主要目的是使用像是 C++ 和 Python 開發的程式可以更加輕鬆快捷的移植到 NonStop TS/MP 上。因此使用 PathSocket library 可以使程式移植時,可能只要做最少的更改或不需要更改應用程式。
功能說明
一、概述:
下圖圖示 client/server 應用程式架構,並描述 TCP/IP 和 PathSockets 兩種不同的通訊通道的 client/server 的通訊。

《圖一》
下列範例程式段說明一個簡單的 client 端應用程式,連線到 server 發送資料,然後接收回應。在 server 端,server 程式進行 listen 等待連線,建立連線後,等待 client 發送資料,然後做出回應。

《圖二》
下表描述啟用 PathSockets 時的相關行為:

《圖三》
備註:
1.PathSockets library 只能用於需要 NonStop IPC 的應用程式或解決方案。
2.使用 PathSockets library 時,client 和 server 都必須在 NonStop 平台上可用。
3.只有 TCP sockets 可以配置使用 NonStop IPC,UDP sockets 不能配置使用。
二、安裝和啟用 PathSockets library:
- 安裝的必要條件:PathSockets只能安裝在 L19.08 或以上的 RVU 版本。
- 安裝的方式:
- 使用 NonStop software essentials。
- 使用 PINSTALL 安裝:TACL> PINSTALL -rvf /G/system/zossutl/T1009PAX
- 使用 NonStop software essentials。
- 安裝的 default 位置:/usr/tandem/pathsockets
- Pathsockets library 檔案說明:
《圖四》 - 啟用 Pathsockets:
- 選擇適當的 Pathsockets library,使用 _PUT_MODEL_ 編譯選項進行編譯。
- 確認正確的路徑設定 _RLD_FIRST_LIB_PATH。
例如:
export _RLD_FIRST_LIB_PATH=/usr/tandem/pathsockets - 設定配置檔案,可以指定 socket 是否需要使用 NonStop IPC。
- 該程式必須單獨編譯。必須先將 Pathsockets library。
例如:
c89 server.c ...
xld server.o -l/usr/tandem/pathsockets/libpathsocks_core.so -lcre -lcrtl ... -o server.out
三、Pathsockets library features:
- Socket wrappers for NonStop IPC calls
Pathsockets library 經由標準 C socket interface 調用 NonStop FS 和 Pathsend IPC。
根據要求,可以將應用程式配置為在 REQUEST_RESPONSE 或 BI_DIRECTIONAL 模式下使用 NonStop FS 或 Pathsend IPC。- NonStop FS:允許 client 直接與 process 通訊。
- NonStop IPC:允許 client 與 TS/MP 下的 process 通訊,以確保負載平衡和可擴充性。Pathsend IPC包含:
- SERVERCLASS SEND
- 允許 client 和 server process 交換單一訊息,後續的訊息會送至其他的 server process。
- SERVERCLASS SEND 只能在 REQUEST_RESPONSE 模式下使用。
- SERVERCLASS SEND 也稱為 CONTEXT-。
- DIALOG
- 允許 client 與 server 在結束對話框之前,通過對話框交換多條訊。
- DIALOG 也稱為 CONTEXT-SENSITIVE。
- SERVERCLASS SEND
- Mapping file
為 Pathsockets 的環境配置檔案,如果配置不正確將會造成 socket 程式回到 TCP/IP 的調用。 - Establishing a connection
NonStop IPC client 傳送資料到 server 是使用 FS API 或 Pathsend API。但是在傳送資料之前,client 經由 Pathsend dialog 明確的 open server process 建立連線。 - Modes of communication
在 NonStop 上的傳統 IPC 允許使用 REQUEST_RESPONSE 的通訊模式。在這裡 client 端發送一個訊息,server 端會對該訊息進行回應。server 無法向 client 發送未經請求的訊息。這種通訊方式稱為 REQUEST_RESPONSE。
在 TCP 通訊中,一旦建立連線,即可在 socket 之間自由交換資料。這種通訊方式稱為 BI_DIRECTIONAL。
Pathsockets library 支援兩種上述通訊模式,默認為 BI_DIRECTIONAL 模式。- BI_DIRECTIONAL mode
BI_DIRECTIONAL 模式會建立二條通道,這兩個通道分別為C2S (client to server) 以及 S2C (server to client)。- Connecting to process
如果目的地是 process,則 connect() 會使用不同的 qualifier 對 process open 兩次,第一次是 C2S 通道,第二次是 S2C 通道。
經由 open_qualifier 屬性設定 Qualifier1 和 Qualifier2 來建立通道。下圖說明了在 BI_DIRECTIONAL 模式下與命名進程建立連接所涉及的事件。 - Connecting to a TS/MP serverclass
如果目的地是 serverclass,則使用 context-sensitive Pathsend IPC 來建立連線。只會建立 C2S 通道。
下圖說明了在 BI_DIRECTIONAL 模式下與 TS/MP 服務器類建立連接所涉及的事件。
- Connecting to process
- REQUEST_RESPONSE mode
在 REQUEST_RESPONSE 模式下只要建立 C2S 通道即可。- File system
File system IPC 使用在 process to process 通訊。
A sample mapping file:
server_socket-15.213.85.95:8080 open_qualifier=**ANY_QUALIFIER**
client_socket-15.213.85.95:8080 process=$SVR:mode=REQUEST_RESPONSE - Serverclass send
《圖五》
Serverclass send 也稱為 CONTEXT-FREE。在這個模式下,TS/MP 會將 client 發送的資料轉發到 serverclass。當 client 端寫入資料時,server 端的 accept() 才會完成。寫入後 server 必須 close socket。
A sample file:
server_socket-15.213.85.95:8080 pathsend_qualifier=**ANY_DIALOG**
client_socket-15.213.85.95:8080
pathmon=$NSASJ:serverclass=server:mode=REQUEST_RESPONSE:pathsend_qualifier=**CONTEXT-FREE** - Dialog
Dialog 也稱為 CONTEXT-SENSITIVE。在這種模式下,client 和 server 之間將保持上下文,直到它們中的任何一個結束對話框為止。
- File system
- BI_DIRECTIONAL mode
- Interoperability with NSJI
Pathsockets library 可與 NSJI library 互用。 - Communicating with non PathSockets components
有時,Pathsockets client 必須與舊的 server 通訊,或者舊的應用程式必須與 Pathsockets server 通訊。在這種情況下,不可能修改舊的應用程式,因此 Pathsockets 組件必須能夠與舊版組件進行通訊。- Pathsockets client with a legacy TS/MP serverclass for context-free communication
- 在 mapping file 中必須使用屬性 pathsend_qualifier 設置為 **CONTEXT-FREE**。
例如: pathsend_qualifier=**CONTEXT-FREE**
- 在 mapping file 中必須使用屬性 pathsend_qualifier 設置為 **CONTEXT-FREE**。
- 內部在連線操作期間不執行任何操作,當 client 程式將資料寫入 socket 時,資料經由 SERVERCLASS_SEND_ 發送到 server。
- 必須注意,可以送到 server 的資料量取決於 socket 的內部緩衝區大小。
- Pathsockets client with a legacy TS/MP serverclass for context-free communication
- Pathsockets client with a legacy TS/MP serverclass for dialog based commucination
- 在 mapping file 中必須使用屬性 pathsend_qualifier 設置為 **CONTEXT-SENSITIVE**。
例如: pathsend_qualifier=**CONTEXT-SENSITIVE**
- 在 mapping file 中必須使用屬性 pathsend_qualifier 設置為 **CONTEXT-SENSITIVE**。
- 內部在連線操作期間不執行任何操作,當 client 程式在 socket 上寫入資料時,將通過建立對話框來發送資料。
- client 端期望在一個動作中寫入完整的資料,server 可以使用 file system code FECONTINUE(70) 表示資料傳輸不完整。
- 如果 file system 收到 code 70,則 Pathsockets library 使對話框保持 open 狀態。如果 code 0,則結束對話框。如果 file system code 不是 0 或 70,則終止該對話框。
一個 server socket 必須只能接受相關的連線。一個 server program 可以有多個配置使用 NonStop IPC 的 server socket。在這種情況下,每個 server socket 都會存取 $RECEIVE 以及接受和自身相關的連線。
由於所有的 server socket 都會讀取相同的 $RECEIVE,因此必須有一種機制讓 client socket 辨識自己,以使得 server socket 能夠接受連線。
open_qualifier 和 pathsend_qualifier 屬性幫助建立和驗證 socket identify。當 client socket 必須與 TS/MP serverclass 建立線線時,pathsend_qualifier 作為對話框將開始調用的訊息傳送到 server。
- 在 mapping file 中必須使用屬性 pathsend_qualifier 設置為 **ANY-DIALOG**,並將 open_qualifier 設置為 **ANY-QUALIFIER**。
例如: pathsend_qualifier=**ANY-DIALOG**
open_qualifier=**ANY-QUALIFIER**
創建 socket 後,可以使用 setsocketopt() 調用來設置各種選項。Pathsockets 不支援 setsokcetopt() 所有的選項,下表僅提供與 Pathsockets 相關的選項。

《圖六》
在默認的情況下,TCP sockets 是在 blocking mode。
使用 descriptor 可以將操作設定為 nonblocking mode。
Pathsockets library 對所有的 socket APIs 支援 nonblocking 功能。
Pathsockets library 不會解釋 client 和 server 之間的資料流。所以當它使用 BI_DIRECTIONAL 模式下,socket 的行為表現與 TCP/IP socket 相同。但是如果使用在 REQUEST_RESPONSE 模式下,應用程式需要使用一些 semantics 來確認訊息結束。
在 context-free 模式下,read() 函數返回 -1,並將 errno設定為 ECONNREST,以表示訊息結束。
如果是使用長連線,應用程式必須自行設置訊息結束標識。
Pathsockets library 回應與 TCP socket 相同的錯誤代碼。當 socket 無法辨識時可以使用 SO_ERROR 回應 NonStop 的錯誤代碼。
The system call to retrieve the error set on socket is as follows:
getsockopt(sockfd, SOL_SOCKET, SO_ERROR, &error, &len);
client 程式可以經由 client-mapping 屬性來 enable / disable 使用 TMF。
默認的情況下 Transaction propagation 設定為 disable。只能在 REQUEST_RESPONSE 模式下才能 enable。
支援版本資訊
NonStop PathSockets library ( T1009 ) 在 L19.08 以上的 RVU 版本開始支援。
結論
經由使用 Pathsockets library 只需要很少的程式修改或無需修改程式就可以部署在其他平台開發的業務應用程式。對於不熟悉 HPE NonStop 平台的開發人員提供輕鬆部署的好處。
參考資料
1.HPE NonStop PathSockets Programmer’s Reference P12621-001