gRPC v.s. WebSocket



gRPC

特色

  • 使用 Google 的 Protocol Buffers(Protobuf) 作為 interface description language.
  • protoc compiler 支援多語言,例如:python、go,所以客戶端和伺服器可以使用不同語言撰寫
  • 基於 HTTP/2
  • 讓調用遠程的程式也像調用本地函式庫一樣,此外,許多網路相關的程式碼被不需要工程師自己寫,protoc compiler 會幫忙產生

缺點

  • Protobuf 非人類可讀語言,debug 不方便
  • 雖然很多語言都有 gRPC 的套件,瀏覽器仍然沒辦法直接支持,需要使用例如 gRPC Web 這種 proxy

WebSocket

特色

  • WebSocket 是 W3C 網路協定標準,與一般 http、https不同之處在於,他只需要一次接觸便能一直保持連線,直到其中一方斷掉
  • 可以傳輸文本、binary data
  • HTTP/1.1 握手期間可以指定在 WebSocket 之上使用的子協議(例如,MQTT),也可以自訂協議或自訂額外功能(例如發布/訂閱消息傳遞)
  • 因為是持續的連接而不是每次都 request/response,所以只需要極小的傳輸開銷
  • 瀏覽器原生支持 WebSocket API
  • 事件驅動(event-driven)

缺點

  • stateful
  • 連線終止後不會自動恢復
  • 某些環境(例如帶有代理服務器的公司網絡)會阻止 WebSocket 連接。

比較

  • data format
    • GRPC : .proto file
    • WebSocket : no “official” format specification
  • request processing performance
    • gRPC : 使用 HTTP2 連線延遲比較大,但因為 HTTP2 支持 multiplexing 與 高效的 binary format,gRPC 有較大的吞吐量(throughput)
    • WebSocket : 使用持續的 TCP 連線,通信完成才關閉,也可以做 multiplexing ,但必須要使用第三方函式庫或自己寫代碼,比較麻煩
  • scalability
    • gRPC : 使用的 HTTP 是 stateless,維持通信所需的任何信息都會在每次請求/響應交換時重新傳輸。雖然這造成標頭中數據的低效重複,但它也確保了服務器在過程中是可互換的,因為它們都不需要記住與它們通信的客戶端的任何信息。擴展比較簡單
    • WebSocket : stateful protocol,依賴於雙方(尤其是服務器)存儲有關連接狀態和先前消息歷史記錄的信息。 您需要更複雜的代碼來跟踪狀態。此外,客戶端只能與有權訪問當前狀態的服務器進程通信。 這會使擴展大量 WebSocket 之間的連接變得困難 但總而言之,WebSocket 佔用資源較少,差不多規模的系統,使用 gRPC 會需要比較大的計算能力和頻寬

使用時機

gRPC

  • Connecting polyglot services in a microservices-style architecture.
  • Connecting client devices (e.g., mobile devices) to backend services. (理想情況不涉及高頻數據更新)
  • Connecting point-to-point realtime services that need to handle streaming requests or responses.

WebSocket

  • Realtime updates, where the communication is unidirectional, and the server is streaming low-latency (and often frequent) updates to the client. (例如:實時比分更新、新聞源、警報和通知 等)
  • Bidirectional communication, where both the client and the server send and receive messages. (例如:聊天室、虛擬活動、虛擬教室)
  • 多用戶協作(例如:同時編輯一文檔)
  • Fanning out (broadcasting) the same message to multiple users at once.(pub/sub messaging)

參考資料