消息队列

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 如何避免消息重复投递或重复消费?

幂等性设计

4.6 如何避免消息不丢失

4.6 消息丢失怎么办

4.6 消息丢失怎么办

4.6 消息丢失怎么办

4.6 消息丢失怎么办

4.6 消息丢失怎么办

4.6 虚拟主机是什么?

5.Kafka

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
【社区内容提示】社区部分内容疑似由AI辅助生成,浏览时请结合常识与多方信息审慎甄别。
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

友情链接更多精彩内容