交换机-topic

交换机-topic

topic模式相比direct模式,它的选择性更加灵活多样。

direct模式下,队列绑定交换机时附件的binding key必须严格匹配消息分发时附加的routing-key

topic模式下,这种匹配则相对宽松,只要符合一定的规则,都可以匹配到;类似于正则匹配。

补充:队列绑定交换机时附件的binding key其实就是参数routing-key;避免混淆,官方建议读为binding key。

匹配规则

消息分发时的routing-key

  • 多个单词通过点的方式连接,如:fast.orange.rabbit
  • 可以一个单词,也多个单词通过点连接,最长255个字节。
  • 推荐将这些单词设置为描述消息信息的单词。

队列绑定时的binding key

  • binding key的格式和routing-key的合适一致;

  • 另外增加两个功能强大且灵活的匹配符号:#*

    #  匹配任意多个单词
    *  仅匹配一个单词
    
    如 fast.*.*     匹配 fast开头且长度为3的routing-key
    如 #.orange.*   匹配 中间带有orange字段,orange前不限数量个任意单词,orange后必须有一个任意单词。 
    

补充

  • 当队列绑定的是符号 #,此时队列接收交换机发布的所有信息,此时这个队列类似于 fanout模式下的队列。
  • 当队列绑定的符号的不是#或者*,此时这个队列类似于 direct模式下的队列。

代码

生产者和消费者的代码和 fanoutdirect模式下的几乎一致

生产者.py

import pika

# 第一步,连接rabbitmq
parameters = pika.ConnectionParameters(host='localhost')
connection = pika.BlockingConnection(parameters)
channel = connection.channel()

# 第二步,建交换机
channel.exchange_declare(exchange='log_topic', exchange_type='topic')

# 第三步,发消息
channel.basic_publish(exchange='log_topic', routing_key='fast.white.rabbit', body='Hello World!')
print(" [x] Sent 'Hello World!'")

# 主动关闭连接
connection.close()

消费者.py

import pika

# 第一步,连接rabbitmq
parameters = pika.ConnectionParameters(host='localhost')
connection = pika.BlockingConnection(parameters)
channel = connection.channel()

# 第二步,建交换机
channel.exchange_declare(exchange='log_topic', exchange_type='topic')

# 第三步,建队列队并绑定到交换机
result = channel.queue_declare(queue='', exclusive=True)
queue_name = result.method.queue
channel.queue_bind(exchange='log_topic', queue=queue_name, routing_key='#.orange.#')
# 只关心orange类型的消息


def callback(ch, method, properties, body):
    print(" [x] Received %r" % body)
    # ch.basic_ack(delivery_tag=method.delivery_tag)
# 第4步,设置监听参数
channel.basic_consume(
    queue=queue_name, on_message_callback=callback, auto_ack=True) # 默认auto_ack=False
# 第5步,开始监听
print(' [*] Waiting for messages. To exit press CTRL+C')
channel.start_consuming()
posted @ 2020-05-10 21:53  the3times  阅读(217)  评论(0)    收藏  举报