HTTP/1.1已經(jīng)面世20年了,被互聯(lián)網(wǎng)界廣泛應用,但是它的一些特性導致它無法適用于海量應用。HTTP/1.1會建立一個TLS保護的long-lived TCP連接,后續(xù)的交互數(shù)據(jù)都會通過這個連接傳輸。但是如果這個連接正在被一個耗時較長的請求占用,那么后續(xù)發(fā)出的請求只能等待,這就是隊頭阻塞(Head of line blocking)。
HTTP/2引入了流的概念,一個TCP連接可以包含多個雙向流(Stream),每個流中可以傳輸若干消息(Message),每個消息由若干二進制幀(Frame)組成??蛻舳撕头斩丝梢园袶TTP消息分解成獨立的幀交錯傳輸,然后在另一端組裝。這樣即使是某一個大消息的響應時間過長,也不會影響到后續(xù)的請求,如果后發(fā)請求的響應幀先到齊,客戶端可以根據(jù)幀頭的信息把消息組裝起來繼續(xù)處理。
gRPC基于HTTP/2,gRPC的Channel利用了流的機制。Channel是一個虛擬的連接,它其實對應了多個連接以及多個流。RPC調(diào)用實際上就是HTTP/2的流,通過其中一個連接傳遞,RPC調(diào)用的消息以幀的形式發(fā)送,根據(jù)消息的大小,即有可能多個消息公用一個幀,也有可能一個消息分割成多個幀。
