接下来我们了解一下RabbitMQ的高级特性以及独有特色的插件。
队列的选择
我们一直以来都是在使用Classic队列去实现一些相关的逻辑和功能,实际上在我们使用客户端创建队列的时候会出现三种可以选的队列classic经典队列,Quorum仲裁队列,Stream流式队列,他们各自存在各自的优缺点,针对不同的业务可以使用不同的队列。

使用最多的队列,是一种先进先出的数据结构,面向单机服务,拥有较高的消息可靠性。
经典队列主要用在数据量比较小,并且生产消息和消费消息的速度比较稳定的业务场景。


其他队列
概念:未能正常消费的消息进行的一种补救机制,他还是一个普通的队列,亦可以绑定消费者去消费。
产生方式:
-
消息被消费者确认拒绝后(通过channel.basicReject或者channel.basicNack)
-
消息过期
-
消息数量超长
实现方式:
单独配置某个队列为死信队列。
rabbitmqctl set_policy DLX ".*" '{"dead-letter-exchange":"xxxQueue,yyyQueue"}' --apply-to queues
在服务器使用策略模式方法批量设置某些队列为死信。
channel.exchangeDeclare("xxx", "direct");Map<String, Object> args = new HashMap<String, Object>();args.put("x-dead-letter-exchange", "xxx");channel.queueDeclare("xxxqueue", false, false, false, args)
- 基于死信队列来实现延迟队列,设置一个队列将里面的消息设置好TTL时间,不绑定消费者,绑定一个死信队列,当消息过期后就会进入死信队列,此时死信队列我们绑定消费者,这样就可以间接性实现延时消息。
-
使用Rabbitmq的rabbitmq_delayed_message_exchange插件来实现。
懒队列的设计目的就是为了内存堆积问题,先将消息持久化在磁盘里面,等需要使用的时候会将消息加载到内存里面进行执行。
懒队列会尝试尽可能早的把消息写到硬盘中。这意味着在正常操作的大多数情况下,RAM中要保存的消息要少得多。当然,这是以增加磁盘IO为代价的。
实现方式:
直接在参数里面进行配置。
Map<String, Object> args = new HashMap<String, Object>();args.put("x-queue-mode", "lazy");channel.queueDeclare("myqueue", false, false, false, args);
通过策略去指定。
rabbitmqctl set_policy Lazy "^lazy-queue$" '{"queue-mode":"default"}' --apply-to queues
插件


文章有帮助的话,
点赞、在看、转发吧。
一起讨论,谢谢支持哟






本篇文章来源于微信公众号: java从零到壹
微信扫描下方的二维码阅读本文

Comments NOTHING