1. 程式人生 > >python使用rabbitMQ介紹五(話題模式)

python使用rabbitMQ介紹五(話題模式)

localhost env ctr prope clas nec sum spa pan

一、模式介紹

話題模式(Topic)基本思想和路由模式是一樣的,只不過路由鍵支持模糊匹配,符號“#”匹配一個或多個詞,符號“*”匹配不多不少一個詞

話題模式相當於消息的模糊匹配,或者按照正則匹配。其中

# 是通配符,匹配一個或者多個單詞

* 代表匹配一個單詞

模式提醒:

當使用#來收消息時,會接收到所有的消息,這樣和fanout模式一樣了。

當routing key中不含*或者#時,則topic的模式退化為direct的一對一模式。

隊列模型:

技術分享圖片

二、代碼示例

發布者:

 1 #!/usr/bin/env python
 2 import pika
 3 import sys
 4 
 5
connection = pika.BlockingConnection(pika.ConnectionParameters(host=localhost)) 6 channel = connection.channel() 7 8 channel.exchange_declare(exchange=topic_logs, 9 exchange_type=topic) 10 11 routing_key = [#, "kern.critical", "A critical kernel error"] 12 for i in
range(10): 13 message = {} msg at : routing key {}.format(i, routing_key[i % 3]) 14 channel.basic_publish(exchange=topic_logs, 15 routing_key=routing_key[i % 3], 16 body=message) 17 print(" [x] Sent :%r" % (message)) 18 connection.close()

消費者:

 1 import pika
 2 import sys
 3 
 4 connection = pika.BlockingConnection(pika.ConnectionParameters(host=localhost))
 5 channel = connection.channel()
 6 
 7 channel.exchange_declare(exchange=topic_logs,
 8                          exchange_type=topic)
 9 
10 result = channel.queue_declare(exclusive=True)
11 queue_name = result.method.queue
12 
13 binding_key = "#"
14 
15 channel.queue_bind(exchange=topic_logs,
16                    queue=queue_name,
17                    routing_key=binding_key)
18 
19 print( [*] Waiting for logs. To exit press CTRL+C)
20 
21 def callback(ch, method, properties, body):
22     print(" [x] %r:%r" % (method.routing_key, body))
23 
24 channel.basic_consume(callback,
25                       queue=queue_name,
26                       no_ack=True)
27 
28 channel.start_consuming()

發布者輸出:

[x] Sent :0 msg at : routing key #
 [x] Sent :1 msg at : routing key kern.critical
 [x] Sent :2 msg at : routing key error.critical
 [x] Sent :3 msg at : routing key #
 [x] Sent :4 msg at : routing key kern.critical
 [x] Sent :5 msg at : routing key error.critical
 [x] Sent :6 msg at : routing key #
 [x] Sent :7 msg at : routing key kern.critical
 [x] Sent :8 msg at : routing key error.critical
 [x] Sent :9 msg at : routing key #

消費者輸出:

all:可以看到接收到所有的消息

[*] Waiting for logs. To exit press CTRL+C
 [x] #:b0 msg at : routing key #
 [x] kern.critical:b1 msg at : routing key kern.critical
 [x] error.critical:b2 msg at : routing key error.critical
 [x] #:b3 msg at : routing key #
 [x] kern.critical:b4 msg at : routing key kern.critical
 [x] error.critical:b5 msg at : routing key error.critical
 [x] #:b6 msg at : routing key #
 [x] kern.critical:b7 msg at : routing key kern.critical
 [x] error.critical:b8 msg at : routing key error.critical
 [x] #:b9 msg at : routing key #

消費者“critical”,只接收含critical的消息

[*] Waiting for logs. To exit press CTRL+C
 [x] kern.critical:b1 msg at : routing key kern.critical
 [x] error.critical:b2 msg at : routing key error.critical
 [x] kern.critical:b4 msg at : routing key kern.critical
 [x] error.critical:b5 msg at : routing key error.critical
 [x] kern.critical:b7 msg at : routing key kern.critical
 [x] error.critical:b8 msg at : routing key error.critical

消費者“kern”,只接收含kern的消息

[*] Waiting for logs. To exit press CTRL+C
 [x] kern.critical:b1 msg at : routing key kern.critical
 [x] kern.critical:b4 msg at : routing key kern.critical
 [x] kern.critical:b7 msg at : routing key kern.critical

三、隊列信息

在管理頁面上可以看到三個隊列信息,routing key對應著三個隊列的配置

技術分享圖片

python使用rabbitMQ介紹五(話題模式)