百萬年薪架構師一文整理RabbitMQ、ActiveMQ、RocketMQ、Kafka
一般來說,大型應用通常會被拆分成多個子系統,這些子系統可能會部署在多台機器上,也可能只是一台機器的多個進程中,這樣的應用就是分散式應用。在討論分散式應用時,很多初學者會把它和集群這個概念搞混,因為從部署形態上看,它們都是多台機器或多個進程部署, 而且都是為了實現一個業務功能。這裡有一個簡單的區分標準:如果是一個業務被拆分成多個子業務部署在不同的伺服器上,那就是分散式應用:如果是同一個業務部署在多台伺服器上,那就是集群。而分散式應用的子系統之間並不是完全獨立的,它們需要相互通訊來共同完成某個功能,這就涉及系統間通訊了。
目前,業界通常有兩種方式來實現系統間通訊:
一種是基於遠程過程調用的方式;
一種是基於消息隊列的方式。
遠程調用
前一種就是我們常說的RPC調用,客戶端不需要知道調用的具體實現細節,只需直接調用實際存在於遠程電腦上的某個對象即可,但調用方式看起來和調用本地應用程式中的對象一樣
RPC是一種通過網路從遠程電腦程式上請求服務,而不需要了解底層網路技術的協議。
這句話至少有三個層面的含義。
①它是協議,說明這是一種規範,就需要有遵循這套規範的實現。典型的RPC實現包括Dubbo、Thrift、 GRPC等。
②網路通訊的實現是透明的,調用方不需要關心網路之間的通訊協議、網路I/O模型、通訊的資訊格式等。
③跨語言,調用方實際上並不清楚對端伺服器使用的是什麼程式語言。對於調用方來說,無論其使用的是何種程式語言,調用都應該成功,並且返回值也應按照調用方程式語言能理解的形式來描述。
消息隊列(今天重點)
基於消息隊列的方式是指由應用中的某個系統負責發送資訊,由關心這條消息的相應系統負責接收消息,並在收到消息後進行各自系統內的業務處理。消息可以非常簡單,比如只包含文本字元串;也可以很複雜,比如包含位元組流、位元組數組,還可能包含嵌入對象,甚至是Java對象(經過序列化的對象)。
消息在被發送後可以立即返回,由消息隊列來負責消息的傳遞,消息發布者只管將消息發布到消息隊列而不用管誰來取,消息使用者只管從消息隊列中取消息而不管是誰發布的,這樣發布者和使用者都不用知道對方的存在
應用場景
消息隊列在實際應用中包括如下四個場景:
- 應用耦合:多應用間通過消息隊列對同一消息進行處理,避免調用介面失敗導致整個過程失敗;
- 非同步處理:多應用對消息隊列中同一消息進行處理,應用間並發處理消息,相比串列處理,減少處理時間;
- 限流削峰:廣泛應用於秒殺或搶購活動中,避免流量過大導致應用系統掛掉的情況;
- 消息驅動的系統:系統分為消息隊列、消息生產者、消息消費者,生產者負責產生消息,消費者(可能有多個)負責對消息進行處理;
常用消息隊列
常見的四種消息隊列對比(
RabbitMQ/ActiveMQ/RocketMQ/Kafka)
篇幅原因,也因為時間不夠,所以,介紹就到這裡了,想要更加深入學習消息隊列的,給大家準備一份文檔,我學習消息隊列就是看的這份文檔
需要這份文檔的,關注公眾號:Java架構師聯盟,精彩福利,回復1000即可
目錄
內容展示
麻煩轉發,轉發分享給更多人,謝謝

