feat: 会话感知收发 ISessionAwareStreamConnection - #42
Merged
Conversation
added 3 commits
August 28, 2026 19:59
- 新公共 API:CurrentSessionId(每次 TCP 会话分配、单调不复用,无会话=0)、 SendInSessionAsync(整帧写入本机 socket 才完成;会话失效即 SessionExpiredException 且绝不跨会话重放)、GetSessionMessages(消息带会话编号的接收视图)、 SessionExpiredException / SessionMessage;能力接口不动 IStreamConnection(第三方 实现者不受影响) - 线性化(评审要点 3.2):编号分配先于 Connected 对外发布(回调/等待器可见时必为 有效值);Retry/Disconnected 发布前归零;拆除时(Retry 分支/Shutdown)立即 fault 全部挂起的会话绑定发送,不空等重连——且只在真正的拆除点 fault,StartSession 的 旧会话清理不 fault(否则误杀"Connected 已发布、任务未就绪"窗口内注册的条目, net48 线程调度慢时稳定复现,已修复并有压测覆盖) - 发送队列内部信封化(状态字 CAS:排队中→已认领/已取消/已失效三向互斥), 调用方取消的提交点=worker 认领;认领后取消不撕裂帧;普通 SendAsync/GetMessages 语义一字不改(既有测试全绿) - 双接收视图明确为二选一的竞争消费者(非广播),XML 文档与 README 说明 - 测试 12 条(真实 TCP 回环):线性化与编号生命周期/整帧写完才完成/拆除及时失败 (含队满等待中)/会话切换不重放 vs 普通发送仍续发/Dispose 收尾/取消提交点两侧/ 消息带会话编号/视图竞争非广播/独立运行等价/拆除与注册并发压测(成功帧对端必收齐) - README 双语新增"会话感知收发(高级)"章节
CI(net48) 暴露:被 worker 认领、正在写出的条目与会话拆除竞争时, 整帧恰好在取消生效前写完 → 任务成功,同样符合"整帧写入本机 socket 才完成" 的契约(本地三次都是取消先赢,纯时序)。放宽两处断言:写出中条目不悬挂、 成败皆可(失败时类型仍须合法);排队中条目仍必须失败。
- SessionSwitch 用例补上与另两处一致的断言放宽:被认领、正在写出的条目在 拆除竞争下允许"整帧恰好写完→成功"的合法结局,不悬挂即可 - RepeatedTimeoutCycles 的轮内 Connected 等待放宽到 8s(与该文件其余等待一致) - 新增 ModuleInitializer 抬高测试宿主线程池最小线程数:CI 2 核跑机上并行测试的 Thread.Sleep 停顿阻塞线程池,net48 线程注入慢(约 1 个/500ms),曾拖垮其他 测试的秒级等待——属环境性抖动,非实现问题
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment
Add this suggestion to a batch that can be applied as a single commit.This suggestion is invalid because no changes were made to the code.Suggestions cannot be applied while the pull request is closed.Suggestions cannot be applied while viewing a subset of changes.Only one suggestion per line can be applied in a batch.Add this suggestion to a batch that can be applied as a single commit.Applying suggestions on deleted lines is not supported.You must change the existing code in this line in order to create a valid suggestion.Outdated suggestions cannot be applied.This suggestion has been applied or marked resolved.Suggestions cannot be applied from pending reviews.Suggestions cannot be applied on multi-line comments.Suggestions cannot be applied while the pull request is queued to merge.Suggestion cannot be applied right now. Please check back later.
Closes #39
按 设计讨论 与 评审回执 落地,评审意见全部采纳。
API(新增
ISessionAwareStreamConnection<TMessage>能力接口,不动IStreamConnection)CurrentSessionId(long):每次真实 TCP 会话建立时分配,单调递增、不复用(有间隔);无会话 = 0;checked递增,耗尽显式抛出SendInSessionAsync(sessionId, message, ct):整帧写入本机 socket(内核缓冲,不含对端 ACK)后才完成;会话在写出前终止 →SessionExpiredException,绝不转移到新会话重放;远端处理结果视为未知(文档按评审口径收紧为四条公共保证)GetSessionMessages():SessionMessage<T>(消息 + 所属会话编号);与GetMessages为二选一的竞争消费视图(非广播),独立运行中验证等价评审要点的落法
_sessionCounter/_currentSessionId,仅真实会话建立时分配WaitForConnectedAsync可见时必为有效值);Retry/Disconnected 发布前归零。拆除 fault 只在 Retry 分支与 Shutdown 调用——初版放在 StopSessionCore(StartSession 也会调)会误杀"Connected 已发布、新会话任务未就绪"窗口内注册的条目,net48 线程调度慢时稳定复现;修复后压测覆盖WriteAsync等待中失效 → 及时结束,迟到入队的旧信封只跳过不发送过程中发现的两个测试环境事实(已绕开并记录在测试注释里)
测试(12 条新增,真实 TCP 回环)
issue 清单 6 条 + 评审竞态清单 6 条全覆盖;全套件 76×3 = 228 通过。重点:拆除与注册并发压测(15 轮 × 4 发送,成功的每一次对端必收完整帧)、拆除及时失败(含队满等待中的条目,无需等重连)、普通 SendAsync 跨会话续发 vs 绑定发送不重放的并排对照。
其他
SendAsync/GetMessages现有语义一字不改(既有 55×3 用例全绿)