1,生产者生产之后怎么放到队列里面的
生产者投递消息到exchange 上,exchange会把消息路由到指定的queue上,(根据某种路由规则去路由的)
消费者只需要监听mq然后去消费就可以了
消费者确认接收到的消息之后就 rabbitMQ从队列中删除相应己经被确认的消息
生产者生产消息,消费者消费消息的过程可参考这个网址:
https://blog.csdn.net/myFirstCN/article/details/93501215
2,mq有哪些消费模式
(1)推送consumer
注册一个消费者后,RabbitMQ会在消息可用时,自动将消息进行推送给消费者。这种方式效率最高最及时。
(2)拉取get
属于一种轮询模型,发送一次get请求,获得一个消息。如果此时RabbitMQ中没有消息,会获得一个表示空的回复。
(3)自动确认
方法channel.basicConsume和方法channel.basicGet表示同步或异步获取消息,第二个参数都表示是否自动确认。前面我们都设置为了true。这个时候我们只需要处理逻辑,将自动向RabbitMQ进行确认。
当autoAck=true时,一旦消费者接收到了消息,就视为自动确认了消息。如果消费者在处理消息的过程中,出了错,就没有什么办法重新处理这条消息,所以我们很多时候,需要在消息处理成功后,再确认消息,这就需要手动确认。
(4)手动确认
(5)qos预取模式
在确认消息被接收之前,消费者可以预先要求接收一定数量的消息,在处理完一定数量的消息后,批量进行确认。如果消费者应用程序在确认消息之前崩溃,则所有未确认的消息将被重新发送给其他消费者。所以这里存在着一定程度上的可靠性风险。
这种机制一方面可以实现限速(将消息暂存到RabbitMQ内存中)的作用,一方面可以保证消息确认质量(比如确认了但是处理有异常的情况)
参考:https://www.cnblogs.com/duanjt/p/10075897.html
3,rabbitmq的延迟队列和死信队列
在rabbitmq中不存在延时队列,但是我们可以通过设置消息的过期时间和死信队列来模拟出延时队列。消费者监听死信交换器绑定的队列,而不要监听消息发送的队列。
参考:https://www.iteye.com/blog/huan1993-2432175
4,rabbitmq怎么保证数据不丢失
三个方面:
(1)生产者不弄丢消息:开启confirm模式,生产者开启confirm之后,每次写的消息都会分配一个唯一的id,如果写入了rabbitmq中,会回传一个ack消息,告诉你ok了,否则会回调一个nack接口,告知你失败了。
(2)rabbitmq不弄丢消息:设置持久化有两个步骤:创建queue的时候设置持久化,发送消息的时候把deliveryMode=2消息设置为持久化
(补充:声明队列,生命交换机,发送消息的时候 都需要持久化)
(3)消费端设置持久化:用到rabbitmq的ack机制,关闭自动ack,处理完业务逻辑之后再程序里面ack
5,rabbitmq相对其他队列的特点是什么
(1)基于erlang开发,开发能力强,性能好,延时低
(2)时效性高,是微秒级别
(3)可用性比较高,基于主从架构实现高可用
(4)消息可靠性高
6,rabbitmq有哪些工作模式:
6.1,基本消息模型
一个生产者对应一个消费者,生产者生产一个消息到队列,消费者消费这个消息。
6.2,工作队列模式:
在实际生产过程中,消息生产会发送很多条消息,如果消费者只有一个的花效率就会很低
一个生产者发送消息到队列,允许有多个消费者接收消息,但是一条消息只会被一个消费者获取。
6.3,订阅模式
在订阅模式中,一条消息可以被多个消费者获取。
消息传递过程中多了一个交换机,生产者不是直接发送消息到队列,而是先发送到交换机,经由交换机分配到不同的队列,每个消费者都有自己的队列。
6.3.1,fanout 广播模式
每个消费者都有自己的队列,队列和交换机绑定,交换机把消息发送到队列中
6.3.2,direct 路由模式
在路由模式下可以实现不同的消息被不同的队列消费。
交换机和队列绑定的时候会设定一个routing key ,生产者发送消息的时候也需要携带一个routing key
6.3.3,topic 路由匹配模式
跟路由模式一样,只不过路由名称可以进行匹配识别
第6题和第4题可参考: