RabbitMQ-如何保证消息不丢失
参考文献
RabbitMQ如何保证消息不丢失?
确保消息到MQ
生产者配置(结合Spring)
在 Spring 中,通过 RabbitTemplate 来发送消息到 RabbitMQ,可以通过配置 RabbitTemplate 的 ConfirmCallback 和 ReturnCallback 来实现消息的确认机制。
ConfirmCallback 是消息发送确认的回调函数接口,该接口方法如下:
12345678910public interface ConfirmCallback { /** * 消息确认回调方法 * @param correlationData 相关数据 * @param ack 消息是否成功到达交换机 * @param cause 失败原因 */ void confirm(CorrelationData correlationData, boolean ack, String cause);}
ReturnCallback 是消息发送失败后的回调函数接口,该接口方法如下:
12 ...
RabbitMQ-死信队列
参考文献
死信队列
RabbitMQ中的死信队列(Dead Letter Queue,DLQ)是一种特殊的队列,用于接收那些未能被消费者正确处理的消息.当一条消息被认为“死亡”时(如过期、被拒绝、超出队列限制等),RabbitMQ会将其路由到预先设定的死信队列中,以便后续进一步处理.
死信队列的作用
容错处理:当某些消息无法正常处理时,可以将其转发至死信队列,以免影响整个消息队列的正常运行.
调试方便:死信队列可以用于存储消费者处理失败的消息,方便开发人员进行问题排查和调试.
业务逻辑处理:死信队列也可以作为一个处理逻辑的触发点,例如当某些消息无法被正确处理时,可以将其路由到死信队列中触发其他业务逻辑的处理.
死信队列的创建步骤
创建一个普通队列,并设置相关参数(如队列名、交换机、路由键等).
设置队列的死信参数(如死信交换机、死信路由键等),以便将“死亡”的消息路由到指定的死信队列中.这些参数可以在创建队列时进行设置,也可以在之后通过队列属性进行修改.
创建一个死信队列,用于接收那些未能被消费者正确处理的消息.同样需要设置相关参数(如队列名、交换机、路由键等).
...
RabbitMQ-处理消息积压
参考文献
消息积压对RabbitMQ的影响
系统性能下降:如果消息队列中的消息没有及时处理,会导致队列变得越来越长,消费者从队列中获取消息的速度会减缓,从而影响整个系统的性能.
内存消耗增加:消息队列中的消息如果一直没有被消费,将一直占用内存.如果队列中积压的消息很多,将会占用大量的内存资源,导致内存消耗增加.
系统崩溃:如果 RabbitMQ 中的消息积压到一定程度,可能会导致系统崩溃.
消息丢失:当 RabbitMQ 中的消息积压到一定程度,可能会导致一些消息被直接删除,从而导致消息丢失的情况.
RabbitMQ处理消息积压
增加消费者数量
可以通过增加消费者数量来提高消息的处理速度.可以在消费者端通过增加线程数或者增加消费者实例数来实现
设置消息过期时间
RabbitMQ 设置消息过期时间是一种处理消息积压的方案,可以通过让已经过期的消息自动被删除,从而减轻队列负担,提高队列的处理能力.具体的操作步骤如下:
设置队列的过期时间
首先,需要在队列声明时设置队列的过期时间,即 x-message-ttl 参数,表示消息的存活时间.当队列中的消息存活时间超过指定时间 ...
RabbitMQ-基本操作
参考文献
RabbitMQ实战
基本命令
服务器操作指令
1234567891011121314# 查看服务器状态./rabbitmqctl status# 启动RabbitMQ./rabbitmq-server# 以守护进程方式启动RabbitMQ./rabbitmq-server -detached# 停止RabbitMQ./rabbitmqctl stop# 打印RabbitMQ的配置文件信息cat /etc/rabbitmq/rabbitmq.conf
RabbitMQ中每个队列,交换器和绑定的元数据(除了消息的内容)都保存到Mnesia中.Mnesia是内奸在Erlang的非SQL型数据库.Mnesia通过将RabbitMQ元数据首先写入一个仅追加的日志文件,以确保其完整性.然后,它再定期将日志内容转储到真实的Mnesia数据库文件中.
用户相关操作指令
123456789101112131415161718# 创建用户rabbitmqctl add_user test testpwdAdding user "test" ..# 删除用户rabbi ...
RabbitMQ-配置SSL
参考文献
TLS Support
RabbitMQ使用TLS支持SSL加密处理
https://docs.oracle.com/cd/E19509-01/820-3503/ggfen/index.html
Java Keytool Essentials: Working with Java Keystores
https://github.com/securitysushi/rabbitmq-ssl-example
运维侧配置
使用TSL工具生成证书
1234567git clone https://github.com/rabbitmq/tls-gen tls-gencd tls-gen/basic# private key passwordmake PASSWORD=bunniesmake verifymake infols -l ./result
12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626 ...
MQ-面试题
参考文献
消息队列使用场景
异步处理
优点:
可以更快地返回结果;
减少等待,自然实现了步骤之间的并发,提升系统总体的性能.
流程控制
优点:
能根据下游的处理能力自动调节流量,达到“削峰填谷”的作用
缺点:
增加了系统调用链环节,导致总体的响应时延变长.
上下游系统都要将同步调用改为异步消息,增加了系统的复杂度.
服务解耦
作为发布 / 订阅系统实现一个微服务级系统间的观察者模式;
连接流计算任务和数据;
用于将消息广播给大量接收者.
消息中间件的选择
RabbitMQ
优点
RabbitMQ 的架构简单,易于上手,开发人员可以快速使用.
RabbitMQ 提供了丰富的消息模式,例如发布-订阅模式、工作队列模式、RPC 模式等.
RabbitMQ 支持各种消息传递协议,包括 AMQP、MQTT、STOMP 等.
RabbitMQ 的可靠性较高,支持持久化消息,可以确保消息不会丢失.
缺点
RabbitMQ 的性能较低,不适合处理高吞吐量的消息.
RabbitMQ 的可扩展性有限,节点的数量和规模受限于 Erlang VM 的性能.
Rabbit ...
RabbitMQ-基础理论
参考文献
https://blog.csdn.net/unique_perfect/article/details/109380996
amqp.0-10
AMQP
引言-AMQP
RabbitMQ是基于AMQP协议,erlang语言开发,是部署最广泛的开源,消息中间件,是最受欢迎的开源消息中间件之一.
AMQP 协议AMQP(advanced message queuing protocol)在2003年时被提出,最早用于解决金融领不同平台之间的消息传递交互问题.顾名思义,AMQP是一种协议,更准确的说是一种binary wire-level protocol(链接协议).这是其和JMS的本质差别,AMQP不从API层进行限定,而是直接定义网络交换的数据格式.这使得实现了AMQP的provider天然性就是跨平台的.
AMQP Model:
举例说明
如果我们拿电子邮件系统做个类比,我们会发现AMQP的概念并不激进:
AMQP消息类似于电子邮件消息.
消息队列类似于邮箱.
3.消费者类似于获取和删除电子邮件的邮件客户机.
交易所类似于MTA(邮件传输代理), ...
RabbitMQ-开启消息追踪
开启消费记录功能
123rabbitmq-plugins enable rabbitmq_tracingrabbitmqctl trace_on