爲何使用消息隊列
消息隊列的優缺
1優勢程序員
(1) 解耦 數據庫
(2) 異步服務器
(3) 消峯架構
2 缺點異步
(1)系統的可用性下降,系統引入的外部依賴越多,越容易掛掉 (2)系統複雜性提升 (3)數據一致性問題
經常使用消息隊列的優缺點 分佈式
(1)activeMq 技術很是成熟,可是偶爾會出現較低機率的丟失消息,並且如今社區以及國內應用都愈來愈少性能
(2)rabbitMQ 社區相對活躍,吞吐量是萬級別,並且開元,性能極好,可是erlang語言阻止了大量的Java程序員深刻研究和掌握他,對公司而言幾乎是不可控的學習
(3)rocketMq 10萬級別的,rockectMq 也是能夠支持高吞吐的一個MQ,topic能夠達到幾百,幾千的級別,可用性很是的高,分佈式架構,可是社區有黃的風險。大數據
(4)kafka 特色就是僅僅提供較少的核心功能,可是提供較高的吞吐量,極高的可用性能,並且分佈式能夠隨意的擴展,可是沒有重複消費,會對大數據產生一點點影響,特別適合大數據領域的實時計算,日誌採集等場景,社區活躍度很高線程
消息隊列的高可用
(1)kafka是自然的分佈式消息隊列,就是說一個topic的數據,是分散在多個機器上的,每個機器就放其中的一部分數據,kafka0.8之後,提供了HA機制,就是replica的副本機制,,每個partition的數據都會同步到其餘的機器上,造成本身的多個replica副本,而後全部的replica就會選舉一個leader出來,那麼生產者和消費者都跟這個leader打交道,而後其餘的replica就是flower,leader會負責將數據同步到follower中去,讀的時候直接讀leader上的數據就好了。這麼搞,就有所謂的高可用性了,由於若是摸一個broke硯機了,那麼其餘的機器上有他的副本,若是時某個partition的leader出現了問題,那麼follower就會選舉爲新的leader,你們就能夠繼續讀寫那個新的leader便可,這就是所謂的高可用性。
如何保證消息不被重複消費(如何保證消息的消費時的冪等性)
kafka有個offset的概念,就是每次每一個消息寫進去,都有一個offset,表明他的序號,而後,consumer 消費了數據以後,每隔一段時間,就會把本身消費了的offset提交一下,表明我已經消費過了,下一次要是重啓啥的,就會繼續從上一次的消費的offset來繼續消費,可是假如,有時候 重啓系統,就會致使有些尚未來的及處理的消息沒有offset,就會致使有些消息會在消費一次。其實重複消費並無什麼,最重要的是保證冪等性,如何消除冪等性的問題
(1)好比,你拿數據庫裏面的數據,你先跟住主鍵進行查詢一下,若是數據都有了,你就不須要插入了,直接update一下就行了
(2)好比你是寫Redis,那就沒有問題了,反正每次都是set,自然冪等性
(3)可使用惟一鍵進行約束
如何保證數據的可靠性傳輸
(1)消費端能丟了數據
就是說消費者消費了消費到消息,而後消費者那邊自動提交了offset,讓kafka覺得你已經消費了數據,可是其實你這邊尚未處理,就已經掛了,那麼只須要關閉自動提交offset,在處理完成之後本身手動的提交offset,就能夠保證數據不會丟失了,可是此時會存在重複消費的問題,這時,只須要保證冪等問題就行了。
(2)kafka弄丟了數據
這是一個比較常見的問題,就是kafka某個broke巖機,而後從新選舉某一個partition的leader時,假如此時其餘的follower還有一些數據尚未同步,結果leader就已經掛了,而後選舉某一個follower成leader後,就會少了一批數據。此時,咱們要給topic設置4個參數就行了, *1 給topic設置replication.factor參數,這個值必須大於1,要求每個partition必須至少2個副本 ?? *2 在producer端設置ACKs=all:這是要求每條數據,都必須是寫入replica以後,才能認爲是寫入成功了 *3 在producer端設置retries=max,這就要求一旦寫入失敗,就無限重試,卡在這裏了。 *4 在kafka服務器設置min.insync.replicas參數,這個值必須大於1,這是要求一個leader至少感知到有至少一個follower還和本身進行聯繫,沒有掉隊,這樣才能保證leader掛了,還有一個follower
如何保證數據的有序性
一個topic,一個partition,一個consumer,內部線程消費,寫N個內存queue,而後N個線程分別消費一個內存queue便可
如何解決消息隊列中的時效性問題,消息對列中消息滿了怎麼辦
擴容 (0)將現有的consumer停掉 (1)新建一個topic,partition是原來的10倍,臨時建好原先10倍或20倍的queue數量 (2)寫一些臨時的分發數據的程序,將程序部署到上面進行消費
設計一個MQ系統架構注意點
(1) 系統可伸縮,就是想要擴容的時候可以擴容,咱們能夠採用分佈式架構 (2) MQ的數據怎樣落地到磁盤 (3) MQ的可用性 (4) 保證數據的完整性,以及數據丟失的方案
總結 經過以上的學習可使咱們基本瞭解消息隊列的使用。