服务化架构 IM 系统之应用 MQ
在微服务化系统中,存在三个最核心的组件,分别是 RPC、注册中心和MQ。
在前面的两篇文章(见《服务化架构 IM 系统之应用 RPC》和《服务化架构 IM 系统之应用注册中心》)中,我们站在应用的视角分析了普适性的 RPC 和 注册中心应该提供的服务能力。今天我们继续站在应用的角度,分析微服务第三组件: MQ。
RPC 和 MQ 是微服务化系统中服务之间两种典型的通讯模型,见下图。

MQ 通讯模型是通过消息实现服务之间的数据传输,MQ 的核心原理可以抽象为下图。

-
服务发送的消息先传输到 MQ,MQ 是保存消息的容器
-
MQ 具备持久化能力,保证了消息的可靠性
-
MQ 分别与消息的生产方和消费方通讯,从根本上对两者进行了解耦
而在 RPC 通讯模型中,数据传输的可靠性以及服务之间的耦合性则不如 MQ 通讯方式,如此来看,MQ 能否完全替代 RPC 呢?答案肯定是不行的。分别基于 RPC 通讯模型 和 MQ 通讯模型的 IM 分层架构见下图。


本质上讲,完全通过 MQ 通讯的系统是一个中心化的系统,而通过 RPC 通讯的系统则是一个去中心化的系统;MQ 完全替代 RPC 后,若 MQ 崩溃,则整个系统将陷入瘫痪,风险更大。
一般来说,当系统对实时性要求较高,或者服务消费方对服务提供方的处理结果非常关注时,我们会使用 RPC 通讯模型。而 MQ 通讯模型常见应用场景主要有以下五类。
(1)一多应用
一多应用指消息生产方是一个服务,而消息消费方是多个服务;消息生产方只管将消息发送到 MQ 即可,哪个服务对消息感兴趣,来 MQ 订阅消费即可,消息生产方无需关注。见下图。

在电商平台中,IM 系统中产生的每一条聊天消息,都会发送到 MQ;订单服务、交易服务和广告服务分别从 MQ 中获取消息,来进行服务内部的逻辑处理。
(2)轻重分离
轻重分离指将轻量级的业务与重量级的业务通过 MQ 分离开来,将核心的业务与非核心的业务通过 MQ 分离开来。见下图。

在分层架构的 IM 系统中,由 logic 处理实时性较强的轻量级的核心业务(如消息收发),而由 extlogic 处理实时性较弱的重量级的非业务业务(如离线用户召回);logic 与 extlogic 之间通过 MQ 通讯,实现轻重业务的分离。这一块应用场景在之前的文章中有过详细分析,见《分层架构 IM 系统之架构演进》。
(3)结果忽略
结果忽略指消息生产方不关注消息消费方的处理结果,也就是消息消费方对消息的处理结果不会影响消息生产方的处理流程;这个也是 MQ 最常用的业务场景。反之,如果消息生产方对消费消费方的处理结果很关注的话,就应该用 RPC 了。见下图。

用户A 向用户B 发消息,用户B处于离线状态,此时 logic 会向 MQ 发消息;pusher 服务从 MQ 获取消息后,向用户B 推送一条手机的 push ,以此提醒用户B,有用户A 向你发送了 IM 消息;pusher 服务是否能成功将手机的 push 消息推送给用户B,logic 并不关注,也不会影响 logic 的处理流程。
(4)流量缓冲
流量缓冲指消息消费速度低于消息的生产速度,而没有及时消费的消息暂时缓冲在 MQ 中,给下游服务一些时间来逐步对消息进行消费。见下图。

当 logic 产生需要广播的消息时,发送给 MQ;extlogic 从 MQ 获取消息后,广播发送给相关用户。消息广播是一个相对耗时的动作,没有及时处理的广播消息,暂时留在 MQ 中,由 extlogic 沉住气,逐步消费处理即可。
(5)架构保护
在服务化的分层架构中,我们经常建立这样的约束机制:上层服务调用下层的服务,下层的服务不能调用上层的服务,同层服务之间也禁止相互调用。这样的架构约束是为了尽量减少服务维护时的影响范围,防止调用扩散产生服务之间的强耦合。
在业务规模逐步扩大,服务数量不断增加时,同时因为业务快速迭代的需要,在架构落地时,这样的约束很容易被打破,此时可以通过引入 MQ 来包含上述的约束机制。见下图。

上层服务通过 RPC 调用下层服务,在现实情况中,下层服务 “不得不” 调用上层服务时,通过 MQ 通讯机制进行调用,以此保护整个架构。
MQ 在系统中应用广泛,除了上述五类应用场景外,还有三类特殊用法,分别是:顺序消息、事务消息和延时消息。
顺序消息应用在业务消息按既定顺序执行的流程中;事务消息应用在消息生产方和消息消费方两个独立进程的业务在同一个事务中运行;延时消息应用在消息消费方按既定时间进行消费的场景中。
三类消息的特殊应用,分别保证了业务的流程顺序、时间顺序和同时执行的事务性;在后面的文章中,我们结合着 MQ 架构来剖析这三类消息的实现原理。
最后,总结文中关键:
-
微服务化系统存在三大核心组件:RPC、注册中心 和 MQ;
-
MQ 通讯模型中,其消息的可靠性及对服务耦合性的解耦都优于 RPC,但是 MQ 不能完全替代 RPC ;
-
对实时性有强要求,或对提供方结果非常关注时,应该使用 RPC 通讯模型;
-
MQ 通讯模型有五大应用场景:一多应用、轻重分离、结果忽略、流量缓冲、架构保护;
-
MQ 有三类特殊用法:顺序消息、事务消息和延时消息。
相关文章:
服务化架构 IM 系统之应用 MQ
在微服务化系统中,存在三个最核心的组件,分别是 RPC、注册中心和MQ。 在前面的两篇文章(见《服务化架构 IM 系统之应用 RPC》和《服务化架构 IM 系统之应用注册中心》)中,我们站在应用的视角分析了普适性的 RPC 和 注…...
ELF2开发板(飞凌嵌入式)基本使用的搭建
ELF2开发板(飞凌嵌入式) 开箱包裹内容 打开包装,你可以看到以下物品 一个绿联的usb3.0读卡器、sandisk的32g内存卡(太好了)rk3588 4g32g emmc版本ELF2开发板输出为12v 3A的电源适配器(和ipad的充电器外观好像) 图1 外…...
Appium(四)
一、app页面元素定位 1、通过id定位元素: resrouce-id2、通过ClassName定位:classname3、通过AccessibilityId定位:content-desc4、通过AndroidUiAutomator定位5、通过xpath定位xpath、id、class、accessibility id、android uiautomatorUI AutomatorUI自…...
简单的sql注入 buuctf
lovesql 这道题是一个非常简单的sql注入 也就是万能密码 我们只需要注意在输入用户名的地方使用 ’ 将语句提前终止 并且or一个为真的条件 这样整个语句的结果就为真 这就是万能密码的原理 这样我们就得到了密码 然后我们发现这只是密码 于是查看一下字段数 尝试下注入 这里我…...
Ubuntu 24.04 LTS 空闲硬盘挂载到 文件管理器的 other locations
Ubuntu 24.04 LTS 确认硬盘是否被识别 使用 lsblk 查看信息,其中sda这个盘是我找不到的,途中是挂在好的。 分区和格式化硬盘 如果新硬盘没有分区,你需要先分区并格式化它。假设新硬盘为 /dev/sdb,使用 fdisk 或 parted 对硬盘…...
<电子幽灵>开发笔记:BAT基础笔记(一)
BAT脚本基础笔记(一) 介绍 费曼学习法最重要的部分,即把知识教给一个完全不懂的孩子——或者小白。 为了更好的自我学习,也为了让第一次接触某个知识范畴的同学快速入门,我会把我的学习笔记整理成电子幽灵系列。 提示:作为低代码…...
PiliPalaX ( 第三方安卓哔哩哔哩)
PiliPalaX 是一款哔哩哔哩第三方客户端。使用 Flutter 开发,基于PiliPala原版基础上创作出来的X升级版,目前支持Android、IOS客户端。 应用特色 目前着重移动端(Android、iOS)和Pad端,暂时没有适配桌面端、手表端等 https://pan.quark.cn/s/…...
在亚马逊云科技上高效蒸馏低成本、高精度的Llama 3.1 405B模型(上篇)
在2024年的亚马逊云科技re:Invent全球云计算春晚里,亚马逊云科技CEO - Matt Garman介绍了亚马逊云科技的AI模型托管平台Amazon Bedrock上的模型蒸馏服务Model Distillation,令小李哥印象十分深刻。该功能可自动化地为特定场景的知识创建一个蒸馏模型。它…...
Amazon MSK 开启 Public 访问 SASL 配置的方法
1. 开启 MSK Public 1.1 配置 MSK 参数 进入 MSK 控制台页面,点击左侧菜单 Cluster configuration。选择已有配置,或者创建新配置。在配置中添加参数 allow.everyone.if.no.acl.foundfalse修改集群配置,选择到新添加的配置。 1.2 开启 Pu…...
LeetCode_438.找到字符串中所有字母异位词
给定两个字符串 s 和 p,找到 s 中所有 p 的 异位词 的子串,返回这些子串的起始索引。不考虑答案输出的顺序。 示例 1: 输入: s "cbaebabacd", p "abc" 输出: [0,6] 解释: 起始索引等于 0 的子串是 "cba", 它是 "a…...
一文读懂服务器的HBA卡
什么是 HBA 卡 HBA 卡,全称主机总线适配器(Host Bus Adapter) ,是服务器与存储装置间的关键纽带,承担着输入 / 输出(I/O)处理及物理连接的重任。作为一种电路板或集成电路适配器,HBA…...
Debezium日常分享系列之:对于从Oracle数据库进行快照的性能优化
Debezium日常分享系列之:对于从Oracle数据库进行快照的性能优化 源数据库Kafka Connect监控测试结果 源数据库 Oracle 19c,本地,CDB数据库主机的I/O带宽为6 GB/s,由此主机上运行的所有数据库共享临时表空间由42个文件组成&#x…...
深度学习 Pytorch 基本优化思想与最小二乘法
在正式开始进行神经网络建模之前,我们还需要掌握pytorch中最核心的基础数学工具——autograd(自动微分)模块。虽然对于任何一个通用的深度学习框架都会提供许多自动优化的算法和现成的loss function,但如果想更深入理解神经网络,对深度学习的…...
C# 实现系统信息监控与获取全解析
在 C# 开发的众多应用场景中,获取系统信息以及监控用户操作有着广泛的用途。比如在系统性能优化工具中,需要实时读取 CPU、GPU 资源信息;在一些特殊的输入记录程序里,可能会涉及到键盘监控;而在图形界面开发中…...
Transformer详解:Attention机制原理
前言 Hello,大家好,我是GISer Liu😁,一名热爱AI技术的GIS开发者,本系列文章是作者参加DataWhale2025年1月份学习赛,旨在讲解Transformer模型的理论和实践。😲 本文将详细探讨Attention机制的原理…...
网络安全技术深度解析与实践案例
网络安全技术深度解析与实践案例 随着信息技术的飞速发展,网络已成为现代社会不可或缺的一部分。然而,网络空间的开放性也带来了各种安全隐患。为了保障网络和数据的安全,网络安全技术显得尤为重要。本文将深入探讨网络安全技术的核心要素,并通过Python代码示例展示其具体…...
JavaScript中提高效率的技巧一
1.生成随机颜色的两种方式 1).生成RandomHexColor const generateRandomHexColor () > {return #${Math.floor(Math.random() * 0xffffff).toString(16).padStart(6, 0)} } generateRandomHexColor() // #a8277c generateRandomHexColor() // #09c20c generat…...
美食推荐系统 协同过滤余弦函数推荐美食 Springboot Vue Element-UI前后端分离
个性化美食推荐系统 协同过滤余弦函数推荐美食 Echart数据统计 Springboot Vue Element-UI前后端分离 【亮点功能】 1.SpringbootVueElement-UIMysql前后端分离 2.Echarts图表统计数据, 直观展示数据情况 3.发表评论后,用户可以回复评论, 回复的评论可以被再次回复,…...
ThinkPHP 8的一对多关联
【图书介绍】《ThinkPHP 8高效构建Web应用》-CSDN博客 《2025新书 ThinkPHP 8高效构建Web应用 编程与应用开发丛书 夏磊 清华大学出版社教材书籍 9787302678236 ThinkPHP 8高效构建Web应用》【摘要 书评 试读】- 京东图书 使用VS Code开发ThinkPHP项目-CSDN博客 编程与应用开…...
Django简介与虚拟环境安装Django
目录 1.Django简介 1.1 Django 的核心特点 1.2 Django 的核心组件 1.3 Django 的应用场景 1.4 总结 2.基础环境建立 2.1 创建虚拟环境 2.1.1 使用 virtualenv 创建虚拟环境 2.1.2 使用 venv 创建虚拟环境 2.2 激活虚拟环境 2.2.1 在 Windows 上 2.2.2 在 macOS 或 …...
5步彻底解决显卡驱动问题:Display Driver Uninstaller完全指南
5步彻底解决显卡驱动问题:Display Driver Uninstaller完全指南 【免费下载链接】display-drivers-uninstaller Display Driver Uninstaller (DDU) a driver removal utility / cleaner utility 项目地址: https://gitcode.com/gh_mirrors/di/display-drivers-unin…...
5分钟快速上手:智慧树自动刷课插件的终极解决方案
5分钟快速上手:智慧树自动刷课插件的终极解决方案 【免费下载链接】zhihuishu 智慧树刷课插件,自动播放下一集、1.5倍速度、无声 项目地址: https://gitcode.com/gh_mirrors/zh/zhihuishu 还在为智慧树平台繁琐的网课学习而烦恼吗?智慧…...
百川2-13B对话模型一键部署:Python环境配置与快速启动指南
百川2-13B对话模型一键部署:Python环境配置与快速启动指南 想试试最新的开源大模型,却被复杂的Python环境、CUDA版本、依赖冲突搞得头大?这几乎是每个AI开发者入门时都会遇到的“劝退”第一关。今天,我们就来彻底解决这个问题。我…...
AgentCPM在网络安全领域的应用:自动生成漏洞分析与修复建议报告
AgentCPM在网络安全领域的应用:自动生成漏洞分析与修复建议报告 最近和几个做安全的朋友聊天,他们都在抱怨同一个问题:每天面对安全扫描工具吐出来的一大堆漏洞报告,看得头都大了。这些报告往往就是一堆原始数据,比如…...
具身智能2026:从Demo秀场到工业量产落地的关键拐点
具身智能的发展现状具身智能(Embodied AI)通过将AI模型与物理实体结合,实现感知、决策与行动的闭环。2023-2024年,该领域主要集中在实验室Demo和特定场景的小规模验证,例如机器人抓取、自动驾驶测试等。技术瓶颈包括环…...
芯片研发也能用 Minimum Viable Product?
MVP,全称 Minimum Viable Product(最小可行性产品),最早是互联网产品圈的说法——先做最小可用版本,跑通核心逻辑,验证方向对不对,再慢慢迭代。 但是芯片不是 App,改一次要流片&…...
7种Prompt优化技巧实现大模型输出精度提升
在大模型应用落地的过程中,很多使用者会遇到输出质量不稳定的问题:明明输入了需求,却得到偏离主题、逻辑混乱或不符合格式的结果。这背后的核心原因往往不是模型能力不足,而是提示词(Prompt)的设计没有精准…...
基于74LS164与555定时器的四花样彩灯控制器设计与仿真
1. 四花样彩灯控制器设计概述 第一次接触彩灯控制器设计时,我被那些闪烁变换的灯光效果深深吸引。这种看似简单的电子装置,实际上蕴含着数字电路的精华。今天要介绍的这个基于74LS164与555定时器的四花样彩灯控制器,正是数字电路入门的绝佳实…...
Linux I/O 演进史:从管道到零拷贝,一篇串起个服务端核心原语右
前言 在使用 kubectl get $KIND -o yaml 查看 k8s 资源时,输出结果中包含大量由集群自动生成的元数据(如 managedFields、resourceVersion、uid 等)。这些信息在实际复用 yaml 清单时需要手动清理,增加了额外的工作量。 使用 kube…...
MAX31865 RTD测温驱动库:工业级高精度SPI温度采集实现
1. PWFusion_Max31865 库概述:面向工业级 RTD 测温的高精度 SPI 驱动实现PWFusion_Max31865 是一个专为 Maxim Integrated MAX31865 集成电路设计的嵌入式驱动库,核心目标是为 Arduino 兼容平台(包括基于 STM32、ESP32、nRF52 等 MCU 的开发板…...
