RPC远程过程调用,二进制封装,提供高吞吐低延迟的高性能RPC框架
|
# RPC 釿ž„需求
## 1. èƒŒæ™¯ä¸Žç›®æ ‡
### 背景
NewLife.Remoting 已有æˆç†Ÿçš„ RPC 通信架构(ApiClient/ApiServerï¼‰ï¼Œæ”¯æŒ TCP/UDP/WebSocket 多å议长连接通信ã€SRMP 二进制åè®®ã€JSON ç¼–è§£ç ã€‚ä½†ä¸Žä¸»æµ RPC 框架(如 gRPC)相比,ä»ç¼ºå°‘以下能力:
- Server-Streaming æµå¼è°ƒç”¨ï¼ˆæœåŠ¡ç«¯æŒç»æŽ¨é€å¤šæ¡å“应)
- 通用元数æ®/上下文é€ä¼ 机制(当å‰ä»…支æŒå•一 Token å—æ®µï¼‰
- 高并å‘大å—符串场景å˜åœ¨ç¨³å®šæ€§é—®é¢˜ï¼ˆBenchmark 32 å¹¶å‘ 2000 å—符 N/A)
### ç›®æ ‡
1. **æµå¼è°ƒç”¨**ï¼šæ”¯æŒ Controller 返回 `IAsyncEnumerable<T>`,æœåŠ¡ç«¯æŒç»æŽ¨é€å¤šæ¡å“应,客户端æµå¼æŽ¥æ”¶ã€‚SRMP äºŒè¿›åˆ¶æµ + HTTP 自动兼容 SSE
2. **元数æ®ä¼ 递**:在 Token 之外支æŒä»»æ„键值对é€ä¼ (如 TraceIdï¼‰ï¼Œä¸æ”¹ IMessage 接å£
3. **性能修å¤**:解决高并å‘大å—符串 Benchmark 失败问题,优化çƒè·¯å¾„分é…
4. **文档完善**:更新 README å’Œ Doc 文档,çªå‡º RPC æ ¸å¿ƒäº®ç‚¹
## 2. 用户角色
| 角色 | 说明 | æ ¸å¿ƒè¯‰æ±‚ |
|------|------|---------|
| åŽç«¯å¼€å‘者 | 使用 Remoting 构建微æœåŠ¡ | æµå¼æŽ¨é€æ•°æ®ã€ä¼ 递链路追踪 ID |
| IoT 设备开å‘者 | 通过 Remoting 连接设备 | æµå¼ä¸ŠæŠ¥/䏋呿•°æ® |
| 系统架构师 | 评估 RPC 框架选型 | å¯¹æ ‡ gRPC,了解差异和优势 |
## 3. 功能需求
### 3.1 æµå¼è°ƒç”¨ (Server-Streaming)
- **æè¿°**:Controller Action å¯è¿”回 `IAsyncEnumerable<T>`,æœåŠ¡ç«¯æŒç»æŽ¨é€å¤šæ¡å“åº”å¸§ï¼Œå®¢æˆ·ç«¯é€æ¡æŽ¥æ”¶ç›´åˆ°ç»“æŸæ ‡è®°
- **用户故事**:作为åŽç«¯å¼€å‘者,我希望 Controller èƒ½é€æ¡æŽ¨é€æ—¥å¿—/进度数æ®ï¼Œä»¥ä¾¿å®¢æˆ·ç«¯å®žæ—¶å±•示而ä¸å¿…ç‰å…¨éƒ¨å®Œæˆ
- **验收æ¡ä»¶**:
- [ ] TCP SRMP åè®®æ”¯æŒ Streaming Flag å’Œ EndOfStream æ ‡è®°
- [ ] Controller 返回 `IAsyncEnumerable<T>` 时自动æµå¼æŽ¨é€
- [ ] `ApiClient.InvokeStreamAsync<T>()` 返回 `IAsyncEnumerable<T>`ï¼Œæ”¯æŒ `CancellationToken` ä¸é€”å–æ¶ˆ
- [ ] HTTP 模å¼è‡ªåЍ兼容 SSE (`text/event-stream`)
- [ ] 客户端æ–开连接时æœåŠ¡ç«¯è‡ªåŠ¨åœæ¢æžšä¸¾
- **优先级**:Must
### 3.2 元数æ®/Headers ä¼ é€’
- **æè¿°**:`ApiClient.Headers` å—å…¸åœ¨æ¯æ¬¡è°ƒç”¨æ—¶è‡ªåЍé€ä¼ 键值对,æœåŠ¡ç«¯å¯é€šè¿‡ `ControllerContext` 读å–
- **用户故事**:作为åŽç«¯å¼€å‘者,我希望在 RPC 调用ä¸è‡ªåŠ¨ä¼ é€’ TraceId,以便分布å¼é“¾è·¯è¿½è¸ª
- **验收æ¡ä»¶**:
- [ ] `ApiClient.Headers` 属性(`IDictionary<String, String?>`)
- [ ] æ¯æ¬¡ `InvokeAsync` 自动注入 Headers åˆ°å‚æ•°å—å…¸
- [ ] è‡ªåŠ¨æ³¨å…¥å½“å‰ `Tracer?.TraceId`(若已é…置)
- [ ] æœåŠ¡ç«¯ä»Ž `ControllerContext.Current.Items["Headers"]` å¯è¯»å–
- [ ] 䏿”¹ `IMessage` 接å£ï¼Œä¸ç ´åå议兼容
- **优先级**:Must
### 3.3 é«˜å¹¶å‘æ€§èƒ½ä¿®å¤
- **æè¿°**:定ä½å¹¶ä¿®å¤ Benchmark ä¸ 32 å¹¶å‘ 2000 å—符场景失败问题,优化çƒè·¯å¾„内å˜åˆ†é…
- **用户故事**:作为系统架构师,我希望 Remoting 在高并å‘大消æ¯åœºæ™¯ä¸‹ç¨³å®šè¿è¡Œ
- **验收æ¡ä»¶**:
- [ ] Benchmark 32 å¹¶å‘ 2000 å—符场景通过(ä¸å† N/A)
- [ ] çƒè·¯å¾„分é…优化(Encoder 预计算长度ã€SpanWriter åˆå¹¶å†™å…¥ï¼‰
- [ ] å‰åŽ TPS å¯¹æ¯”æ— é€€åŒ–
- **优先级**:Must
### 3.4 文档与 README 更新
- **æè¿°**:更新 README 展示 RPC æ ¸å¿ƒäº®ç‚¹å’Œå¿«é€Ÿç”¨ä¾‹ï¼Œæ›´æ–° Doc 文档覆盖新功能
- **用户故事**:作为新用户,我希望通过 README 5 分钟内了解 Remoting RPC çš„æ ¸å¿ƒèƒ½åŠ›å¹¶è·‘é€šç¬¬ä¸€ä¸ªç¤ºä¾‹
- **验收æ¡ä»¶**:
- [ ] README 顶部强化 RPC æ ¸å¿ƒäº®ç‚¹ + 最简 5 行示例
- [ ] 新增æµå¼è°ƒç”¨ç« 节(å«ä»£ç 示例)
- [ ] 新增元数æ®ä¼ 递å°èŠ‚
- [ ] Doc 文档更新(SRMP åè®®ã€ç»„ä»¶å›¾ã€æ—¶åºå›¾ã€å¯¹æ¯”表)
- [ ] 代ç 示例å¯å¤åˆ¶ç²˜è´´è¿è¡Œ
- **优先级**:Must
## 4. éžåŠŸèƒ½éœ€æ±‚
- **性能**:æµå¼è°ƒç”¨é¦–帧延迟与普通 RPC 一致;åŽç»å¸§å»¶è¿Ÿ < 1ms(内网 TCP);32 å¹¶å‘ 2000 å—符ä¸å¤±è´¥
- **安全**:æµå¼è°ƒç”¨ä»éœ€é€šè¿‡ Token 认è¯ï¼ˆé¦–帧验è¯ï¼ŒåŽç»å¸§å¤ç”¨ä¼šè¯ï¼‰
- **兼容性**:éµå¾ªçŽ°æœ‰æ¡†æž¶å…¼å®¹æ€§ï¼ˆnet45~net10.0);旧客户端å¯è¿žæŽ¥æ–°æœåŠ¡ç«¯ï¼ˆä¸å‘é€ Streaming 请求å³å¯ï¼‰ï¼›ä¸æ”¹ `IMessage` ç‰ NewLife.Core 基础接å£
## 5. 边界与约æŸ
- **ä¸åšä»€ä¹ˆ**:
- ä¸å®žçŽ°å®¢æˆ·ç«¯æµå¼ï¼ˆClient Streaming)ã€åŒå‘æµå¼ï¼ˆBidirectional Streaming)——仅 Server-Streaming
- ä¸å¼•å…¥ Protobuf ç‰æ–°åºåˆ—化方案
- 䏿”¹ `IMessage` / `IActionFilter` / 现有负载å‡è¡¡æœºåˆ¶
- 䏿–°å¢žå¤–部 NuGet ä¾èµ–
- **已知é™åˆ¶**:æµå¼è°ƒç”¨ä¸æ”¯æŒ UDP(UDP å¤©ç„¶æ— è¿žæŽ¥ï¼Œæµå¼è¯ä¹‰ä¸é€‚åˆï¼‰
- **技术债务**:`EnsureOwnedPayload` 在 32 å¹¶å‘下å¯èƒ½å˜åœ¨ ArrayPool 竞争
## 6. 术è¯è¡¨
| æœ¯è¯ | 定义 |
|------|------|
| SRMP | Simple Remote Message Protocol,NewLife è‡ªç ” RPC åè®® |
| SSE | Server-Sent Events,HTTP å•呿µå¼æŽ¨é€æ ‡å‡† |
| Server-Streaming | æœåŠ¡ç«¯æµå¼è°ƒç”¨ï¼šä¸€æ¬¡è¯·æ±‚,多次å“应 |
| Headers | 元数æ®é”®å€¼å¯¹ï¼Œåœ¨ RPC 调用ä¸é€ä¼ |
| SAEA | SocketAsyncEventArgs,.NET 高性能网络 IO 模型 |
|