服务化架构 IM 系统之应用 MQ

news2025/1/22 8:08:07

在微服务化系统中,存在三个最核心的组件,分别是 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 架构来剖析这三类消息的实现原理。

最后,总结文中关键:

  1. 微服务化系统存在三大核心组件:RPC、注册中心 和 MQ;

  2. MQ 通讯模型中,其消息的可靠性及对服务耦合性的解耦都优于 RPC,但是 MQ 不能完全替代 RPC ;

  3. 对实时性有强要求,或对提供方结果非常关注时,应该使用 RPC 通讯模型;

  4. MQ 通讯模型有五大应用场景:一多应用、轻重分离、结果忽略、流量缓冲、架构保护;

  5. MQ 有三类特殊用法:顺序消息、事务消息和延时消息。

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

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

相关文章

【Rabbitmq】Rabbitmq高级特性-发送者可靠性

Rabbitmq发送者可靠性 发送者重连发送者确认1.开启确认机制2.ReturnCallback3.ConfirmCallback MQ的可靠性数据持久化交换机持久化队列持久化消息持久化 Lazy Queue 总结其他文章 Rabbitmq提供了两种发送来保证发送者的可靠性,第一种叫发送者重连,第二种…

【技术总结类】2024,一场关于海量数据治理以及合理建模的系列写作

目录 1.今年的创作路线 2.先说第一条线 2.1.由日志引出的海量文本数据存储和分析问题 2.2.监控以及监控的可视化 2.3.数据量级再往上走牵扯出了大数据 2.4.由大数据牵扯出的JAVA线程高级内容 3.第二条线,也是2025要继续的主线 1.今年的创作路线 今年的写作内…

【深度学习项目】语义分割-DeepLab网络(DeepLabV3介绍、基于Pytorch实现DeepLabV3网络)

文章目录 介绍深度学习语义分割的关键特点主要架构和技术数据集和评价指标总结 DeepLabDeepLab 的核心技术DeepLab 的发展历史DeepLab V3网络结构获取多尺度信息架构Cascade ModelASPP ModelMulti-GridPytorch官方实现的DeepLab V3该项目主要是来自pytorch官方torchvision模块中…

Python Pyside6 加Sqlite3 写一个 通用 进销存 系统 初型

图: 说明: 进销存管理系统说明文档 功能模块 1. 首页 显示关键业务数据商品总数供应商总数本月采购金额本月销售金额显示预警信息库存不足预警待付款采购单待收款销售单2. 商品管理 商品信息维护商品编码(唯一标识)商品名称规格型号单位分类进货价销售价库存数量预警…

数字电子技术基础(十五)——MOS管的简单介绍

目录 1 MOS的简单介绍 1.1 MOS简介 1.2 MOS管的基本结构 1.3 MOS管工作时的三个区域 1.4 MOSEF的结构的工作原理 1 MOS的简单介绍 1.1 MOS简介 绝缘栅型场效应管,简称MOS管,全称为金属-氧化物-半导体场效应晶体管(Metal-Oxide-Semic…

【BUUCTF】BUU XSS COURSE 11

进入题目页面如下&#xff0c;有吐槽和登录两个可注入点 根据题目可知是一道XSS 登陆界面没有注册&#xff0c;尝试简单的SQL注入也不行 回到吐槽界面&#xff0c;输入简单的xss代码 <script>alert(1)</script> 访问网址&#xff0c;发现回显不出来&#xff0c;猜…

Codeforces Round 903 (Div. 3) E. Block Sequence

题解&#xff1a; 想到从后向前DP f[i] 表示从 i ~ n 转化为“美观”所需要的最少的步骤 第一种转移方式&#xff1a;直接删除掉第i个元素&#xff0c;那么就是上一步 f[i 1] 加上 1;第二种转移方式&#xff1a;从第 i a[i] 1 个元素直接转移&#xff0c;不需要增加步数&a…

分布式系统通信解决方案:Netty 与 Protobuf 高效应用

分布式系统通信解决方案&#xff1a;Netty 与 Protobuf 高效应用 一、引言 在现代网络编程中&#xff0c;数据的编解码是系统设计的一个核心问题&#xff0c;特别是在高并发和低延迟的应用场景中&#xff0c;如何高效地序列化和传输数据对于系统的性能至关重要。随着分布式系…

【C++】模板(进阶)

本篇我们来介绍更多关于C模板的知识。模板初阶移步至&#xff1a;【C】模板&#xff08;初阶&#xff09; 1.非类型模板参数 1.1 非类型模板参数介绍 模板参数可以是类型形参&#xff0c;也可以是非类型形参。类型形参就是我们目前接触到的一些模板参数。 //类型模板参数 …

2025年入职/转行网络安全,该如何规划?网络安全职业规划

网络安全是一个日益增长的行业&#xff0c;对于打算进入或转行进入该领域的人来说&#xff0c;制定一个清晰且系统的职业规划非常重要。2025年&#xff0c;网络安全领域将继续发展并面临新的挑战&#xff0c;包括不断变化的技术、法规要求以及日益复杂的威胁环境。以下是一个关…

Golang Gin系列-4:Gin Framework入门教程

在本章中&#xff0c;我们将深入研究Gin&#xff0c;一个强大的Go语言web框架。我们将揭示制作一个简单的Gin应用程序的过程&#xff0c;揭示处理路由和请求的复杂性。此外&#xff0c;我们将探索基本中间件的实现&#xff0c;揭示精确定义路由和路由参数的技术。此外&#xff…

K8S-Pod的环境变量,重启策略,数据持久化,资源限制

1. Pod容器的三种重启策略 注意&#xff1a;k8s所谓的重启容器指的是重新创建容器 cat 07-restartPolicy.yaml apiVersion: v1 kind: Pod metadata:name: nginx-web-imagepullpolicy-always spec:nodeName: k8s233.oldboyedu.com## 当容器异常退出时&#xff0c;始终重启容器r…

常见Arthas命令与实践

Arthas 官网&#xff1a;https://arthas.aliyun.com/doc/&#xff0c;官方文档对 Arthas 的每个命令都做出了介绍和解释&#xff0c;并且还有在线教程&#xff0c;方便学习和熟悉命令。 Arthas Idea 的 IDEA 插件。 这是一款能快速生成 Arthas命令的插件&#xff0c;可快速生成…

Django学习笔记(安装和环境配置)-01

Django学习笔记(安装和环境配置)-01 一、创建python环境 1、可以通过安装Anaconda来创建一个python环境 # 创建一个虚拟python环境 conda create -n django python3.8 # 切换激活到创建的环境中 activate django2、安装django # 进入虚拟环境中安装django框架 pip install …

C# 委托和事件思维导图

思维导图 下载链接腾讯云盘 https://share.weiyun.com/fxBH9ESl

css动画水球图

由于echarts水球图动画会导致ios卡顿&#xff0c;所以纯css模拟 展示效果 组件 <template><div class"water-box"><div class"water"><div class"progress" :style"{ --newProgress: newProgress % }"><…

Python----Python高级(文件操作open,os模块对于文件操作,shutil模块 )

一、文件处理 1.1、文件操作的重要性和应用场景 1.1.1、重要性 数据持久化&#xff1a; 文件是存储数据的一种非常基本且重要的方式。通过文件&#xff0c;我们可 以将程序运行时产生的数据永久保存下来&#xff0c;以便将来使用。 跨平台兼容性&#xff1a; 文件是一种通用…

电脑如何访问手机文件?

手机和电脑已经深深融入了我们的日常生活&#xff0c;无时无刻不在为我们提供服务。除了电脑远程操控电脑外&#xff0c;我们还可以在电脑上轻松地访问Android或iPhone手机上的文件。那么&#xff0c;如何使用电脑远程访问手机上的文件呢&#xff1f; 如何使用电脑访问手机文件…

stm32 L051 adc配置及代码实例解析

一 cude的设置&#xff1a; 1. 接口的基本设置&#xff1a; 2. 参数的设置&#xff1a; 二 代码的逻辑&#xff1a; 1. 上面的直接生成代码&#xff0c;然后使用下面源码即可读到adc的数据&#xff1a; void adc_battery_start(void) {uint32_t ADC_value 0;HAL_ADC_Start(&…

Vue3初学之Element Plus Dialog对话框,Message组件,MessageBox组件

Dialog的使用&#xff1a; 控制弹窗的显示和隐藏 <template><div><el-button click"dialogVisible true">打开弹窗</el-button><el-dialogv-model"dialogVisible"title"提示"width"30%":before-close&qu…