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

在这里插入图片描述

消息队列(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.xdnf.cn/news/35669.html

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

相关文章

Redis的高可用之哨兵模式

Redis哨兵主要是解决Redis主从同步时主数据库宕机问题,使其能够自动进行故障恢复,提高Redis系统的高可用性。 1. 哨兵的作用: 监控:哨兵通过心跳机制监控主库和从库的存活性。 选主:当主库宕机时,哨兵会选举出一个领…

知识分享|一文了解实时荧光定量PCR(qPCR)技术的原理与分类

实时荧光定量PCR技术(Realtime quantitative PCR,qPCR)是在PCR反应体系中添加荧光报告基团和荧光淬灭基团,通过荧光信号来实现对核酸分子的定量检测过程在反应过程中,PCR产物随着扩增反应的进行不断生成,荧光信号不断增加&#xf…

【MySQL】环境变量配置

环境变量英文名SystemRoot,直译为“系统总(根)目录",主要指明操作系统的重要目录在哪里。那么配置MySQL的环境变量,就是在程序运行时,告诉操作系统你的MySQL目录位置。 复制MySQL安装目录:…

高级 CEF 内核集成与 VC++——开发环境搭建与配置

开发环境的搭建是 CEF 浏览器开发中至关重要的一步。正确配置开发环境不仅能提高开发效率,也能确保开发过程中的稳定性与可靠性。本文将结合最新的资料和技术方案,深入讲解如何搭建 CEF 编译与配置环境,正确配置 Windows SDK 与依赖库&#x…

【React】组件通讯有哪几种方式?

文章目录 一、父子组件通讯二、兄弟组件通讯3、context 跨级组件通讯 提示:以下是本篇文章正文内容,下面案例可供参考 一、父子组件通讯 父组件 ----> 子组件: props 父组件提供要传递的 state 数据 给子组件标签添加属性,值…

huggingface-cli下载数据(含下载指定数据教程)

在国内,推荐使用:HF-Mirror 1.尝试下载大模型相关文件 在huggingface镜像首页,可以看到如图: 2.使用huggingface-cli下载文件 2.1 首先激活自己的虚拟环境,然后安装环境,使用如下命令: pip …

生产慎用之调试日志对空间矢量数据批量插入的性能影响-以MybatisPlus为例

目录 前言 一、一些缘由 1、性能分析 二、插入方式调整 1、批量插入的实现 2、MP的批量插入实现 3、日志的配置 三、默认处理方式 1、基础程序代码 2、执行情况 四、提升调试日志等级 1、在logback中进行设置 2、提升后的效果 五、总结 前言 在现代软件开发中&…

Linux下编译安装METIS

本文记录Linux下编译安装METIS的流程。 零、环境 操作系统Ubuntu 22.04.4 LTSVS Code1.92.1Git2.34.1GCC11.4.0CMake3.22.1 一、安装依赖 1.1 下载GKlib sudo apt-get install build-essential sudo apt-get install cmake 2.2 编译安装GKlib 下载GKlib代码, …

数据链路层总结

- - 链路、物理链路:两节点间物理线路(有线、无线),中间没有任何其他的交换节点 数据链路、逻辑链路: 链路 协议需要的硬件、软件 网络适配器(网卡):包含物理层、数据链路层 网络适配器软件驱动程…

基于Java和Vue开发的漫画阅读软件漫画阅读小程序漫画APP

前景分析 受众广泛:漫画的受众群体广泛,不仅限于青少年,还涵盖了成年人等多个年龄层和社会阶层。漫画文化在全球范围内的影响力不断扩大,未来漫画软件创业可以考虑全球市场的拓展。 市场需求大:数字化阅读趋势下&…

LoRa无线空调计费系统都应用在哪里

中央空调计费系统由于布线方式需要消耗大量的人力及成本,LoRa在楼宇自控及智能家居中的应用越来越广泛,成为当前普遍应用的通信技术。 LoRa模块无线传输技术的不断完善,逐步解决了温控器通信方面布线困难、施工成本高的问题,促进…

4.STM32通信接口之SPI通信---硬件SPI的介绍

上一节,我们学会软件的SPI,本节,我们将学习STM32的SPI硬件收发电路,虽然STM32的硬件收发电路很强大,但是,很多我们都用不到,我们只需会最基本的就可以。硬件的好处就是稳定,功能模块…

Open AI 推出 ChatGPT Pro

每周跟踪AI热点新闻动向和震撼发展 想要探索生成式人工智能的前沿进展吗?订阅我们的简报,深入解析最新的技术突破、实际应用案例和未来的趋势。与全球数同行一同,从行业内部的深度分析和实用指南中受益。不要错过这个机会,成为AI领…

洛谷P1030 [NOIP2001 普及组] 求先序排列(c嘎嘎)

题目链接:P1030 [NOIP2001 普及组] 求先序排列 - 洛谷 | 计算机科学教育新生态 题目难度:普及 解题思路:这道题和之前做过的一道题很像,举一反三就行 相似题目:P1827 [USACO3.4] 美国血统 American Heritage - 洛谷 |…

创意型广告如何配音梨花声音研修院退费

张弛播音5天训练营靠谱吗,在当今竞争激烈的广告市场中,创意型广告以其独特的构思和表现形式脱颖而出。而配音作为广告的重要组成部分,对于创意型广告的成功起着至关重要的作用。 在为创意型广告配音之前,首先要深入理解广告的创意…

探索 Python 应用的分层依赖:解决 UOS 环境中的 libvirt-python 安装问题

探索 Python 应用的分层依赖:解决 UOS 环境中的 libvirt-python 安装问题 背景Python 版本升级 问题描述原因分析与解决方案 Python 应用的分层依赖:安装与部署的视角libvirt-python的分层依赖尝试的解决方案 使用编译好的 .whl 文件"嫁接"整个…

SpringBoot+ENC实现密钥加密及使用原理

?? 作者: ?? 主页: https://blog.csdn.net/zhuocailing3390 ?? 社区: Java技术栈交流 ?? 主题: SpringBootENC实现密钥加密及使用原理 创作时间: 2024年06月23日 目录 前言1、整合SpringBoot 1.1、POM…

多源多汇流网络的等价转换与证明

多源多汇流网络的等价转换与证明 引言流的性质和定义推广转换方法等价性证明伪代码与C代码实现结论引言 在经典的流网络问题中,我们通常考虑的是单源单汇(即一个源节点和一个汇节点)的网络流。然而,在实际应用中,我们经常会遇到具有多个源节点和多个汇节点的情况。本文将…

如何制作“优美”PPT

目录 1.免费PPT模板网站: 2.免费有较好质量的图片网站: 免费图片资源 免费透明PNG图片资源: 免费icon图片资源: 3.选择好的图片: 图片底色 4.要与不要 千万不要: 一定要: 6.一些建议…

R中利用ggplot2绘制气泡图

闲来无事,整理了一下自己的绘图笔记,顺便分享到CSDN上。 一、介绍 气泡图(Bubble Plot)是一种常用的数据可视化方法,用于展示三个变量之间的关系。气泡图的特点是通过气泡的大小、颜色和位置来表达数据中的多维信息。…