
介绍什么是MQRabbitMQ官网地址https://www.rabbitmq.com/官网下载地址http://www.rabbitmq.com/download.html中文地址https://rabbitmq.cn/中文文档地址https://rabbitmq.cn/docs消息队列Message Queue简称MQ从字面意思上看本质是个队列FIFO先入先出只不过队列中存放的内容是message而已。其主要用途不同进程Process/线程Thread之间通信。为什么需要消息队列不同进程process之间传递消息时两个进程之间耦合程度过高改动一个进程引发必须修改另一个进程为了隔离这两个进程在两进程间抽离出一层一个模块所有两进程之间传递的消息都必须通过消息队列来传递单独修改某一个进程不会影响另一个不同进程process之间传递消息时为了实现标准化将消息的格式规范化了并且某一个进程接受的消息太多一下子无法处理完并且也有先后顺序必须对收到的消息进行排队因此诞生了事实上的消息队列总结MQ 的出现核心是把“同步直接调用”改造成“异步消息传递”从而解决分布式系统的耦合、阻塞、峰值压力、可靠传递和事件广播问题。它最核心的三个关键词是解耦、异步、削峰再往后才是可靠重试、最终一致性、顺序消息、事件驱动等能力。MQ的五种队列五种队列模式核心角色消息分发规则典型场景简单队列1生产者1消费者1队列一条消息只能被一个消费者消费一对一通信如简单的任务处理工作队列1生产者多个消费者1队列消息被多个消费者竞争消费默认轮询分发任务分发、负载均衡如短信通知服务发布/订阅1生产者1 Fanout交换机多个队列/消费者广播消息复制多份发送给所有绑定的队列广播通知如天气预报推送给多个门户网站路由模式1生产者1 Direct交换机多个队列/消费者定向根据Routing Key精确匹配发送到指定队列按规则定向传递如错误日志单独处理主题模式1生产者1 Topic交换机多个队列/消费者通配符匹配Routing Key支持*和#模糊匹配灵活的多条件路由如按用户角色、地区过滤消息简单队列 (Simple Queue)最基础的一对一模型。生产者将消息直接发送到队列一个消费者从该队列接收并处理。特点配置简单轻量级。但一个队列只有一个消费者无法实现负载均衡消息处理能力有限。适用消息量不大、处理逻辑简单的单一消费者场景。工作队列 (Work Queue)在简单队列基础上增加消费者多个消费者监听同一个队列共同消费消息实现并行处理。分发规则默认采用轮询Round-Robin方式将消息依次分发给每个消费者。也可以配置为“能者多劳”模式让处理快的消费者获取更多消息。特点提高了系统的吞吐量和并行处理能力但消息的处理顺序无法保证。适用任务处理耗时、需要多消费者并行处理的场景如集群环境下的异步任务分发。发布/订阅模式 (Publish/Subscribe)消息不再直接进入队列而是先发送到Fanout扇出交换机。该交换机会将消息广播给所有绑定到它的队列。特点一条消息会被多个消费者同时接收实现广播效果。发布者与订阅者完全解耦。适用需要将同一事件通知给多个系统的场景如实时通知、数据同步。路由模式 (Routing)使用Direct直接交换机。交换机会根据消息携带的Routing Key将其精确投递到Binding Key完全匹配的队列中。特点实现了有选择的定向分发只有Routing Key匹配的队列才能收到消息而非广播给所有队列。适用需要根据特定规则如日志级别、消息类型将消息路由到不同处理队列的场景。主题模式 (Topic)使用Topic主题交换机是路由模式的超集。Routing Key支持通配符匹配。通配符规则*匹配一个单词#匹配零个或多个单词。例如user.*.order可以匹配user.vip.orderuser.#可以匹配user.vip.order.create。特点路由规则非常灵活可以实现复杂的多条件过滤。适用需要根据多个维度如地区、类型、优先级进行灵活消息分发的复杂业务场景。SpringBoot集成springboot集成RabbitMQ非常简单如果只是简单的使用配置非常少springboot提供了spring-boot-starter-amqp对消息各种支持。1、配置pom文件主要是添加spring-boot-starter-amqp的支持dependencygroupIdorg.springframework.boot/groupIdartifactIdspring-boot-starter-amqp/artifactId/dependency2、配置application.properties文件配置rabbitmq的安装地址、端口以及账户信息spring.application.namespirng-boot-rabbitmqspring.rabbitmq.host127.0.0.1spring.rabbitmq.port5672spring.rabbitmq.usernameadminspring.rabbitmq.passwordadmin3、配置队列packagecom.zpc.rabbitmq;importorg.springframework.amqp.core.Queue;importorg.springframework.context.annotation.Bean;importorg.springframework.context.annotation.Configuration;ConfigurationpublicclassRabbitConfig{BeanpublicQueuequeue(){returnnewQueue(q_hello);}}4、发送者packagecom.zpc.rabbitmq;importorg.springframework.amqp.core.AmqpTemplate;importorg.springframework.beans.factory.annotation.Autowired;importorg.springframework.stereotype.Component;importjava.text.SimpleDateFormat;importjava.util.Date;ComponentpublicclassHelloSender{AutowiredprivateAmqpTemplaterabbitTemplate;publicvoidsend(){StringdatenewSimpleDateFormat(yyyy-MM-dd HH:mm:ss).format(newDate());//24小时制Stringcontexthello date;System.out.println(Sender : context);//简单对列的情况下routingKey即为Q名this.rabbitTemplate.convertAndSend(q_hello,context);}}5、接收者packagecom.zpc.rabbitmq;importorg.springframework.amqp.rabbit.annotation.RabbitHandler;importorg.springframework.amqp.rabbit.annotation.RabbitListener;importorg.springframework.stereotype.Component;ComponentRabbitListener(queuesq_hello)publicclassHelloReceiver{RabbitHandlerpublicvoidprocess(Stringhello){System.out.println(Receiver : hello);}}6、测试packagecom.zpc.rabbitmq;importorg.junit.Test;importorg.junit.runner.RunWith;importorg.springframework.beans.factory.annotation.Autowired;importorg.springframework.boot.test.context.SpringBootTest;importorg.springframework.test.context.junit4.SpringRunner;RunWith(SpringRunner.class)SpringBootTestpublicclassRabbitMqHelloTest{AutowiredprivateHelloSenderhelloSender;Testpublicvoidhello()throwsException{helloSender.send();}}