分层架构 IM 系统之 Entry 设计实现

news2024/11/29 11:13:52

在分层架构中,Entry 向客户端提供了 TCP 长连接的接入能力,并对这些长连接的活性进行保活维护(详见 分层架构 IM 系统之架构解读),所以在 Entry 服务内部有两个最核心的数据结构:

  1. Map<uid, fd>,其 key 是描述客户端的 uid,其 value 是该客户端与服务端建立的长连接对应的描述符 fd;

  2. Map<fd, uid>,其 key 是客户端与服务端之间的长连接对应的描述符 fd,其 value 是客户端的 uid。

这两个 map 是双向的映射关系。当 Entry 需要主动向用户推送消息时,可以通过 Map<uid, fd> 映射结构,获取到 fd,然后基于 fd 推送消息; 当 Entry 收到客户端发送的消息时,可以通过 Map<fd, uid> 映射结构,获取到 uid,知道是哪一个用户发送的消息; 见下图。

Entry 所能承受的 TCP 长连接数是有上限的,当在线客户端数量超过这个上限值后,就需要对入口层 Entry 进行横向扩容,即通过 Entry 集群方式来 cover 越来越多的客户端,不同的 Entry 节点管理着不同的客户端长连接,Entry 服务是一个有状态的服务。这种情况下,当需要主动向用户推送消息时,应该如何处理呢? 使各个 Entry 节点互相通信绝不是一个好的实现方案,见下图。

不管每个 Entry 节点是保存了所有在线客户端的连接状态,还是只保存部分客户端的连接状态,这都不是关键问题,核心问题是每增加一个 Entry 节点,网络通信负载会指数级增加,最终成为瓶颈;如图所示,3个 Entry 节点需要建立 6 条连接,4个 Entry 节点时就需要建立 12 条连接。

比较优雅的解决方案是将客户端的连接状态数据单独集中化存储,见下图。由路由层 Router 集中存储所有在线客户端连接数据;Router 本质上是一个内存数据库,核心是一个很大 Map<uid, EntryIp>,其 key 是在线客户端的 uid,其 value 是该客户端连接的 Entry 节点;当客户端与 Entry 建立连接并登录后,在 Router 中进行注册;当要推送消息给用户时,先在 Router 中获取客户端连接到了哪一个 Entry 节点,然后将消息推送给该 Entry 节点。

将所有在线客户端的连接数据进行集中化存储,每一个 Entry 节点是独立的,Entry 会趋向于无状态化,这为横向扩展 Entry 集群提供了便利。

Entry 内部又是如何设计的呢?Entry 有哪些关键的内部构成组件呢?见下图。

Entry 对外与客户端直接连接,对内与业务逻辑层 Logic 直接交互。

当多个客户端同时并发访问时,通过 “IO多路复用” 机制来管理客户端连接是一个常用的解决方案,在 Linux 系统中一般基于 epoll 模型实现,在 Windows 系统中一般基于 IOCP 模型实现,在 Mac 系统中一般基于 kqueue 模型实现;所谓 “IO多路复用”,就是在一个线程中可以同时等待多个文件描述符(即连接)就绪,哪个就绪(有连接到来、有数据可读、有数据可写)了,就对哪条连接进行操作,一句话描述:在单个线程中实现对多条连接的管理。

客户端发送的请求,全部写入到 “请求队列”,然后由下游的工作线程从 “请求队列” 中获取请求进行处理。在系统设计上, “请求队列” 起到了 IO线程与工作线程交互、对高并发请求进行流量削峰、IO逻辑与业务逻辑解耦等三个关键作用。

工作线程池的业务逻辑处理非常简单,拿到客户端请求后判断,若是心跳请求,则调用 “心跳管理器” 模块来处理心跳(详见 分层架构 IM 系统之 Entry 心跳算法),若是其他请求,则全部通过 RPC 方式交由业务逻辑层 Logic 进行处理;所以 Entry 需要集成 rpc 客户端的 sdk。Logic 业务逻辑处理的结果返回到 Entry后,写入到 “发送队列”,最后仍然通过 “IO多路复用” 机制返回到客户端。

当 Logic 需要主动推送消息到客户端时,Logic 通过 RPC 调用的方式将消息发送给 Entry,此时 Entry 的角色是 RPC 服务端,所以 Entry 同时需要集成 rpc 服务端的 sdk。向客户端推送的消息到达 Entry 后,仍然写入到 “发送队列” ,复用上述流程。

另外,图中的 “在线用户管理器”,其核心就是文章开头部分所描述的两个映射关系,即 Map<uid, fd> 和 Map<fd, uid>。

综述一下 Entry 的核心组成部分:一是实现IO多路复用机制的IO线程;二是请求队列和发送队列;三是实现与 Logic 交互的工作线程,其集成了 rpc客户端和服务端sdk; 四是心跳管理器和在线用户管理器两个逻辑模块。

最后,总结文中关键:

1、Entry 的核心数据结构是两个映射关系,即 Map<uid, fd> 和 Map<fd, uid>;

2、Entry 集群部署时对客户端进行优雅管理的解决方案是集中存储客户端连接状态数据;

3、Entry 内部核心组成包括四部分:IO线程、请求队列和发送队列、工作线程、心跳管理器和在线用户管理器。

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

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

相关文章

git rebase-优雅合并与修改提交

文章目录 简介rebase用于合并使用rebase修改提交cherry-pick 简介 在Git核心概念图例与最常用内容操作(reset、diff、restore、stash、reflog、cherry-pick)中我们已经介绍了git的最常用实用的命令。 在上面说的那篇文章中&#xff0c;我们只是简单提了一下rebase。 是因为r…

Android蓝牙架构,源文件目录/编译方式学习

Android 版本 发布时间 代号&#xff08;Codename&#xff09; Android 1.0 2008年9月23日 无 Android 1.1 2009年2月9日 Petit Four Android 1.5 2009年4月27日 Cupcake Android 1.6 2009年9月15日 Donut Android 2.0 2009年10月26日 Eclair Android 2.1 2…

Qt6.8安卓Android开发环境配置

时隔多年&#xff0c;重拾QtCreator下Android开发。发现Qt6下安卓开发环境配置变简单不少&#xff01;只需三步即可在QtCreator下进行Android开发&#xff1a; 一、使用Qt Mantenance Tool进行Android模块的安装&#xff1a; 如果感觉安装网速较慢&#xff0c;可以查看本人另外…

PHP获取安卓APK文件的信息(名称、版本、图标文件等)

最近业务需要一个功能&#xff0c;后台上传apk文件&#xff0c;需要自动获取到此apk的名称、版本、图标、PackageName等信息。网上查了很多资料&#xff0c;看大家都是使用aapt工具来获取信息&#xff0c;不过不能获取图标。后来发现有大神已经封装了一套组件【php-apk-parser】…

扫雷-完整源码(C语言实现)

云边有个稻草人-CSDN博客 在学完C语言函数之后&#xff0c;我们就有能力去实现简易版扫雷游戏了&#xff08;成就感满满&#xff09;&#xff0c;下面是扫雷游戏的源码&#xff0c;快试一试效果如何吧&#xff01; 在test.c里面进行扫雷游戏的测试&#xff0c;game.h和game.c…

Docker:在 ubuntu 系统上生成和加载 Docker 镜像

本文将介绍在 ubuntu系统上进行 Docker 镜像的生成和加载方法和代码。 文章目录 一、下载和安装 docker二、加载 docker 文件三、保存你的镜像四、将镜像上传到云端并通过连接下载和加载 Docker 镜像五、Docker 容器和本地的文件交互5.1 从容器复制文件到本地宿主机5.1.1 单个文…

【排序算法】之快速排序篇

思想&#xff1a; 分而治之&#xff0c;通过选定某一个元素作为基准值&#xff0c;将序列分为两部分&#xff0c;左边的序列小于基准值&#xff0c;右边的序列大于基准值&#xff0c; 然后再分别将左序列和右序列进行递归排序&#xff0c;直至每部分有序。 性质&#xff1a;这…

Unity中的数学应用 之 角色移动中单位化向量的妙用 (小学难度)

最近准备从简单到困难跟几个教程用以加强自己的业务能力&#xff0c;相信很多小伙伴都做过胡闹厨房这一个案例&#xff0c;其实这个案例比较初级&#xff0c;但是也包含了很多平常可能注意不到小细节&#xff0c;所以我就以它为举例&#xff0c;拓展其中的数学知识 CodeMonkey教…

远程视频验证如何改变商业安全

如今&#xff0c;商业企业面临着无数的安全挑战。尽管企业的形态和规模各不相同——从餐厅、店面和办公楼到工业地产和购物中心——但诸如入室盗窃、盗窃、破坏和人身攻击等威胁让安全主管时刻保持警惕。 虽然传统的监控摄像头网络帮助组织扩大了其态势感知能力&#xff0c;但…

简释下oracle的set define的使用场景

我们在使用oracle的时候&#xff0c;有些菜单表存在url字段&#xff0c;url字段中存在这&字符。但我们通过sql语句进行插入表记录的时候&#xff0c;数据库会提示要我们输入变量值。这个时候有些人难免会不知所措&#xff0c;今天告诉大家一个非常简单的办法解决。 一、问…

在ACK集群中自动化执行Ray Job

企业在管理集群资源时面临的主要挑战是任务量庞大而资源有限。为解决这一问题&#xff0c;需要优先将资源分配给关键部门或个人&#xff0c;并保持高度的灵活性以随时调整资源分配。本文将介绍如何提高企业集群资源的利用率&#xff0c;并通过统一的任务管理平台自动化处理来自…

分布式锁的实现原理

作者&#xff1a;来自 vivo 互联网服务器团队- Xu Yaoming 介绍分布式锁的实现原理。 一、分布式锁概述 分布式锁&#xff0c;顾名思义&#xff0c;就是在分布式环境下使用的锁。众所周知&#xff0c;在并发编程中&#xff0c;我们经常需要借助并发控制工具&#xff0c;如 mu…

【北京迅为】iTOP-4412全能版使用手册-第十九章 搭建和测试TFTP服务器

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

webrtc 3A移植以及实时处理

文章目录 前言一、交叉编译1.Pulse Audio webrtc-audio-processing2.交叉编译 二、基于alsa进行实时3A处理1.demo源码2.注意项3.效果展示 总结 前言 由于工作需要&#xff0c;硬件3A中的AEC效果实在太差&#xff0c;后面使用SpeexDSP的软3A&#xff0c;效果依旧不是很好&#…

Python学习第十天--处理CSV文件和JSON数据

CSV&#xff1a;简化的电子表格&#xff0c;被保存为纯文本文件 JSON&#xff1a;是一种数据交换格式&#xff0c;易于人阅读和编写&#xff0c;同时也易于机器解析和生成&#xff0c;以JavaScript源代码的形式将信息保存在纯文本文件中 一、csv模块 CSV文件中的每行代表电…

Layui表格的分页下拉框新增“全部”选项

1、首先需要从后端接口获取表格的全部数据长度&#xff0c;这里以100为例。 2、根据请求到的数据进行表格的渲染。示例代码&#xff1a; let pageSize 5 let pageNo 1 let count 100 table.render({elem: XXX,done: function(res, curr, count){pageNo curr; // 将当前选…

CBK7运营安全

1 运营部门的角色 ​ prudent man、due care&#xff08;按要求执行&#xff09;VS due diligence&#xff08;承担管理者责任&#xff09; ​ 应尽关注&#xff1a;执行了负责任的动作降低了风险。 ​ 应尽职责&#xff1a;采取了所有必要的安全步骤以了解公司或个人的实际风…

AIGC引领金融大模型革命:未来已来

文章目录 金融大模型的应用场景1. **金融风险管理**2. **量化交易**3. **个性化投资建议**4. **金融欺诈检测和预防**5. **智能客户服务** 金融大模型开发面临的挑战应对策略《金融大模型开发基础与实践》亮点内容简介作者简介获取方式 在AIGC&#xff08;Artificial Intellige…

Linux操作系统2-进程控制3(进程替换,exec相关函数和系统调用)

上篇文章&#xff1a;Linux操作系统2-进程控制2(进程等待&#xff0c;waitpid系统调用&#xff0c;阻塞与非阻塞等待)-CSDN博客 本篇代码Gitee仓库&#xff1a;Linux操作系统-进程的程序替换学习 d0f7bb4 橘子真甜/linux学习 - Gitee.com 本篇重点&#xff1a;进程替换 目录 …

Java函数式编程+Lambda表达式

文章目录 函数式编程介绍纯函数Lambda表达式基础Lambda的引入传统方法1. 顶层类2. 内部类3. 匿名类 Lambda 函数式接口&#xff08;Functional Interface&#xff09;1. **函数式接口的定义**示例&#xff1a; 2. **函数式接口与Lambda表达式的关系**关联逻辑&#xff1a;示例&…