消息队列是以队列的形式,是一种"先进先出"的数据结构
为什么使用消息队列 削峰 削峰前 削峰后 异步 解耦 解耦前 解耦后 消息队列的缺点系统可用性降低(单点故障,使用集群)
系统复杂性提高(多了一个中间件,多了一个服务)
一致性问题
消息丢失的原因过程中所出现的丢失很大原因取决于网络
消息写入后,持久化到磁盘,这样即使RabbitMq挂掉了,在恢复后也会自动去读取之前存储的数据.
概率极小的情况下,MQ还未进行持久化,可能就挂了,导致了数据的丢失
如何解决还未持久化出现的消息丢失情况持久化需要跟生产者的confirm 机制相互配合,只有消息已经持久化到磁盘后,才会通知生产者 ack ,如果持久化到磁盘之前,RabbitMQ 挂了,数据丢失了,生产者收不到 ack,就有个消息补偿机制,会自己进行重发操作。
关闭RabbitMq的ack(只能保证在消费者)消费方完成消费后进行手动ack确认,mq收到ack确认再删除本地消息,否,则不删除
解决消息的重复发送在发送消息的时候,设置全局唯一的id.
消息在获取后,会使用id去redis中进行查询消费者是否成功消费,
没有消费过,则直接消费,存入redis,
消费过,啥也不干
消息是基于什么传输基于TCP连接,使用信道的方式传输数据.信道是建立在TCP连接内的一个虚拟的连接,每条TCP连接上的信道数量没有限制.
生产者消息运转- Producer先连接到Broker,建立连接Connection,开启一个信道(Channel)。Producer声明一个交换器并设置好相关属性。Producer声明一个队列并设置好相关属性。Producer通过路由键将交换器和队列绑定起来。Producer发送消息到Broker,其中包含路由键、交换器等信息。相应的交换器根据接收到的路由键查找匹配的队列。如果找到,将消息存入对应的队列,如果没有找到,会根据生产者的配置丢弃或者退回给生产者。关闭信道。管理连接。
- Producer先连接到Broker,建立连接Connection,开启一个信道(Channel)。向Broker请求消费响应的队列中消息,可能会设置响应的回调函数。等待Broker回应并投递相应队列中的消息,接收消息。消费者确认收到的消息,ack。RabbitMq从队列中删除已经确定的消息。关闭信道。关闭连接。
当给消息设置了一个过期时间,如果超时后还未被消费,就是消息过期,会进入死信队列
消息过期的解决进入死信队列后,让专门的消费者去消费死信队列的消息,记录过期的消息,写入数据库记录日志,查询后,重新发给mq



