Skip to content

[P3][message] 明确 Message/Messager 的职责并评估是否保留为核心封装 #96

Closed

Description

@Kilerd

现状与设计问题

当前 Messager 保存 GotchaContext,send 克隆自身并直接调用 message.handle,spawn 则转交 tokio::spawn 后丢弃句柄。没有队列、背压、重试或独立执行边界。
这些能力不一定都应加入;需要先确认相对普通 async 服务方法,这层框架抽象要提供的独特价值。

代码位置

静态审查:

建议范围

先做有结论的 API 设计与文档 PR:明确它是携带上下文的 typed command dispatch,还是需要更强的后台执行语义。评估保留、简化或移出默认核心;不要为了证明封装价值而添加尚无需求的消息基础设施。

验收标准

  • 用实际调用案例说明比普通 async 方法多提供的价值。
  • 明确 send 是否排队、执行位置、错误与取消传播;明确 spawn 为何/是否 detached。
  • 给出保留、简化或迁移的决策及兼容方案。
  • 与计划任务统一生命周期的交互被明确考虑。
  • 不在缺少使用需求时额外引入队列、重试等机制。

本项是待决策的设计工作,不是已证实的功能错误。

当前版本复查与已批准方案

基于 PR #113 合入后的 main 165c9db6cec3efa0d50d75bba0754b11c5d2d4d5 复查:

  • send 克隆上下文后直接 await Message::handle,不排队、不创建独立 Tokio task;结果、错误(作为 Output 的一部分)、panic 和取消沿调用方 future 传播。
  • spawn 只接受 Output = (),内部调用 tokio::spawn 后丢弃 JoinHandle;调用方不能通过该 API 等待完成、读取结果/任务失败或取消任务。
  • 仓库的 examples/message 展示了 HTTP handler 提取上下文、执行消息、消息再触发消息。它提供统一的命令类型和上下文传递约定;普通 async 服务方法同样可以表达这些业务,不必强制使用 Message。
  • PR fix(task)!: own scheduled tasks through application shutdown #112 已管理计划任务生命周期,但应用自行创建的消息任务没有加入该所有权,MIGRATION 已明确这一边界。

建议保留这个轻量封装和现有导出,明确其定位为携带应用上下文的类型化命令调用。用户已批准以下范围,已实现于 PR #114:

  1. 保持 send 的直接执行语义,补充执行位置、Result/panic 和取消传播说明。
  2. 将 spawn 改为 pub fn spawn<M: Message<S, C>>(&self, message: M) -> tokio::task::JoinHandle<M::Output>,让调用方获得等待结果、观察 JoinError 和取消任务的入口,不添加额外 task 或消息队列。
  3. 明确丢弃 JoinHandle 仍会 detach,不会自动取消,也不会自动加入应用 shutdown;需要完成保障的工作由调用方持有并等待,或在已有受管理的计划任务内直接 await send。
  4. 更新可编译示例、迁移说明和针对执行/取消/失败契约的必要测试,不重复现有上下文读取测试。

兼容影响:一般带分号的旧调用仍可运行;依赖 spawn 返回 () 的尾表达式或函数签名需要调整。旧的 detached 使用可以显式丢弃返回句柄;新代码可使用返回值保留执行控制。

PR #114 已由用户合入,合入 commit 为 7cea0fef855cd0b16a3df2d101a1f26a8cc92d09。不新增队列、背压或重试,也不更改计划任务的所有权设计。

实现与验证

  • spawn 直接返回已有 tokio::spawn 的 JoinHandle<M::Output>,去掉 Output = () 限制。
  • README、模块及方法文档明确 Message/Messager 的类型化命令定位、结果/失败传播和取消边界;示例改为等待 spawn 的结果并展示嵌套 send。
  • MIGRATION 记录返回类型变更,以及 drop 仍会 detach、abort 后需要 await、应用 shutdown 不接管这些任务的边界。
  • 保留原有上下文测试,新增 4 项测试:结果/错误与 panic 边界、无 runtime 的惰性直接执行及 drop 取消、abort 并 join、drop handle 后继续执行。
  • 本地 gotcha 默认/all-features 测试(含 doctest)、message 示例编译、workspace all-features Clippy、格式检查及拒绝 warning 的文档构建全部通过。
  • GitHub CI:commit d7bf36f7e84a5086d8b869451507c1b1b5a9cf27 的 11 项检查全部通过,见 run 34815229794。
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

    enhancementNew feature or request

    Projects

    No projects

      Milestone

      No milestone

      Relationships

      None yet

      Development

      No branches or pull requests

      Issue actions