核心基础组件
- 1、生产者:用于产生、发送消息的程序
- 2、消费者:用于监听、接受、消费消息的程序
- 3、消息:实际传输的数据,消息是通过二进制流进行传输
- 4、队列:消息的暂存区和储存区
- 5、交换机:同样也可以看作是消息的中转站点,用于首次接收和分发消息,其中包括Headers、 Fanout、Direct和Topic这4种
- 6、路由:相当于密钥、地址或者“第三者”,一般不单独使用,而是与交换机绑定在一起,将消息路由到指定的队列
使用场景:
- 1、服务解耦
- 2、异步通讯
- 3、接口限流:前端的请求并不是直接到达后端,而是进入队列排队执行,先进先出
- 4、超时业务和数据延迟处理
- 5、消息异步分发:异步执行业务,通过短信、邮件等通知告知用户结果
消息模型
- 1、HeadersExchange
- 2、FanoutExchange --具有"广播消息"的作用(无需路由)
- 一个交换机可以对应并绑定多个队列,从而对应多个消费者
- 3、DirectExchange --直连传输消息 (必须要绑定路由)
- 一个交换机对应多个路由,从而对应多个队列
- 4、TopicExchange --发布订阅模式
- 与前面介绍的另外两种消息模型相比,最大的不同之处在于其支持“通配式”的路由,即可以通过为路由的名称指定特定的通配符""和"#",从而绑定到不同的队列中。其中,通配符""表示一个特定的“单词”,而通配符“#”则可以表示任意的单词(可以是一个,也可以是多个,也可以没有)
- "*"相当于一个单词,"#"相当于0个或者多个单词
死信队列
- 死信队列组成:
- 1、DLX 死信交换机(必需)
- 2、DLK 死信路由(必需)
- 3、TTL 死信队列中消息的存活时间(非必需):TTL既可以设置成为死信队列的一部分,也可以在消息中单独进行设置,当队列跟消息同时都设置了存活时间 TTL时,则消息的“最大生存时间”或者“存活时间”将取两者中较短的时间
-
- 创建成功,RabbitMQ将严格要求其不再允许被修改,比如修改交换机、队列的持久化策略等属性都是不允许的(IDEA控制台将会在项目运行之后输出报错信息)
- 如果将消息存活时间作为死信队列的组成成分,那么一旦死信队列创建成功将不可修改存活时间,只能删除重建死信队列或者在控制台修改属性配置
实际生产环境中产生的问题
- 1、消息是否发送成功
添加确认机制,在生产者发送完消息后进行"发送确认",当确认成功即代表消息发送成功
- 2、服务宕机消息丢失
在创建队列和交换机时设置其持久化参数为true,即durable参数为true,在生产者生产消息时设置持久化模式
- 3、消息重复消费
rabbitmq提供消息确认机制(ACK),分别为:NONE(无需确认)、AUTO(自动确认)、MANUAL(手动确认)
- NONE:生产者将消息发送至队列,消费者监听到该消息时,无须发送任何反馈信息给RabbitMQ服务器
-
- AUTO:指的是“自动确认”机制,即生产者将消息发送至队列,消费者监听到该消息时,需要发送一个 AUTO ACK的反馈信息给RabbitMQ服务器,之后该消息将在 RabbitMQ的队列中被移除
-
- MANUAL:它是一种“人为手动确认消费”机制,即生产者将消息发送至队列,消费者监听到该消息时需要手动地“以代码的形式”发送一个ACK的反馈信息给RabbitMQ服务器,之后该消息将在RabbitMQ的队列中被移除,同时告知生产者,消息已经成功发送并且已经成功被消费者监听消费了
-