# boot-rabbitmq **Repository Path**: lzh2019/boot-rabbitmq ## Basic Information - **Project Name**: boot-rabbitmq - **Description**: 练习rabbitmq - **Primary Language**: Unknown - **License**: Not specified - **Default Branch**: master - **Homepage**: None - **GVP Project**: No ## Statistics - **Stars**: 0 - **Forks**: 0 - **Created**: 2021-08-03 - **Last Updated**: 2021-08-04 ## Categories & Tags **Categories**: Uncategorized **Tags**: None ## README # boot-rabbitmq #### 介绍 练习rabbitmq #### 软件架构 ![](https://gitee.com/lzh2019/imgrepo/raw/master/20210803135826.png) ![](https://gitee.com/lzh2019/imgrepo/raw/master/20210803135710.png) 1.点对点(一对一)MQ推送 AmqpTemplate.convertAndSend(String 队列, Object msg) 即 订阅了这个Queue的多个消费者们,只有1个消费者能收到msg 见com.example.bootrabbitmq.simple包 --- ![](https://gitee.com/lzh2019/imgrepo/raw/master/20210803152356.png) 2.广播MQ推送 AmqpTemplate.convertAndSend(String exchange, "", Object msg) Producer先定义3个Queue,再定义1个FanoutExchange,然后将3个Queue与交换机绑定; 3个Consumer分别监听3个Queue,来接收msg 即 生产者发送1个消息,被3个消费者消费 见com.example.bootrabbitmq.fanout ![](https://gitee.com/lzh2019/imgrepo/raw/master/20210803163805.png) --- ![](https://gitee.com/lzh2019/imgrepo/raw/master/20210803160447.png) ![](https://gitee.com/lzh2019/imgrepo/raw/master/20210803164025.png) 3.Topic匹配推送 AmqpTemplate.convertAndSend(String exchange, String routerKey, Object msg) Producer先定义3个Queue, 再定义1个 TopicExchange, 然后将3个Queue与交换机绑定,绑定时要指定routingKey, 最后发送msg时要指定routingKey; 定义3个Consumer分别监听3个Queue,来接收msg; 即 生产者发送1个消息时,MQ按照routingKey匹配1个或多个Queue,再发送消息; 最终会有1个或多个消费者收到msg 见com.example.bootrabbitmq.topic --- ![](https://gitee.com/lzh2019/imgrepo/raw/master/20210804105719.png) ![](https://gitee.com/lzh2019/imgrepo/raw/master/20210804105931.png) 4.Direct直连交换机推送 RabbitTemplate.convertAndSend(String exchange, String routingKey, Object msg , CorrelationData correlationId) Producer定义1个Queue,1个DirectExchange,然后将队列绑定到这个交换机上 DirectRabbitProducer 实现 RabbitTemplate.ConfirmCallback接口,来做消息的发送确认 可以定义多个消费者,来做负载均衡, 测试效果:2个消费者在2s内可以消费100条msg 3个消费者在15s内可以消费500条msg 见com.example.bootrabbitmq.direct包 --- #### 教程 ``` Broker:它提供一种传输服务,它的角色就是维护一条从生产者到消费者的路线,保证数据能按照指定的方式进行传输, Exchange:消息交换机,它指定消息按什么规则,路由到哪个队列。 Queue:消息的载体,每个消息都会被投到一个或多个队列。 Binding:绑定,它的作用就是把exchange和queue按照路由规则绑定起来. Routing Key:路由关键字,exchange根据这个关键字进行消息投递。 vhost:虚拟主机,一个broker里可以有多个vhost,用作不同用户的权限分离。 Producer:消息生产者,就是投递消息的程序. Consumer:消息消费者,就是接受消息的程序. Channel:消息通道,在客户端的每个连接里,可建立多个channel. ``` --- ``` 消息接收确认 消息消费者如何通知 Rabbit 消息消费成功? 消息通过 ACK 确认是否被正确接收,每个 Message 都要被确认(acknowledged),可以手动去 ACK 或自动 ACK 自动确认会在消息发送给消费者后立即确认,但存在丢失消息的可能,如果消费端消费逻辑抛出异常,也就是消费端没有处理成功这条消息,那么就相当于丢失了消息 如果消息已经被处理,但后续代码抛出异常,使用 Spring 进行管理的话消费端业务逻辑会进行回滚,这也同样造成了实际意义的消息丢失 如果手动确认则当消费者调用 ack、nack、reject 几种方法进行确认,手动确认可以在业务失败后进行一些操作,如果消息未被 ACK 则会发送到下一个消费者 如果某个服务忘记 ACK 了,则 RabbitMQ 不会再发送数据给它,因为 RabbitMQ 认为该服务的处理能力有限 ACK 机制还可以起到限流作用,比如在接收到某条消息时休眠几秒钟 消息确认模式有: AcknowledgeMode.NONE:自动确认 AcknowledgeMode.AUTO:根据情况确认 AcknowledgeMode.MANUAL:手动确认 确认消息(局部方法处理消息) 默认情况下消息消费者是自动 ack (确认)消息的,如果要手动 ack(确认)则需要修改确认模式为 manual https://blog.csdn.net/wxb880114/article/details/105836274/ ``` #### 一些资料 1.RabbitMQ如何保证不丢数据? Spring Boot实现confirm机制及ack消费端主动回调 https://blog.csdn.net/supercmd/article/details/93189617?utm_medium=distribute.pc_relevant_t0.none-task-blog-2%7Edefault%7EBlogCommendFromMachineLearnPai2%7Edefault-1.pc_relevant_baidujshouduan&depth_1-utm_source=distribute.pc_relevant_t0.none-task-blog-2%7Edefault%7EBlogCommendFromMachineLearnPai2%7Edefault-1.pc_relevant_baidujshouduan 2.解决rabbitmq ConfirmCallback不回调的问题 https://blog.csdn.net/qq_19289851/article/details/114338165 3.https://www.jianshu.com/p/79ca08116d57 4.https://www.cnblogs.com/lusaisai/p/13022090.html 5.https://blog.nowcoder.net/n/181f72971813496686087ad685b99144?from=nowcoder_improve 模式总结 RabbitMQ工作模式: 1、简单模式 HelloWorld 一个生产者、一个消费者,不需要设置交换机(使用默认的交换机) 2、工作队列模式 Work Queue 一个生产者、多个消费者(竞争关系),不需要设置交换机(使用默认的交换机) 3、发布订阅模式 Publish/subscribe 需要设置类型为fanout的交换机,并且交换机和队列进行绑定,当发送消息到交换机后,交换机会将消息发送到绑定的队列 4、路由模式 Routing 需要设置类型为direct的交换机,交换机和队列进行绑定,并且指定routing key,当发送消息到交换机后,交换机会根据routing key将消息发送到对应的队列 5、通配符模式 Topic 需要设置类型为topic的交换机,交换机和队列进行绑定,并且指定通配符方式的routing key,当发送消息到交换机后,交换机会根据routing key将消息发送到对应的队列 #### 特技 1. 使用 Readme\_XXX.md 来支持不同的语言,例如 Readme\_en.md, Readme\_zh.md 2. Gitee 官方博客 [blog.gitee.com](https://blog.gitee.com) 3. 你可以 [https://gitee.com/explore](https://gitee.com/explore) 这个地址来了解 Gitee 上的优秀开源项目 4. [GVP](https://gitee.com/gvp) 全称是 Gitee 最有价值开源项目,是综合评定出的优秀开源项目 5. Gitee 官方提供的使用手册 [https://gitee.com/help](https://gitee.com/help) 6. Gitee 封面人物是一档用来展示 Gitee 会员风采的栏目 [https://gitee.com/gitee-stars/](https://gitee.com/gitee-stars/)