rabbitmq 簡單梳理

2022-04-13 09:51:16 字數 2141 閱讀 2836

概念:

生產者(producer,簡寫p),負責發布訊息。

「交換機」(exchange, 簡寫x), 負責中轉訊息。

路由(route, 簡寫r), 即 x->q的路線名。

訊息佇列 (queue, 簡寫q), 負責臨時儲存訊息。

消費者(customer,簡寫c), 負責處理訊息。

完整關係**:

p: 負責發布訊息, 可繫結到乙個exchange上,預設的exchange名為空字串,型別為direct。 推送訊息時,需要指定路由名(routing_key)。

發布訊息時,需要指定:

routing_key, 路由名

body,訊息正文

properties,訊息屬性

amqp協議定義的訊息屬性支援14種之多,最常用的有四種:

delivery_mode: 2---持久化訊息。  其他值----臨時訊息(不存檔案/資料庫)

reply_to: **佇列名稱, 

correlation_id: 訊息id, 可用於匹配響應內容。

x: 負責路由訊息,型別有

* :  代表乙個單詞(關鍵字)

# : 代表0~n個單詞(用.分隔)

對於上圖的路由情況:

eg.訊息a.orange.b 匹配*.orange.* , 去q1

訊息a.b.rabbit, 匹配*.*.rabbit, 去q2

訊息lazy.b.orange, 匹配  *.orange.* 和  laze.# 去 q1和q2, 訊息被處理兩次!

訊息lazy.b.rabbit, 匹配 *.*.rabbit 和 lazy.# 去q2, 由於是統一個佇列,只投遞一次。只處理一次!

訊息hardworking.a.cow, 不匹配任何路由規則,訊息將被丟棄!

路由的宣告: 在繫結佇列到exchange上時宣告。

路由:佇列繫結到exchange上,需要指定路由,預設為''(路由名為空時,匹配佇列名)

q: 佇列, 快取訊息,

可進行持久化(durable), 在少數極端條件下,即使durable的佇列訊息也可能丟失。

要持久化訊息,處理佇列要宣告為可持久化的,訊息在推送時,也需要指定其屬性為可持久化的(delivery_mode = 2)。

有臨時佇列(c指定,用exclusive屬性宣告佇列), 隨消費者銷毀而銷毀(專用)。

佇列在分發訊息給消費者(多個消費者)時,預設是按訊息條數平分的。即:若佇列(q)裡有10條訊息, 有兩個消費者(c1和c2), 那麼c1得到(1,3,5,7,9), c2得到(2,4,6,8,10)。

若想佇列在下發訊息時,考慮到消費者的處理能力,做到處理大而耗時任務的少發,處理小而快速的任務的消費者多發(即負載均衡), 需要配置消費者同時處理最大任務數屬性(prefetch)

pika 裡面是:  channel.basic_qos(prefetch=1)

c: 消費者可以繫結到乙個佇列上,進行監聽,訊息來了即處理, 從這個角度講, 消費者可以作為server端。

消費者在輪詢監聽到訊息,交給**函式(callback)來處理訊息。

消費者指定訊息佇列中的訊息的刪除模式(確認後刪除/不需要確認刪除),通過no_ack引數(預設為false, 即需要確認), 需要確認的訊息在其**函式中,得進行確認操作。以保證訊息總能得到處理,不會丟失。預設, 如果乙個消費者程序掛掉了, 沒有確認"訊息處理完了", 訊息佇列將重發此訊息給下乙個消費者(保證服務可靠性)。

應用:

1. 提高系統併發性:

對於某些可以非同步處理的任務(傳送簡訊/郵件/推送等等),及時將任務publish到訊息佇列中,及時返回,不阻塞請求。

2. 應用於某些設計模式:

訊息發布/訂閱

3. rpc

demo參考這裡。

謝謝!  

RabbitMQ知識梳理

rabbitmq 入門使用 高階使用 高階佇列 生產者和消費者 佇列 交換機 路由鍵 繫結 生產者傳送訊息過程 連線到 rabbitmq broker 建立乙個連線 connection 開啟通道 channel 宣告交換器 設定相關屬性 宣告佇列,設定相關屬性 通過路由鍵將交換器和佇列繫結起來 傳...

crontab 簡單梳理

基本格式 command 分 時 日 月 周 命令 第1列表示分鐘1 59每分鐘用 或者 1表示 第2列表示小時1 23 0表示0點 第3列表示日期1 31 第4列表示月份1 12 第5列標識號星期0 6 0表示星期天 第6列要執行的命令 延遲一秒,需要用到 sleep 1 這個引數,注意是分號 比...

hive DML 簡單梳理

環境相關 os centos release 6.9 ip 192.168.77.10 hadoop 2.6.0 cdh5.7.1 hive 1.1.0 cdh5.7.1 mysql5.1 hive的dml中,update和delete一般不會用,生產資料是不會刪除的,常用overwrite和loa...