Skip to content

docs: [P2] 补足 Codec 缓冲与并发契约,并提供有界接收的生产配置示例 #69

Closed

Description

@CSJ608

评审基线:StreamFrame 2.6.0,提交 4b892d9eaa11cf003b5d10793e735b0604bc17ed(2026-09-08 仓库评审)。

问题

这是 API 文档和使用边界改进项。

  1. src/StreamFrame/Codec/ICodec.cs:11 仅描述 Decode/Encode 功能,未明确 ReadOnlySequence、IBufferWriter 的使用寿命与实现需满足的并发约束。Decoder 在消费后推进/释放池化管线,返回消息若直接引用输入帧内存可能在业务消费时失效。
  2. 同一连接编码与解码可并行,旧解码任务在背压等情况下可能与新会话任务重叠;一个 Codec 实例跨连接共享也需明确责任。
  3. README 推荐 byte[] / ReadOnlyMemory 消息类型,但缺少完整的安全所有权示例。
  4. 默认 ReceiveQueueCapacity=0 为无界接收队列;快速上手未展示慢消费者场景的容量与背压配置。框架单客户端监听的产品边界也宜在示例附近明确。

建议范围

  • 明确 Decode 只能在同步调用期间借用 frame;返回的消息必须拥有其数据,不能未经拷贝保留管线切片。
  • 明确 Encode 对 writer 的引用与异步保留限制。
  • 根据实际调用模型写明并发/重入约束;必要时包括 IFramer 实例共享的责任。不能仅凭“发送 worker 串行”宣称整个 Codec 不需线程安全。
  • 给出可编译的 byte[]/ReadOnlyMemory Codec 示例,展示需要保留时的拷贝或受支持的所有权转移方式。
  • 增加生产配置示例:有界接收/发送队列、半帧大小限制、超时选择、取消和 Dispose;解释队列容量按消息数而非总字节预算计量。
  • 区分快速入门与适合具体吞吐/消息大小的配置,不直接修改现有默认值。
  • 同步 README 双语与 XML API 文档,并清理与实际行为冲突的说明。

验收

  • 自定义驱动作者仅凭公开文档即可判断哪些内存能留存、哪些方法可能并行。
  • 示例能编译,异步消费时数据正确,不依赖池化内存碰巧未复用。
  • 有界队列示例解释慢消费者背压及消息大小对内存占用的影响。
  • 明确这是单连接/单客户端设备对接库,避免将监听模式理解成通用多客户端服务器。
  • 关联 KeepAlive 单位修复,示例使用其修复后的实际语义。

实施按 AGENTS.md:从最新 main 建分支、同步 CHANGELOG Unreleased、通过 Release build/test、走 PR;本 Issue 仅登记工作,不代表已实施修复。

相关修复:#62(KeepAlive 单位)、#65(终态等待);文档与示例应体现修复后的契约。

Activity

  1. CSJ608 commented on Sep 8, 2026

    @CSJ608
    OwnerAuthor

    已由 PR #78 rebase 合并,main 提交 831f7ff9bda43f4033b040e43e8cf28eda928f3b。

    验收已完成:公开 ICodec/IFramer/流式定界 XML 和双语 README 明确借用内存、同步 writer、收发/新旧会话/跨连接共享责任;提供 byte[] 与 ReadOnlyMemory 安全拷贝示例及有界生产配置,说明按消息数计量、慢消费背压、超时/取消/Dispose、单客户端边界,并对齐 #62/#65/#67 语义。默认值与实现公共契约不变。

    示例源文件原样纳入 net8/net10/net48 编译;4 项新增所有权测试主动覆盖单段/多段原始内存,并用归还即填充 0xDD 的内存池执行真实 FrameDecoder,释放管线后异步消费仍正确。Release build 0 警告/错误;完整 test:net8/net10 各 132 通过、net48 124 通过,各 3 项长测默认跳过,0 失败。

    PR CI/CodeQL 全绿,合并后 main CI 与 main CodeQL 均成功;实施分支已删除。#66/#67 夜间长测仍独立验收。

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Metadata

Metadata

Assignees

No one assigned

    Labels

    documentationImprovements or additions to documentation

    Projects

    No projects

      Milestone

      No milestone

      Relationships

      None yet

      Development

      No branches or pull requests

      Issue actions