幂等性:多次收到消息,但是不会重复消费
1 使用rabbitmq有什么好处?
解耦
异步 将消息写入消息队列之中,非必要的逻辑以异步的方式运行,加快反应速度
削峰 并发量大的时候,可以不让所有的请求直接到数据库,造成数据库异常
2 消息是基于什么传输的
因为tcp连接的创建和销毁开销很大,且并发数量受到系统资源的限制,rabbitmq采用的是信道方式传输数据(信道是建立在真实tcp连接上的虚拟连接,数量没有限制)
3 rabbitmq 消息怎么路由
消息路由有三部分: 交换器 路由 绑定
生产者将消息发布到交换器上;绑定决定了消息如何从路由器到指定的消息队列;消息到达队列,被消费者接收
消息发布到交换器的时候有一个routing key(路由键),在消息创建的时候设定
通过队列路键,吧消息绑定到交换器上
消息到达交换器后,交换器会根据消息的路由键和队列的路由键匹配,匹配成功进入到消息队列中。
常用的交换器有三种
direct
fanout
topic
4如何保证消息准确的发送到rabbitmq?
rabbitmq采用发送方确认模式,就是将信道设置成confirm模式,就是在发送消息的时候配置一个唯一的id,消息被消息队列接收并写入磁盘之后返回一个包含发送时配置的唯一id的信息,如果消息丢失会发送会一个未确认的消息,这种方式是异步的,生产者在等待消息确认的时候是可以继续发送消息的,
5 如何确保消息被正常接收消费、
消费者接收到消息之后需要进行确认,确认后rabbmimq才会吧消息从消息队列中删除,没有设定超时机制,是根据连接是否断开判断,有以下两种情况:
1 消费者接收到消息,在没消息确认之前就断开了连接,连接断开,rabbitmq会认为消息没有消费,会分给另外一个订阅这
2 消费者接收到消息,没有确认消息但是连接未断开,消息不回分给另外的订阅者,会一直等待
6 如何避免消息冲入投递或者重读消费
生产者在消息发布的时候生成一个唯一的id,作为去重和幂等的依据,避免重复进入消息队列中,就算重复消费,也会导致主键冲突,或者是方法哦redis里边,看是否存在,存在则不在消费
消息消费时需要根据id去查询是否消费过,已消费过的不在消费
7 消息如何被优先消费
生产者在生产消息的时候可以设置优先级
8 消息丢失
9 如何补救消息