6-MQ篇 RabbitMQ

简介: acascaca

01- 你们项目中哪里用到了RabbitMQ ?

我们项目中很多地方都使用了RabbitMQ , RabbitMQ 是我们项目中服务通信的主要方式之一 , 我们项目中服务通信主要有二种方式实现 :

  1. 通过Feign实现服务调用
  2. 通过MQ实现服务通信

基本上除了查询请求之外, 大部分的服务调用都采用的是MQ实现的异步调用 , 例如 :

  1. 发布内容的异步审核
  2. 验证码的异步发送
  3. 用户行为数据的异步采集入库
  4. 搜索历史记录的异步保存
  5. 用户信息修改的异步通知(用户修改信息之后, 同步修改其他服务中冗余/缓存的用户信息)
  6. 静态化页面的生成
  7. MYSQL和Redis , ES之间的数据同步
  8. ....

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的延迟队列有二种实现方案 :

  1. 使用消息过期TTL + 死信交换机
  2. 使用延迟交换机插件
相关文章
|
9月前
|
Java Go 开发者
IDEA开发常用的快捷键
IntelliJ IDEA常用快捷键汇总:涵盖代码生成(如main、sout)、编辑(复制、删除、重命名)、导航(跳转、查找)、格式化、代码阅读及版本控制等高频操作,提升开发效率。熟练掌握可显著优化编码体验,是Java开发者必备技能。
808 1
|
9月前
|
Oracle Java 关系型数据库
Java命名规范
Java命名规范涵盖包、类、方法、变量等命名规则。包名全小写,类名首字母大写采用驼峰法,接口常用形容词,抽象类以Abstract/Base开头,异常类以Exception结尾,方法名小写驼峰,常量全大写用下划线分隔,枚举值按常量规范命名,提升代码可读性与一致性。
1137 0
|
10月前
|
Arthas 运维 监控
|
10月前
|
C++
解决Clion中写多个C++文件中存在多个main函数报错的问题
本文介绍如何在CLion中解决多个C++文件含main函数报错的问题。通过安装“C/C++ Single File Execution”插件,无需注释或新建项目,即可单独运行指定文件。配合右键操作与简单重构,实现高效刷题编码,方便文件管理与快速调试,提升开发效率。
487 1
|
9月前
|
人工智能 自然语言处理 数据可视化
当行业进入寒冬,那个自带“AI调度中心”的人成了最稳的赢家
本文剖析职场寒冬下个体突围新路径:告别单点执行,构建个人“AI调度中心”,成为指挥多Agent协同、融合RAG知识库与LUI交互的“AI Agent指挥官”,实现从劳动力到系统力的跃迁。
285 2
|
12月前
|
存储 算法 关系型数据库
我们来讲一讲 MVCC 的实现原理
我是小假 期待与你的下一次相遇 ~
597 1
我们来讲一讲 MVCC 的实现原理
|
11月前
|
Kubernetes Cloud Native 调度
寻因生物 × 阿里云 ACS:Argo Workflows 驱动的基因分析新范式
国家级专精特新“小巨人”企业寻因生物[1],基于阿里云容器服务全托管工作流引擎 Argo Workflows[2] (以下简称:全托管 Argo Workflows)与容器计算服务 ACS[3](以下简称:ACS)构建的了新一代基因生信分析平台。该平台实现生信流程编排效率提升 70%、计算成本降低超 50%、运维复杂度下降 70%,为单细胞、空间转录组、表观测序技术等前沿研究提供了高效、弹性、标准化的算力基础设施。
854 1
|
12月前
|
人工智能 程序员
注意力隧道效应与 Burnout:专注的双刃剑
最让人投入的状态,也可能埋下倦怠的种子。对我们每个人而言,关键在于认识到 ‘心流不是一个可持续的常态,而是一个需要精心准备的峰值状态。 专注让我们效率倍增,却也可能悄悄消耗我们的精力。本文以“注意力隧道效应”为切入点,探讨如何在深度专注与倦怠之间找到平衡,让工作更高效而不透支自己。
772 8
|
12月前
|
消息中间件 分布式计算 资源调度
《聊聊分布式》ZooKeeper与ZAB协议:分布式协调的核心引擎
ZooKeeper是一个开源的分布式协调服务,基于ZAB协议实现数据一致性,提供分布式锁、配置管理、领导者选举等核心功能,具有高可用、强一致和简单易用的特点,广泛应用于Kafka、Hadoop等大型分布式系统中。
|
人工智能 Serverless 数据处理
AI练习场|如何从多模态文件中自动提取有效信息?
本文介绍了利用AI技术进行多模态文件信息抽取的实战教程,涵盖从文档、图像、音视频等多种数据中自动提取关键信息的技术方案。通过阿里云百炼模型与函数计算服务,实现高效数据处理,适用于信息提取、图片分类、音视频分析等场景,提升数据处理效率与准确性。
AI练习场|如何从多模态文件中自动提取有效信息?

热门文章

最新文章