分层架构 IM 系统之架构演进

在电商业务日活几百万的情况下,IM 系统采用分层架构方式,如下图。

分层架构的 IM 系统,整体上包含了【终端层】、【入口层】、【业务逻辑层】、【路由层】、【数据访问层】和【存储层】,我们在上篇文章(分层架构 IM 系统之架构解读)中进行了介绍。今天讨论局部的架构调整和演进!

随着用户日活量的增多,业务规模也在逐步增大(即后端接口数量越来越大),而且业务逻辑也越来越复杂;为了引流,平台几乎每周都会做运营活动,此时 IM 系统的业务逻辑全部集中在 Logic 中实现,会愈加繁杂;此时系统表现出的最大的问题是:非核心的业务(如各类运营活动)影响核心的业务(如收发消息、联系人)。

怎样解决该问题呢?将非核心的业务和核心的业务进行拆分即可。上图 IM 系统我们称之为分层架构1.0,那么分层架构2.0见下图。

在业务逻辑层中,包含 Logic 和 Extlogic 两个服务:由 Logic 负责处理核心的、实时性较高的、轻量级的业务,比如:用户登录、点对点消息、群消息、消息已读等; 由 Extlogic 负责处理处理非核心的、实时性较低的,重量级的业务,比如:广播系统消息、离线用户召回等;然后由 Logic 通过 RPC 方式远程调用 Extlogic;Extlogic 如果要推送消息到客户端,直接将其推送到 Entry 即可。

业务逻辑层拆分成 Logic 和 Extlogic 之后,各类运营活动的代码直接在 Extlogic 完成,核心的 Logic 逻辑不会受到运营活动代码的侵入;再一个,频繁重启的是 Extlogic 进程,核心的 Logic 进程大大减少了被重启的次数,保证了核心业务的稳定性。

随着业务的不断迭代,仔细分析 Extlogic 的业务,其业务接口的执行逻辑结果如何,并不会影响到 Logic 的执行逻辑,也就是说:Logic 在执行业务逻辑的过程中,并不关注 Extlogic 的执行结果,只是将业务事件通知到 Extlogic 即可。此时,Logic 和 Extlogic 通过 RPC 这样一种高耦合的方式进行通讯就不是太合适。

再一个,自研的内存存储 Router,随着在线用户量的增多,其维护的复杂度也增大,可以通过成熟的组件进行优化。分层架构 IM 系统3.0见下图。

在 3.0 版本的 IM 系统中,引入了 MQ 消息中间件:MQ 一方面解耦了 Logic 和 Extlogic,同时解耦了 “平台业务” 对整个 IM 系统的调用;在整个电商平台中,有非常多的业务(比如订单、支付、物流、客服等)需要借助于 IM 系统,实现定制化消息的推送。

另外,引入缓存(Redis),替换 Router,大大降低了对用户在线状态中央存储维护的复杂度。

最后,总结文中关键:

1、分层架构 IM 1.0,业务逻辑层通过 Logic 实现所有的业务逻辑;

2、分层架构 IM 2.0,业务逻辑层通过 Logic 实现核心的业务逻辑,通过 Extlogic 实现非核心的业务逻辑;

3、分层架构 IM 3.0,引入 MQ,一方面解耦 Logic 和 Extlogic,一方面解耦电商平台和IM系统;引入 Redis,替换 Router,降低对中央存储维护的复杂度。

大家思考一下:

在分层架构 IM 系统中,入口层 Entry 需要处理哪些问题呢?

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

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

相关文章

基于Ruoyi的同一token跨系统访问,后端单点登录并且鉴权方案

基于Ruoyi的同一token跨系统访问,后端单点登录并且鉴权方案 需求场景以及先决条件默认方案改造思路改造代码,一共4个类需要变更完整需要修改的代码 需求场景以及先决条件 同一环境下的多个ruoyi项目,各自使用相同的一组用户(我这里用的是LDAP的登录,不影响本文),但是每个权限拥…

基于Lora通讯加STM32空气质量检测WIFI通讯-分享

目录 目录 前言 一、本设计主要实现哪些很“开门”功能? 二、电路设计原理图 1.电路图采用Altium Designer进行设计: 2.实物展示图片 三、程序源代码设计 四、获取资料内容 前言 随着环境污染问题的日益严重,空气质量的监测与管理已经…

How to paint colors to the assets cube through .urdf

1. Find your assets/cube.urdf Something looks like this <?xml version"1.0"?> <robot name"object"><link name"object"><visual><origin xyz"0 0 0"/><geometry><box size"0.05…

刚学php序列化/反序列化遇到的坑(攻防世界:Web_php_unserialize)

刚开始遇到题目的时候&#xff0c;思路还是很明确。 原题入口&#xff1a;攻防世界 (xctf.org.cn) 中的 Web_php_unserialize 两个函数 serialize() //将一个对象转换成一个字符串 unserialize() //将字符串还原成一个对象 首先看到 unserialize() 可以知道基本上能得…

5G 现网信令参数学习(3) - RrcSetup(2)

前一篇&#xff1a;5G 现网信令参数学习(3) - RrcSetup(1) 目录 1. rlf-TimersAndConstants 2. spCellConfigDedicated 2.1 initialDownlinkBWP 2.1.1 pdcch-Config 2.1.1.1 controlResourceSetToAddModList 2.1.1.2 searchSpacesToAddModList 2.1.2 pdsch-Config 2.1…

在windows上打包mediasoup arm64版本的docker镜像

mediasoup版本&#xff1a;3.14.14 mediasoup-demo版本&#xff1a;v3 windows 10 专业版 docker-desktop版本&#xff1a;4.30.0 (149282) docker info: Client:Version: 26.1.1Plugins:buildx: Docker Buildx (Docker Inc.)Version: v0.14.0-desktop.1Path: C:\Prog…

11.19机器学习_逻辑回归

十二 逻辑回归 1.概念 逻辑回归(Logistic Regression)是机器学习中的一种分类模型&#xff0c;逻辑回归是一种分类算法&#xff0c;虽然名字中带有回归&#xff0c;但是它与回归之间有一定的联系。由于算法的简单和高效&#xff0c;在实际中应用非常广泛。 逻辑回归一般用于…

【LLM训练系列01】Qlora如何加载、训练、合并大模型

示例1&#xff1a;Qlora训练Qwen2.5 参考脚本&#xff1a;https://github.com/QwenLM/Qwen/blob/main/recipes/finetune/deepspeed/finetune_qlora_multi_gpu.ipynb 训练命令如下&#xff1a; !torchrun --nproc_per_node 2 --nnodes 1 --node_rank 0 --master_addr localho…

Jmeter数据库压测之达梦数据库的配置方法

目录 1、概述 2、测试环境 3、数据库压测配置 3.1 安装jmeter 3.2 选择语言 3.3 新建测试计划 3.4 配置JDBC连接池 3.5 配置线程组 3.6 配置测试报告 3.7 执行测试 1、概述 Jmeter是Apache组织开发的基于Java的压力测试工具&#xff0c;用于对软件做压力测试。 它最…

[ 应急响应进阶篇-1 ] Windows 创建后门并进行应急处置-5:启动项后门

&#x1f36c; 博主介绍 &#x1f468;‍&#x1f393; 博主介绍&#xff1a;大家好&#xff0c;我是 _PowerShell &#xff0c;很高兴认识大家~ ✨主攻领域&#xff1a;【渗透领域】【数据通信】 【通讯安全】 【web安全】【面试分析】 &#x1f389;点赞➕评论➕收藏 养成习…

编译报错:protoc did not exit cleanly. Review output for more information.

目录标题 解决“protoc did not exit cleanly”的报错问题检查.proto文件的语法 解决“protoc did not exit cleanly”的报错问题 今天做的项目需要用到grpc&#xff0c;然后需要编写proto然后编译后实现grpc的具体方法&#xff01; 结果编译的时候报了protoc did not exit cl…

Java码农人生开启手册——重载和重写

一、重载 有时在调用现有方法时会出现参数类型不匹配的问题&#xff0c;在Java中&#xff0c;如果多个方法的名字相同&#xff0c;参数列表不同&#xff0c;则称该几种方法被重载了。 注意&#xff1a; 方法名必须相同参数列表必须不同与返回值是否相同无关编译器在编译代码时&…

ComfyUI-unclip模型部署指南

一、介绍 unCLIP 模型是 SD 模型的版本&#xff0c;经过专门调整&#xff0c;除了文本提示之外&#xff0c;还可以接收图像概念作为输入。使用这些模型附带的 CLIPVision 对图像进行编码&#xff0c;然后在采样时将其提取的概念传递给主模型。 它并不是按照传统意义将图像混合…

优雅关闭:避免服务停机带来的业务损失

服务关闭有什么问题&#xff1f; 在“单体应用”复杂到一定程度后&#xff0c;一般会进行系统拆分&#xff0c;也就是微服务架构。服务拆分之后&#xff0c;就需要协同&#xff0c;于是RPC框架就出来了&#xff0c;用来解决各个子系统之间的通信问题。 拆分系统的目的&#x…

硬件知识 cadence16.6 原理图输出为pdf 网络名下划线偏移 (ORCAD)

1. cadence原理图输出为PDF网络名下划线偏移 生这种情况的原因 1. 设计的原理图图纸大小比正常的 A4图纸大。 2. 打印为PDF 的时候&#xff0c;打印机的设置有问题。 2.cadence原理图输出为 PDF网络名下划线偏移的情况 可以看到上图&#xff0c;网络名往上漂移。 3. 解决办法 …

Linux插件zsh(oh-my-zsh)

一、oh-my-zsh基本介绍 oh-my-zsh&#xff1a; https://github.com/ohmyzsh/ohmyzshhttps://github.com/ohmyzsh/ohmyzsh 注意&#xff1a;需要先安装zsh命令&#xff0c;才能安装oh-my-zsh&#xff0c;先测试是否安装了zsh rootserver:/opt # zsh --version zsh 5.8 (x86_6…

异或和之和

//暴力做法 枚举每个子区间 O(n^3) //优化1 利用前缀异或和快速求出区间异或和 O(n^2) //优化2 处理位运算的常用方法&#xff1a;拆位法 常用的思想&#xff1a;贡献法思想 下面详见优化2&#xff1a; 1.拆位贡献法 2.实战真题1 题目链接&#xff1a;1.异或和之和 - 蓝桥…

A039-基于SpringBoot的农产品销售系统的设计与实现

&#x1f64a;作者简介&#xff1a;在校研究生&#xff0c;拥有计算机专业的研究生开发团队&#xff0c;分享技术代码帮助学生学习&#xff0c;独立完成自己的网站项目。 代码可以查看文章末尾⬇️联系方式获取&#xff0c;记得注明来意哦~&#x1f339; 赠送计算机毕业设计600…

【大数据学习 | Spark】RDD的概念与Spark任务的执行流程

1. RDD的设计背景 在实际应用中&#xff0c;存在许多迭代式计算&#xff0c;这些应用场景的共同之处是&#xff0c;不同计算阶段之间会重用中间结果&#xff0c;即一个阶段的输出结果会作为下一个阶段的输入。但是&#xff0c;目前的MapReduce框架都是把中间结果写入到HDFS中&…

jmeter操作数据库

简介 Apache JMeter 是一个强大的开源工具&#xff0c;用于负载测试和性能测量。除了Web应用外&#xff0c;JMeter还可以用于测试各种数据库系统&#xff0c;包括MySQL。本文将详细介绍如何使用JMeter来测试MySQL数据库的性能。 环境准备 安装Java&#xff1a;确保你已经安装…