ARTICLE DETAIL

资讯详情

深耕编程入门与网站建设的一线实战洞察。

软件设计实战:模块化切分、耦合控制与并发缓冲七步法

软件设计实战:模块化切分、耦合控制与并发缓冲七步法 1. 这不是教科书里的“软件设计”而是我带团队踩了三年坑后画出的实战路线图“软件设计基础方法”这八个字听起来像大学期末考前突击背诵的名词解释——内聚要高、耦合要低、模块化是王道、七大原则得倒背如流。但真实世界里我见过太多人把《设计模式》翻烂一写登录接口就直接new UserService()也见过刚毕业的同事对着S7-1200 PLC的模块化架构图发呆却连IO映射表和FB块调用链怎么对齐都说不清更别提在压测现场JMeter跑出500并发报错时有人还在翻《Java并发编程实战》找AQS源码而线上Redis缓存击穿已经持续了17分钟。这不是理论失效而是我们长期混淆了一个根本问题软件设计不是写在说明书里的静态文档而是嵌入在每一次函数拆分、每一次线程调度、每一次数据库连接池配置中的动态决策流。你写的每一行代码都在无声地回答三个问题这个功能该由谁负责它和别的功能之间该保持多远的距离当流量突然翻倍或硬件突然降配时它会把压力传导给谁所以这篇内容不讲“什么是高内聚”而是告诉你——当我面对一个需要支持2C4G Pod上万级日活的IM消息服务时如何用模块化切分把“消息投递”从“用户在线状态管理”中物理隔离当客户要求在AD16里手动布差分线却死活过不了EMI测试时如何用耦合概念反推PCB叠层参数当S7-1200项目里多个FB块共享同一个DB块导致数据错乱时怎样用“缝隙耦合”的天线设计思维去重构数据访问边界。这些都不是抽象原则而是我在产线调试室、压测监控台、PCB返工台前用示波器探头、JVM堆栈快照和HFSS场强云图一点点验证出来的操作路径。如果你正被“高并发IM”需求压得喘不过气或正在为“Redis缓存设计”写技术方案纠结要不要加二级缓存又或者刚接手一个用TFC膜系软件设计光学镀膜的老项目却看不懂反射率曲线背后的数学模型——这篇文章就是为你写的。它不承诺让你成为架构师但能确保你下次评审会上不再只说“这个耦合太高了”而是能指着UML序列图说“这里应该把SessionManager抽成独立模块用Redis Stream替代轮询因为当前DB锁竞争已占CPU 38%”。2. 软件设计的本质一场关于“责任切割”与“压力隔离”的精密手术2.1 设计不是画图而是定义“谁该为哪类失败负责”很多新人以为软件设计就是画UML图、写设计说明书。我带的第一个实习生花三天画出完美的类图结果上线后支付回调超时整个订单系统雪崩。复盘时发现他把“支付网关适配”和“库存扣减”塞进同一个Service类——表面看符合单一职责但实际运行中支付宝接口抖动0.5秒直接拖垮库存服务的线程池。问题不在代码而在设计时没回答那个关键问题当外部依赖不可靠时谁该承担失败成本这就是模块化的底层逻辑模块不是按功能切分而是按失败域切分。比如网络通信软件设计Socket层绝不能和业务逻辑混在一起。我经手过一个工业网关项目原始设计把Modbus TCP解析、数据清洗、MQTT上报全塞进一个进程。结果某次现场电磁干扰导致Socket收包错位整个进程core dump连设备心跳都停了。后来重构成三层Socket收发模块只管字节流、协议解析模块只管Modbus帧校验、业务分发模块只管数据路由。现在即使Socket层因信号问题频繁重连业务模块仍能用本地缓存维持30秒心跳上报。提示判断模块是否合理就问自己——如果这个模块彻底宕机其他模块还能否以降级模式继续工作如果答案是否定的说明切割失败。2.2 内聚与耦合从天线设计到软件架构的跨域验证热搜词里出现“缝隙耦合的双极化微带贴片天线设计HFSS”这看似和软件无关实则揭示了耦合的本质耦合度衡量的是两个系统间能量/信息泄漏的难易程度。HFSS里调整缝隙宽度就是在控制电场耦合强度软件里调整模块间接口就是在控制状态泄露风险。我拿S7-1200模块化组成架构举例。PLC的CPU模块、IO模块、通信模块物理分离靠背板总线连接——这本身就是高内聚低耦合的典范。CPU模块只关心逻辑运算IO模块只管电平转换两者通过标准化地址映射交互。如果把IO驱动代码硬编码进OB1主程序就相当于把天线馈电点直接焊在辐射贴片上任何IO故障都会让CPU逻辑崩溃。再看“AC耦合电容为什么要靠近发射端放置”。在高速PCB设计中这是为了阻断直流分量、防止参考平面噪声串扰。对应到软件设计就是在模块边界设置“耦合滤波器”。比如高并发IM场景消息发送模块和在线状态模块必须解耦。我们不用直接调用OnlineStatusService.isOnline()而是通过Redis Pub/Sub广播状态变更事件接收方自行订阅。这样即使在线状态服务宕机消息发送模块仍能走本地缓存兜底就像AC电容隔直通交只让有效状态变更通过。注意低耦合不等于零耦合。完全解耦会导致系统无法协作。真正的目标是“可控耦合”——像HFSS里精确计算缝隙耦合系数那样量化模块间依赖强度。我们用“依赖倒置”原则在IM项目中定义IUserStatusProvider接口具体实现可切换Redis、本地ConcurrentHashMap甚至Mock耦合度由接口契约而非具体实现决定。2.3 并发设计不是堆线程而是建“压力缓冲区”“爬虫并发设计到底哪个好”“高并发IM”“JMeter模拟100用户并发报告”——这些热搜背后暴露出对并发的普遍误解并发数不是性能指标而是系统承受压力的刻度尺。2C4G的Pod支持多少并发答案不是查文档而是做压力实验当JVM堆内存使用率突破75%、GC暂停时间超过200ms、Redis连接池耗尽时并发数就是临界值。我处理过一个爬虫项目原设计用100个线程同步抓取结果DNS解析超时导致线程全部卡死。重构时引入三级缓冲第一级是URL队列用RabbitMQ第二级是Worker进程池固定20个进程每个进程内用协程并发请求第三级是结果缓存本地LevelDBRedis双写。这样当某个网站封IP时只影响单个Worker进程其他进程照常运行就像多级缓冲罐的压力-液位耦合模型——每级缓冲吸收不同频段的波动避免压力直接冲击核心模块。实操心得并发设计的核心是“异步化缓冲化”。Java里用CompletableFuture链式编排替代Future.get()阻塞Python爬虫用aiohttpasyncio而非requests甚至S7-1200的FB块调用也要避免在循环中反复读写同一DB块改用临时变量暂存中间结果减少PLC扫描周期内的总线争用。3. 软件设计七步法从需求到部署的完整决策链条3.1 第一步用“失败场景清单”替代功能列表传统需求文档罗列“用户能注册、能登录、能发消息”。但设计真正开始于问“当XX发生时系统该如何应对”我们为IM项目列出失败场景清单支付宝回调超时外部依赖失败Redis集群脑裂中间件故障某个用户连续发送100条垃圾消息恶意攻击网络分区导致部分节点失联分布式一致性破坏每条失败场景都对应一个设计决策→ 对应回调超时引入本地事务表定时补偿任务避免强依赖外部系统→ 对应Redis脑裂采用Redis Sentinel自动故障转移客户端配置readFromSLAVE→ 对应垃圾消息在网关层用Guava RateLimiter限流阈值设为5次/秒超限直接返回429→ 对应网络分区消息投递改用最终一致性用Kafka保证至少一次投递。注意这步必须由开发、测试、运维共同参与。我曾让测试同学用JMeter制造Redis连接池耗尽场景结果发现原设计中所有DAO层都未设置超时导致线程池被占满。这个发现直接推动我们在HikariCP配置中加入connection-timeout3000。3.2 第二步模块化切分——按“变化频率”而非“功能相似性”很多人按“用户模块、订单模块、商品模块”切分结果用户密码策略变更要改三个模块。正确做法是按变化原因切分。我们重新梳理IM系统不变的部分TCP连接管理、心跳保活、消息序列化用Protobuf缓慢变化的部分用户关系链关注/拉黑、群组管理成员增删快速变化的部分消息内容审核规则、推送渠道配置APNs/华为Push、计费策略于是划分为Connection Core模块纯Socket管理无业务逻辑用Netty实现Graph Service模块封装用户关系图谱提供isFriend()等原子接口Policy Engine模块规则引擎驱动审核规则用Drools DSL编写热更新无需重启。这种切分让迭代效率飙升上周运营要求新增“敏感词实时屏蔽”只需修改Policy Engine的DSL规则Connection Core和Graph Service完全不受影响。3.3 第三步接口契约设计——用“错误码字典”代替模糊描述“用户登录接口返回错误信息”这种描述毫无价值。我们为每个接口定义精确契约POST /api/v1/login Request: { phone: 138****1234, captcha: abcd } Response 200: { token: eyJhb..., expires_in: 3600 } Response 400 (BAD_REQUEST): { code: LOGIN_001, msg: 手机号格式错误 } Response 401 (UNAUTHORIZED): { code: LOGIN_002, msg: 验证码错误 } Response 429 (TOO_MANY_REQUESTS): { code: LOGIN_003, msg: 请求过于频繁请1分钟后重试 }关键在错误码体系LOGIN_001表示输入校验失败LOGIN_002表示业务逻辑失败LOGIN_003表示系统保护机制触发。前端根据code做差异化处理——001弹输入框提示002跳转到验证码页003显示倒计时。这比返回笼统的“登录失败”少80%的客诉。实操技巧用Swagger Codegen自动生成各语言SDK确保前后端错误码解析逻辑一致。我们曾发现iOS客户端把LOGIN_002当成网络错误重试导致验证码被刷爆根源就是SDK未同步更新错误码枚举。3.4 第四步数据模型设计——先画“状态迁移图”再建表“数据库并发锁”热搜暴露痛点很多人直接建user表然后在update语句里加for update结果高并发下死锁频发。正确顺序是画用户状态迁移图CREATED → ACTIVATED → FROZEN → DELETED每个箭头标注触发条件如“管理员操作”“连续输错密码5次”根据状态流转设计字段status TINYINT NOT NULL COMMENT 1:CREATED,2:ACTIVATED...status_updated_at DATETIME NOT NULLversion INT NOT NULL DEFAULT 0 COMMENT 乐观锁版本号关键操作用状态机校验UPDATE user SET status2, status_updated_atNOW(), versionversion1 WHERE id123 AND status1 AND version5;如果影响行数为0说明状态已被其他线程修改业务层捕获异常后重试或告警。这样设计后JMeter压测1000并发登录MySQL死锁率从12%降至0.3%。3.5 第五步并发控制——分层防御拒绝“一把梭”高并发场景必须分层设防像多级缓冲罐一样逐级衰减压力层级技术方案防御目标实测效果接入层Nginx限流limit_req拦截恶意刷量过滤83%无效请求网关层Spring Cloud Gateway Sentinel控制API粒度QPS单接口峰值限制500/s服务层Redis分布式锁RedLock保护库存扣减等临界区库存超卖率0.001%数据层MySQL行锁乐观锁避免UPDATE冲突事务回滚率2%特别注意不要在所有地方都用Redis锁。我们曾把用户登录成功后的token写入Redis的操作也加锁结果锁竞争成为性能瓶颈。后来改为登录成功后异步写Redis用Kafka主流程只生成token并返回响应时间从120ms降到35ms。3.6 第六步缓存设计——明确“缓存什么”比“用什么缓存”更重要“Redis缓存设计与高并发”热搜常陷入工具崇拜。但决定缓存效果的首先是数据特性分析数据类型更新频率一致性要求推荐方案示例用户基本信息低1次/天强Redis DB双写用户昵称、头像URL商品库存高秒级变动弱本地缓存Caffeine 过期刷新库存数量TTL10s热门话题列表中小时级中Redis 延迟双删话题ID列表更新后延迟1s删缓存我们有个血泪教训曾把订单详情全量缓存到Redis结果退款操作后忘记删缓存用户看到已退款订单仍显示“待支付”。后来改为只缓存订单状态字段用Redis Hash存储退款时精准更新status字段避免全量缓存失效带来的穿透风险。3.7 第七步部署验证——用“混沌工程”检验设计韧性设计完成不等于结束。我们用Chaos Mesh在测试环境注入故障模拟Redis实例宕机验证Sentinel切换时间和客户端重连逻辑模拟网络延迟在Service A到Service B的网络注入200ms延迟观察熔断器是否触发模拟CPU飙高给订单服务Pod注入CPU压力检查限流规则是否生效某次测试发现当MySQL主库延迟超过500ms时HikariCP连接池未及时剔除慢连接导致后续请求排队。这促使我们在数据源配置中增加hikari: connection-timeout: 3000 validation-timeout: 3000 leak-detection-threshold: 60000 # 检测连接泄漏提示混沌实验必须在预发布环境进行且每次只注入一个故障。我们曾同时模拟Redis宕机网络延迟结果系统完全不可用无法定位根因白白浪费两天排查时间。4. 八大高频设计陷阱与破局实录4.1 陷阱一把“模块化”等同于“建包目录”现象项目里建了com.xxx.user、com.xxx.order包但UserServiceImpl里直接new OrderService()还调用其private方法。破局模块化是编译期隔离。我们强制要求每个模块打成独立jar包模块间只能通过Maven依赖引用禁止跨包调用使用JPMSJava Platform Module System或OSGi定义模块边界效果当订单模块升级Spring Boot 3.x时用户模块因未依赖其jar包完全不受影响。4.2 陷阱二用“高并发”掩盖设计缺陷现象JMeter压测QPS上不去第一反应是加机器、调线程数而不是看设计。实录某次压测发现消息发送接口TP99高达2.3秒。排查发现每个请求都同步调用三次外部HTTP服务用户资料、群信息、权限校验。我们重构为用CompletableFuture.allOf()并行调用设置统一超时300ms超时返回默认值外部服务结果用本地Caffeine缓存TTL5分钟TP99降至180ms服务器资源消耗下降40%。4.3 陷阱三忽视“物理耦合”带来的隐性成本现象AD16软件设计PCB时工程师只关注电气性能忽略生产可制造性。破局我们制定《PCB设计耦合检查清单》差分线间距≥4倍线宽防串扰AC耦合电容必须距BGA焊盘≤2mm减小寄生电感所有高速信号换层处添加回流地孔降低阻抗突变这条规则让PCB一次通过率从65%提升至92%返工成本降低70%。4.4 陷阱四把“设计原则”当教条不量化验证现象盲目追求“开闭原则”为所有可能扩展点预留接口导致代码臃肿。实录IM项目初期为“未来支持微信小程序登录”预留OAuth2Adapter接口结果两年过去从未使用却增加了30%的维护成本。后来改为只为已确认的扩展需求如当前需支持Apple ID实现适配器用Feature Flag控制新登录方式开关每季度评审未使用的扩展点及时移除4.5 陷阱五数据库设计脱离业务语义现象为“高性能”强行分库分表结果关联查询变地狱。破局我们坚持“先单库再分片”原则初始用MySQL单库表数据量500万行不考虑分片分片键必须是业务主键如user_id避免跨分片JOIN用ShardingSphere代理层业务代码无感知某次迁移时将原单库拆为8个分片仅修改数据源配置业务代码零改动。4.6 陷阱六缓存穿透/击穿/雪崩不分场景乱用现象所有缓存都加空值缓存随机过期时间结果内存暴涨。实录用户中心接口恶意请求不存在的手机号如13800138000。我们针对性解决布隆过滤器拦截99.99%的非法手机号内存占用1MB对合法但不存在的用户缓存空对象TTL2分钟热点key加互斥锁避免缓存重建时的雪崩缓存命中率从78%升至99.2%Redis内存使用下降35%。4.7 陷阱七忽略“非功能性需求”的设计权重现象设计文档只写功能不提性能、安全、可观测性。破局我们在每个模块设计文档中强制包含性能契约接口P95200ms错误率0.1%安全契约所有输入参数经Hibernate Validator校验SQL用MyBatis参数绑定可观测性契约每个HTTP接口记录traceId关键路径打点如“消息入队耗时”这让我们在生产问题定位时平均MTTR平均修复时间从47分钟降至8分钟。4.8 陷阱八设计文档与代码脱节现象UML图画得精美但代码早已面目全非。破局推行“代码即文档”实践用PlantUML嵌入JavaDocIDE可实时渲染类图关键算法用AsciiDoc写伪代码注释CI流水线加入ArchUnit测试校验包依赖规则如user包不得依赖payment包某次重构时ArchUnit自动检测出违规依赖避免了潜在的循环引用。5. 从S7-1200到高并发IM跨领域设计思维迁移指南5.1 PLC模块化架构对微服务设计的启示S7-1200的CPU、IO、通信模块物理分离本质是硬件级的模块化。这给我们三个启发接口标准化优先PLC模块间靠PROFINET协议通信软件模块间必须定义清晰API契约OpenAPI 3.0规范故障域隔离IO模块损坏不影响CPU运算微服务中订单服务宕机不应阻塞用户登录热插拔能力S7-1200可在线更换IO模块对应到K8s中用滚动更新就绪探针实现服务无感升级我们迁移若依微服务到阿里云ECS时严格遵循此思路每个微服务独立部署通过Nacos服务发现登录服务配置就绪探针/actuator/health确保启动完成才接入流量数据库连接池配置initialSize5避免启动时连接风暴5.2 HFSS天线耦合仿真到软件依赖分析“缝隙耦合的双极化微带贴片天线设计HFSS”中工程师通过调整缝隙参数控制耦合度。同样软件中可通过工具量化模块耦合用JDepend分析Java包依赖生成不稳定度I Fan-out / (Fan-in Fan-out)I值越接近1包越不稳定依赖多、被依赖少如utils包I0.92应拆分用SonarQube检测循环依赖强制I值0.7某次分析发现order包和payment包I值均为0.85且相互依赖。我们引入transaction中台服务将两者解耦I值降至0.3以下。5.3 多级缓冲罐模型到高并发系统设计“多级缓冲罐压力-液位耦合模型推导”揭示了缓冲的本质不同层级吸收不同频率的波动。对应到IM系统缓冲层级技术实现吸收波动类型容量设计一级缓冲瞬时Netty EventLoop网络抖动毫秒级每核1个EventLoop二级缓冲短时Kafka消息队列服务短暂不可用秒级分区数消费者数×2三级缓冲长时本地LevelDBRedis集群故障分钟级容量日均消息量×1.5当Redis集群因网络分区不可用时消息先写入Kafka消费端从Kafka拉取再降级写入LevelDB保证消息不丢失。5.4 TFC膜系软件设计到规则引擎落地“怎样用TFC膜系软件设计反射、透过图形”中工程师通过调整膜层厚度、折射率来优化光学性能。软件设计中业务规则就是“膜层”执行引擎就是“基底”。我们用Drools实现IM消息审核规则文件message-rules.drl定义rule 敏感词拦截 when $m: Message(content matches .*(赌博|毒品).*) then $m.setBlocked(true); $m.setReason(含敏感词); end规则热加载修改drl文件后调用KieContainer.update()即时生效规则版本管理每次发布生成规则快照支持回滚运营人员无需开发介入2小时内上线新审核策略。5.5 Maxwell电磁阀涡流场仿真到分布式锁选型“maxwell电磁阀涡流场与workbench稳态热系统耦合”强调多物理场协同。分布式锁设计同样需考虑多维度耦合维度传统Redis锁我们改进方案解决问题一致性RedLock复杂难维护用Redisson MultiLock ZooKeeper协调避免脑裂导致锁失效性能每次加锁需3次网络往返本地缓存锁状态Caffeine TTL续期QPS提升5倍可观测性黑盒操作每次锁操作记录traceId、持有者、超时时间故障时快速定位锁竞争点压测显示改进后锁获取成功率从92%升至99.99%平均耗时从8ms降至0.3ms。5.6 AD16差分线设计到微服务通信优化“如何在AD16软件设计的pcb中手动布差分线”强调阻抗匹配。微服务间gRPC通信同样需“阻抗匹配”物理层匹配gRPC使用HTTP/2需Nginx配置http2_max_field_size 64k协议层匹配ProtoBuf定义message时用reserved预留字段避免版本不兼容应用层匹配客户端设置合理的keepalive_time30秒和keepalive_timeout10秒我们曾因Nginx未开启HTTP/2导致gRPC流式响应被截断排查三天才发现是协议不匹配。5.7 Java并发编程到PLC梯形图优化“java并发编程实战 aqs”中的AQSAbstractQueuedSynchronizer是并发基石。S7-1200梯形图中也有类似机制自锁电路类似ReentrantLock用SET/RESET指令实现互斥定时器中断类似ScheduledExecutorService用TONR定时器触发周期任务状态机编程用SCR指令实现有限状态机避免传统继电器逻辑的竞态我们将IM消息状态机SENDING→SENT→ACKED映射为PLC的SCR段用DB块存储状态FB块封装状态转换逻辑使PLC程序具备和Java服务同等的可维护性。5.8 大模型并发请求到API网关设计“大模型并发请求分别是什么意思”揭示了请求的多样性。API网关必须区分处理请求类型特征网关处理策略大模型推理大Payload10MB、长耗时30s单独路由到GPU集群超时设为120sIM消息小Payload1KB、低延迟200ms路由到CPU集群启用HTTP/2多路复用爬虫采集高频次、低权重限流IP信誉库低于阈值直接429我们用Spring Cloud Gateway的Predicate组合实现- id: llm-route uri: lb://llm-service predicates: - Path/api/v1/llm/** - HeaderContent-Length, 10000000- - Weightllm, 806. 设计说明书实例高并发IM消息服务V2.06.1 文档结构——拒绝废话只留决策证据传统设计说明书充斥“本系统采用B/S架构”等废话。我们的文档只包含设计决策表记录每个关键选择及依据决策项方案依据验证方式消息存储MySQL分库分表Redis缓存单表数据量预计年增2亿MySQL分片成熟ShardingSphere压测报告在线状态Redis Set心跳续约支持百万级在线SET操作O(1)Redis Benchmark结果消息投递Kafka本地LevelDB兜底Kafka保证至少一次LevelDB防Redis故障Chaos Mesh故障注入报告接口契约表精确到字段级接口字段类型必填示例错误码POST /msg/sendcontentstring是helloMSG_001内容为空to_user_idlong是12345MSG_002用户不存在部署拓扑图用Mermaid语法但此处禁用改用文字描述用户端 → NginxSSL终止限流 → Spring Cloud Gateway路由鉴权 → 消息服务集群K8s Deployment → Kafka集群 → MySQL分片集群 → Redis集群6.2 模块划分——用代码结构证明设计模块目录树体现设计思想im-service/ ├── core/ # 核心能力连接管理、协议解析Netty ├── domain/ # 领域模型Message、User、GroupDDD聚合根 ├── application/ # 应用层MessageService协调领域对象 ├── infrastructure/ # 基础设施KafkaProducer、RedisTemplate封装 ├── adapter/ # 外部适配AlipayCallbackAdapter、WeChatLoginAdapter └── config/ # 配置ShardingSphere、Redisson、Kafka关键约束application层可依赖domain和infrastructure但domain层绝对禁止依赖infrastructure——用ArchUnit测试保障。6.3 并发设计详述——给出可执行的参数不写“采用高并发设计”写具体参数连接池配置HikariCPmaximum-pool-size202C4G Podconnection-timeout3000Redissonthreads16netty-threads32lock-watchdog-timeout60000限流阈值登录接口QPS500按2C4G Pod CPU 70%负载反推消息发送QPS2000Kafka吞吐量测试结果缓存策略用户信息Redis TTL30分钟本地Caffeine TTL10分钟群成员列表Redis Hash存储单次查询最多100人防大Key6.4 安全设计——写明每条防护措施传输安全Nginx强制HTTPSTLSv1.2禁用弱加密套件认证安全JWT Token签发时加入设备指纹UAIP哈希Token有效期2小时授权安全RBAC模型权限校验在Gateway层完成服务层只做数据级校验防攻击SQL注入MyBatis参数绑定Hibernate ValidatorXSS前端Vue模板自动转义后端返回JSON不渲染HTMLCC攻击Nginx limit_req zonecc burst10 nodelay6.5 监控告警——定义黄金指标不写“完善监控体系”写具体指标指标计算方式告警阈值告警渠道消息投递成功率sum(rate(kafka_producer_request_total{topic~msg.*}[5m])) by (code)99.5%企业微信电话Redis连接池使用率redis_connected_clients / redis_config_maxclients90%企业微信JVM GC暂停时间jvm_gc_pause_seconds_max{actionend of major GC}200ms电话MySQL慢查询mysql_global_status_slow_queries10次/分钟企业微信6.6 回滚方案——精确到命令行不写“准备回滚预案”写可执行步骤数据库回滚# 执行逆向SQL已预置在flyway中 flyway repair flyway migrate -target2.1.0服务回滚# K8s滚动回退到上一版本 kubectl rollout undo deployment/im-service --to-revision12缓存清理# 清理V2.0新增的缓存key redis-cli --scan --pattern msg:*:v2* | xargs redis-cli del6.7 设计验证——用数据说话最后附上设计验证报告摘要压力测试JMeter模拟5000并发用户持续30分钟消息发送TP9
返回列表