rabbitMQ
为什么使用MQ
-
流量削峰
-
应用解耦
-
异步处理
1,生产者生产之后怎么放到队列里面的
生产者投递消息到exchange 上,exchange会把消息路由到指定的queue上,(根据某种路由规则去路由的)
消费者只需要监听mq然后去消费就可以了
消费者确认接收到的消息之后就 rabbitMQ从队列中删除相应己经被确认的消息
2.七种工作模式
- 简单模式:一个生产者,一个消费者
- work模式:一个生产者,多个消费者,每个消费者获取到的消息唯一
- 订阅模式:一个生产者发送的消息会被多个消费者获取
- 路由模式: 发送消息到交换机并且要指定路由key ,消费者将队列绑定到交换机时`需要指定路由key
- topic 主题模式:将路由键和某模式进行匹配,此时队列需要绑定在一个模式上,“#”匹配一个词或多个词,“*”只匹配一个词
- RPC模式:使用RabbitMQ构建RPC系统:客户端和可伸缩RPC服务器
- 发布确认:与发布者进行可靠的发布确认
3.rabbitmq 的使用场景有哪些?
- 跨系统的异步通信,所有需要异步交互的地方都可以使用消息队列。(就像我们除了打电话(同步)以外,还需要发短信,发电子邮件(异步)的通讯方式。)
- 多个应用之间的耦合(由于消息是平台无关和语言无关的,而且语义上也不再是函数调用,因此更适合作为多个应用之间的松耦合的接口。基于消息队列的耦合,不需要发送方和接收方同时在线。在企业应用集成(EAI)中,文件传输,共享数据库,消息队列,远程过程调用都可以作为集成的方法。)
- 应用内的同步变异步(比如订单处理,就可以由前端应用将订单信息放到队列,后端应用从队列里依次获得消息处理,高峰时的大量订单可以积压在队列里慢慢处理掉。由于同步通常意味着阻塞,而大量线程的阻塞会降低计算机的性能。)
- 消息驱动的架构(EDA),系统分解为消息队列,和消息制造者和消息消费者,一个处理流程可以根据需要拆成多个阶段(Stage),阶段之间用队列连接起来,前一个阶段处理的结果放入队列,后一个阶段从队列中获取消息继续处理。
- 应用需要更灵活的耦合方式,如发布订阅,比如可以指定路由规则。
- 跨局域网,甚至跨城市的通讯(CDN行业),比如北京机房与广州机房的应用程序的通信。
4.rabbitmq 有哪些重要的组件?
- ConnectionFactory(连接管理器):应用程序与Rabbit之间建立连接的管理器,程序代码中使用。
- Channel(信道):消息推送使用的通道。
- Exchange(交换器):用于接受、分配消息。
- Queue(队列):用于存储生产者的消息。
- RoutingKey(路由键):用于把生成者的数据分配到交换器上。
- BindingKey(绑定键):用于把交换器的消息绑定到队列上。
5.rabbitmq 怎么避免消息丢失?
- 消息持久化
- ACK确认机制
- 设置集群镜像模式
- 消息补偿机制
6.要保证消息持久化成功的条件有哪些?
- 声明队列必须设置持久化 durable 设置为 true.
- 消息推送投递模式必须设置持久化,deliveryMode 设置为 2(持久)。
- 消息已经到达持久化交换器。
- 消息已经到达持久化队列。
以上四个条件都满足才能保证消息持久化成功。
7.rabbitmq 持久化有什么缺点?
持久化的缺地就是降低了服务器的吞吐量,因为使用的是磁盘而非内存存储,从而降低了吞吐量。可尽量使用 ssd 硬盘来缓解吞吐量的问题。
8.为什么会出现消息重复?
消息重复的原因有两个:1.生产时消息重复,2.消费时消息重复。
1.1 生产时消息重复
由于生产者发送消息给MQ,在MQ确认的时候出现了网络波动,生产者没有收到确认,实际上MQ已经接收到了消息。这时候生产者就会重新发送一遍这条消息。
生产者中如果消息未被确认,或确认失败,我们可以使用定时任务+(redis/db)来进行消息重试。
1.2消费时消息重复
消费者消费成功后,再给MQ确认的时候出现了网络波动,MQ没有接收到确认,为了保证消息被消费,MQ就会继续给消费者投递之前的消息。这时候消费者就接收到了两条一样的消息。
由于重复消息是由于网络原因造成的,因此不可避免重复消息。但是我们需要保证消息的幂等性。
9.RabbitMQ解决分布式事务原理
采用最终一致性原理。
需要保证以下三要素
1、确认生产者一定要将数据投递到MQ服务器中(采用MQ confirm消息确认机制)
2、MQ消费者消息能够正确消费消息,采用手动ACK模式(注意重试幂等性问题)
3、如何保证第一个事务先执行,采用补偿机制,在创建一个补单消费者进行监听,如果订单没有创建成功,进行补单。
10.生产者没有成功把消息发送到MQ
方案:事物机制和confirm机制
事务机制和confirm机制,最常用的是confirm机制。
RabbitMQ的事务机制是同步的,很耗型能,会降低RabbitMQ的吞吐量。confirm机制是异步的,生成者发送完一个消息之后,不需要等待RabbitMQ的回调,就可以发送下一个消息,当RabbitMQ成功接收到消息之后会自动异步的回调生产者的一个接口返回成功与否的消息。