Skip to content

Commit 920e6f3

Browse files
committed
更新README
1 parent 5d52260 commit 920e6f3

File tree

2 files changed

+42
-88
lines changed

2 files changed

+42
-88
lines changed

README.md

Lines changed: 21 additions & 44 deletions
Original file line numberDiff line numberDiff line change
@@ -13,83 +13,60 @@
1313

1414
1. 客户端初始化与发送逻辑顺序问题
1515

16-
现象 :编写测试代码时发现客户端在未完成初始化时就执行发送逻辑,导致空指针异常
16+
现象 :测试时客户端未完成初始化即执行发送逻辑,引发空指针异常
1717

18-
原因分析
18+
问题本质 :协程调度顺序不确定导致
1919

20-
代码中多处使用协程并发执行,由于协程调度顺序的不确定性,导致以下执行顺序错误:
20+
- 连接未初始化完成
21+
- 发送逻辑提前执行
2122

22-
- 客户端连接尚未完成初始化
23+
解决方案 :
2324

24-
- 需要连接对象的发送逻辑已提前执行
25+
- 引入 ready 管道同步协程
26+
- 调整关键协程启动顺序
27+
- 非关键路径保留并发
2528

26-
解决方案
29+
经验总结
2730

28-
- 引入ready管道作为协程同步信号
29-
30-
- 调整关键节点的协程启动顺序
31-
32-
- 保留必要的并发逻辑(非关键路径保持并发执行)
31+
- 执行并发逻辑需确保依赖实例初始化完整
3332

3433
2. 高并发场景下的服务端稳定性问题
3534

36-
现象 :压力测试时出现端口耗尽导致客户端异常断开,进而引发服务端崩溃
35+
现象 :压力测试时端口耗尽导致客户端断连,服务端崩溃
3736

3837
问题本质 :
3938

4039
- 连接异常处理机制缺陷
41-
42-
- 并发协程间的资源竞争
43-
44-
- 连接关闭时的任务执行完整性问题
40+
- 并发协程资源竞争
41+
- 任务执行完整性不足
4542

4643
改进方案 :
4744

4845
- 状态管理 :
4946

50-
- 新增原子变量标记连接状态
47+
- 原子变量标记连接状态
5148

52-
- 使用sync.WaitGroup跟踪任务执行
49+
- sync.WaitGroup 跟踪任务
5350

5451
- 执行流程优化 :
5552

5653
```
57-
// 连接异常处理流程
58-
reader检测异常 -> 设置关闭状态 -> 触发stop流程 ->
59-
wg.Wait等待已接收任务 -> workpool继续执行遗留任务 ->
60-
writer无脑发送(忽略错误) -> wg.Done -> 清理资源(关闭msg管道等)
54+
reader异常 -> 设置关闭状态 -> stop流程 -> wg.Wait -> workpool处理遗留任务 -> writer尽力发送 -> wg.Done -> 清理资源
6155
```
6256
6357
- 容错设计 :
64-
- 任务提交阶段不进行连接状态检查
65-
66-
- 写协程统一处理发送异常
67-
68-
- 提供用户级熔断接口(通过handler提前return实现)
58+
- 任务提交不检查连接状态
59+
- 写协程统一处理异常
60+
- 提供用户级熔断接口
6961
7062
- 性能考量 :
7163
72-
- 采用"尽力而为"策略处理异常连接的任务
73-
74-
- 通过wg.Wait()保证已接收任务执行完毕
75-
76-
- 优雅关闭时确保:
77-
78-
- reader先行退出
79-
80-
- writer处理完消息队列
81-
82-
- 管道关闭时无残留数据
64+
- "尽力而为"处理异常任务
65+
- 优雅关闭分阶段执行(停读 -> 停写 -> 清理)
8366
8467
经验总结:
8568
86-
- 协程同步应优先使用简单同步原语
87-
8869
- 资源释放需保证执行完整性
89-
90-
- 异常处理应区分系统级和业务级容错
91-
92-
- 避免过度设计,当前方案在代码复杂度和功能需求间取得平衡
9370
9471
3. 服务端异步启动后 stop 在大量并发连接下的死锁问题
9572

log.md

Lines changed: 21 additions & 44 deletions
Original file line numberDiff line numberDiff line change
@@ -2,83 +2,60 @@
22

33
1. 客户端初始化与发送逻辑顺序问题
44

5-
现象 :编写测试代码时发现客户端在未完成初始化时就执行发送逻辑,导致空指针异常
5+
现象 :测试时客户端未完成初始化即执行发送逻辑,引发空指针异常
66

7-
原因分析
7+
问题本质 :协程调度顺序不确定导致
88

9-
代码中多处使用协程并发执行,由于协程调度顺序的不确定性,导致以下执行顺序错误:
9+
- 连接未初始化完成
10+
- 发送逻辑提前执行
1011

11-
- 客户端连接尚未完成初始化
12+
解决方案 :
1213

13-
- 需要连接对象的发送逻辑已提前执行
14+
- 引入 ready 管道同步协程
15+
- 调整关键协程启动顺序
16+
- 非关键路径保留并发
1417

15-
解决方案
18+
经验总结
1619

17-
- 引入ready管道作为协程同步信号
18-
19-
- 调整关键节点的协程启动顺序
20-
21-
- 保留必要的并发逻辑(非关键路径保持并发执行)
20+
- 执行并发逻辑需确保依赖实例初始化完整
2221

2322
2. 高并发场景下的服务端稳定性问题
2423

25-
现象 :压力测试时出现端口耗尽导致客户端异常断开,进而引发服务端崩溃
24+
现象 :压力测试时端口耗尽导致客户端断连,服务端崩溃
2625

2726
问题本质 :
2827

2928
- 连接异常处理机制缺陷
30-
31-
- 并发协程间的资源竞争
32-
33-
- 连接关闭时的任务执行完整性问题
29+
- 并发协程资源竞争
30+
- 任务执行完整性不足
3431

3532
改进方案 :
3633

3734
- 状态管理 :
3835

39-
- 新增原子变量标记连接状态
36+
- 原子变量标记连接状态
4037

41-
- 使用sync.WaitGroup跟踪任务执行
38+
- sync.WaitGroup 跟踪任务
4239

4340
- 执行流程优化 :
4441

4542
```
46-
// 连接异常处理流程
47-
reader检测异常 -> 设置关闭状态 -> 触发stop流程 ->
48-
wg.Wait等待已接收任务 -> workpool继续执行遗留任务 ->
49-
writer无脑发送(忽略错误) -> wg.Done -> 清理资源(关闭msg管道等)
43+
reader异常 -> 设置关闭状态 -> stop流程 -> wg.Wait -> workpool处理遗留任务 -> writer尽力发送 -> wg.Done -> 清理资源
5044
```
5145
5246
- 容错设计 :
53-
- 任务提交阶段不进行连接状态检查
54-
55-
- 写协程统一处理发送异常
56-
57-
- 提供用户级熔断接口(通过handler提前return实现)
47+
- 任务提交不检查连接状态
48+
- 写协程统一处理异常
49+
- 提供用户级熔断接口
5850
5951
- 性能考量 :
6052
61-
- 采用"尽力而为"策略处理异常连接的任务
62-
63-
- 通过wg.Wait()保证已接收任务执行完毕
64-
65-
- 优雅关闭时确保:
66-
67-
- reader先行退出
68-
69-
- writer处理完消息队列
70-
71-
- 管道关闭时无残留数据
53+
- "尽力而为"处理异常任务
54+
- 优雅关闭分阶段执行(停读 -> 停写 -> 清理)
7255
7356
经验总结:
7457
75-
- 协程同步应优先使用简单同步原语
76-
7758
- 资源释放需保证执行完整性
78-
79-
- 异常处理应区分系统级和业务级容错
80-
81-
- 避免过度设计,当前方案在代码复杂度和功能需求间取得平衡
8259
8360
3. 服务端异步启动后 stop 在大量并发连接下的死锁问题
8461

0 commit comments

Comments
 (0)