RabbitMQ
-
消息队列的主要作用是什么?
解耦
将消息写入消息队列,需要消息的系统自己从消息队列中订阅,从而系统不需要做任何修改。
异步
将消息写入消息队列,非必要的业务逻辑以异步的方式运行,加快响应速度
削峰
系统慢慢的按照数据库能处理的并发量,从消息队列中慢慢拉取消息。在生产中,这个短暂的高峰期积压是允许的 -
你项目好好的情况下,为什么要引入消息队列? 引入的理由是什么?
-
项目里你们是怎么用消息队列的?
spring boot 引入相关依赖<dependencies> <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-amqp</artifactId> </dependency> </dependencies>
在application.yml添加配置
4. 你在项目中是如何保证消息队列的高可用
-
kafka、activemq、rabbitmq、rocketmq都有什么区别
-
MQ在高并发情况下假设队列满了如何防止消息丢失
-
消费者消费消息,如何保证MQ幂等性
-
谈谈你对死信队列的理解
-
如果百万级别的消息积压了,你们如何处理? ]
-
你们为什么不用其他的MQ,最终选择了RabbitMQ?
-
RabbitMQ的交换器
Direct Exchange
处理路由键。需要将一个队列绑定到交换机上,要求该消息与一个特定的路由键完全匹配。这是一个完整的匹配。如果一个队列绑定到该交换机上要求路由键 “abc”,则只有被标记为“abc”的消息才被转发,不会转发abc.def,也不会转发dog.ghi,只会转发abc。
Fanout Exchange
不处理路由键。你只需要简单的将队列绑定到交换机上。一个发送到交换机的消息都会被转发到与该交换机绑定的所有队列上。很像子网广播,每台子网内的主机都获得了一份复制的消息。Fanout交换机转发消息是最快的。
Topic Exchange
将路由键和某模式进行匹配。此时队列需要绑定要一个模式上。符号“#”匹配一个或多个词,符号“”匹配不多不少一个词。因此“abc.#”能够匹配到“abc.def.ghi”,但是“abc.” 只会匹配到“abc.def”。
Headers Exchanges
不处理路由键。而是根据发送的消息内容中的headers属性进行匹配。在绑定Queue与Exchange时指定一组键值对;当消息发送到RabbitMQ时会取到该消息的headers与Exchange绑定时指定的键值对进行匹配;如果完全匹配则消息会路由到该队列,否则不会路由到该队列。headers属性是一个键值对,可以是Hashtable,键值对的值可以是任何类型。而fanout,direct,topic 的路由键都需要要字符串形式的。
匹配规则x-match有下列两种类型:
x-match = all :表示所有的键值对都匹配才能接受到消息
x-match = any :表示只要有键值对匹配就能接受到消息