RabbitMQ之备份交换机(alternate-exchange)
1、备份交换器,AlternateExchange(AE)
备份交换器是为了实现没有路由到队列的消息,声明交换机的时候添加属性alternate-exchange,声明一个备用交换机,一般声明为fanout类型,这样交换机收到路由不到队列的消息就会发送到备用交换机绑定的队列中。
使用Python的pika包,设置方式是在声明exchange时,argument的参数中设置alternate-exchange的值,值为备份交换机的名称。
代码示例:
#!/usr/bin/env python import pika connection = pika.BlockingConnection(pika.ConnectionParameters(host='127.0.0.1', port=5672)) channel = connection.channel() alternate_exchange = { 'alternate-exchange': 'backup_exchange' } channel.exchange_declare(exchange='topic_logs', exchange_type='topic', arguments=alternate_exchange) result = channel.queue_declare(exclusive=True) queue_name = result.method.queue binding_key = "info.*" channel.queue_bind(exchange='topic_logs', queue=queue_name, routing_key=binding_key) print(' [*] Waiting for logs. To exit press CTRL+C') def callback(ch, method, properties, body): print(" [x] %r:%r" % (method.routing_key, body)) channel.basic_consume(callback, queue=queue_name, no_ack=True) channel.start_consuming()
这样设置声明,如果交换机topic_logs没有队列来接收消息,则消息会被转发到备份的exchange中。
2、其他arguments扩展参数
arguments键 | 值 | 意义 |
x-message-ttl | 数字类型,标志 | 标志队列中的消息存活时间,也就是说队列中的消息超过了制定时间会被删除 |
x-expires | 数字类型,标志 | 队列自身的空闲存活时间,当前的queue在指定的时间内,没有consumer、basic.get也就是未被访问,就会被删除。 |
x-max-length和x-max-length-bytes | 数字 | 最大长度和最大占用空间,设置了最大长度的队列,在超过了最大长度后进行插入会删除之前插入的消息为本次的留出空间,相应的最大占用大小也是这个道理,当超过了这个大小的时候,会删除之前插入的消息为本次的留出空间。 |
x-dead-letter-exchange和x-dead-letter-routing-key | 字符串 | 消息因为超时或超过限制在队列里消失,这样我们就丢失了一些消息,也许里面就有一些是我们做需要获知的。而rabbitmq的死信功能则为我们带来了解决方案。设置了dead letter exchange与dead letter routingkey(要么都设定,要么都不设定)那些因为超时或超出限制而被删除的消息会被推动到我们设置的exchange中,再根据routingkey推到queue中 |
x-max-priority | 数字 | 队列所支持的优先级别,列如设置为5,表示队列支持0到5六个优先级别,5最高,0最低,当然这需要生产者在发送消息时指定消息的优先级别,消息按照优先级别从高到低的顺序分发给消费者 |
alternate-exchange | 下面简称AE,当一个消息不能被route的时候,如果exchange设定了AE,则消息会被投递到AE。如果存在AE链,则会按此继续投递,直到消息被route或AE链结束或遇到已经尝试route过消息的AE。 |