llfc项目分布式服务笔记
一、系统整体架构流程图(简明版)
复制代码
+---------------+ +------------------+ +----------------+
| 客户端 (Client) |--------->| GateServer |----------| StatusServer |<--+
+---------------+ +------------------+ +----------------+ || | |连接状态、用户登录、客户端请求 | 管理所有chatserver的连接数| |+----------------+ | || chatserver1 |-----| |+----------------+ | || 连接用户数管理 |<-------------------------------------+| grpc端点处理 |+------------------+| | TCP服务监听 | | grpc通信 (端对端聊天、好友请求...)| | +--------+ +---------+| chatserver2 | | chatserverN |(未来可扩展多台)+--------------+ +--------------+
- 客户端(用户手机/网页)发起请求(登录、聊天消息等)
- GateServer:作为“门面”,收发客户端请求。它负责:
- 用户登录转发到特定的chatserver
- 获取聊天内容
- 获取负载最小的chatserver进行分配(通过StatusServer)
- StatusServer:监控所有chatserver的连接数,做负载均衡决策
- 多个ChatServer:实际处理用户的聊天逻辑
- Grpc端点通信:ChatServer之间通过grpc实现端对端通信
- 连接池(ChatConPool):优化grpc连接管理,避免频繁建立连接
二、详细逐步讲解(用比喻辅助)
1. 系统的基本目标
- 分布式部署:多个ChatServer共享压力
- 负载平衡:避免某台ChatServer超载
- 端对端通信:确保不同ChatServer可以直接互传消息
- 状态监控:动态获取每台Server的连接数,确保由负载最小的Server处理用户请求
2. 核心技术点及其作用
a. 多个ChatServer
- 就像超市里有多收银台,用户随机排队,但我们想让“服务快”的收银台快点帮用户结账。
- 每个ChatServer都有自己的连接数(“排队人数”)
b. GateServer(门面)
- 就像路口柜台,负责迎接客户(用户)
- 核心职责:
- 让用户登录后,告知它们“去哪台聊天服务器”
- 通过调用StatusServer查找连接最少的ChatServer
- 转发后续聊天请求到对应的ChatServer
c. StatusServer(负载调度)
- 管理所有ChatServer的连接数(“排队人数”)
- 动态统计,做负载最小的Server的选择
- 作用类似:超市每个收银台可以实时看到等待人数,然后引导客户去排队少的柜台
d. grpc通信
- grpc:一种高效的远程通信协议,像快递包裹一样,快速、可靠地传递信息
- 通过grpc,ChatServer之间端对端可以直接调用,相当于两个超市的收银员可以直接交换信息,不需要经过中转站
e. 连接池(ChatConPool)
- 连接grpc的“桥梁”,如超市里备用的快速通道
- 避免每次通信都重新建连接,节省资源,提高效率
3. 工作流程(用户请求全流程)
假设用户要登录,系统是如何实现的?
- 用户发起登录请求(输入账号密码)
- GateServer收到请求
- 通过调用StatusServer查询负载信息, 发现“ChatServer A”连接数最少
- GateServer把用户登录请求(ID、Token等信息)转发到“ChatServer A”
- ChatServer A确认用户信息后,返回登录成功
- GateServer将用户ID绑定到会话中,存入Redis(或者内存)
- 用户正式登录成功(连接完毕)
之后用户发消息:
- 用户消息发到GateServer
- GateServer识别到用户已登录
- 直接将消息转发到对应的ChatServer
- 聊天内容由目标ChatServer处理
负载均衡(动态匹配)
- 每次用户登录或请求,GateServer会实时调用StatusServer,#找到连接数最少的ChatServer
- 这样确保每个服务都不会过载,从而保证系统平稳运行
4. 跨Server通信(端对端grpc)
- 由于多个ChatServer都通过grpc连接,彼此可以调用服务
- 这样可以实现:
- 跨Server转发消息(比如:A和B两个Server的用户聊天)
- 其他交互(好友关系校验、同步消息等)
5. 用户连接数管理
- 每个ChatServer:启动后,向Redis设置自己的连接数(初始为0)
- 每当用户连接/断开:更新连接数
- 连接:增加
- 断开:减少
- StatusServer:实时读取所有Server的连接数,做出负载匹配
三、各个组件详细作用介绍
组件 | 作用 | 作用比喻 |
---|---|---|
GateServer | 客户端入口,负责请求转发、负载均衡 | 超市门口的工作人员,迎接客户 |
StatusServer | 监控每个ChatServer连接数,提供负载分配依据 | 超市中监控排队人数的管理员 |
ChatServer | 具体处理聊天逻辑,存储好友关系、聊天历史等 | 超市的收银台,客户排队等候 |
grpc通信 | 各Service端点间可靠、快速的网络通讯 | 快递车,直接送货到不同超市的货架 |
连接池(ChatConPool) | 管理grpc连接,避免频繁创建,提升效率 | 超市备用通道,快速通达收银台 |
Redis | 存储用户状态、连接数信息,快速查询 | 超市排队系统,实时统计等待人数 |
四、总结和思路重点
- 多服务器部署:将系统分别部署多个ChatServer,避免单点失效,提升性能
- 动态负载均衡:请求到达GateServer,实时通过StatusServer匹配负载最小的Server,确保公平分配
- grpc端对端通信:多Server可以直接交互,保证消息转发效率
- 连接数管理:实时监控每个Server的连接情况,依据连接数来做负载调度
- 高效通信:利用grpc连接池,减少连接创建/销毁的开销
五、建议理解路径
- 把整体流程图记住:用户-门面-负载调度-聊天处理(跨Server)
- 重点理解
相关文章:
llfc项目分布式服务笔记
一、系统整体架构流程图(简明版) 复制代码 +---------------+ +------------------+ +----------------+ | 客户端 (Client) |--------->| GateServer |----------| StatusServer |<--+ +---------------+ +--------------…...
“链式前向星”等三种存图方式分别输出“无向无权图”的“DFS序列”
【DFS序列】 DFS序列(深度优先搜索序列),是树或图结构在深度优先遍历过程中生成的节点访问顺序记录。 下面三段代码,分别采用链式前向星、邻接表、邻接矩阵存图,输出图的“DFS序列”。 【DFS:链式前向星】…...
Lesson 16 A polite request
Lesson 16 A polite request 词汇 park n. 公园,停车场,庄园 v. 停车,泊车 例句:让我来停车。 Let me park. 相关:spot n. 车位 区别:garden n. 花园 [小,私家的] 例句:我们…...
【IP101】边缘检测技术全解析:从Sobel到Canny的进阶之路
🌟 边缘检测的艺术 🎨 在图像处理的世界里,边缘检测就像是给图像画眉毛 —— 没有它,你的图像就像一只没有轮廓的熊猫🐼。让我们一起来探索这个神奇的"美妆"技术! 📚 目录 基础概念 …...
Nx 智能分发机制(Nx Agents + Nx Cloud)
Nx 智能分发机制(Nx Agents Nx Cloud) 阶段关键做的事作用1. 收集信息- Project Graph:解析整个 workspace 依赖关系(谁依赖谁)- 历史统计:每次 CI 结束后将每个任务的实际用时与缓存命中情况上传…...
《“昊龙一号”:开启中国航天货运新时代》
中国航天新力量:昊龙一号登场 在 2024 年 10 月 29 日上午,神舟十九号载人飞行任务新闻发布会如一颗重磅炸弹,在航天领域激起千层浪。发布会上,一系列关乎中国载人航天工程未来走向的重要信息被披露,其中,“昊龙一号” 货运航天飞机入围空间站低成本货物运输系统总体方案…...
C++ 多态:原理、实现与应用
目录 引言 一、多态的概念 二、多态的定义及实现 (一)构成条件 (二)虚函数的深入理解 (三)虚函数的重写(覆盖) 三、抽象类 (一)概念 (二&…...
多模态大语言模型arxiv论文略读(五十八)
How Does the Textual Information Affect the Retrieval of Multimodal In-Context Learning? ➡️ 论文标题:How Does the Textual Information Affect the Retrieval of Multimodal In-Context Learning? ➡️ 论文作者:Yang Luo, Zangwei Zheng, …...
TS 枚举类型
枚举 参数为枚举成员中的一个 数字枚举 字符串枚举 枚举特点 、 缺点:转为JS代码时会编译成JS代码,增大开销...
Python容器与循环:数据处理的双剑合璧
Python作为一门简洁强大的编程语言,其容器类型和循环结构的完美结合为数据处理提供了极大的便利。本文将带领初学者深入理解Python中的四大容器(列表、元组、字典、集合)以及它们与循环结构的配合使用,助你掌握数据处理的核心技能…...
ST-LINKV2仿真器下载
ST-LINKV2仿真器 — 正点原子资料下载中心 1.0.0 文档...
RAGFlow 接入企业微信应用实现原理剖析与最佳实践
背景 近期有医美行业客户咨询我们智能客服产品,期望将自己企业的产品、服务以及报价信息以企微应用的方式给到客户进行体验互动,提升企业运营效率。关于企业微信对接,我们分享下最佳实践,抛砖引玉。效果图如下: 这里也…...
大模型实践:图文解锁Ollama在个人笔记本上部署llm
使用在线模型服务时,我们常常需要支付API调用费用,这对于个人开发者或小型组织来说可能是一笔不小的开支。那么,有没有方法可以在本地免费使用这些强大的模型呢?答案是肯定的——Ollama就是这样一个工具。 当然如果是比较大的组织…...
如何提高情商?(优化版)
引言 提高情商(EQ)是一个需要长期练习和自我反思的过程,核心在于理解自己、管理情绪、共情他人并有效沟通。以下是一些具体且可操作的方法,结合理论和实际场景,帮助你逐步提升: 一、核心方法:…...
学习黑客Linux权限
在 Linux 的王国里,“权限”就是装备与技能加成:决定谁能拔剑(读 r)、挥剑(写 w)、进入房间(执行 x)。本文用“闯关升级”视角,把常见 rwx、八进制数字、SUID/SGID/Stick…...
信息系统监理师第二版教材模拟题第二组(含解析)
信息系统监理师模拟题第二组(30题) 监理理论与法规 根据《信息系统工程监理暂行规定》,监理单位应当独立于( ) A. 建设单位和承建单位 B. 政府监管部门 C. 行业组织 D. 最终用户答案:A 解析:监理单位应当保持独立性,不得与建设单位和承建单位有隶属关系或其他利害关系…...
C与指针——输入输出
错误定位 当一个库函数出错时,errno会被重置 perror(const char* s);\\输出s: errno 对应的错误信息 \\如果单独想要错误信息可以 char* e strerror(errno);\\系统错误码转换为对应的错误信息字符串输出缓冲区 一般输出缓冲区满的时候才刷新,也就是…...
RR(Repeatable Read)级别如何防止幻读
在 MySQL 数据库事务隔离级别中,RR(可重复读) 通过 MVCC(多版本并发控制) 和 锁机制 的组合策略来避免幻读问题。 一、MVCC机制:快照读与版本控制 快照读(Snapshot Read) 每个事务启…...
Python之学习笔记(六)
文章目录 1. 字典(Dictionary)2. 集合(Set)3. 字典 vs 集合4. 应用场景5. 注意事项 Python中的字典( dict)和集合( set)是两种高效且常用的数据结构,适用于不同的场景。…...
Easy云盘总结篇-文件上传02
说在前面:此项目是跟着B站一位大佬写的,不分享源码,支持项目付费 文件预览 主要分视频和其他文件预览,但实现逻辑相同,只是请求路径有区别。 这段逻辑: 拿视频预览举例: 视频开始时ÿ…...
window-docker的容器使用宿主机音频设备
文章目录 前言操作配置 前言 你有没有遇到过这种情况? 你兴冲冲地在Windows上用Docker搭了个语音识别项目,准备让容器高歌一曲,或者至少"Hey Docker"一下。结果——静音。 Docker Desktop一脸无辜:“亲,默…...
NaVILA: Legged Robot Vision-Language-ActionModel for Navigation
摘要 本文旨在解决基于视觉与语言导航(VLN)在四足机器人上的实现问题。该任务不仅为人类提供了一种灵活的指令方式,还使机器人能够在更具挑战性和杂乱的场景中导航。然而,将人类自然语言指令转换为低层次的腿部关节控制指令并非易…...
LeetCode 2071 你可以安排的最多任务数目 题解(附带自己的错误做题思路 过了25/49)
示例 输入:tasks [3,2,1], workers [0,3,3], pills 1, strength 1 输出:3 解释: 我们可以按照如下方案安排药丸: - 给 0 号工人药丸。 - 0 号工人完成任务 2(0 1 > 1) - 1 号工人完成任务 1&#…...
高翔《视觉SLAM十四讲》中第13讲,单目稠密重建中的RMODE数据集
高翔《视觉SLAM十四讲》中第13讲,单目稠密重建,中的RMODE数据集, 原作者苏黎世大学slam小组提供,但是网址已失效 下载方式: 1 https://vj6cqktnxq.feishu.cn/wiki/KBqtwD6XJio3Rmkm2FkckMY8nPg 2 参考地址:…...
PyTorch_张量形状操作
搭建模型时,数据都是基于张量形式的表示,网络层与层之间很多都是以不同的shape的方式进行表现和运算。 对张量形状的操作,以便能够更好处理网络各层之间的数据连接。 reshape 函数的用法 reshape 函数可以再保证张量数据不变的前提下改变数…...
【浅尝Java】变量与数据类型(含隐式类型转换、强制类型转换、整型与字符串互相转换等)
🍞自我激励:每天努力一点点,技术变化看得见 文章目录 字面常量数据类型变量变量概念语法格式整型变量字节型变量(byte)短整型变量(short)整型变量(int)长整型(…...
Ubuntu环境下使用uWSGI服务器【以flask应用部署为例】
0、前置内容说明 首先要知道WSGI是什么,关于WSGI服务器的介绍看这篇:WSGI(Web Server Gateway Interface)服务器 由于从Python 3.11开始限制了在系统级 Python 环境中使用 pip 安装第三方包,以避免与系统包管理器&am…...
GCC 使用指南
安装 GCC Ubuntu/Debian: sudo apt update && sudo apt install gcc gCentOS/RHEL: sudo yum install gcc gcc-cmacOS (通过 Homebrew): brew install gcc基本用法 编译 C 程序 gcc hello.c -o hello # 编译 hello.c,生成可执行文件 hello ./hello …...
虚函数 vs 纯虚函数 vs 静态函数(C++)
🧩 一图看懂:虚函数 vs 纯虚函数 特性虚函数(Virtual)纯虚函数(Pure Virtual)语法virtual void foo();virtual void foo() 0;是否必须实现✅ 必须在类中实现❌ 不在基类实现,派生类必须实现是…...
CF1000E We Need More Bosses
CF1000E We Need More Bosses 题目描述 题目大意: 给定一个 n n n 个点 m m m 条边的无向图,保证图连通。找到两个点 s , t s,t s,t,使得 s s s到 t t t必须经过的边最多(一条边无论走哪条路线都经过ta,这条边就是…...
Python:Seaborn 美化图表的技术指南
🎨 1、简述 Seaborn 是建立在 Matplotlib 基础上的高级可视化库,提供了更美观、更简洁的数据统计图表。本文将带你深入了解 Seaborn 的强大功能,并通过多个实践案例掌握使用技巧。 2、Seaborn 1️⃣ 什么是 Seaborn? Seaborn 是一个基于 matplotlib 构建的 Python 可视…...
go实现循环链表
需求 实现循环链表的节点生成、顺序遍历、指定删除。 实现 package mainimport ("fmt" )type zodiac_sign struct {number intdizhi stringanimal stringyear intnext *zodiac_sign }// 添加 // func add_node_by_order(previous_node zodiac_sign, current_…...
QT | 常用控件
前言 💓 个人主页:普通young man-CSDN博客 ⏩ 文章专栏:C_普通young man的博客-CSDN博客 ⏩ 本人giee: 普通小青年 (pu-tong-young-man) - Gitee.com 若有问题 评论区见📝 🎉欢迎大家点赞👍收藏⭐文章 —…...
EasyExcel使用总结
EasyExcel 文章目录 EasyExcel1、导入1.1、基本方式导入1.导入依赖2. 加载源文件基本语法 3. 读取数据行4. 读取结果 1.2、模型映射导入1.定义实体映射类2. 操作读取基本语法 3. 读取数据行4. 读取结果 1.3、导入类型转换器语法 1.4、导入监听器基本语法: 1.5、多行…...
【形式化验证】动态逻辑(DL)的定义解释与示例
动态逻辑(Dynamic Logic, DL)是一种用于描述和验证程序行为的逻辑系统。它结合了命题逻辑、谓词逻辑以及模态逻辑的特点,特别适用于表达程序执行前后的状态变化。以下将从语法、语义以及实际应用等方面详细介绍DL公式的相关内容。 1. 动态逻…...
OpenCv实战笔记(1)在win11搭建opencv4.11.1 + qt5.15.2 + vs2019_x64开发环境
一. 准备工作 Visual Studio 2019(安装时勾选 C 桌面开发 和 Windows 10 SDK) CMake 3.20(官网下载) Qt 5.15.2(下载 Qt Online Installer)安装时勾选 MSVC 2019 64-bit 组件。 opencv 4.11.1 源码下载 git…...
四年级数学知识边界总结思考-上册
目录 一、背景二、过程1.大数的认识**一、知识点梳理****二、知识点的由来****三、作用与意义****四、总结** 2. 公顷和平方千米**一、知识点梳理****二、知识点的由来****三、作用与意义** 3.角的度量**一、知识点梳理****二、知识点的由来****三、作用与意义** 4.平行四边形和…...
(undone) MIT6.S081 2023 学习笔记 (Day10: LAB9 fs file system)
url: https://pdos.csail.mit.edu/6.1810/2023/labs/fs.html 任务1:Large files (moderate) ----------------- 完成 本次作业中,你将扩大xv6文件的最大容量。当前xv6文件被限制为268个块(即268*BSIZE字节,xv6中BSIZE为1024&…...
SpringMVC详解
一:Maven 1.1 概述 (1)项目结构 所有IDE使用Maven创建的项目结构完全一样,maven项目可通用 (2)构建流程(编译、测试、打包、发布) (3)依赖管理 定义ÿ…...
【Python】一直没搞懂生成器是什么。。
生成器 上期我们讲解了迭代器:【Python】一直没搞懂迭代器是什么。。-CSDN博客 这期我们来讲讲它的好兄弟——生成器 生成器 (Generator)? 生成器是一种特殊的 迭代器 (Iterator)。 迭代器 是你可以逐个访问其元素的对象(比如在 for 循环中使用)。列表、元组、字典、字符…...
高等数学同步测试卷 同济7版 试卷部分 上 做题记录 第四章 不定积分同步测试卷 B卷
第四章 不定积分同步测试卷 B卷 一、单项选择题(本大题共5小题,每小题3分,总计15分) 1. 2. 3. 4. 5. 二、填空题(本大题共5小题,每小题3分,总计15分) 6. 7. 8. 9. 10. 三、求解下列各题(本大题共5小题,每小题6分,总计30分) 11. 12. …...
只用Prettier进行格式化项目
1.下载Prettier插件,禁用ESlint 2.在项目根目录新建.prettierrc文件 {"singleQuote": true,"jsxSingleQuote": true,"printWidth": 100,"trailingComma": "none","tabWidth": 2,"semi": f…...
ARM寻址方式
寻址方式指的是确定操作数位置的方式。 寻址方式: 立即数寻址 直接寻址(绝对寻址),ARM不支持这种寻址方式,但所有CISC处理器都支持 寄存器间接寻址 3种寻址方式总结如下: 助记符 RTL格式 描述 ADD r0,r1…...
2025年- H25-Lc133- 104. 二叉树的最大深度(树)---java版
1.题目描述 2.思路 返回左右子树中,最高高度的子树,高度从0开始计数。 3.代码实现 class TreeNode {int val;TreeNode left;TreeNode right;TreeNode() {}TreeNode(int val) { this.val val; }TreeNode(int val, TreeNode left, TreeNode right) {this.val val;…...
深入理解 Spring MVC:DispatcherServlet 与视图解析机制
import javax.servlet.ServletException; import javax.servlet.http.HttpServletRequest; import javax.servlet.http.HttpServletResponse; import java.io.IOException; import java.util.Locale; import java.util.Map;// 继承自 FrameworkServlet 的 DispatcherServlet 类…...
Python基本语法(lambda表达式)
lambda表达式 lambda的一般形式是在关键字lambda后面跟一个或多个参数,之后再紧跟一个 冒号,接下来是一个表达式。lambda是一个表达式,而不是一个语句,它能够出现 在Python语法不允许def出现的地方。作为表达式,lambd…...
嵌入式按键原理、中断过程与中断程序设计(键盘扫描程序)
按键去抖动 通常的按键所用开关为机械弹性开关,当机械触点断开、闭合时,电压信号波型如下图。由于机械触点的弹性作用,一个按键开关在闭合时不会马上稳定地接通,在断开时也不会一下子断开。因而在闭合及断开的瞬间均伴随有一连串的抖动。…...
C++负载均衡远程调用学习之实时监测与自动发布功能
目录 1.LarsDns-V0.3BackenThread后端实时监控线程流程 2.LarsDns-V0.3加载当前Route版本号方法实现 3.LarsDns-V0.3加载RouteChange修改表的信息 4.LarsDns-V0.3实现实时监控流程线程业务 5.LarsDnsV0.3编译bug修改和功能测试 6.Lars Web管理界面的集成 7.LarsDnsV0.3 D…...
VSCode常用插件推荐
文章目录 VSCode常用插件推荐1 Git相关插件2 代码格式3 AI工具4 语言插件通用工具参考 VSCode常用插件推荐 1 Git相关插件 2 代码格式 3 AI工具 4 语言插件 通用工具 参考 50 个 VSCode 必装插件推荐 https://mp.weixin.qq.com/s/b_OKvg3hdavtnv7pbWcKWg...
性能优化实践:内存优化技巧
性能优化实践:内存优化技巧 在Flutter应用开发中,内存优化是提升应用性能的关键环节之一。本文将从实战角度深入探讨Flutter内存优化的各种技巧,帮助你构建高性能的Flutter应用。 一、内存分析工具使用 1. DevTools内存分析器 启动DevTool…...