使用场景
- 使用 MQ 异步发送优惠券;
- 使用 MQ 异步发送通知(短信、邮件);
- 使用 MQ 异步扣库存/增加积分/
消息队列有什么优缺点?
优点
解藕、异步、削峰
缺点
可用性降低、复杂度提高、一致性问题
RabbitMQ、RocketMQ、kafka 对比?
- 吞吐量
- 消息延迟
- 可靠性
- 可用性
RabbitMQ 6种工作模式
消息路由分发的方式不同
简单模式和工作模式,一条消息只能被消费一次
- 简单模式: 不需要交换机
- work queues: 不需要交换机
- fanout 发布与订阅模式 : 交换机和队列绑定不需要路由键
- Routing 路由模式 : 交换机和队列通过路由键绑定
- Topics 主题模式 : 交换机和队列通过路由键绑定,并且路由键可以使用通配符
- RPC 远程调用模式 :
生产者消息运转
-
Producer先连接到Broker,建立连接Connection,开启一个信道(Channel)。
-
Producer声明一个交换器并设置好相关属性。
-
Producer声明一个队列并设置好相关属性。
-
Producer通过路由键将交换器和队列绑定起来。
-
Producer发送消息到Broker,其中包含路由键、交换器等信息。
-
相应的交换器根据接收到的路由键查找匹配的队列。
-
如果找到,将消息存入对应的队列,如果没有找到,会根据生产者的配置丢弃或者退回给生产者。
-
关闭信道。
-
关闭连接。
springboot 整合rabbitMQ
生产端
- pom文件中,引入依赖
- yml文件中,配置基本信息
- 写一个配置类,定义交换机,队列和绑定信息
- 注入rabbitTemplete,调用方法,完成消息发送
消费端
- pom文件中,引入依赖
- yml文件中,配置基本信息
- 写一个监听类,使用@RabbitListener 注解完成队列监听
RabbitMQ高级特性
- 消息可靠性投递
- Consumer ACK
- 消费端限流
- TTL
- 死信队列
- 延迟队列
- 日志与监控
- 消息可靠性分析与追踪
- 管理
消息可靠投递
confirm模式
- 在配置信息中开启确认模式。
- 使用rabbitTemplate.setConfirmCallback设置回调函数。
当消息发送到exchange后回 调confirm方法。在方法中判断ack,如果为true,则发送成功,如果为false,则发 送失败,需要处理。
retun 模式
- 在配置信息中开启退回模式。
- 使用rabbitTemplate.setReturnCallback设置退回函数,当消息从exchange路由到 queue失败后,如果设置了rabbitTemplate.setMandatory(true)参数,则会将消息退 回给producer。并执行回调函数returnedMessage。
Consumer Ack
- 配置信息中设置ack方式 none:自动确认,manual:手 动确认
- 如果在消费端没有出现异常,则调用channel.basicAck(deliveryTag,false);方法确认签收消息
- 如果出现异常,则在catch中调用 basicNack或 basicReject,拒绝消息,让MQ重新发送消息。
消费端限流
- 在rabbit:listener-container 中配置消费端一次拉取多少消息
死信队列
- 死信交换机和死信队列和普通的没有区别
- 当消息成为死信后,如果该队列绑定了死信交换机,则消息会被死信交换机重新路由到死信队列
- 消息成为死信的三种情况:
- 队列消息长度到达限制;
- 消费者拒接消费消息,并且不重回队列;
- 原队列存在消息过期设置,消息到达超时时间未被消费;
延迟队列
- 延迟队列 指消息进入队列后,可以被延迟一定时间,再进行消费。
- RabbitMQ没有提供延迟队列功能,但是可以使用 : TTL + DLX 来实现延迟队列效果。