軟體介面是異構系統資料交換的橋梁,依耦合程度分為緊耦合 (低延遲、無阻塞) 與鬆耦合 (容忍較高延遲)。本文針對緊耦合場景,深入分析 Socket、中介軟體 (以 BEA Tuxedo 為例) 與 SOAP 三種主流通訊技術的實作細節與優劣勢。
CurReceLen = 0;
for (;;) {
iResult = select(0, &fdread, NULL, NULL, &timeout);
if (iResult == 0) { /* 超時處理 */ }
CurReceLen = recv(Socket, oBuf + ReceLen, len, 0);
if (CurReceLen > 0) {
// 處理黏包:依應用層協定長度拆分封包
memcpy(&MsgLen, oBuf, sizeof(WORD32));
MsgLen = ntohl(MsgLen);
if (ReceLen + CurReceLen == MsgLen) break; // 完整封包
ReceLen += CurReceLen;
}
}
核心難點在於 黏包處理:發送端多個封包可能在傳輸層合併,接收端必須依應用協定 (長度前綴、分隔符等) 正確拆分,否則導致應用層丟包。
Tuxedo 提供豐富通訊模型:同步/非同步 Request/Response、巢狀呼叫、呼叫轉發、會話通訊、主動通知、事件驅動、佇列通訊、交易處理。
int tpcallex(char *svc, char *idata, long ilen, char **odata, long *olen, long flags, long timeout) {
int iHandler = tpacall(svc, idata, ilen, TPNOBLOCK); // 非同步發送
if (iHandler == -1) return -1;
while (timeout > 0) {
int iResult = tpgetrply(&iHandler, odata, olen, TPNOBLOCK);
if (iResult != -1) break; // 取得回應
Sleep(10); timeout -= 10;
}
if (timeout <= 0) { tpcancel(iHandler); return -1; }
return iHandler;
}
多執行緒模式易導致執行緒耗盡,生產環境建議採 多進程 + 負載均衡 架構。
使用 Microsoft SOAP Toolkit 3.0 (COM 基礎),需注意參數封送順序:Windows 與 Unix 平台相反,呼叫前必須反轉參數陣列:
if (!m_bFlatType) {
for (i = paramNum, j = 0; i > j; i--, j++) {
VARIANTARG tmp = va[i-1];
va[i-1] = va[j];
va[j] = tmp;
}
}
hr = pSoapClient->Invoke(dispidFn, IID_NULL, LOCALE_SYSTEM_DEFAULT,
DISPATCH_METHOD, ¶ms, &result, 0, 0);
| 技術 | 優點 | 缺點 | 適用場景 |
|---|---|---|---|
| Socket | 輕量、跨平台、完全控制 | 需自行處理協定、黏包、重連、安全性 | 高效能、特殊協定、嵌入式系統 |
| Tuxedo | 企業級特性 (交易、負載均衡、高可用) | 授權成本高、學習曲線陡峭 | 金融、電信等核心交易系統 |
| SOAP | 標準化、跨語言、防火牆友善 (HTTP) | XML 開銷大、效能較低 | 異構系統整合、B2B、公開 API |
「適合的才是最好」:選型必須配合服務端技術棧、效能需求、維護成本與團隊技術債綜合評估。管道、訊息佇列等替代方案在緊耦合場景較少採用。