使用场景
异步处理应用解耦流量控制(削峰)
工作流程
生产者连接RabbitMQ,建立TCP连接( Connection),开启信道(Channel)生产者声明一个Exchange(交换器),并设置相关属性,比如交换器类型、是否持久化等生产者声明一个队列井设置相关属性,比如是否排他、是否持久化、是否自动删除等生产者通过 bindingKey (绑定Key)将交换器和队列绑定( binding )起来生产者发送消息至RabbitMQ Broker,其中包含 routingKey (路由键)、交换器等信息相应的交换器根据接收到的 routingKey 查找相匹配的队列。如果找到,则将从生产者发送过来的消息存入相应的队列中。如果没有找到,则根据生产者配置的属性选择丢弃还是回退给生产者关闭信道。关闭连接。
用docker创建实例
docker run -d --name rabbitmq --publish 5671:5671 --publish 5672:5672 --publish 4369:4369 --publish 25672:25672 --publish 15671:15671 --publish 15672:15672 rabbitmq:management 4369,25672 -- erlang发现和集群端口 5672,5671 --AMQP端口 15672 -- 管理界面ui端口
接听注解
@RabbitListener:类+方法上(监听哪些队列)@RabbitHandler:标在方法上(重载区分不同的消息)
消息确认机制-----可靠抵达
想要保证消息不丢失,可靠抵达,可以使用事务消息,但是性能下降250倍。为此引入确认机制生产者–>Broker:/confirm/iCallback:确认模式Exchange–>Queue:returnCallback:未投递到queue退回模式Queue–>消费者:ack机制
RabbitMQ延时队列(实现定时任务)
场景:未付款的订单,超过一定时间后,系统自动取消订单并释放占有物品常用解决方案:spring的schedule定时任务轮询数据库缺点:消耗系统内存,增加了数据库的压力,存在较大的时间误差解决方法:rabbitMQ的消息TTL和死信Exchange结合
延时队列的实现1(给队列里面设置消息的过期时间等信息)
生产者发送消息时先指定路由键,并将消息发送给Exchange交换机交换机会按照路由键把消息交给一个队列这个队列设置有消息的TTL(消息存活时间),一个死信路由键和一个死信交换机,这个死信交换机绑定了一个新的路由当消息过了存活时间之后,队列就会带着死信路由键把消息发送给这死信交换机绑定的路由路由收到信息后会按照死信路由键找到一个队列监听该队列的消费者收到信息,实现了延时队列
延时队列的实现1(直接给消息设置过期时间)
生产者发送消息,给消息单独设置一个过期时间消息经过交换机,被交给延时队列后面跟上一种实现一样



