概念:
生產者(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...