1. Fanout模式
Fanout模式的交換機(jī)是扇出交換機(jī)(Fanout Exchange
),它會(huì)將消息廣播給所有綁定到它的隊(duì)列,而不考慮消息的內(nèi)容或路由鍵。
工作原理:
- 生產(chǎn)者發(fā)送消息到
Fanout Exchange
。 Fanout Exchange
會(huì)將消息廣播給所有綁定到它的隊(duì)列,所有綁定的隊(duì)列都會(huì)收到這條消息。- 消費(fèi)者監(jiān)聽綁定的隊(duì)列,處理收到的消息。
特點(diǎn):
- 沒有路由鍵:消息不需要路由鍵,所有綁定的隊(duì)列都會(huì)接收到消息。
- 廣播機(jī)制:消息會(huì)被廣播到所有與交換機(jī)綁定的隊(duì)列,而不管消息內(nèi)容。
應(yīng)用場(chǎng)景:
- 廣播系統(tǒng)消息:適合需要通知多個(gè)服務(wù)模塊或系統(tǒng)節(jié)點(diǎn)的場(chǎng)景。
- 日志系統(tǒng):將日志消息廣播到多個(gè)日志處理服務(wù)。
exchange_type = 'fanout'
exchange = channel.exchange_declare(exchange='logs', exchange_type=exchange_type)
2. Direct模式
Direct模式使用直連交換機(jī)(Direct Exchange
),通過消息的**路由鍵(Routing Key)**來精確匹配隊(duì)列。如果生產(chǎn)者的消息路由鍵和隊(duì)列綁定的路由鍵相同,消息就會(huì)被分發(fā)到該隊(duì)列。
工作原理:
- 生產(chǎn)者發(fā)送帶有路由鍵的消息到
Direct Exchange
。 Direct Exchange
根據(jù)消息的路由鍵,將消息精確地分發(fā)給綁定了相同路由鍵的隊(duì)列。- 消費(fèi)者監(jiān)聽對(duì)應(yīng)的隊(duì)列,處理符合路由鍵的消息。
特點(diǎn):
- 精確路由:消息根據(jù)路由鍵精確匹配隊(duì)列。
- 一對(duì)一或多對(duì)一:不同隊(duì)列可以綁定不同的路由鍵,確保只有匹配的隊(duì)列收到消息。
應(yīng)用場(chǎng)景:
- 日志系統(tǒng):將不同級(jí)別的日志(info、error、warning)發(fā)送到不同的日志處理隊(duì)列。
- 分布式任務(wù):根據(jù)任務(wù)類型(如
task_type_1
或task_type_2
)精確分發(fā)任務(wù)
exchange_type = 'direct'
exchange = channel.exchange_declare(exchange='direct_logs', exchange_type=exchange_type)# Binding with specific routing key
channel.queue_bind(exchange='direct_logs', queue='error_logs', routing_key='error')
3. Topic模式
Topic模式使用主題交換機(jī)(Topic Exchange
),允許使用通配符進(jìn)行消息路由。消息的路由鍵由一個(gè)點(diǎn)分隔的字符串組成,隊(duì)列可以通過通配符綁定到交換機(jī),實(shí)現(xiàn)模糊匹配。
工作原理:
- 生產(chǎn)者發(fā)送帶有路由鍵的消息到
Topic Exchange
,路由鍵由點(diǎn)分隔的多個(gè)單詞組成,例如"logs.info"
, "user.create"
, "order.payment.success"
. - 隊(duì)列綁定到
Topic Exchange
時(shí),可以使用通配符匹配多個(gè)路由鍵: *
匹配一個(gè)單詞。#
匹配零個(gè)或多個(gè)單詞。
- 消費(fèi)者監(jiān)聽隊(duì)列,接收符合通配符規(guī)則的消息。
特點(diǎn):
- 模糊匹配:消息根據(jù)路由鍵的模式進(jìn)行模糊匹配。
- 靈活路由:支持復(fù)雜的路由需求,允許將相似類別的消息路由到同一個(gè)隊(duì)列。
應(yīng)用場(chǎng)景:
- 消息分類處理:適合需要對(duì)復(fù)雜系統(tǒng)中的消息進(jìn)行分類的場(chǎng)景,比如基于用戶操作類型、訂單狀態(tài)等。
- 多模塊事件處理:可以為不同的模塊創(chuàng)建靈活的訂閱機(jī)制。
exchange_type = 'topic'
exchange = channel.exchange_declare(exchange='topic_logs', exchange_type=exchange_type)# Binding queue with topic patterns
channel.queue_bind(exchange='topic_logs', queue='system_logs', routing_key='logs.*')
channel.queue_bind(exchange='topic_logs', queue='all_logs', routing_key='#')
4. 頭部模式
頭部模式使用頭部交換機(jī)(Headers Exchange
),不同于Direct和Topic模式,它不是通過路由鍵來路由消息,而是通過消息的頭部屬性來路由。隊(duì)列綁定到交換機(jī)時(shí)會(huì)指定一組頭部鍵值對(duì),只有當(dāng)消息的頭部屬性匹配這些鍵值對(duì)時(shí),消息才會(huì)被路由到相應(yīng)的隊(duì)列。
工作原理:
- 生產(chǎn)者發(fā)送帶有頭部屬性的消息到
Headers Exchange
。 - 隊(duì)列綁定到
Headers Exchange
時(shí),會(huì)指定匹配條件(例如x-match=all
表示所有頭部鍵值對(duì)都必須匹配,x-match=any
表示只要有一個(gè)匹配即可)。 - 交換機(jī)根據(jù)頭部屬性將消息分發(fā)給符合條件的隊(duì)列。
特點(diǎn):
- 基于頭部字段路由:不依賴路由鍵,消息的頭部屬性決定消息的路由。
- 更復(fù)雜的路由邏輯:適合需要根據(jù)多種屬性組合來路由的場(chǎng)景。
應(yīng)用場(chǎng)景:
- 消息過濾:適合需要根據(jù)消息的多個(gè)屬性來進(jìn)行復(fù)雜過濾的場(chǎng)景,比如需要根據(jù)來源、優(yōu)先級(jí)等多個(gè)條件篩選消息。
- 高度靈活的路由邏輯:當(dāng)單純依賴路由鍵不足以滿足需求時(shí),使用頭部模式更合適。
exchange_type = 'headers'
exchange = channel.exchange_declare(exchange='header_logs', exchange_type=exchange_type)# Binding queue with header matching criteria
channel.queue_bind(exchange='header_logs', queue='error_logs', arguments={'x-match': 'all', 'type': 'error', 'format': 'json'})