RabbitMq概要

RabbitMq

image.png

1. 背景
    a. AMQP-高級(jí)消息隊(duì)列協(xié)議
    b. 解耦
    c. 方便拓展
2. 概念
     A. 消費(fèi)者和生產(chǎn)者
        (1). 生產(chǎn)者-producer創(chuàng)建消息,然后發(fā)布(發(fā)送到)代理服務(wù)器(RabbitMQ)
            $1. 什么是消息
                a. 有效載荷(payload)
                    任意數(shù)據(jù),任意格式
                b. 標(biāo)簽(label)
                    描述了有效載荷,RabbitMQ通過(guò)它能決定誰(shuí)能獲得消息的拷貝
                c. 發(fā)后即忘(fire-and-forget)的通信方式
        (2). 消費(fèi)者連接到代理服務(wù)器,訂閱到隊(duì)列上
            a. 隊(duì)列類似一個(gè)具名郵箱
            b. 消息在到達(dá)隊(duì)列后,RabbitMQ會(huì)把消息傳遞給其中的一個(gè)訂閱/監(jiān)聽(tīng)的消費(fèi)者
            c. 消息標(biāo)簽不會(huì)隨著有效載荷一同傳遞
            d. 如果需要得知發(fā)送方信息,只有把發(fā)送方信息放入有效載荷中
        (3). 信道(生產(chǎn)者或消費(fèi)者向服務(wù)器建立連接)
            a. 建立在tcp連接內(nèi)的虛擬連接
            b. 每條信道都會(huì)有一個(gè)唯一的ID(AMQP庫(kù)存儲(chǔ))
            c. 避免了每次建立和銷毀TCP連接會(huì)話帶來(lái)的開(kāi)銷
            d. 避免了遭遇高峰期操作系統(tǒng)TCP的瓶頸
            e. 一次tcp連接里可以創(chuàng)建多條信道,既保證了線程的私密性,同時(shí)也避免了給操作系統(tǒng)的tcp棧帶來(lái)額外負(fù)擔(dān)
    B. AMQP消息路由
        (1). 隊(duì)列
            $1. AMQP消息通信的基礎(chǔ)模塊
                a. 為消息提供了住所,消息在此等待消費(fèi)
                b .對(duì)負(fù)載均衡來(lái)說(shuō),隊(duì)列是絕佳方案,只需附加一堆消費(fèi)者,并讓RabbitMQ以循環(huán)的方式均勻的分配發(fā)來(lái)的消息
                c. 隊(duì)列是RabbitMQ中消息最后的終點(diǎn)(除非消息進(jìn)入了黑洞)
            $2. 消費(fèi)者通過(guò)兩種方式接受特定隊(duì)列里的消息
                a. basic.consume 訂閱
                    將信道設(shè)置為訂閱模式,消息到達(dá)隊(duì)列時(shí)自動(dòng)接受
                b. basic.get 單條消息
                    不建議放在循環(huán)里使用,影響性能
                消費(fèi)者應(yīng)通過(guò)consume來(lái)實(shí)現(xiàn)高吞吐量
            $3. 隊(duì)列沒(méi)有消費(fèi)者訂閱
                消息在隊(duì)列中等待,直到有消費(fèi)者訂閱,才把消息發(fā)給消費(fèi)者
            $4. 多消費(fèi)者訂閱隊(duì)列
                a. 機(jī)制
                    (1). 循環(huán)發(fā)送給消費(fèi)者
                    (2). 每條消息只會(huì)發(fā)送給一個(gè)消費(fèi)者
            $5. 消費(fèi)者消息確認(rèn)機(jī)制
                a. 命令
                    (1). basic.ack 顯示向Rabbit發(fā)送確認(rèn)
                    (2). auto_ack參數(shù)設(shè)置為true
                    
                b. 機(jī)制
                    (1). 消費(fèi)者收到消息沒(méi)有確認(rèn)就從服務(wù)器斷開(kāi)連接
                        Rabbit會(huì)把消息傳遞給下一位消費(fèi)者
                    (2). 消費(fèi)者收到消息沒(méi)有確認(rèn)并且仍在線
                        不會(huì)再往該消費(fèi)者發(fā)送消息了
                c. 拒絕消息
                    (1). 從服務(wù)器斷開(kāi)連接
                    (2). RabbitMQ2.0以上版本,basic.reject
                        reject命令中的requeue的參數(shù)設(shè)置
                            為true 時(shí) ,RabbitMQ會(huì)自動(dòng)把消息傳送給下一個(gè)消費(fèi)者
                            為false時(shí),Rabbit會(huì)從隊(duì)列移除該消息,不會(huì)發(fā)送給其他消費(fèi)者
             $6. 隊(duì)列創(chuàng)建
                a. 須知
                消費(fèi)者在同一條信道上訂閱另一條隊(duì)列時(shí),無(wú)法再聲明隊(duì)列,必須取消訂閱,設(shè)置信道為傳輸模式
                b.  隊(duì)列名稱
                  (1). 指定隊(duì)列名稱
                  (2). 不指定名稱
                    Rabbit隨機(jī)分配名稱并在queue.declare命令中返回
                c. 重點(diǎn)參數(shù)
                    (1). exclusive
                        為true時(shí),隊(duì)列變成私有的, 只有當(dāng)前應(yīng)用程序才能消費(fèi)隊(duì)列,可以用來(lái)限制一個(gè)隊(duì)列只能有一個(gè)消費(fèi)者
                    (2). auto-delete
                        當(dāng)最后一個(gè)消費(fèi)者取消訂閱時(shí),隊(duì)列就會(huì)自動(dòng)移除
        (2). 交換器
            $1. 四種類型的交換器
                a. direct
                    如果路由建匹配,消息就被投遞到對(duì)應(yīng)的隊(duì)列
                b. fanout
                    將收到的消息廣播到綁定的隊(duì)列上
                c. topic
                    使來(lái)自不同源頭的消息到達(dá)相同的隊(duì)列上
    
        (3). 多租戶于權(quán)限控制
          $1. vhost 虛擬主機(jī)
              a. 方便遷移
              b. 數(shù)據(jù)隔離
          $2. 權(quán)限控制可以在服務(wù)器上或vhost上
              a.消息持久化與策略
                * 必須點(diǎn)
                  (1). 消息的投遞模式設(shè)置成2
                  (2). 發(fā)送給持久化的交換器
                  (3). 到達(dá)持久化的隊(duì)列
              b. AMQP事務(wù)
                發(fā)送方確認(rèn)
3. 實(shí)踐
    (1). 目的
        $1. 解耦
        $2. 提高請(qǐng)求處理速度
        $3. 方便擴(kuò)展
    (2). 發(fā)后即忘模式
        $1. 概念
            a. 創(chuàng)建任務(wù),放置到交換機(jī)上,無(wú)需知道結(jié)果
        $2. 場(chǎng)景運(yùn)用
            a. 日志告警框架
            b. 并行處理
                (1). 執(zhí)行主線任務(wù)
                (2). 附帶任務(wù)分開(kāi)進(jìn)行
    (3). 實(shí)現(xiàn)rpc
        $1. 使用消息來(lái)發(fā)回應(yīng)答
            a. AMQP消息頭字段 reply_to
            b. 生產(chǎn)者以該字段創(chuàng)建隊(duì)列,并監(jiān)聽(tīng)隊(duì)列
            c. 消費(fèi)者檢查該字段,并以該隊(duì)列名稱作為路由鍵
        $2. 匿名隊(duì)列
最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時(shí)請(qǐng)結(jié)合常識(shí)與多方信息審慎甄別。
平臺(tái)聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡(jiǎn)書(shū)系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

  • 初識(shí)RabbitMQ要說(shuō)RabbitMQ,我們不得不先說(shuō)下AMQP。AMQP,即Advanced Message ...
    Jackie_Zheng閱讀 785評(píng)論 0 3
  • 1,簡(jiǎn)單介紹與服務(wù)安裝 1.1,背景 在分布式系統(tǒng)中,我們廣泛運(yùn)用消息中間件進(jìn)行系統(tǒng)間的數(shù)據(jù)交換,便于異步解耦?,F(xiàn)...
    紅薯愛(ài)帥閱讀 276評(píng)論 0 3
  • 關(guān)于消息隊(duì)列,從前年開(kāi)始斷斷續(xù)續(xù)看了些資料,想寫(xiě)很久了,但一直沒(méi)騰出空,近來(lái)分別碰到幾個(gè)朋友聊這塊的技術(shù)選型,是時(shí)...
    預(yù)流閱讀 586,597評(píng)論 51 787
  • 整體架構(gòu) 部署步驟 基于 Docker 基本概念內(nèi)存節(jié)點(diǎn)只保存狀態(tài)到內(nèi)存,例外情況是:持久的 queue 的內(nèi)容將...
    mvictor閱讀 12,903評(píng)論 5 30
  • hello world這句話對(duì)于我們學(xué)習(xí)通信技術(shù)的人來(lái)說(shuō)呢并不陌生,任何一個(gè)編程語(yǔ)言第一個(gè)程序都會(huì)是它。 本周我們...
    好想吃薯愿閱讀 299評(píng)論 0 0

友情鏈接更多精彩內(nèi)容