web 前端常用的设计模式
华智工作总结
@hz/layout + @hz/node-server技术架构
微前端架构图及核心流程解析
graph TD
subgraph 配置管理系统
M[菜单配置系统] -->|存储| MenuData
P[代理配置系统] -->|存储| ProxyRules
end
subgraph 基础服务层
Layout{{"@hz/layout"}}
NodeServer{{"@hz/node-server"}}
end
subgraph 微应用A
A1[子应用A - 端口11127]
A2[React Router配置]
A3[业务模块a/b/c]
end
subgraph 微应用B
B1[子应用B - 端口9090]
B2[React Router配置]
B3[业务模块d/e]
end
User[用户浏览器] -->|请求| NodeServer
NodeServer -->|读取| ProxyRules
Layout -->|读取| MenuData
%% 独立运行流程
A1 -->|运行时加载| Layout
B1 -->|运行时加载| Layout
Layout -->|过滤菜单| A2
Layout -->|过滤菜单| B2
%% 代理转发流程
NodeServer -->|路由匹配| ProxyRules
ProxyRules -->|/deviceManage → 9090| B1
ProxyRules -->|/appAPath → 11127| A1
%% 菜单处理流程
MenuData -->|全量菜单数据| Layout
A2 -->|仅保留a/b/c| A3
B2 -->|仅保留d/e| B3
%% 集成部署
Gateway[统一网关] --> NodeServer
CDN[静态资源CDN] --> User
个人面试模拟
第一题:架构设计(结合@hz/node-server项目)
Q:您将单实例QPS从1200提升至6500的核心手段是「流式代理+cluster集群」,流式代理如何解决高并发下的内存瓶颈?请对比描述传统缓冲模式(buffer)与流式处理(stream)的内存差异
A:
流式代理 vs 传统缓冲模式的内存差异:
- 内存占用高:高并发场景下,传统缓冲模式(Buffer)会先将完整请求/响应体加载到内存再处理,当并发量高或传输大文件时,内存消耗迅速攀升,可能触发频繁的垃圾回收(GC),增加延迟,还易导致内存溢出(OOM)。我们的服务单实例曾出现内存增长400MB+的问题。
- 阻塞事件循环:传统缓冲模式的大内存分配和复制操作(如拼接Buffer)会阻塞事件循环,降低整体吞吐量。
- 内存占用低:流式处理将数据分割成小块(chunks),每收到一块就立即处理并释放内存。内存中同一时间只保留一小部分数据(例如几KB到几十KB),因此:内存占用量基本恒定,与并发量、数据大小无关,可以避免大内存分配,减轻GC压力
- 低延迟处理:流式处理方案中数据接收和处理并行化
- 背压(Backpressure)控制:流式处理通过管道(pipe)自动管理数据流速(默认 16kb 缓冲区)。当处理速度跟不上接收速度时,会自动通知上游暂停发送数据,避免内存爆增
- 即使同样使用堆外内存,Stream 通过 分块处理 + 背压控制 + 零复制机制 实现常数级内存占用(O(1)),而 Buffer 模式是线性增长(O(n)),这才是高并发性能差异的本质原因。
解决思路:
- 采用流式处理(Stream)将数据分割为数据块(chunk) 逐段处理,配合背压机制控制处理速度。