文章插图
对于生成队列,原理和消费一样,如果连接到非 master queue 节点,则路由过去 。
文章插图
所以,到这里小伙伴们就可以看到 RabbitMQ的不足:由于master queue单节点,导致性能瓶颈,吞吐量受限 。虽然为了提高性能,内部使用了Erlang这个语言实现,但是终究摆脱不了架构设计上的致命缺陷 。2.5 高级特性2.5.1 过期时间Time To Live,也就是生存时间,是一条消息在队列中的最大存活时间,单位是毫秒,下面看看RabbitMQ过期时间特性:
- RabbitMQ可以对消息和队列设置TTL 。
- RabbitMQ支持设置消息的过期时间,在消息发送的时候可以进行指定,每条消息的过期时间可以不同 。
- RabbitMQ支持设置队列的过期时间,从消息入队列开始计算,直到超过了队列的超时时间配置,那么消息会变成死信,自动清除 。
- 如果两种方式一起使用,则过期时间以两者中较小的那个数值为准 。
- 当然也可以不设置TTL,不设置表示消息不会过期;如果设置为0,则表示除非此时可以直接将消息投递到消费者,否则该消息将被立即丢弃 。
消费者订阅队列的时候,可以指定autoAck参数,当autoAck为true的时候,RabbitMQ采用自动确认模式,RabbitMQ自动把发送出去的消息设置为确认,然后从内存或者硬盘中删除,而不管消费者是否真正消费到了这些消息 。
当autoAck为false的时候,RabbitMQ会等待消费者回复的确认信号,收到确认信号之后才从内存或者磁盘中删除消息 。
消息确认机制是RabbitMQ消息可靠性投递的基础,只要设置autoAck参数为false,消费者就有足够的时间处理消息,不用担心处理消息的过程中消费者进程挂掉后消息丢失的问题 。
2.5.3 持久化消息的可靠性是RabbitMQ的一大特色,那么RabbitMQ是如何保证消息可靠性的呢?答案就是消息持久化 。持久化可以防止在异常情况下丢失数据 。RabbitMQ的持久化分为三个部分:交换器持久化、队列持久化和消息的持久化 。
交换器持久化可以通过在声明队列时将durable参数设置为true 。如果交换器不设置持久化,那么在RabbitMQ服务重启之后,相关的交换器元数据会丢失,不过消息不会丢失,只是不能将消息发送到这个交换器了 。
队列的持久化能保证其本身的元数据不会因异常情况而丢失,但是不能保证内部所存储的消息不会丢失 。要确保消息不会丢失,需要将其设置为持久化 。队列的持久化可以通过在声明队列时将durable参数设置为true 。
设置了队列和消息的持久化,当RabbitMQ服务重启之后,消息依然存在 。如果只设置队列持久化或者消息持久化,重启之后消息都会消失 。
当然,也可以将所有的消息都设置为持久化,但是这样做会影响RabbitMQ的性能,因为磁盘的写入速度比内存的写入要慢得多 。
对于可靠性不是那么高的消息可以不采用持久化处理以提高整体的吞吐量 。鱼和熊掌不可兼得,关键在于选择和取舍 。在实际中,需要根据实际情况在可靠性和吞吐量之间做一个权衡 。
2.5.4 死信队列当消息在一个队列中变成死信之后,他能被重新发送到另一个交换器中,这个交换器成为死信交换器,与该交换器绑定的队列称为死信队列 。
消息变成死信有下面几种情况:
- 消息被拒绝 。
- 消息过期
- 队列达到最大长度
死信队列有什么用?当发生异常的时候,消息不能够被消费者正常消费,被加入到了死信队列中 。后续的程序可以根据死信队列中的内容分析当时发生的异常,进而改善和优化系统 。
2.5.5 延迟队列一般的队列,消息一旦进入队列就会被消费者立即消费 。延迟队列就是进入该队列的消息会被消费者延迟消费,延迟队列中存储的对象是的延迟消息,“延迟消息”是指当消息被发送以后,等待特定的时间后,消费者才能拿到这个消息进行消费 。
延迟队列用于需要延迟工作的场景 。最常见的使用场景:淘宝或者天猫我们都使用过,用户在下单之后通常有30分钟的时间进行支付,如果这30分钟之内没有支付成功,那么订单就会自动取消 。
推荐阅读
- 生科医学|突发!日本首相岸田文雄感染新冠:全国医疗已经崩溃
- Firefox浏览器|火狐浏览器新增实用工具:将支持图片文字识别
- 超跑|3.5秒破百的V12怪兽!阿斯顿马丁新超跑限量249辆已卖空
- 青椒猪肝的做法
- 冻肉新做法
- 动画|《白蛇》系列团队全新力作!《新神榜:杨戬》上映两天票房破亿
- 登月|中国长征系列火箭创下新纪录:2030年左右载人登月!
- 薰衣草枕头最新功效和作用介绍 熏衣草枕头
- 蚊子|南方蚊子变少了?或热死或北上避暑:天气转凉后会重新活跃
- 充电|四川供电紧张 半夜连跑三个充电桩才充上电 新能源车主:体会到狼狈