当前位置: 首页 > news >正文

服务化架构 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 架构来剖析这三类消息的实现原理。

最后,总结文中关键:

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

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

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

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

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

相关文章:

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

在微服务化系统中,存在三个最核心的组件,分别是 RPC、注册中心和MQ。 在前面的两篇文章(见《服务化架构 IM 系统之应用 RPC》和《服务化架构 IM 系统之应用注册中心》)中,我们站在应用的视角分析了普适性的 RPC 和 注…...

IoTDB 常见问题 QA 第四期

关于 IoTDB 的 Q & A IoTDB Q&A 第四期来啦!我们将定期汇总我们将定期汇总社区讨论频繁的问题,并展开进行详细回答,通过积累常见问题“小百科”,方便大家使用 IoTDB。 Q1:Java 中如何使用 SSL 连接 IoTDB 问题…...

Objective-C语言的数据类型

Objective-C数据类型详解 Objective-C是一种面向对象的编程语言,主要用于macOS和iOS应用程序的开发。作为C语言的超集,Objective-C继承了C语言的基本数据类型,同时也引入了一些独特的特性。本文将对Objective-C的各种数据类型进行详细的介绍…...

3d系统误差分析

系统标定重投影误差预估 在计算机视觉和三维重建领域中,评估一个相机系统标定精度的重要指标。通过比较真实的三维点在图像中的投影位置与标定模型计算出的投影位置之间的差异,来衡量标定的准确性。 以下是对这一概念的详细解析: 什么是系统…...

单片机的原理及其应用:从入门到进阶的全方位指南

以下是一篇详细、深入的“单片机的原理及其应用”博客文章示例,适合想要系统学习或深入了解单片机的读者。文中不仅会介绍单片机的基本原理、内部构造、开发流程和应用领域,还会融入更多的理论分析、实操案例以及常见问题与解决思路等,帮助读…...

在.NET用C#将Word文档转换为HTML格式

将Word文档转换为HTML格式尤其具有显著的优势,它不仅能够确保文档内容在多种设备和平台上保持一致灵活的显示,还便于通过网络进行传播和集成到各种Web应用中。随着越来越多的企业和开发者寻求更灵活、更具兼容性的文件处理方式,.NET框架下的C…...

智能学习平台系统设计与实现(代码+数据库+LW)

摘 要 传统办法管理信息首先需要花费的时间比较多,其次数据出错率比较高,而且对错误的数据进行更改也比较困难,最后,检索数据费事费力。因此,在计算机上安装智能学习平台系统软件来发挥其高效地信息处理的作用&#…...

ASP .NET Core 学习(.NET9)配置接口访问路由

新创建的 ASP .NET Core Web API项目中Controller进行请求时,是在地址:端口/Controller名称进行访问的,这个时候Controller的默认路由配置如下 访问接口时,是通过请求方法(GET、Post、Put、Delete)进行接口区分的&…...

探索与创作:2024年CSDN平台上的成长与突破

文章目录 我与CSDN的初次邂逅初学阶段的阅读CSDN:编程新手的避风港初学者的福音:细致入微的知识讲解考试复习神器:技术总结的“救命指南”曾经的自己:为何迟迟不迈出写博客的第一步兴趣萌芽:从“读”到“想写”的初体验…...

[Qualcomm]Qualcomm MDM9607 SDK代码下载操作说明

登录Qualcomm CreatePoing Qualcomm CreatePointhttps://createpoint.qti.qua...

【python_钉钉群发图片】

需求: **在钉钉群发图片,需要以图片的形式展示,如图所示:**但是目前影刀里面没有符合条件的指令 解决方法: 1、在钉钉开发者后台新建一个自建应用,发版,然后获取里面的appkey和appsecret&am…...

数据可视化:让数据讲故事的艺术

目录 1 前言2 数据可视化的基本概念2.1 可视化的核心目标2.2 传统可视化手段 3 数据可视化在知识图谱中的应用3.1 知识图谱的可视化需求3.2 知识图谱的可视化方法 4 数据可视化叙事:让数据讲故事4.1 叙事可视化的关键要素4.2 数据可视化叙事的实现方法 5 数据可视化…...

ElasticSearch下

DSL查询 叶子查询:在特定字段里查询特定值,属于简单查询,很少单独使用复合查询:以逻辑方式组合多个叶子查询或更改叶子查询的行为方式 在查询后还可以对查询结果做处理: 排序:按照1个或多个字段做排序分页…...

T-SQL语言的数据库交互

T-SQL语言的数据库交互 引言 随着信息技术的不断发展,数据库在各个行业中扮演着越来越重要的角色。数据库的有效管理和优化对于企业的数据安全、效率提升和决策支持至关重要。T-SQL(Transact-SQL)作为微软SQL Server的重要扩展语言&#xf…...

.Net 6.0 .Net7.0 .Net8.0 .Net9.0 使用 Serilog 按日志等级写入日志及 appsetting.json 配置方式实现

前言 最近使用最新版的Serilog记录日志时,发现以前有些关于Serilog的Nuget弃用了,最关键的是有些配置写法也改变,于是就整理了一下最新版的Serilog配置方式(appsetting.json)的使用 说明:我是用的.Net6,最新长期支持…...

[Qt]事件-鼠标事件、键盘事件、定时器事件、窗口改变事件、事件分发器与事件过滤器

目录 前言:Qt与操作系统的关系 一、Qt事件 1.事件介绍 2.事件的表现形式 常见的Qt事件: 常见的事件描述: 3.事件的处理方式 处理鼠标进入和离开事件案例 控件添加到对象树底层原理 二、鼠标事件 1.鼠标按下和释放事件(单击&#x…...

从零开始:Gitee 仓库创建与 Git 配置指南

引言 Git 是一款广泛使用的版本控制工具,它能够帮助开发者在开发过程中高效地管理代码的版本。而 Gitee(码云)是国内知名的 Git 托管平台,它提供了强大的代码托管、团队协作和项目管理功能。如果你是 Git 和 Gitee 的新手&#x…...

大文件上传的解决办法~文件切片、秒传、限制文件并发请求。。。

1、项目背景:针对大文件上传,如果将文件作为一个请求去发送给后端,会有以下几种问题,首先是上传时间长,用户不能进行其他操作,包括页面刷新等操作,其次有的接口会设置响应时间限制,可…...

如何在日常工作中使用AI

### 如何在日常工作中使用AI:提高效率与创造力 随着人工智能(AI)技术的不断发展,它已经成为我们日常工作的重要助手。无论是在准备演示文稿、进行知识搜索还是寻求技术支持方面,AI都能够提供有力的支持。本文将探讨如何…...

计算机网络 (47)应用进程跨越网络的通信

前言 计算机网络应用进程跨越网络的通信是一个复杂而关键的过程,它涉及多个层面和组件的协同工作。 一、通信概述 计算机网络中的通信,本质上是不同主机中的应用进程之间的数据交换。为了实现这种通信,需要借助网络协议栈中的各层协议&#x…...

医疗集群系统中基于超融合数据库架构的应用与前景探析

一、引言 1.1 研究背景与意义 随着医疗信息化的飞速发展,医疗数据呈爆炸式增长。从日常诊疗记录、患者病历,到各类医疗影像、检查检验数据等,海量信息不断涌现。据统计,医疗数据的年增长率高达 30% 以上 ,2025 年,全球医疗数据量将达到 2314 艾字节(EB)。如此庞大的数…...

2024年度推进可解释人工智能迈向类人智能讨论总结分享

目录 一、探索“可解释人工智能”:AI如何从“黑箱”走向“透明大师” 二、走进可解释人工智能:让AI的决策变得透明 (一)几种常见的特征导向方法 (二)像素级方法 1. 层次相关传播(LRP&#…...

【Unity】使用Canvas Group改变UI的透明度

目录 一、前言二、Canvas Group三、结合DOTween达到画面淡进的效果 一、前言 在平时开发中,可以通过控制材质、Color改变UI透明度,除此之外还可以CanvasGroup组件来控制透明度。 二、Canvas Group 官方文档链接👉👉 点击进入 …...

【北京迅为】iTOP-4412全能版使用手册-第八十七章 安装Android Studio

iTOP-4412全能版采用四核Cortex-A9,主频为1.4GHz-1.6GHz,配备S5M8767 电源管理,集成USB HUB,选用高品质板对板连接器稳定可靠,大厂生产,做工精良。接口一应俱全,开发更简单,搭载全网通4G、支持WIFI、蓝牙、…...

小例Java结合Spring框架和MyBatis ORM来实现 ERP项目中实现读写分离

前记:大家带着挑剔的眼光,多多批判和指正!🙏 在ERP项目中实现读写分离,我们可以使用Java结合Spring框架和MyBatis ORM来实现。以下是一个简化的例子,展示了如何在ERP项目中配置和使用读写分离。 一、项目…...

.gitignore配置忽略out目录

文章目录 说明操作 说明 可以结合IDEA可视化操作git,只要不删除远程仓库,如果本地操作项目出现错误,可以直接修改远程仓库的.gitignore文件,并重新拉取项目到本地。 操作 在项目根目录下找到 .gitignore 文件,打开并…...

mac 安装mongodb

本文分享2种mac本地安装mongodb的方法,一种是通过homebrew安装,一种是通过tar包安装 homebrew安装 brew tap mongodb/brew brew upate brew install mongodb-community8.0tar包安装 安装mongodb 1.下载mongodb社区版的tar包 mongdb tar包下载地址 2…...

向harbor中上传镜像(向harbor上传image)

向 Harbor 中上传镜像通常分为以下几个步骤: 1、登录 Harbor 2、构建镜像 3、标记镜像 4、推送镜像到 Harbor 仓库 1、登录 Harbor 首先,确保你已经能够访问 Harbor,并且已经注册了账户。如果还没有 Harbor 账户,你需要先注册一…...

项目太大导致 git clone 失败

git克隆也分深浅,大项目clone可以先用浅克隆,只克隆源代码和最新的提交记录。 具体分两步: 1. 浅克隆 git clone https://github.com/google/mydemo.git --depth 1 只会克隆最新的一次提交,没有历史记录, 2. 拉取剩…...

开发神器之cursor

文章目录 cursor简介主要特点 下载cursor页面的简单介绍切换大模型指定ai学习的文件指定特定的代码喂给ai创建项目框架文件 cursor简介 Cursor 是一款专为开发者设计的智能代码编辑器,集成了先进的 AI 技术,旨在提升编程效率。以下是其主要特点和功能&a…...

Python爬虫学习前传 —— Python从安装到学会一站式服务

早上好啊,大佬们。我们的python基础内容的这一篇终于写好了,啪唧啪唧啪唧…… 说实话,这一篇确实写了很久,一方面是在忙其他几个专栏的内容,再加上生活学业上的事儿,确实精力有限,另一方面&…...

MySQL触发器:概念、作用

MySQL触发器:概念、作用与问题解决 在MySQL数据库管理系统中,触发器是一项强大且实用的功能。它为数据库的操作提供了一种自动化响应机制,在许多场景下极大地提升了数据管理的效率和数据的完整性。本文将深入探讨MySQL触发器是什么&#xff…...

ASP.NET Core 中基于 Cookie 的身份鉴权实现

在 ASP.NET Core 应用中,基于 Cookie 的身份鉴权是一种常见的身份验证方式,特别适用于传统的 Web 应用程序。Cookie 能够在用户的浏览器中存储身份验证数据,从而在用户访问应用的不同页面时保持登录状态。 一、配置 Cookie 身份验证 首先&a…...

从玩具到工业控制--51单片机的跨界传奇【3】

在科技的浩瀚宇宙中,51 单片机就像一颗独特的星辰,散发着神秘而迷人的光芒。对于无数电子爱好者而言,点亮 51 单片机上的第一颗 LED 灯,不仅仅是一次简单的操作,更像是开启了一扇通往新世界的大门。这小小的 LED 灯&am…...

Java算法 二叉树入门 力扣简单题相同的树 翻转二叉树 判断对称二叉树 递归求二叉树的层数

目录 模版 先序遍历 中序遍历 后序遍历 力扣原题 相同的二叉树 力扣原题 翻转二叉树 遍历树的层数 题目 静态变量 核心逻辑 模版 // 二叉树public static class Node{public int value;public Node left;public Node right;public Node(int v) {valuev;}} 先序遍历 …...

麒麟操作系统服务架构保姆级教程(十二)keepalived高可用

如果你想拥有你从未拥有过的东西,那么你必须去做你从未做过的事情 随着业务的扩大,服务器集群也越来越大,用户多了起来就要保证用户访问,服务绝对不能宕机,那么这个时候咱们除了做灾备以外,负载均衡服务器会…...

docker 部署confluence

1.安装docker的过程就不说了。 2.下载镜像。 docker pull cptactionhank/atlassian-confluence:7.4.0 docker images 3.下载pojie 包。 https://download.csdn.net/download/liudongyang123/90285042https://download.csdn.net/download/liudongyang123/90285042 4.编写do…...

【English-Book】Go in Action目录页翻译中文

第8页 内容 前言 xi 序言 xiii 致谢 xiv 关于本书 xvi 关于封面插图 xix 1 介绍 Go 1 1.1 用 Go 解决现代编程挑战 2 开发速度 3 • 并发 3 • Go 的类型系统 5 内存管理 7 1.2 你好,Go 7 介绍 Go 玩具 8 1.3 总结 8 2 Go 快速入门 9 2.1 程序架构 10 2.2 主包 …...

奉加微PHY6230兼容性:部分手机不兼容

从事嵌入式单片机的工作算是符合我个人兴趣爱好的,当面对一个新的芯片我即想把芯片尽快搞懂完成项目赚钱,也想着能够把自己遇到的坑和注意事项记录下来,即方便自己后面查阅也可以分享给大家,这是一种冲动,但是这个或许并不是原厂希望的,尽管这样有可能会牺牲一些时间也有哪天原…...

SSE 实践:用 Vue 和 Spring Boot 实现实时数据传输

前言 大家好,我是雪荷。最近我在灵犀 BI 项目中引入了 SSE 技术,以保证图表的实时渲染,当图表渲染完毕服务端推送消息至浏览器端触发重新渲染。 什么是 SSE? SSE 全称为 Server-Send Events 意思是服务端推送事件。 SSE 相比于 …...

HJ3 明明的随机数(Java版)

一、试题地址 明明的随机数_牛客题霸_牛客网 二、试题内容 描述 对于明明生成的 nn 个 11 到 500500 之间的随机整数,你需要帮助他完成以下任务: 删去重复的数字,即相同的数字只保留一个,把其余相同的数去掉;然后…...

C++ 模拟真人鼠标轨迹算法 - 防止游戏检测

一.简介 鼠标轨迹算法是一种模拟人类鼠标操作的程序,它能够模拟出自然而真实的鼠标移动路径。 鼠标轨迹算法的底层实现采用C/C语言,原因在于C/C提供了高性能的执行能力和直接访问操作系统底层资源的能力。 鼠标轨迹算法具有以下优势: 模拟…...

Linux-----线程同步(条件变量)

目录 相关API restrict关键字 线程间条件切换函数 条件变量pthread_cond_t 案例 在前面的锁的基础上进一步提高线程同步效率,也就是两个线程只用锁去执行的话依然会存在资源竞争的情况,也就是抢锁,这里就需要在锁的这边加上限制&#xf…...

58,【8】BUUCTF [PwnThyBytes 2019]Baby_SQL1

进入靶场 和2次注入的页面很像 不过养成查看源代码的好习惯 先访问source.zip 下载后解压,发现两个文件 第一个文件夹打开又有4个PHP文件 那还是先看index.php文件好了 有PHP和HTML两部分,下面是PHP部分代码(HTML太长了,先放一…...

小汽车维修记录程序(PC版)

我需要一个小程序,记录我的小车保养相关的情况:时间,地点,某种零件,以什么价格被保养使用。这样我才能清楚的知道我的小车下一次保养,然后我可以有的放矢的去准备下一次的零件和时间,避免过度保…...

回顾2024年在CSDN的成长

文章目录 我与CSDN的初次邂逅初学阶段的阅读CSDN:编程新手的避风港初学者的福音:细致入微的知识讲解考试复习神器:技术总结的“救命指南”曾经的自己:为何迟迟不迈出写博客的第一步兴趣萌芽:从“读”到“想写”的初体验…...

AI编程工具使用技巧——通义灵码

活动介绍通义灵码1. 理解通义灵码的基本概念示例代码生成 2. 使用明确的描述示例代码生成 3. 巧妙使用注释示例代码生成 4. 注意迭代与反馈原始代码反馈后生成优化代码 5. 结合生成的代码进行调试示例测试代码 其他功能定期优化生成的代码合作与分享结合其他工具 总结 活动介绍…...

解读InnoDB数据库索引页与数据行的紧密关联

目录 一、快速走进索引页结构 (一)整体展示说明 (二)内容说明 File Header(文件头部) Page Header(页面头部) Infimum Supremum(最小记录和最大记录) …...

KubeSphere 与 Pig 微服务平台的整合与优化:全流程容器化部署实践

一、前言 近年来,为了满足越来越复杂的业务需求,我们从传统单体架构系统升级为微服务架构,就是把一个大型应用程序分割成可以独立部署的小型服务,每个服务之间都是松耦合的,通过 RPC 或者是 Rest 协议来进行通信,可以按照业务领域来划分成独立的单元。但是微服务系统相对…...

虚幻基础2:gameplay框架

能帮到你的话,就给个赞吧 😘 文章目录 ue框架:gameplay组成game modeactorcomponent player controllergame state 工作流程 ue框架:gameplay 组成 game mode 游戏类型和规则。可以控制游戏的开始与结束以及一些其他功能。 ac…...