全网营销一站式推广,农产品网站建设投标书,厦门建设局网站中标结果查询,景区宣传软文亿级分布式系统架构演进实战#xff08;一#xff09;- 总体概要
服务无状态化详细设计
目标#xff1a;确保服务实例完全无状态#xff0c;可任意扩缩容 1. 会话存储改造#xff08;Session Management#xff09;
核心问题#xff1a;传统单体应用中#xff0c;用… 亿级分布式系统架构演进实战一- 总体概要
服务无状态化详细设计
目标确保服务实例完全无状态可任意扩缩容 1. 会话存储改造Session Management
核心问题传统单体应用中用户会话存储在服务实例内存无法支持多实例负载均衡。 解决方案
用户请求 → [LB] → 任意实例 → 会话数据统一存储 → [分布式存储]使用分布式会话存储避免横向扩展后多节点会话信息不能共享问题如用户登录会话。
1.1 分布式会话存储选型比较
方案实现方式适用场景Redis Cluster会话数据以Key-Value形式存储支持TTL过期、高可用高并发、强一致性要求生产首选Memcached多节点分布式缓存协议简单需要极低延迟但允许短暂数据丢失的场景Database会话数据存入MySQL/PostgreSQL小规模系统需强事务保障不推荐高并发
本项目选择的是Redis Cluster来实现分布式会话存储。
会话管理可优化方向 • 数据压缩采用Zstandard/LZ4压缩会话数据减少30%存储占用
技术方案
压缩场景 仅对会话中大于1KB的字段如用户画像、历史记录启用压缩。压缩算法选择LZ4适用于文本类数据压缩率20%-30%Zstandard适用于二进制数据压缩率30%-40% 生产级优化监控压缩率在Redis写入时记录原始大小和压缩后大小低于20%压缩率触发告警。动态降级当CPU使用率超过80%时自动关闭压缩功能。• 安全加密敏感会话字段如UserID使用AES-GCM加密存储 #mermaid-svg-vTLYdzNtabnTmxqS {font-family:"trebuchet ms",verdana,arial,sans-serif;font-size:16px;fill:#333;}#mermaid-svg-vTLYdzNtabnTmxqS .error-icon{fill:#552222;}#mermaid-svg-vTLYdzNtabnTmxqS .error-text{fill:#552222;stroke:#552222;}#mermaid-svg-vTLYdzNtabnTmxqS .edge-thickness-normal{stroke-width:2px;}#mermaid-svg-vTLYdzNtabnTmxqS .edge-thickness-thick{stroke-width:3.5px;}#mermaid-svg-vTLYdzNtabnTmxqS .edge-pattern-solid{stroke-dasharray:0;}#mermaid-svg-vTLYdzNtabnTmxqS .edge-pattern-dashed{stroke-dasharray:3;}#mermaid-svg-vTLYdzNtabnTmxqS .edge-pattern-dotted{stroke-dasharray:2;}#mermaid-svg-vTLYdzNtabnTmxqS .marker{fill:#333333;stroke:#333333;}#mermaid-svg-vTLYdzNtabnTmxqS .marker.cross{stroke:#333333;}#mermaid-svg-vTLYdzNtabnTmxqS svg{font-family:"trebuchet ms",verdana,arial,sans-serif;font-size:16px;}#mermaid-svg-vTLYdzNtabnTmxqS .label{font-family:"trebuchet ms",verdana,arial,sans-serif;color:#333;}#mermaid-svg-vTLYdzNtabnTmxqS .cluster-label text{fill:#333;}#mermaid-svg-vTLYdzNtabnTmxqS .cluster-label span{color:#333;}#mermaid-svg-vTLYdzNtabnTmxqS .label text,#mermaid-svg-vTLYdzNtabnTmxqS span{fill:#333;color:#333;}#mermaid-svg-vTLYdzNtabnTmxqS .node rect,#mermaid-svg-vTLYdzNtabnTmxqS .node circle,#mermaid-svg-vTLYdzNtabnTmxqS .node ellipse,#mermaid-svg-vTLYdzNtabnTmxqS .node polygon,#mermaid-svg-vTLYdzNtabnTmxqS .node path{fill:#ECECFF;stroke:#9370DB;stroke-width:1px;}#mermaid-svg-vTLYdzNtabnTmxqS .node .label{text-align:center;}#mermaid-svg-vTLYdzNtabnTmxqS .node.clickable{cursor:pointer;}#mermaid-svg-vTLYdzNtabnTmxqS .arrowheadPath{fill:#333333;}#mermaid-svg-vTLYdzNtabnTmxqS .edgePath .path{stroke:#333333;stroke-width:2.0px;}#mermaid-svg-vTLYdzNtabnTmxqS .flowchart-link{stroke:#333333;fill:none;}#mermaid-svg-vTLYdzNtabnTmxqS .edgeLabel{background-color:#e8e8e8;text-align:center;}#mermaid-svg-vTLYdzNtabnTmxqS .edgeLabel rect{opacity:0.5;background-color:#e8e8e8;fill:#e8e8e8;}#mermaid-svg-vTLYdzNtabnTmxqS .cluster rect{fill:#ffffde;stroke:#aaaa33;stroke-width:1px;}#mermaid-svg-vTLYdzNtabnTmxqS .cluster text{fill:#333;}#mermaid-svg-vTLYdzNtabnTmxqS .cluster span{color:#333;}#mermaid-svg-vTLYdzNtabnTmxqS div.mermaidTooltip{position:absolute;text-align:center;max-width:200px;padding:2px;font-family:"trebuchet ms",verdana,arial,sans-serif;font-size:12px;background:hsl(80, 100%, 96.2745098039%);border:1px solid #aaaa33;border-radius:2px;pointer-events:none;z-index:100;}#mermaid-svg-vTLYdzNtabnTmxqS :root{--mermaid-font-family:"trebuchet ms",verdana,arial,sans-serif;} 是 否 用户登录 生成明文Session数据 敏感字段标记 AES-GCM加密 直接存储 存储密文IVAuthTag • 分片策略采用Redis Cluster分片避免单点热点
原生分片机制
哈希槽分配16384个槽位自动分配到集群节点。客户端路由使用CRC16算法计算键名哈希值定位目标分片。• 容灾机制跨机房部署Redis Cluster如3机房部署每个分片3副本 这个看情况去选择开始可以先选择简单的主从结构去代替即可。 #mermaid-svg-VjMSh490pRz92rHp {font-family:"trebuchet ms",verdana,arial,sans-serif;font-size:16px;fill:#333;}#mermaid-svg-VjMSh490pRz92rHp .error-icon{fill:#552222;}#mermaid-svg-VjMSh490pRz92rHp .error-text{fill:#552222;stroke:#552222;}#mermaid-svg-VjMSh490pRz92rHp .edge-thickness-normal{stroke-width:2px;}#mermaid-svg-VjMSh490pRz92rHp .edge-thickness-thick{stroke-width:3.5px;}#mermaid-svg-VjMSh490pRz92rHp .edge-pattern-solid{stroke-dasharray:0;}#mermaid-svg-VjMSh490pRz92rHp .edge-pattern-dashed{stroke-dasharray:3;}#mermaid-svg-VjMSh490pRz92rHp .edge-pattern-dotted{stroke-dasharray:2;}#mermaid-svg-VjMSh490pRz92rHp .marker{fill:#333333;stroke:#333333;}#mermaid-svg-VjMSh490pRz92rHp .marker.cross{stroke:#333333;}#mermaid-svg-VjMSh490pRz92rHp svg{font-family:"trebuchet ms",verdana,arial,sans-serif;font-size:16px;}#mermaid-svg-VjMSh490pRz92rHp .label{font-family:"trebuchet ms",verdana,arial,sans-serif;color:#333;}#mermaid-svg-VjMSh490pRz92rHp .cluster-label text{fill:#333;}#mermaid-svg-VjMSh490pRz92rHp .cluster-label span{color:#333;}#mermaid-svg-VjMSh490pRz92rHp .label text,#mermaid-svg-VjMSh490pRz92rHp span{fill:#333;color:#333;}#mermaid-svg-VjMSh490pRz92rHp .node rect,#mermaid-svg-VjMSh490pRz92rHp .node circle,#mermaid-svg-VjMSh490pRz92rHp .node ellipse,#mermaid-svg-VjMSh490pRz92rHp .node polygon,#mermaid-svg-VjMSh490pRz92rHp .node path{fill:#ECECFF;stroke:#9370DB;stroke-width:1px;}#mermaid-svg-VjMSh490pRz92rHp .node .label{text-align:center;}#mermaid-svg-VjMSh490pRz92rHp .node.clickable{cursor:pointer;}#mermaid-svg-VjMSh490pRz92rHp .arrowheadPath{fill:#333333;}#mermaid-svg-VjMSh490pRz92rHp .edgePath .path{stroke:#333333;stroke-width:2.0px;}#mermaid-svg-VjMSh490pRz92rHp .flowchart-link{stroke:#333333;fill:none;}#mermaid-svg-VjMSh490pRz92rHp .edgeLabel{background-color:#e8e8e8;text-align:center;}#mermaid-svg-VjMSh490pRz92rHp .edgeLabel rect{opacity:0.5;background-color:#e8e8e8;fill:#e8e8e8;}#mermaid-svg-VjMSh490pRz92rHp .cluster rect{fill:#ffffde;stroke:#aaaa33;stroke-width:1px;}#mermaid-svg-VjMSh490pRz92rHp .cluster text{fill:#333;}#mermaid-svg-VjMSh490pRz92rHp .cluster span{color:#333;}#mermaid-svg-VjMSh490pRz92rHp div.mermaidTooltip{position:absolute;text-align:center;max-width:200px;padding:2px;font-family:"trebuchet ms",verdana,arial,sans-serif;font-size:12px;background:hsl(80, 100%, 96.2745098039%);border:1px solid #aaaa33;border-radius:2px;pointer-events:none;z-index:100;}#mermaid-svg-VjMSh490pRz92rHp :root{--mermaid-font-family:"trebuchet ms",verdana,arial,sans-serif;} 机房C 机房B 机房A 异步复制 异步复制 异步复制 异步复制 异步复制 异步复制 Master-分片3 Slave-分片1 Master-分片2 Slave-分片3 Master-分片1 Slave-分片2 数据同步一致性保障写入流程客户端写入本地机房Master节点Master异步复制到其他两个机房的Slave节点超过半数的节点ACK后返回客户端成功
故障恢复机房级故障时通过Raft协议选举新Master数据修复使用NCDCNetwork-Constrained Data Consistency算法保证最终一致性1.2 会话迁移策略
场景旧系统迁移到无状态架构时的会话兼容 PS 其实这步只是为了在生产环境验证程序的准确性认真完成后业务允许的话直接停机切换最彻底
• 双写过渡
新会话写入Redis Cluster旧会话保留在本地内存Tomcat Session通过Nginx路由新请求到无状态实例
• 灰度切流 • 按用户ID范围逐步迁移如尾号0~9分批切换 • 监控会话丢失率要求0.01% #mermaid-svg-DdQAR4FX6F2lIzpz {font-family:"trebuchet ms",verdana,arial,sans-serif;font-size:16px;fill:#333;}#mermaid-svg-DdQAR4FX6F2lIzpz .error-icon{fill:#552222;}#mermaid-svg-DdQAR4FX6F2lIzpz .error-text{fill:#552222;stroke:#552222;}#mermaid-svg-DdQAR4FX6F2lIzpz .edge-thickness-normal{stroke-width:2px;}#mermaid-svg-DdQAR4FX6F2lIzpz .edge-thickness-thick{stroke-width:3.5px;}#mermaid-svg-DdQAR4FX6F2lIzpz .edge-pattern-solid{stroke-dasharray:0;}#mermaid-svg-DdQAR4FX6F2lIzpz .edge-pattern-dashed{stroke-dasharray:3;}#mermaid-svg-DdQAR4FX6F2lIzpz .edge-pattern-dotted{stroke-dasharray:2;}#mermaid-svg-DdQAR4FX6F2lIzpz .marker{fill:#333333;stroke:#333333;}#mermaid-svg-DdQAR4FX6F2lIzpz .marker.cross{stroke:#333333;}#mermaid-svg-DdQAR4FX6F2lIzpz svg{font-family:"trebuchet ms",verdana,arial,sans-serif;font-size:16px;}#mermaid-svg-DdQAR4FX6F2lIzpz .actor{stroke:hsl(259.6261682243, 59.7765363128%, 87.9019607843%);fill:#ECECFF;}#mermaid-svg-DdQAR4FX6F2lIzpz text.actortspan{fill:black;stroke:none;}#mermaid-svg-DdQAR4FX6F2lIzpz .actor-line{stroke:grey;}#mermaid-svg-DdQAR4FX6F2lIzpz .messageLine0{stroke-width:1.5;stroke-dasharray:none;stroke:#333;}#mermaid-svg-DdQAR4FX6F2lIzpz .messageLine1{stroke-width:1.5;stroke-dasharray:2,2;stroke:#333;}#mermaid-svg-DdQAR4FX6F2lIzpz #arrowhead path{fill:#333;stroke:#333;}#mermaid-svg-DdQAR4FX6F2lIzpz .sequenceNumber{fill:white;}#mermaid-svg-DdQAR4FX6F2lIzpz #sequencenumber{fill:#333;}#mermaid-svg-DdQAR4FX6F2lIzpz #crosshead path{fill:#333;stroke:#333;}#mermaid-svg-DdQAR4FX6F2lIzpz .messageText{fill:#333;stroke:#333;}#mermaid-svg-DdQAR4FX6F2lIzpz .labelBox{stroke:hsl(259.6261682243, 59.7765363128%, 87.9019607843%);fill:#ECECFF;}#mermaid-svg-DdQAR4FX6F2lIzpz .labelText,#mermaid-svg-DdQAR4FX6F2lIzpz .labelTexttspan{fill:black;stroke:none;}#mermaid-svg-DdQAR4FX6F2lIzpz .loopText,#mermaid-svg-DdQAR4FX6F2lIzpz .loopTexttspan{fill:black;stroke:none;}#mermaid-svg-DdQAR4FX6F2lIzpz .loopLine{stroke-width:2px;stroke-dasharray:2,2;stroke:hsl(259.6261682243, 59.7765363128%, 87.9019607843%);fill:hsl(259.6261682243, 59.7765363128%, 87.9019607843%);}#mermaid-svg-DdQAR4FX6F2lIzpz .note{stroke:#aaaa33;fill:#fff5ad;}#mermaid-svg-DdQAR4FX6F2lIzpz .noteText,#mermaid-svg-DdQAR4FX6F2lIzpz .noteTexttspan{fill:black;stroke:none;}#mermaid-svg-DdQAR4FX6F2lIzpz .activation0{fill:#f4f4f4;stroke:#666;}#mermaid-svg-DdQAR4FX6F2lIzpz .activation1{fill:#f4f4f4;stroke:#666;}#mermaid-svg-DdQAR4FX6F2lIzpz .activation2{fill:#f4f4f4;stroke:#666;}#mermaid-svg-DdQAR4FX6F2lIzpz .actorPopupMenu{position:absolute;}#mermaid-svg-DdQAR4FX6F2lIzpz .actorPopupMenuPanel{position:absolute;fill:#ECECFF;box-shadow:0px 8px 16px 0px rgba(0,0,0,0.2);filter:drop-shadow(3px 5px 2px rgb(0 0 0 / 0.4));}#mermaid-svg-DdQAR4FX6F2lIzpz .actor-man line{stroke:hsl(259.6261682243, 59.7765363128%, 87.9019607843%);fill:#ECECFF;}#mermaid-svg-DdQAR4FX6F2lIzpz .actor-man circle,#mermaid-svg-DdQAR4FX6F2lIzpz line{stroke:hsl(259.6261682243, 59.7765363128%, 87.9019607843%);fill:#ECECFF;stroke-width:2px;}#mermaid-svg-DdQAR4FX6F2lIzpz :root{--mermaid-font-family:"trebuchet ms",verdana,arial,sans-serif;} User Nginx NewApp OldApp Redis Tomcat 请求 /api/login 转发请求 写入新会话(user123) 双写旧会话(user123) 返回登录成功 请求 /api/profile (携带Cookie) 旧版实例处理 读取旧会话(user123) 返回用户数据 User Nginx NewApp OldApp Redis Tomcat 1.3 会话安全
• 防窃取 • Cookie设置HttpOnly、Secure、SameSite属性 • 动态Token刷新机制每5分钟更新Session ID • 防篡改 • 会话数据签名HMAC-SHA256 • 客户端IP绑定检测IP变更时强制重新认证 2. 配置外置Externalized Configuration
核心问题配置硬编码或本地文件导致实例间不一致无法动态生效。
2.1 动态配置中心选型
工具核心能力生产建议Nacos支持配置推送、版本历史、灰度发布集成Spring Cloud Alibaba推荐阿里生产验证Spring Cloud Config与Spring生态无缝集成支持Git/SVN存储旧系统迁移场景Consul服务发现与配置管理一体化强一致性保证多语言混合技术栈
本项目选择的是Nacos作为服务的配置中心
配置分类管理 • 环境配置Env数据库地址、缓存集群节点区分dev/test/prod • 业务规则Biz限流阈值、开关配置如促销活动开关 • 安全配置Security密钥、白名单IP加密存储
2.2 灰度发布策略
• 按应用分组
新配置 → 10%的实例组如Canary组 → 监控1小时 → 全量发布 • 按用户分桶
if (userId % 100 5) { // 5%用户灰度 applyNewConfig();
} • 回滚机制 • 自动回滚配置更新后错误率上升5%则自动回退 • 版本快照保留最近10个版本支持一键回滚
2.3 配置安全
Nacos如果没有修改源码做不了这么细可以选择每个环境搭建一个Nacos这样的方式。 • 权限分级 • 开发人员只读测试环境配置 • 运维人员可修改生产环境非敏感配置 • 安全管理员管理密钥类配置 • 审计追踪 • 记录配置修改人、时间、旧值/新值 • 集成LDAP/AD账号体系 3. 资源管理Resource Management
核心问题服务实例依赖本地资源文件、缓存导致状态残留。
3.1 文件存储外迁
• 对象存储方案
存储类型使用场景示例热数据频繁访问的文件如图片缩略图阿里云OSS标准存储冷数据归档日志、备份文件阿里云OSS归档存储/Glacier临时文件处理中生成的文件需定时清理本地SSD CronJob清理
• 上传优化 • 客户端直传OSS减少服务端带宽压力 • 分片上传支持大文件断点续传
3.2 内存缓存治理
这项改造其实跟服务无状态话这个目标是没有什么关联性的本地内存的作用是提升性能这里是顺便优化了你们可以根据情况自行选择。 • 本地缓存策略
缓存类型使用场景淘汰策略Caffeine高频读、数据量小如用户基础信息LRU 最大条目数限制Guava兼容旧系统基于权重淘汰
本项目本地缓存使用的是Caffeine
• 防缓存滥用 • 限制最大内存占比如JVM堆的20% • 监控缓存命中率低于70%时告警
3.3 临时资源清理
• 临时文件 • 定时任务Cron清理超过24小时的/tmp文件 • 使用内存文件系统如tmpfs加速处理 • 线程池管理 • 禁止使用全局静态线程池导致内存泄漏 • 统一由Spring Bean管理应用关闭时自动销毁 4. 生产级实施步骤 架构评估 • 识别现有状态会话存储位置、本地配置文件、资源依赖 • 确定技术栈Redis版本、配置中心选型、存储迁移工具 灰度迁移 • 阶段1新会话写入Redis同时保留本地Session双写 • 阶段2配置中心逐步替换本地配置文件 • 阶段3文件存储迁移到OSS删除本地存储逻辑 验证与监控 • 自动化测试模拟实例重启验证会话不丢失 • 监控看板会话存储延迟、配置推送成功率、临时文件磁盘占用 全量切换 • 旧服务下线确保所有流量切至无状态实例 • 资源清理关闭本地Session存储删除冗余配置 5. 升级效果
总结 1、利用redis存储服务会话信息 2、利用nacos config 实现服务配置信息管理 3、利用OSS做文件上传、读取 以上应用服务可以实现无状态话当应用服务达到性能瓶颈的时候可通过横向增加节点然后利用nginx的负载均衡调度实现性能增加。