RabbitMQ topic细致的消息过滤广播模式

一、前言

  刚才我们做了一个区分,把error、warning绑定级别把消息区分了。我们回到日志上,如果想做的更细致的区分,比如说,你现在搜索的有error,有warning等,在Linux上有一个系统日志,这个系统日志搜索所有应用的系统日志。所有程序都在这个日志里面打日志。那如果我想划分出来。什么是mysql的发出来的日志,什么是apache发出来的日志。然后mysql日志里面同时是info,又包含warning,error。Apache也是一样,所以我们要做更细的区分,更细致的消息过滤。

二、topic广播模式逻辑图

 

三、topic广播方式的代码实现

3.1、生产者(publicer)

#!/usr/bin/env python
#-*- coding:utf-8 -*-
__author = "susu"
import pika, sys
credentials = pika.PlainCredentials('junesu', '123456')
#连接信息
connection = pika.BlockingConnection(pika.ConnectionParameters(
    '192.168.5.132',5672,'/',credentials))
channel = connection.channel()
# 声明一个topic的exchange
channel.exchange_declare(exchange="topic_logs",
                         exchange_type="topic")

routing_key = sys.argv[1] if len(sys.argv) > 1 else "anonymous.info"

message = " ".join(sys.argv[2:]) or "hello world"
channel.basic_publish(exchange="topic_logs",
                      routing_key=routing_key,
                      body=message)
print(" [x] Sent %r:%r" % (routing_key, message))
connection.close()

 注:这边修改了exchange的类型,类型为topic,topic=>话题,意思是:你对什么话题感兴趣,就收什么消息。

3.2、消费者(consumer) 

#!/usr/bin/env python
#-*- coding:utf-8 -*-
__author = "susu"
import pika, sys

credentials = pika.PlainCredentials('junesu', '123456')
#连接信息
connection = pika.BlockingConnection(pika.ConnectionParameters(
    '192.168.5.132',5672,'/',credentials))

channel = connection.channel()
# 声明topic类型的exchange
channel.exchange_declare(exchange="topic_logs",
                         exchange_type="topic")

result = channel.queue_declare(exclusive=True)
queue_name = result.method.queue

banding_keys = sys.argv[1:]
if not banding_keys:
    sys.stderr.write("Usage: %s [binding_key]...\n" % sys.argv[0])
    sys.exit(1)
# 循环绑定queue
for banding_key in banding_keys:
    channel.queue_bind(exchange="topic_logs",
                       queue=queue_name,
                       routing_key=banding_key)

print(' [*] Waiting for logs. To exit press CTRL+C')


# 回调函数
def callback(ch, method, properites, body):
    "回调函数"
    print(" [x] %r:%r" % (method.routing_key, body))


# 消费者消费
channel.basic_consume(callback, queue=queue_name, no_ack=True)

channel.start_consuming()

 注:这边除了定义exchange的类型变了,其他的都没有改变。

四、运行效果

 

4.1、客户端匹配mysql.*,*.error

4.2、客户端匹配所有的

五、匹配规则

 

   To receive all the logs run: =># 是匹配所有的

python receive_logs_topic.py "#"

   To receive all logs from the facility "kern":  =>只匹配kern开头的

python receive_logs_topic.py "kern.*"

   Or if you want to hear only about "critical" logs:  =>匹配critical结尾的

python receive_logs_topic.py "*.critical"

   You can create multiple bindings:

python receive_logs_topic.py "kern.*" "*.critical"

   And to emit a log with a routing key "kern.critical" type:

    python emit_log_topic.py "kern.critical" "A critical kernel error"

 

posted @ 2017-11-28 14:07  人生是一场修行  阅读(967)  评论(0编辑  收藏  举报