1.什么是MQ?
MQ MessageQueue 消息队列 用来存放消息
也就是事件驱动架构中的Broker
用来实现异步通讯
2.MQ的应用场景?
①需要异步通通讯
②解除不同业务间的耦合
③提升并发量 吞吐量
④故障隔离
⑤流量削峰
3.常见的mq产品?
| RabbitMQ | ActiveMQ | RocketMQ | Kafka | |
|---|---|---|---|---|
| 公司/社区 | Rabbit | Apache | 阿里 | Apache |
| 开发语言 | Erlang | Java | Java | Scala&Java |
| 协议支持 | AMQP,XMPP,SMTP,STOMP | OpenWire,STOMP,REST,XMPP,AMQP | 自定义协议 | 自定义协议 |
| 可用性 | 高 | 一般 | 高 | 高 |
| 单机吞吐量 | 一般 | 差 | 高 | 非常高 |
| 消息延迟 | 微秒级 | 毫秒级 | 毫秒级 | 毫秒以内 |
| 消息可靠性 | 高 | 一般 | 高 | 一般 |
追求可用性:Kafka、 RocketMQ 、RabbitMQ
追求可靠性:RabbitMQ、RocketMQ
追求吞吐能力:RocketMQ、Kafka
追求消息低延迟:RabbitMQ、Kafka
4.什么是AMQP协议模型?
Advanced Message Queueing Protocol
是用于在应用程序之间传递消息的开放标准
该协议与语言与平台无关 更符合做服务中独立性的要求。
5.rabbitmq支持哪些消息模式?
五种
发布:
①Basic Queue 简单队列模型
②Work Queue 也被称为Task queue 任务模型
让多个消费者绑定到一个队列 共同消费队列中的信息
订阅:
③Fanout 广播 交换机将生产者发送的消息发送到绑定的所有队列
④Direct 定向 交换机将消息发送给含有指定的RoutingKey的队列上
⑤Topic 通配符 可使用# *号 RoutingKey一般由一个或多个单词组成
例如 item.insert
5.如何使用RabbitMQ收发消息?(基于SpringAMQP)?
①添加依赖
<!--AMQP依赖,包含RabbitMQ--><dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-amqp</artifactId></dependency>
②发送和接收端 添加配置
spring:
rabbitmq:
host: 192.168.150.101 # 主机名
port: 5672 # 端口
virtual-host: / # 虚拟主机
username: itcast # 用户名
password: 123321 # 密码
发送端:
@Autowired
private RabbitTemplate rabbitTemplate;
@Test
public void testSimpleQueue() {
// 队列名称
String queueName = "simple.queue";
// 消息
String message = "hello, spring amqp!";
// 发送消息
rabbitTemplate.convertAndSend(queueName, message);
}
接收端:
@Component
public class SpringRabbitListener {
@RabbitListener(queues = "simple.queue")
public void listenSimpleQueueMessage(String msg) throws InterruptedException {
System.out.println("spring 消费者接收到消息:【" + msg + "】");
}
6.如何项目中声明交换机、队列及绑定关系?
方法一:在配置类中利用@Bean的方式
//声明交换机
@Bean
public FanoutExchange fanoutExchange(){
return new FanoutExchange("itcast.fanout");
}
//声明第1个队列
@Bean
public Queue fanoutQueue1(){
return new Queue("fanout.queue1");
}
//将第1个队列与交换机绑定
@Bean
public Binding bindingQueue1(Queue fanoutQueue1,FanoutExchange fanoutExchange){
return BindingBuilder.bind(fanoutQueue1).to(fanoutExchange);
}
方法二:直接在@RabbitListener注解中声明绑定关系
@RabbitListener(bindings = @QueueBinding(
value = @Queue(name = "direct.queue2"),
exchange = @Exchange(name = "itcast.direct",type = ExchangeTypes.DIRECT),
key = {"yellow","red"}
))
public void listenDirectQueue2(String msg){
System.out.println("消费者接收到direct.queue2的消息:["+ msg +"]");
}
7.消息转换器的作用?
可以将发送的消息序列化为指定格式 发送给MQ
8.如何修改MQ默认的消息转换器?
添加依赖
在启动类中添加一个Bean
@Bean
public MessageConverter jsonMessageConverter(){
return new Jackson2JsonMessageConverter();
}
https://www.processon.com/view/link/62a735040e3e747c5c3ffeb9
MQ高级:
rabbitmq如何保证消息的可靠性?
rabbitmq如何解决百万消息堆积问题?
rabbitmq如何防止消息重复消费?
rabbitmq如何保证高可用?
rabbitmq消息的重试机制?
rabbitmq如何实现延迟消费?
rabbitmq在项目中的使用场景?
