參考資料

Remote procedure invocation
Client 使用同步的 remote procedure invocation 協定(如 REST)來呼叫服務

使用 REST
REST 成熟度模型
  • Level 0:沒有 resource 概念。Client 用 HTTP POST 呼叫服務
  • Level 1:支援 resource 概念。Client 用 HTTP POST 呼叫服務
  • Level 2:支援 resource 概念。使用 HTTP verb 來執行動作。GET -> 查詢;POST -> 建立;PUT -> 更新。
  • Level 3:支援 HATEOAS(Hypertext As The Engine Of Application State)原則。(www.infoq.com/news/2009/04/ hateoas-restful-api-advantages)(比較難想像)

定義 REST API
  • 必須使用 interface definition language 來定義你的 API
  • 最受歡迎的 REST IDL 是 Open API Specification(Swagger)

單一請求取得多個資源的挑戰
  • 允許 client 在取得資源時同時取得相關資源。例如 client 可以用 GET /orders/order-id-1345?expand=consumer 來取得 Order 和它的 Consumer
  • GraphQL(http://graphql.org)和 Netflix Falcor(http://netflix.github.io/falcor/),是為了支援高效資料擷取而設計的

將操作對應到 HTTP Verb 的挑戰
更新一個 order 可能有多種方式
  • 使用 PUT
  • 定義 sub-resource 來更新資源的特定面向
  • 例如 POST /orders/{orderId}/cancel
  • 例如 POST /orders/{orderId}/revise
  • gRPC

使用 gRPC
  • 是一種二進位的訊息協定
  • 用 Protocol Buffers-based IDL 來定義 gRPC API
  • 強制採用 API-first 的服務設計方式
  • 除了支援簡單的 request/response RPC,gRPC 也支援 streaming RPC
  • 使用 Protocol Buffers 作為訊息格式

使用 Circuit Breaker Pattern 處理部分失敗
Pattern: Circuit breaker
一個 RPI proxy,當連續失敗次數超過指定的閾值後,在一段逾時期間內立即拒絕呼叫

開發穩健的 RPI Proxy
  • 網路逾時:永遠不要無限期阻塞,等待回應時一定要設定逾時
  • 限制從 client 到服務的未完成請求數量
  • Circuit breaker pattern:如果錯誤率超過某個閾值,就跳開斷路器,讓後續的嘗試立即失敗
  • 參考實作:Netflix Hystrix(https://github.com/Netflix/Hystrix

從不可用的服務中復原
  • 直接回傳錯誤給 client
  • 回傳 fallback 值,例如預設值或快取的回應,可能比較合理