1.什么是消息队列
队列是存放消息的容器
2.为什么要使用队列
- 解耦:例:系统A放消息到队列,BCD系统按需订阅,增减订阅无需修改代码;或BCD系统中某一个挂了,几分钟内消息可缓冲在队列,增加系统可用性。
- 异步:串行变并行。例:发短信邮件消息各需50s,则一共需要100s,队列并行50s。或者之前的回调是A隔一段时间去轮询B,或者B去调用A的api通知,现B完成后发消息给MQ,MQ去通知A
- 削峰 :5000条数据请求穿透数据库造成压力;放在队列消费者每次取1000条即可
3.ActiviMQ RabbitMQ RocketMQ Kafka比较
ActiviMQ :6000+;资料丰富;性能差
RabbitMQ :12000+;轻量迅捷,客户端语言多;消息堆积支持差,性能差
RocketMQ :十万级;性能高,稳定性高,优化响应时延,社区活跃;兼容性差
Kafka:百万级;为大数据而生,性能好,兼容性好;响应时延高,topic达到上百个,性能大幅下降
4.RabbitMQ - AMQP协议的实现
4.1 RabbitMQ的特点
- 可靠【持久化、发布确认、消费确认】
- 灵活的路由 【路由指定对应的路由策略】
- 消息集群【多个服务器组合成为一个逻辑broker】
- 高可用【通过集群镜像实现】
- 多种协议【RabbitMQ 支持多种消息队列协议,比如 STOMP、MQTT】
- 多语言客户端
- 管理界面
- 跟踪机制【如果消息异常,RabbitMQ 提供消息跟踪机制,可以找出发生了什么】
4.2 RabbitMQ的组成部分和工作流程
- Broker:中间件实体机
- 交换器Exchange
- 队列 Queue
- 绑定 Bind
- 路由 RoutingKey
- 信道 Channel 虚拟概念
工作流程:
- Producer连接到队列Broker:创建Connection,打开Channel
- Channel指定交换机类型、名称、是否持久化
- 生产者发布消息:指定RoutingKey 和消息是否持久化
- Exchange根据RountingKey将消息放进对应队列
- 消费者监听到消息后开始业务处理
4.3 RabbitMQ交换机的四种类型的特点,以及使用方法。=消息如何路由
direct:直接类型,routingKey严格匹配
finout:广播类型,通道上所有的
topic :通配符类型
header[场景少,基本不用]:通过header信息进行匹配,match分any部分匹配 all全部匹配
4.4 如何确保消息正确地发送至RabbitMQ? 如何确保消息接收方消费了消息?
1) 发布时:
- 发布者确认:与路由无关,channel.waitForConfirm(); 批量channel.waitForConfirmOrDie();
- 备用交换器
- 事务
- 消息持久化
4.5 如何避免消息重复投递或重复消费?
幂等性设计