RabbitMQ - 6 headers模式

Headers exchange

介绍:
  headers exchange与 direct、topic、fanout不同,它是通过匹配 AMQP 协议消息的 header 而非路由键,有点像HTTP的Headers;
headers exchange与 direct Exchange类似,性能方面比后者查很多,所以在实际项目中用的很少。   

  在绑定Queue与Exchange时指定一组header键值对;当消息发送到Exchange时,RabbitMQ会取到该消息的headers(也是一个键值对的形式),
对比其中的键值对是否完全匹配Queue与Exchange绑定时指定的键值对。如果完全匹配则消息会路由到该Queue,否则不会路由到该Queue。

  headers属性是一个键值对,键值对的值可以是任何类型。而fanout,direct,topic 的路由键都需要要字符串形式的。
键值对要求携带一个键“x-match”,这个键的Value可以是any或者all,这代表消息携带的header是需要全部匹配(all),还是仅匹配一个键(any)就可以了。

 

Putting it all together

send.py

import pika

CREDENTIALS = pika.PlainCredentials('mq_user', 'password')
PARAMETERS = pika.ConnectionParameters('10.6.3.12', 5677,
                                       'smes', CREDENTIALS)
connection = pika.BlockingConnection(PARAMETERS)
channel = connection.channel()
channel.exchange_declare(exchange='my-headers-exchange', exchange_type='headers')
channel.basic_publish(
    exchange='my-headers-exchange',
    routing_key='',
    body='Hello World!',
    properties=pika.BasicProperties(headers={'h1': 'Header1'}))

receive.py

import pika

CREDENTIALS = pika.PlainCredentials('mq_user', 'password')
PARAMETERS = pika.ConnectionParameters('10.6.3.12', 5677,
                                       'smes', CREDENTIALS)
connection = pika.BlockingConnection(PARAMETERS)

channel = connection.channel()
channel.exchange_declare(exchange='my-headers-exchange', exchange_type='headers')
channel.queue_declare(queue='HealthQ')
channel.queue_bind(
    queue='HealthQ',
    exchange='my-headers-exchange',
    routing_key='',
    arguments={'x-match': 'any', 'h1': 'Header1', 'h2': 'Header2'})


def callback(ch, method, properties, body):
    print(" [x] %r:%r" % (properties.headers, body))


channel.basic_consume(queue='HealthQ', on_message_callback=callback, auto_ack=True)
channel.start_consuming()

  

 

posted @ 2021-04-28 16:56  Cool·  阅读(580)  评论(0编辑  收藏  举报