[每周一更]-(第126期):MQ解耦场景

news2025/1/19 14:21:39

在这里插入图片描述

消息队列(MQ)解耦是一种软件架构设计模式,主要通过中间件将系统中的生产者和消费者模块分离,减少模块之间的直接依赖,使系统具有更高的扩展性和灵活性。这种模式尤其适用于需要处理复杂业务逻辑、频繁请求或异步处理的场景。

MQ解耦的核心概念

在传统的系统中,一个模块完成后立即调用下一个模块,模块间存在直接调用关系,耦合度较高,修改或扩展其中一个模块会牵涉多个其他模块。而通过消息队列实现解耦,生产者模块仅负责发送消息到MQ,消费者模块根据订阅获取消息并处理,模块之间通过MQ完成数据的异步传输。这种模式可以有效降低依赖,改善系统的容错能力和响应性能。

关键解耦场景

  1. 异步任务处理
    • 场景:例如在电商网站中,下单后立即向用户发送订单确认邮件。直接调用邮件发送服务会增加响应时间,影响用户体验。
    • 解耦方法:订单服务将邮件发送任务通过MQ异步推送给邮件服务,订单处理完毕后立即响应用户,邮件服务在后台异步处理邮件发送。
  2. 削峰填谷
    • 场景:秒杀、抢购等活动中,大量请求瞬时涌入,容易导致服务器过载。
    • 解耦方法:使用MQ在活动高峰时暂存请求,系统逐步消费队列中的请求数据,从而平滑处理请求,防止宕机或响应延迟。
  3. 模块隔离
    • 场景:在微服务架构中,A服务依赖B服务的部分数据,但不希望因B服务出现故障而影响A服务。
    • 解耦方法:B服务将相关数据通过MQ发布到队列,A服务从队列中消费数据,从而确保A服务不直接依赖B服务的可用性。
  4. 数据同步与分发
    • 场景:多个系统间数据同步,例如用户数据需要在CRM系统和财务系统中同步。
    • 解耦方法:CRM系统在更新用户数据后,发布一条“用户信息变更”消息到MQ。订阅了该消息的财务系统等其他系统收到消息后,再更新数据。
  5. 日志和监控收集
    • 场景:分布式系统中的服务需要收集日志信息、运行状态等数据用于监控分析。
    • 解耦方法:各服务将日志、监控数据发送到MQ,独立的日志系统从MQ消费日志数据并进行集中分析处理。
  6. 事件驱动架构
    • 场景:用户注册后需要完成一系列后续任务,如发送欢迎邮件、赠送积分等。
    • 解耦方法:注册服务在完成注册后,将“用户注册成功”事件发布到MQ,订阅此事件的其他服务(邮件、积分服务等)根据事件触发自己的任务。

MQ解耦的好处

  • 降低耦合性:模块间的逻辑独立,便于开发和维护。
  • 提高系统响应速度:支持异步处理,减少主流程的阻塞。
  • 提高系统稳定性:通过削峰填谷缓解流量冲击,提升系统的承载能力。
  • 增加系统扩展性:消费者模块可以水平扩展,适应业务增长需求。

MQ解耦的挑战

  • 数据一致性问题:异步处理可能导致最终一致性问题,需设计幂等性策略和重试机制。
  • 消息丢失风险:系统异常可能导致消息丢失,可通过持久化和重试机制提高可靠性。
  • 监控和运维复杂度:消息队列的维护、监控、性能调优需要经验和工具支持。

通过在解耦场景中合理应用MQ,可以大大增强系统的灵活性与扩展性,但也需要在开发和运维上进行相应的可靠性设计。

项目中选型

在项目中使用消息队列(MQ)来解耦系统模块,可以通过以下几种方式实现,帮助实现模块间的独立、降低耦合度、提升系统的扩展性和容错性:

1. 选择合适的MQ

常见的消息队列中间件有RabbitMQ、Kafka、ActiveMQ、Redis Stream等,选择时应根据数据量、性能、延迟等需求进行权衡:

  • RabbitMQ:适合处理可靠性较高、事务性强的场景。
  • Kafka:适合处理大数据量的流式数据,具有高吞吐量和低延迟。
  • ActiveMQ:适合分布式系统下的消息传输和缓冲。
  • Redis Stream:适合轻量级任务队列和延迟较低的场景。

2. 确定MQ的解耦点

  • 事件驱动解耦:将模块的业务操作以事件形式发布到消息队列中,其他模块可以根据需求订阅该事件。例如,在电商系统中,订单模块可以发布“订单创建”的消息,库存模块和通知模块可以监听该消息并进行库存减少或发送通知。
  • 异步任务解耦:对于需要后台处理的操作(如发送邮件、文件处理等),通过MQ将任务分发给异步消费者,从而释放主线程的压力。

3. 消息结构设计

  • 设计统一的数据格式,如JSON、XML等,来方便跨服务通信和数据解析。
  • 包含消息ID、事件类型、事件数据、时间戳等必要信息以便于追踪、调试和重试机制的实现。

4. 实现发布-订阅模式

  • 生产者:负责将业务事件或数据通过消息队列发布出去。
  • 消费者:订阅对应的队列来获取数据并处理。
  • 流程示例:
    • 生产者模块将事件发布到MQ。
    • MQ将事件推送给订阅者模块(消费者),消费者异步处理数据。

5. 错误处理和重试机制

  • 在消费消息时设置重试机制,如消费失败后将消息重发或推送至“死信队列”中,并记录错误以备后续处理。
  • 定期监控死信队列,以分析失败原因,避免影响系统稳定性。

6. 保证消息的幂等性

在消费端确保消费的是唯一消息,避免重复消费引起的错误或数据不一致问题。可以通过消息ID、数据库锁、唯一性校验等方法实现。

7. 监控和日志记录

对消息队列的状态、消费情况、延迟、错误进行实时监控,配置报警机制,方便快速排查问题。

使用MQ解耦的核心思想是通过松散耦合的事件驱动模式实现业务模块的独立性,减少模块间的直接依赖,使系统更具弹性和扩展性。

MQ类型优点缺点适用场景
RabbitMQ- 可靠性高,支持消息持久化
- 功能丰富,支持多种交换模式
- 提供良好的社区支持
- 消耗资源较高,性能受限于单节点
- 配置较复杂,需较多运维
企业应用、分布式架构、金融系统
Kafka- 高吞吐量,适合大量数据
- 支持分布式和分区扩展
- 提供日志持久化及流处理
- 配置复杂,维护成本高
- 不适合实时性要求非常高的场景
日志收集、流处理、大数据应用
ActiveMQ- 稳定性较好,支持多种协议
- 社区成熟,支持持久化和事务
- 性能低于Kafka和RabbitMQ
- 扩展性较差,分布式支持较弱
企业应用、事务消息需求场景
RocketMQ- 高效性能,适合大规模数据
- 支持事务消息和延迟低
- 支持分布式扩展
- 社区相对较小,文档不如Kafka丰富
- 运维复杂,需额外处理机制
电商、金融、大数据
Redis- 简单易用,轻量化
- 延迟低,适合实时性高的场景
- 支持数据持久化
- 大数据量场景不适用
- 不适合高可靠性要求的场景,无消息确认机制
实时数据更新、短消息传递
NSQ- 易于部署和使用
- 去中心化架构,适合容错需求高的场景
- 适合高并发和低延迟应用
- 社区小,功能较少
- 持久化支持较弱,不适合长时间数据保留
高并发、低延迟应用
ZeroMQ- 超低延迟,适合高性能计算和消息传递
- 轻量化,无需中心节点
- 不支持持久化和消息确认
- 使用复杂,需实现部分逻辑
高性能计算、内网数据交换
Amazon SQS- 托管服务,运维低成本
- 支持持久化和高可用性
- 可自动扩展应对流量变化
- 消息大小有限制
- 延迟相对较高,不适合极低延迟场景
云端任务队列、分布式架构、消息缓冲
MQ类型消息持久化支持实时性扩展性数据一致性支持开发难度支持的协议事务性支持监控工具编程语言支持社区支持
RabbitMQ较高中等中等AMQP, MQTT, STOMPPrometheus插件等多语言(Python、Java、Go等)强大
Kafka较低很高较高Kafka自定义协议Kafka Manager等多语言(Java、Scala、Python等)强大
ActiveMQ中等中等中等AMQP, MQTT, STOMPPrometheus插件等多语言(Java、Python、C++等)中等
RocketMQ很高较高RocketMQ自定义协议RocketMQ ConsoleJava、Python中等
Redis是(持久化限制)很高中等RESPRedis Insight多语言(Go、Java、Python等)强大
NSQ很高中等NSQ自定义协议NSQ Admin多语言(Go、Python等)中等
ZeroMQ很高中等ZMTP无内置监控多语言(C、C++、Python等)中等
Amazon SQS中等AWS APICloudWatch多语言(Java、Python等)强大

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/2255969.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

flinkSql 将流和表的互相转换

流——>表 方式一 方式二 方式一&#xff1a;写sql DataStreamSource<String> source env.socketTextStream("localhost", 8881); // 表名&#xff0c;流&#xff0c;字段名称 tableEnv.createTemporaryView("t_1",source&#xff0c;$("…

linuxCNC(五)HAL驱动的指令介绍

HAL驱动的构成 指令举例详解 从终端进入到HAL命令行&#xff0c;执行halrun&#xff0c;即可进入halcmd命令行 # halrun指令描述oadrt加载comoonent&#xff0c;loadrt threads name1 period1创建新线程loadusr halmeter加载万用表UI界面loadusr halscope加载示波器UI界面sho…

SQL SERVER 2016 AlwaysOn 无域集群+负载均衡搭建与简测

之前和很多群友聊天发现对2016的无域和负载均衡满心期待&#xff0c;毕竟可以简单搭建而且可以不适用第三方负载均衡器&#xff0c;SQL自己可以负载了。windows2016已经可以下载使用了&#xff0c;那么这回终于可以揭开令人憧憬向往的AlwaysOn2016 负载均衡集群的神秘面纱了。 …

vue3+elementPlus封装的数据过滤区

目录结构 源码 index.vue <template><el-form class"mb-5" :rules"rules" :model"queryForm" ref"queryDOM" label-width"80"><el-row :gutter"20"><slot></slot><el-col cla…

iOS如何自定义一个类似UITextView的本文编辑View

对于IOS涉及文本输入常用的两个View是UITextView和UITextField&#xff0c;一个用于复杂文本输入&#xff0c;一个用于简单文本输入&#xff0c;在大多数开发中涉及文本输入的场景使用这两个View能够满足需求。但是对于富文本编辑相关的开发&#xff0c;这两个View就无法满足自…

《黑神话:悟空》闪退,提示D3D12崩溃,游戏崩溃无法启动是什么原因?要怎么解决?

《黑神话&#xff1a;悟空》闪退、D3D12崩溃及游戏无法启动&#xff1a;原因、解决方案与预防措施 作为一名软件开发从业者&#xff0c;我深知电脑游戏运行时可能遇到的各种问题&#xff0c;尤其是像《黑神话&#xff1a;悟空》这样的高品质游戏&#xff0c;其对硬件和系统配置…

JUC:Synchronized和锁升级

1. 面试题 谈谈你对Synchronized的理解Sychronized的锁升级你聊聊Synchronized实现原理&#xff0c;monitor对象什么时候生成的&#xff1f;知道monitor的monitorenter和monitorexit这两个是怎么保证同步的嘛&#xff1f;或者说这两个操作计算机底层是如何执行的偏向锁和轻量级…

SAP SD学习笔记19 - 形式发票(Proforma Invoice)

上面几章讲了投诉处理。 SAP SD学习笔记18 - 投诉处理4 - 请求书订正依赖&#xff0c;投诉处理流程的总结-CSDN博客 本章继续学习SD 模块的其他内容。 本章讲了形式发票&#xff08;Proforma Invoice&#xff09;的概要及系统操作。 形式发票是在出库确认之前&#xff0c;有…

M005 PHP+MYSQL+web编程课程网站的设计与实现 源码 配置 文档

web编程课程网站 1.摘要2.开发目的和意义3.系统功能设计4.系统界面截图5.源码获取 1.摘要 随着互联网的飞速发展&#xff0c;各行各业的信息化进程逐步加快。商业信息化、政务信息化、教育信息、服务信息化等等已遍布全国各地。信息化的服务平台能更加高效的为用户提供各种服务…

【力扣】13.罗马数字转整数

问题描述 思路解析 对于这种限制字符的问题&#xff0c;使用Map来对键值存储 对其进行判断&#xff0c;如果前面的数小于后面的数&#xff0c;那么结果相减 否则&#xff0c;正常相加。 代码 class Solution {Map<Character,Integer> mapnew HashMap<Character,In…

docker安装ddns-go(外网连接局域网)

docker先下载镜像&#xff0c;目前最新版是v6.7.6 也可以csdn资源下载 再导入dockers https://download.csdn.net/download/u014756339/90096748 docker load -i ddns-go.tar 启动 docker run -d --name ddns-go --restartalways --nethost -v /opt/ddns-go:/root jeessy/…

洛谷P4913 【深基16.例3】二叉树深度(c嘎嘎)

题目链接&#xff1a;P4913 【深基16.例3】二叉树深度 - 洛谷 | 计算机科学教育新生态 题目难度&#xff1a;普及 解题思路&#xff1a;本题要求树的深度&#xff0c;即求左右子树高度的最大值&#xff0c;首先我们用结构体存树左右节点&#xff0c;然后分别递归地去左右子树的…

Android -- [SelfView] 自定义多行歌词滚动显示器

Android – [SelfView] 自定义多行歌词滚动显示器 流畅、丝滑的滚动歌词控件* 1. 背景透明&#xff1b;* 2. 外部可控制进度变化&#xff1b;* 3. 支持屏幕拖动调节进度&#xff08;回调给外部&#xff09;&#xff1b;效果 歌词文件&#xff08;.lrc&#xff09; 一. 使用…

DNS/域名

概述 每个应用层协议都是为了解决某一类应用问题&#xff0c;而问题的解决又往往是通过位于不同主机中的多个应用进程之间的通信和协同工作来完成的。应用层的具体内容就是规定应用进程在通信时所遵循的协议。 应用层的许多协议都是基于客户服务器方式。客户(client)和服务器…

淘宝直播间智能化升级:基于LLM的学习与分析

自营直播应用技术团队负责的业务中&#xff0c;淘宝买菜的直播业务起步较晚&#xff0c;业务发展压力较大&#xff0c;业务上也就有了期望能够对一些二方的标杆直播间进行学习&#xff0c;并将其优点应用到自己直播间的需求。 最初 - 人海战术&#xff0c;学习PK 业务侧最直接的…

数学拯救世界(一)———寻“数”记

一、 很久很久以前&#xff0c;在一个只认识整数和小数的国度&#xff0c;有一个很残暴的国王提了一个要求&#xff1a;要是不能表示出把一段1米的绳子三等分后的大小&#xff0c;就要把所有的大臣杀掉。 1➗3 0.333&#xff0c;怎么办呀&#xff1f;怎么办呀&#xff1f; 袁q…

夏普MX-4608N复印机维修模式进入方法及载体初始化方法

夏普MX-4608N复印机载体型号&#xff08;图&#xff09;&#xff1a; 型 号&#xff1a;载体&#xff08;黑色&#xff09;MX-561CV 净含量&#xff1a;395克 下面图片中分别有载体、刮板、鼓芯、上纸盒搓纸轮一套&#xff0c;均原装正品&#xff1b; 保养周期将至的时候建…

FPGA Xilinx维特比译码器实现卷积码译码

FPGA Xilinx维特比译码器实现卷积码译码 文章目录 FPGA Xilinx维特比译码器实现卷积码译码1 Xilinx维特比译码器实现2 完整代码3 仿真结果 MATLAB &#xff08;n,k,m&#xff09;卷积码原理及仿真代码&#xff08;你值得拥有&#xff09;_matlab仿真后代码-CSDN博客 MATLAB 仿真…

java+ssm+mysql水产品商城

项目介绍&#xff1a; 使用javassmmysql开发的水产品商城&#xff0c;系统包含管理员、用户角色&#xff0c;功能如下&#xff1a; 管理员&#xff1a;用户管理&#xff1b;种类管理&#xff1b;商品管理&#xff1b;订单管理&#xff1b;评论管理&#xff1b;新闻管理&#…

【传感器技术】第5章 电容式传感器,变极距式电容传感器,变面积式电容传感器,变介质式电容传感器

关注作者了解更多 我的其他CSDN专栏 过程控制系统 工程测试技术 虚拟仪器技术 可编程控制器 工业现场总线 数字图像处理 智能控制 传感器技术 嵌入式系统 复变函数与积分变换 单片机原理 线性代数 大学物理 热工与工程流体力学 数字信号处理 光电融合集成电路…