MQ八股

简介: MQ八股

6-MQ篇

RabbitMQ01- 你们项目中哪里用到了RabbitMQ ? 我们项目中很多地方都使用了RabbitMQ , RabbitMQ 是我们项目中服务通信的主要方式之一 , 我们项目中服务通信主要有二种方式实现 : 通过Feign实现服务调用通过MQ实现服务通信基本上除了查询请求之外, 大部分的服务调用都采用的是MQ实现的异步调用 , 例如 : 发布内容的异步审核验证码的异步发送用户行为数据的异步采集入库搜索历史记录的异步保存用户信息修改的异步通知(用户修改信息之后, 同步修改其他服务中冗余/缓存的用户信息)静态化页面的生成MYSQL和Redis , ES之间的数据同步....02- 为什么会选择使用RabbitMQ ? 有什么好处 ?选择使用RabbitMQ是因为RabbitMQ的功能比较丰富 , 支持各种消息收发模式(简单队列模式, 工作队列模式 , 路由模式 , 直接模式 , 主题模式等) , 支持延迟队列 , 惰性队列而且天然支持集群, 保证服务的高可用, 同时性能非常不错 , 社区也比较活跃, 文档资料非常丰富使用MQ有很多好处:吞吐量提升:无需等待订阅者处理完成,响应更快速故障隔离:服务没有直接调用,不存在级联失败问题调用间没有阻塞,不会造成无效的资源占用耦合度极低,每个服务都可以灵活插拔,可替换流量削峰:不管发布事件的流量波动多大,都由Broker接收,订阅者可以按照自己的速度去处理事件使用MQ也有很多缺点:架构复杂了,业务没有明显的流程线,不好管理需要依赖于Broker的可靠、安全、性能03- 使用RabbitMQ如何保证消息不丢失 ? 消息从发送,到消费者接收,会经理多个过程 , 其中的每一步都可能导致消息丢失 针对这些问题,RabbitMQ分别给出了解决方案:消息发送到交换机丢失 : 发布者确认机制publisher-confirm消息发送到交换机失败会向生产者返回ACK , 生产者通过回调接收发送结果 , 如果发送失败, 重新发送, 或者记录日志人工介入消息从交换机路由到队列丢失 : 发布者回执机制publisher-return消息从交换机路由到队列失败会向生产者返回失败原因 , 生产者通过回调接收回调结果 , 如果发送失败, 重新发送, 或者记录日志人工介入消息保存到队列中丢失 : MQ持久化(交换机持久化, 队列持久化 , 消息持久化)消费者消费消息丢失 : 消费者确认机制 , 消费者失败重试机制通过RabbitMQ本身所提供的机制基本上已经可以保证消息不丢失 , 但是因为一些特殊的原因还是会发送消息丢失问题 , 例如 : 回调丢失 , 系统宕机, 磁盘损坏等 , 这种概率很小 , 但是如果想规避这些问题 , 进一步提高消息发送的成功率, 也可以通过程序自己进行控制设计一个消息状态表 , 主要包含 : 消息id , 消息内容 , 交换机 , 消息路由key , 发送时间, 签收状态等字段 , 发送方业务执行完毕之后 , 向消息状态表保存一条消息记录, 消息状态为未签收 , 之后再向MQ发送消息 , 消费方接收消息消费完毕之后 , 向发送方发送一条签收消息 , 发送方接收到签收消息之后 , 修改消息状态表中的消息状态为已签收 ! 之后通过定时任务扫描消息状态表中这些未签收的消息 , 重新发送消息, 直到成功为止 , 对于已经完成消费的消息定时清理即可 !04- 消息的重复消费问题如何解决的 ?在使用RabbitMQ进行消息收发的时候, 如果发送失败或者消费失败会自动进行重试, 那么就有可能会导致消息的重复消费 , 具体的解决方案其实非常简单, 为每条消息设置一个唯一的标识id , 将已经消费的消息记录保存起来 , 后期再进行消费的时候判断是否已经消费过即可 , 如果已经消费过则不消费 , 如果没有消费过则正常消费 05- 如果有100万消息堆积在MQ , 如何解决 ?解决消息堆积有三种思路:提高消费者的消费能力 使用多线程消费增加更多消费者,提高消费速度 使用工作队列模式, 设置多个消费者消费消费同一个队列中的消息扩大队列容积,提高堆积上限 使用RabbitMQ惰性队列06- RabbitMQ如何保证消费的顺序性 ?一个队列只设置一个消费者消费即可 , 多个消费者之间是无法保证消息消费顺序性的07- RabbitMQ的延迟队列有了解过嘛 ? RabbitMQ的延迟队列有二种实现方案 : 使用消息过期TTL + 死信交换机使用延迟交换机插件08- RabbitMQ如何设置消息过期 ?RabbitMQ置消息过期的方式有二种 : 为队列设置过期时间, 所有进到这个队列的消息就会具有统一的过期时间

Plain Text

复制代码

@Bean

public Queue ttlQueue(){

   return QueueBuilder.durable("ttl.queue") // 指定队列名称,并持久化

       .ttl(10000) // 设置队列的超时时间,10秒

       .deadLetterExchange("dl.ttl.direct") // 指定死信交换机

       .build();

}

为消息单独设置过期时间

Plain Text

复制代码

public void testTTLQueue() {

   // 创建消息

   String message = "hello, ttl queue";

   // 消息ID,需要封装到CorrelationData中

   CorrelationData correlationData = new CorrelationData(UUID.randomUUID().toString());

   // 发送消息

   rabbitTemplate.convertAndSend("ttl.direct", "ttl", message, correlationData);

   // 记录日志

   log.debug("发送消息成功");

}

注意 :队列过期和消息过期同时存在 , 会以时间短的时间为准RabbitMQ队列消息过期的机制是判断队列头部元素是否过期 , 如果队里头部消息没有到过期时间 , 中间消息到了过期时间, 这个消息也不会被自动剔除09- 什么情况下消息会成为死信 ? 当一个队列中的消息满足下列情况之一时,就会成为死信(dead letter):消费者使用basic.reject或 basic.nack声明消费失败,并且消息的requeue参数设置为false消息是一个过期消息,超时无人消费要投递的队列消息满了,无法投递10- 什么是死信交换机 ? 如何为队列绑定死信交换机 ?死 信交换机和正常的交换机没有什么不同 , 如果一个包含死信的队列配置了dead-letter-exchange属性,指定了一个交换机,那么队列中的死信就会投递到这个交换机中,而这个交换机称为死信交换机为队列绑定死信交换机 , 只需要设置队列属性 dead-letter-exchange即可11- RabbitMQ的高可用机制有了解过嘛 ? RabbitMQ的是基于Erlang语言编写,而Erlang又是一个面向并发的语言,天然支持集群模式。RabbitMQ的集群有两种模式:•普通集群:是一种分布式集群,将队列分散到集群的各个节点,从而提高整个集群的并发能力。会在集群的各个节点间共享部分数据,包括:交换机、队列元信息。不包含队列中的消息。当访问集群某节点时,如果队列不在该节点,会从数据所在节点传递到当前节点并返回队列所在节点宕机,队列中的消息就会丢失•镜像集群:是一种主从集群,普通集群的基础上,添加了主从备份功能,提高集群的数据可用性。交换机、队列、队列中的消息会在各个MQ的镜像节点之间同步备份。所有操作都是主节点完成,然后同步给镜像节点主宕机后,镜像节点会替代成新的主

相关实践学习
快速体验阿里云云消息队列RocketMQ版
本实验将带您快速体验使用云消息队列RocketMQ版Serverless系列实例进行获取接入点、创建Topic、创建订阅组、收发消息、查看消息轨迹和仪表盘。
消息队列 MNS 入门课程
1、消息队列MNS简介 本节课介绍消息队列的MNS的基础概念 2、消息队列MNS特性 本节课介绍消息队列的MNS的主要特性 3、MNS的最佳实践及场景应用 本节课介绍消息队列的MNS的最佳实践及场景应用案例 4、手把手系列:消息队列MNS实操讲 本节课介绍消息队列的MNS的实际操作演示 5、动手实验:基于MNS,0基础轻松构建 Web Client 本节课带您一起基于MNS,0基础轻松构建 Web Client
相关文章
|
Linux
kali2022.1蓝牙(bluetooth)
kali2022.1蓝牙(bluetooth)
1255 2
|
5月前
|
消息中间件 缓存 NoSQL
【Redis】Redis缓存核心问题:缓存与数据库双写一致性问题、延迟双删、更新策略
本文系统梳理Redis缓存双写一致性核心问题,涵盖强/最终/弱一致性分级、Cache Aside等主流更新策略、延迟双删原理与落地要点,并深入解析binlog CDC兜底方案及高并发优化实践,兼顾理论深度与工业落地。
|
12月前
|
人工智能 视频直播 数据库
2025最新AI智能体学习路线图
零基础入门AI智能体?「智能体来了」为你梳理从技能学习到商业变现的完整路径:涵盖Coze平台开发、Python基础、全平台实战、短视频引流、直播变现实操,助你打造产品+流量+成交闭环,边学边做,快速上手AI智能体商业化应用。
|
JSON JavaScript 测试技术
用Postman玩转电商API:一键测试+自动化请求教程
Postman 是电商 API 测试的高效工具,涵盖基础配置、自动化测试、环境管理与请求自动化,助你快速提升开发效率。
|
缓存 NoSQL Java
Redis+Caffeine构建高性能二级缓存
大家好,我是摘星。今天为大家带来的是Redis+Caffeine构建高性能二级缓存,废话不多说直接开始~
1905 0
|
传感器 人工智能 物联网
数字孪生与灾害预测:提升应急响应能力
【10月更文挑战第31天】数字孪生技术通过实时监测、灾害模拟和应急响应优化,显著提升了灾害预测和应急响应能力。本文探讨了其在洪水、地震等自然灾害中的应用,展示了其在提高预警准确性、优化资源配置和提升应急响应效率方面的巨大潜力。
|
Java 关系型数据库 MySQL
【高频】你了解乐观锁和悲观锁吗?
【高频】你了解乐观锁和悲观锁吗?
649 3
|
关系型数据库 MySQL PHP
利用PhpStorm、phpstudy和xdebug快速构建PHP调试环境
至此,我们已经完成了PHP调试环境的构建。现在,你可以在PhpStorm中打开你的PHP项目,设置断点,然后开始调试你的代码了。希望这个指南能帮助你快速构建PHP调试环境,提高你的开发效率。
907 26
|
存储 安全 Java
synchronized 原理
`synchronized` 是 Java 中实现线程同步的关键字,通过对象头中的 Monitor 和锁机制确保同一时间只有一个线程执行同步代码。其底层依赖 Mark Word 和 Monitor 控制锁状态,支持偏向锁、轻量级锁和重量级锁的升级过程,以优化性能。同步方法和同步块在实现方式上有所不同,前者通过 `ACC_SYNCHRONIZED` 标志隐式加锁,后者通过 `monitorenter` 和 `monitorexit` 指令显式控制。此外,`synchronized` 还保证内存可见性和 Happens-Before 关系,使共享变量在多线程间正确同步。
1101 0
|
存储 缓存 关系型数据库
图解MySQL【日志】——Redo Log
Redo Log(重做日志)是数据库中用于记录数据页修改的物理日志,确保事务的持久性和一致性。其主要作用包括崩溃恢复、提高性能和保证事务一致性。Redo Log 通过先写日志的方式,在内存中缓存修改操作,并在适当时候刷入磁盘,减少随机写入带来的性能损耗。WAL(Write-Ahead Logging)技术的核心思想是先将修改操作记录到日志文件中,再择机写入磁盘,从而实现高效且安全的数据持久化。Redo Log 的持久化过程涉及 Redo Log Buffer 和不同刷盘时机的控制参数(如 `innodb_flush_log_at_trx_commit`),以平衡性能与数据安全性。
1108 5
图解MySQL【日志】——Redo Log