後端必備——資料通訊知識(RPC、訊息佇列)一站式總結

SnailClimb發表於2018-06-22

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

RPC

RPC(Remote Procedure Call)—遠端過程呼叫 ,它是一種通過網路從遠端計算機程式上請求服務,而不需要了解底層網路技術的協議。RPC協議假定某些傳輸協議的存在,如TCP或UDP,為通訊程式之間攜帶資訊資料。在OSI網路通訊模型中,RPC跨越了傳輸層和應用層。RPC使得開發分散式程式就像開發本地程式一樣簡單。

RPC採用客戶端(服務呼叫方)/伺服器端(服務提供方)模式, 都執行在自己的JVM中。客戶端只需要引入要使用的介面,介面的實現和執行都在伺服器端。RPC主要依賴的技術包括序列化、反序列化和資料傳輸協議,這是一種定義與實現相分離的設計。

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

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

常見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》

  • RocketMQ:

    具體可以參考:

    《RocketMQ 實戰之快速入門》

    《十分鐘入門RocketMQ》 (阿里中介軟體團隊部落格)

  • Kafka:Kafka是一個分散式的、可分割槽的、可複製的、基於釋出/訂閱的訊息系統,Kafka主要用於大資料領域,當然在分散式系統中也有應用。目前市面上流行的訊息佇列RocketMQ就是阿里借鑑Kafka的原理、用Java開發而得。

    具體可以參考:

    《Kafka應用場景》

    《初談Kafka》

推薦閱讀:

《Kafka、RabbitMQ、RocketMQ等訊息中介軟體的對比 —— 訊息傳送效能和區別》

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

我的公眾號

相關文章