天天看點

RabbitMQ從入門到面試(一)

在剛開始接觸Rabbitmq 的時候,從網上搜尋了很多資料以便于快速了解,但是這些資料都是零星的分布,并且品質參差不齊無用重複的太多。是以打算寫一個Rabbitmq系列的文章,作為一個參考,幫助後來者更好的學習。

消息中間件的簡介

1.1 什麼是消息中間件

在學習消息中間件之前,我們就聽過很多概念,包括:RabbitMQ、ActiveMQ 、RocketMQ、Kafka等。這些所謂的消息中間件也也把我們搞得腦殼疼。

RabbitMQ從入門到面試(一)

那麼什麼是消息隊列中間件(Message Queue Middleware,簡稱MQ)呢,稍微專業一點就是利用高效可靠的消息傳遞機制與平台無關的資料交流,并且基于資料通信來進行分布式系統的內建。

消息中間件一般有兩種傳遞模式:點對點(Point-to-Point,簡稱P2P)模式和釋出訂閱(Pub/Sub)模式。點對點模式主要是基于隊列實作,消息生産者發送消息到隊列,消息消費者從隊列中接收消息,這也就使得消息可以異步傳輸。在生活中微信已經與我們的生活密不可分,我們經常會關注一些公衆号來擷取資訊,這也就是我們所說的釋出和訂閱模式。公衆号号主,将文章釋出到微信公衆号平台,訂閱者從平台中訂閱消息,公衆号平台使得也使得消息釋出者和訂閱者之間互相獨立,無需接觸就可以保證消息的傳遞。在衆多消息中間件中本文主要介紹RabbitMQ。

1.2 消息中間件的使用場景

曾幾何時,你是否有過這樣的體驗,你懷着激動地心情坐在公司的接待處等待着面試官的到來。不遠處你看到面試官穿着拖鞋,抱着一個滿是劃痕的Mac,是不是撥弄着頭頂那僅剩不多的幾戳頭發。走到你面前開門見山的說道,用過消息中間件嗎?你們公司是怎麼使用的,簡單介紹一下。

面試題:消息中間件的使用場景,為什麼要用它?

回答:MQ主要有三個作用,解耦、異步、削峰。

解耦:在實際項目中如果有三個系統ABC,A系統通過接口調用發送資料給BC系統,随着項目的發展又加入D系統,或者C系統不需要資料了,此時又要修改A系統的代碼,比較麻煩。因為A系統和其他系統之間的耦合性太高,但是如果使用MQ,A系統将資料發送的MQ中,然後MQ再将資料發送給其他系統,就會大大降低耦合性。

異步:在很多時候應用不想立即處理消息。MQ同時也提供了異步處理機制。A系統發送資料給B系統,B系統如果一直不接收資料,此時A系統就無法結束線程。但是如果使用MQ,A系統可以直接将資料放入MQ中,而不需要等待B系統處理完資料。

削峰:在通路量激增的情況下,系統會無法保證正常使用,但是這樣的突發流量不常見,如果單純為此投入資源,也是一個巨大的浪費。使用MQ就可以支撐通路壓力,降低系統因為超負荷的請求而崩潰。

同時MQ的應用還不僅于此,在日志進行中,可以使用Kafka解決大資料環境下的大量日志傳輸問題。

面試題:MQ有哪些缺點

回答:MQ的優點我們在上面巴拉巴拉的說了很多,但是任何事物都是有雙面性的,有優點必然也會存在缺點。比如:系統的可用性也會大大降低了。在系統中加入中間件,如果中間件挂了,那麼系統也就無法正常執行。同時系統的複雜度也增大了很多。還有就是會出現一緻性問題,如果A系統将資料發送到MQ後傳回成功,此時A系統就會認為請求成功了,但是如果MQ将資料發送給其他系統的過程中挂掉了,那麼就會出現資料不一緻的問題。

如何選擇消息中間件

面試官此時漫不經心的看着你說,你們公司生産環境下用的什麼消息中間件,為什麼選這個?

當我們在回答這種問題時,一定要對常用的消息中間件的性能以及其局限性有一定的了解。

比如:ActiveMQ是比較常用的消息中間件,過去國内很多公司應用廣泛,功能比較強大。但是ActiveMQ無法支撐網際網路公司的高并發、高負載以及高吞吐量的複雜場景,在網際網路公司使用較少多使用于傳統企業。

RabbitMQ的好處在于可以支撐高并發、高吞吐性能比較強大,同時擁有非常完善的背景管理界面可以使用,同時支援叢集部署,它的開源社群也很活躍版本疊代頻率較高。但是RabbitMQ是基于erlang語言開發,是以很少有公司有實力做到erlang源碼級别的研究和定制。

RocketMQ是阿裡開源的Java項目,經過阿裡生産環境的高并發、高吞吐的考驗,性能卓越還支援分布式場景的應用,并且RocketMQ是基于Java語言開發,适合深入閱讀源碼。

Kafka的特點比較明顯,它僅僅能提供較少的核心功能,但是提高超高的吞吐量,毫秒級的延時。它的優勢在于超高吞吐量的日志采集、實時資料同步與計算,多用于大資料領域。

ActiveMQ RabbitMQ RocketMQ Kafka
單機吞吐量 比RabbitMQ低 萬級 萬級 十萬級
消息延遲 微秒級 毫秒級 毫秒級
開發語言 Java Erlang Java Scala/Java
消息丢失 理論上不會 理論上不會
社群活躍度

綜合以上各種對比:ActiveMQ的性能比較差,沒有經過大規模的吞吐量場景驗證,社群也不是很活躍,是以不太建議使用。RabbitMQ雖然使用Erlang語言開發,但是開源的,并且性能并較好,社群活躍度也比較高,相比較RocketMQ,它是使用Java開發,如果對自己公司的技術實力有絕對信心,可以使用RocketMQ,否則建議使用RabbitMQ。如果是大資料領域的實時計算、日志采集等可以使用Kafka,社群的活躍度很高,并且幾乎是行業内的标準,大家都在使用。