File tree Expand file tree Collapse file tree 2 files changed +42
-88
lines changed
Expand file tree Collapse file tree 2 files changed +42
-88
lines changed Original file line number Diff line number Diff line change 1313
14141 . 客户端初始化与发送逻辑顺序问题
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
34332 . 高并发场景下的服务端稳定性问题
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
94713. 服务端异步启动后 stop 在大量并发连接下的死锁问题
9572
Original file line number Diff line number Diff line change 22
331 . 客户端初始化与发送逻辑顺序问题
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
23222 . 高并发场景下的服务端稳定性问题
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
83603. 服务端异步启动后 stop 在大量并发连接下的死锁问题
8461
You can’t perform that action at this time.
0 commit comments