RocketMQ 延迟消息
延迟消息,当消息写入到 Broker 后,不会立刻被消费者消费,需要等待指定的时长后才可被消费处理的消息,称为延时消息。在订单创建之后,我们就可以把订单作为一条消息投递到 rocketmq,并将延迟时间设置为 30 分钟,
这样30分钟后我们定义的 consumer 就可以消费到这条消息,然后检查用户是否支付了这个订单。通过延迟消息,我们就可以将业务解耦,极大地简化我们的代码逻辑。优点:可以使代码逻辑清晰,系统之间完全解耦,
只需关注生产及消费消息即可。另外其吞吐量极高,最多可以支撑万亿级的数据量。
缺点:相对来说 mq 是重量级的组件,引入 mq 之后,随之而来的消息丢失、幂等性问题等都加深了系统的复杂度。
总结:通过 mq 进行系统业务解耦,以及对系统性能削峰填谷已经是当前高性能系统的标配。
RabbitMQ 死信队列
除了 RocketMQ 的延迟队列,RabbitMQ 的死信队列也可以实现消息延迟功能。当 RabbitMQ 中的一条正常消息,因为过了存活时间(TTL 过期)、队列长度超限、被消费者拒绝等原因无法被消费时,就会被当成一条死信消息,投递到死信队列。
基于这样的机制,我们可以给消息设置一个 ttl,然后故意不消费消息,等消息过期就会进入死信队列,我们再消费死信队列即可。通过这样的方式,就可以达到同 RocketMQ 延迟消息一样的效果。
优点:同 RocketMQ 一样,RabbitMQ 同样可以使业务解耦,基于其集群的扩展性,也可以实现高可用、高性能的目标。
缺点:死信队列本质还是一个队列,队列都是先进先出,如果队头的消息过期时间比较长,就会导致后面过期的消息无法得到及时消费,造成消息阻塞。
总结:除了增加系统复杂度之外,死信队列的阻塞问题也是需要我们重点关注的。
标签:队列,RabbitMQ,死信,MQ,消息,RocketMQ,延迟
From: https://www.cnblogs.com/sitting-on-the-clouds/p/18387051