後端必備——數據通訊知識(RPC、消息隊列)一站式總結

我本身總結的Java學習的系統知識點以及面試問題,目前已經開源,會一直完善下去,歡迎建議和指導歡迎Star: https://github.com/Snailclimb/Java-Guidehtml

RPC

RPC(Remote Procedure Call)—遠程過程調用 ,它是一種經過網絡從遠程計算機程序上請求服務,而不須要了解底層網絡技術的協議。RPC協議假定某些傳輸協議的存在,如TCP或UDP,爲通訊程序之間攜帶信息數據。在OSI網絡通訊模型中,RPC跨越了傳輸層和應用層。RPC使得開發分佈式程序就像開發本地程序同樣簡單。git

RPC採用客戶端(服務調用方)/服務器端(服務提供方)模式, 都運行在本身的JVM中。客戶端只須要引入要使用的接口,接口的實現和運行都在服務器端。RPC主要依賴的技術包括序列化、反序列化和數據傳輸協議,這是一種定義與實現相分離的設計。github

目前Java使用比較多的RPC方案主要有RMI(JDK自帶)、Hessian、Dubbo以及Thrift等。面試

注意: RPC主要指內部服務之間的調用,RESTful也能夠用於內部服務之間的調用,但其主要用途還在於外部系統提供服務,所以沒有將其包含在本知識點內。redis

常見RPC框架:

  • RMI(JDK自帶): JDK自帶的RPC

    詳細內容能夠參考:從懵逼到恍然大悟之Java中RMI的使用數據庫

  • Dubbo: Dubbo是 阿里巴巴公司開源的一個高性能優秀的服務框架,使得應用可經過高性能的 RPC 實現服務的輸出和輸入功能,能夠和 Spring框架無縫集成。服務器

    詳細內容能夠參考:微信

  • Hessian: Hessian是一個輕量級的remotingonhttp工具,使用簡單的方法提供了RMI的功能。 相比WebService,Hessian更簡單、快捷。採用的是二進制RPC協議,由於採用的是二進制協議,因此它很適合於發送二進制數據。

    詳細內容能夠參考: Hessian的使用以及理解網絡

  • Thrift: Apache Thrift是Facebook開源的跨語言的RPC通訊框架,目前已經捐獻給Apache基金會管理,因爲其跨語言特性和出色的性能,在不少互聯網公司獲得應用,有能力的公司甚至會基於thrift研發一套分佈式服務框架,增長諸如服務註冊、服務發現等功能。

    詳細內容能夠參考: 【Java】分佈式RPC通訊框架Apache Thrift 使用總結框架

如何進行選擇:

  • 是否容許代碼侵入: 即須要依賴相應的代碼生成器生成代碼,好比Thrift。
  • 是否須要長鏈接獲取高性能: 若是對於性能需求較高的haul,那麼能夠果斷選擇基於TCP的Thrift、Dubbo。
  • 是否須要跨越網段、跨越防火牆: 這種狀況通常選擇基於HTTP協議的Hessian和Thrift的HTTP Transport。

此外,Google推出的基於HTTP2.0的gRPC框架也開始獲得應用,其序列化協議基於Protobuf,網絡框架使用的是Netty4,可是其須要生成代碼,可擴展性也比較差。

消息中間件

消息中間件,也能夠叫作中央消息隊列或者是消息隊列(區別於本地消息隊列,本地消息隊列指的是JVM內的隊列實現),是一種獨立的隊列系統,消息中間件常常用來解決內部服務之間的 異步調用問題 。請求服務方把請求隊列放到隊列中便可返回,而後等待服務提供方去隊列中獲取請求進行處理,以後經過回調等機制把結果返回給請求服務方。

異步調用只是消息中間件一個很是常見的應用場景。此外,經常使用的消息隊列應用場景還偷以下幾個:

  • 解耦 : 一個業務的非核心流程須要依賴其餘系統,但結果並不重要,有通知便可。
  • 最終一致性 : 指的是兩個系統的狀態保持一致,能夠有必定的延遲,只要最終達到一致性便可。常常用在解決分佈式事務上。
  • 廣播 : 消息隊列最基本的功能。生產者只負責生產消息,訂閱者接收消息。
  • 錯峯和流控

具體能夠參考:

《消息隊列深刻解析》

當前使用較多的消息隊列有ActiveMQ(性能差,不推薦使用)、RabbitMQ、RocketMQ、Kafka等等,咱們以前提升的redis數據庫也能夠實現消息隊列,不過不推薦,redis自己設計就不是用來作消息隊列的。

  • ActiveMQ: ActiveMQ是Apache出品,最流行的,能力強勁的開源消息總線。ActiveMQ是一個徹底支持JMS1.1和J2EE 1.4規範的JMSProvider實現,儘管JMS規範出臺已是好久的事情了,可是JMS在當今的J2EE應用中間仍然扮演着特殊的地位。

    具體能夠參考:

    《消息隊列ActiveMQ的使用詳解》

  • RabbitMQ: RabbitMQ 是一個由 Erlang 語言開發的 AMQP 的開源實現。RabbitMQ 最初起源於金融系統,用於在分佈式系統中存儲轉發消息,在易用性、擴展性、高可用性等方面表現不俗

    AMQP :Advanced Message Queue,高級消息隊列協議。它是應用層協議的一個開放標準,爲面向消息的中間件設計,基於此協議的客戶端與消息中間件可傳遞消息,並不受產品、開發語言等條件的限制。

具體能夠參考:

《消息隊列之 RabbitMQ》

推薦閱讀:

《Kafka、RabbitMQ、RocketMQ等消息中間件的對比 —— 消息發送性能和區別》

歡迎關注個人微信公衆號:" Java面試通關手冊"(一個有溫度的微信公衆號,無廣告,單純技術分享,期待與你共同進步~~~堅持原創,分享美文,分享各類Java學習資源。您想關注便關注,😁,公衆號只是我記錄文字和生活的地方,無所謂利益。)
相關文章
相關標籤/搜索