中介軟體(middleware)
從零打造一個分散式應用,意味著要一再解決同樣困難的管線工程:兩台機器怎麼找到彼此、怎麼送一個結構化的訊息、怎麼跨網路呼叫一個函式、當一個節點掛掉時怎麼應付。中介軟體是一層軟體,它坐在下方的作業系統與上方的你的應用之間,把那套管線現成地提供出來。名字已經說明了一切:它是「中間」的那層軟體,是讓「在不同機器上、各自獨立打造的程式」能一起合作的黏著劑。
具體來說,中介軟體提供可重複使用的服務,好讓各個應用不必各自重新發明它們。通訊中介軟體給你遠端程序呼叫、訊息佇列、或發布-訂閱頻道,把 socket 與編組藏起來。其他中介軟體處理命名與發現(用名稱找到一個服務)、交易(讓一個多步驟操作全有或全無)、安全(服務間的身分驗證與加密)、以及負載平衡。經典與現代的例子包括 CORBA、訊息代理(message broker)、gRPC、以及雲端系統裡用的服務網格(service mesh)。對應用程式設計師而言,中介軟體把「把這些位元組送到某個 IP 位址、然後祈禱」變成一個乾淨的呼叫,像 submitOrder(order) 這樣、跨機器就是能動。
為什麼重要,以及一個提醒:中介軟體正是讓「大型分散式系統能被一般團隊打造出來」的東西,因為它把那些真正困難、又易出錯的分散式管線,抽離成一層可信、可重複使用的層——這正是作業系統對單一機器扮演的角色,只是被提升一層到了網路。誠實的提醒是:中介軟體可能把網路藏得太好,好到程式設計師忘了它的存在,一頭栽進分散式運算的謬誤——以為那個方便的呼叫不會失敗、瞬間完成、又免費。好的中介軟體會把現實(逾時、重試、失效)暴露出來,而非把它們糊起來,因為部分失效那些底層問題,並不會只因為一個函式庫把呼叫做得像本機就消失。
一家線上商店在不同機器上有各自獨立的庫存、付款、出貨服務。各團隊不必各自手刻 socket,而是用一個訊息代理(中介軟體):訂單服務發布一則「訂單已成立」的訊息,其他服務訂閱並做出反應。中介軟體負責遞送、重試、與排隊,於是各團隊寫的是商業邏輯,而非網路管線。
介於作業系統與應用之間的黏著層,提供現成的分散式管線。
中介軟體是一種便利,不是萬靈丹。它把網路的機制藏起來,卻無法廢除網路的現實;如果它藏得太好,開發者就會滑進分散式運算的謬誤、以為那個呼叫永不失敗。