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. 工作流程(用户请求全流程)

假设用户要登录,系统是如何实现的?

  1. 用户发起登录请求(输入账号密码)
  2. GateServer收到请求
    • 通过调用StatusServer查询负载信息, 发现“ChatServer A”连接数最少
  3. GateServer把用户登录请求(ID、Token等信息)转发到“ChatServer A”
  4. ChatServer A确认用户信息后,返回登录成功
  5. GateServer将用户ID绑定到会话中,存入Redis(或者内存)
  6. 用户正式登录成功(连接完毕)

之后用户发消息:

  • 用户消息发到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连接池,减少连接创建/销毁的开销

五、建议理解路径

  1. 把整体流程图记住:用户-门面-负载调度-聊天处理(跨Server)
  2. 重点理解

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

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

相关文章

C++如何设计和实现缓存(cache)来减少对后端存储的访问压力

随着数据量的激增和用户对低延迟、高吞吐量需求的不断提升,如何减少系统瓶颈、提升响应速度成为了开发者的核心挑战之一。在这一背景下,缓存(cache)作为一种关键的技术手段,逐渐成为解决性能问题的核心策略。缓存的本质是通过存储频繁访问的数据或计算结果,减少对后端存储…

华为设备端口隔离

端口隔离的理论与配置指南 一、端口隔离的理论 基本概念 端口隔离&#xff08;Port Isolation&#xff09;是一种在交换机上实现的安全功能&#xff0c;用于限制同一VLAN内指定端口间的二层通信。被隔离的端口之间无法直接通信&#xff0c;但可通过上行端口访问公共资源&#…

1688平台商品详情接口开发指南(含Python代码示例)

接口概述 1688开放平台提供的商品详情接口&#xff08;item_get&#xff09;是获取商品核心数据的重要API&#xff0c;开发者可通过该接口获取商品标题、价格、规格参数、图片等详细信息。本文重点解析标题字段的获取方式&#xff0c;并提供完整代码示例。 接口请求参数 基础…

Edge浏览器PDF字体显示错误

Edge浏览器PDF字体显示错误 软件版本信息 Edge Version: 136.0.3240.50 Word Version: Microsoft Office 专业增强版2021问题描述 在Word中使用多级列表自动编号, 并使用Word软件自带的导出为PDF文件功能, 在Word中显示正常的数字, 在Edge中查看PDF将会出现渲染错误的现象,…

Redis能保证数据不丢失吗之AOF

我们都知道,Redis是一个基于内存的k-v数据库,既然是基于内存的,那么Redis如何保证数据不丢失?以及真的能做到数据的百分百不丢失吗? 为什么Redis数据需要持久化机制? Redis的一个常用场景是缓存,通常缓存丢失的话,我们也可以从数据库中重新找回,那么为什么Redis还需…

Apache POI实现Excel的基本写入、导出操作

目录 一、Apache POI 简介 二、入门案例(写入导出) 三、实际开发过程中的导出操作——&#xff08;将文件下载至客户端浏览器中&#xff09; 一、Apache POI 简介 Apache POI&#xff08;Poor Obfuscation Implementation&#xff09;是 Apache 软件基金会的开源项目&#…

HTTP请求与前端资源未优化的系统性风险与高性能优化方案

目录 前言一、未合并静态资源&#xff1a;HTTP请求的隐形杀手1.1 多文件拆分的代价1.2 合并策略与工具链实践 二、未启用GZIP压缩&#xff1a;传输流量的浪费2.1 文本资源的压缩潜力2.2 服务端配置与压缩算法选择 三、未配置浏览器缓存&#xff1a;重复请求的根源3.1 缓存失效的…

AgentMesh开源多智能体 (Multi-Agent) 平台

AgentMesh 是一个开源的多智能体 (Multi-Agent) 平台&#xff0c;核心目标是解决多个智能体之间的通信和协同问题&#xff0c;真正实现 “11>2” 的效果。能够帮助用户快速创造自己的多智能体团队&#xff0c;或是让已有的多个单一智能体获得协同能力&#xff0c;最终解决更…

基于Jetson Nano与PyTorch的无人机实时目标跟踪系统搭建指南

引言&#xff1a;边缘计算赋能智能监控 在AIoT时代&#xff0c;将深度学习模型部署到嵌入式设备已成为行业刚需。本文将手把手指导读者在NVIDIA Jetson Nano&#xff08;4GB版本&#xff09;开发板上&#xff0c;构建基于YOLOv5SORT算法的实时目标跟踪系统&#xff0c;集成无人…

从入门到登峰-嵌入式Tracker定位算法全景之旅 Part 8 |产品化与运维:批量标定、误差监控、OTA 升级与安全防护

Part 8 |产品化与运维:批量标定、误差监控、OTA 升级与安全防护 本章聚焦将嵌入式 Tracker 定位系统推向 量产与运维 阶段,覆盖 批量标定、误差监控、远程 OTA 升级 以及 定位安全防护,确保产品在大规模部署后仍能稳定、精准、可靠地运行。 一、批量标定平台搭建 标定流程…

gsplat 渲染库 安装部署笔记

目录 Windows 安装 Nvdiffrast安装 gsplat安装成功笔记: cu118测试ok vs 编译安装报错: 安装命令: 报错结果: Windows 安装 pip install gsplat 安装成功,调用报错: python -c "from gsplat import csrc as _C" Traceback (most recent call last): …

Java二维码学习

使用Java语言生成二维码有以下方式,一是谷歌的zxing,二是基于zxing实现的qrcode开源项目,三是基于zxing实现的qrgen开源项目 一 zxing 谷歌的zxing技术生成二维码,是MultiFormatWriter多写格式书写器生成BitMatrix位矩阵,然后将位矩阵的信息在BufferedImage中设置二维码…

工业质检/缺陷检测领域最新顶会期刊论文收集整理 | AAAI 2025【持续更新中】

会议官方论文列表&#xff1a;https://ojs.aaai.org/index.php/AAAI/issue/view/624 其中&#xff0c;2025年是第三十九届AAAI人工智能大会&#xff0c;主要对第三十九届相关论文进行梳理&#xff0c;当前已初版28期(volume 39 no. 28) 【Attention】 虽然本文主要面向的领域…

数据结构实验8.1:图的基本操作

文章目录 一&#xff0c;实验目的二&#xff0c;实验内容三&#xff0c;实验要求四&#xff0c;算法分析五&#xff0c;示例代码8-1.cpp源码graph.h源码 六&#xff0c;操作步骤七&#xff0c;运行结果 一&#xff0c;实验目的 1&#xff0e;掌握图的邻接矩阵、邻接表的表示方…

Spring Boot3 实现定时任务 每10分钟执行一次,同时要解决分布式的问题 区分不同场景

在Spring Boot 3中实现分布式定时任务&#xff0c;确保多实例环境下任务仅执行一次&#xff0c;可以采用以下方案&#xff1a; 方案一&#xff1a;Redis分布式锁&#xff08;推荐&#xff09; import org.springframework.data.redis.core.StringRedisTemplate; import org.sp…

WPF MVVM入门系列教程(五、命令和用户输入)

&#x1f9ed; WPF MVVM入门系列教程 一、MVVM模式介绍二、依赖属性三、数据绑定四、ViewModel五、命令和用户输入六、ViewModel案例演示 WPF中的命令模型 在WPF中&#xff0c;我们可以使用事件来响应鼠标和键盘动作。 但使用事件会具备一定的局限性&#xff0c;例如&#x…

2025年01月09日德美医疗前端面试

目录 vue2 的双向绑定的原理vue3 的双向绑定原理vue 的生命周期vue 子组件为何不能修改父组件的值js delete 删除数组的某一个值会怎么样vue 和 react 的 diff 算法什么是闭包原型链this指向 vue2 的双向绑定的原理 以下是 Vue 2 双向绑定的原理&#xff1a; 1. 核心概念 …

知识图谱 + 大语言模型:打造更聪明、更可靠的AI大脑 —— 探索 GraphRAG 中文优化与可视化实践

大语言模型&#xff08;LLMs&#xff09;无疑是近年来人工智能领域最耀眼的明星。它们强大的自然语言理解和生成能力&#xff0c;在文本创作、代码生成、对话交互等众多领域展现了惊人的潜力。然而&#xff0c;当前的 LLMs 并非完美无缺&#xff0c;它们常常面临着“幻觉”&…

【uniapp】在UniApp中检测手机是否安装了某个应用

1. 使用plus.runtime.isApplicationExist&#xff08;仅限App端&#xff09; // 判断应用是否安装 function checkAppInstalled(packageName) {if (uni.getSystemInfoSync().platform android || uni.getSystemInfoSync().platform ios) {// 仅App端可用if (typeof plus ! u…

使用 Vue + Axios 构建与后端交互的高效接口调用方案

使用 Vue Axios 构建与后端交互的高效接口调用方案 在 Vue 前端开发中&#xff0c;与后端接口的数据交互是非常核心的部分。而 Axios 是 Vue 项目中最常用的 HTTP 客户端&#xff0c;具备基于 Promise、拦截器、自定义实例等诸多优势。 本篇将深入介绍如何基于 Vue 搭配 Axi…