Orisumi

提交与 SDK

程序实例的身份持久不变,Observer 的业务代码按业务规则形成事实,平台 SDK 按依赖顺序可靠提交

背景

作为 Observer 的程序实例要在断网和重启时不丢数据,重试也不能变成多次修改。本 ADR 讲程序实例怎样把版本交给后端,Observer 的划分见 ADR · Observer 与输入集。

决定

  • 程序实例的身份持久不变。
  • Observer 的业务代码按业务规则形成事实,平台 SDK 负责可靠提交。同一运行环境的程序实例共用该平台的 SDK。
  • 一段事实何时结束,由 Observer 的业务代码判断,再通知 SDK。
  • SDK 按依赖顺序提交版本,重试沿用原 VersionId。队列和合并的算法由各平台的 SDK 决定。
  • 后端按顺序逐个保存一次提交中的版本,遇到被拒绝的版本就停止,之前已保存的保留。
  • SDK 按提交的响应确认版本。错误响应指出被拒绝的版本,它之前的版本已保存,之后的版本没有处理,仍可改写。

理由

可靠提交放进 SDK,重试和恢复只实现一次。结束条件属于业务规则,所以由 Observer 的业务代码判断。

SDK 负责本地保存、恢复发送和按依赖顺序发送。只有尚未提交的本地草稿可以合并或丢弃;已经提交、结果不确定或已被引用的版本按原样发送。

重试沿用 VersionId,已保存的版本重发时直接确认,所以一次提交不必整体成功或整体失败:SDK 处理完被拒绝的原因后,原样重发整次提交即可。逐个保存让后端不必为整次提交维护一个可回滚的工作区。

响应已经说明每个版本的结果,SDK 不需要读回确认。被拒绝的版本之后的版本确定没有保存,所以和草稿一样可以改写,例如改为引用另一个程序实例先保存的首版。

放弃的方案:

  • 每个 Observer 自己实现提交。 重试、恢复和确认的逻辑会在每个 Observer 中重复,而且各不相同。
  • 一次提交整体成功或整体失败。 后端要为整次提交维护工作区;有了 VersionId 的重试,这项保证换不来额外的正确性。

代价

  • 每个运行环境都需要一份 SDK。
  • 一个进程中的每个程序实例都要持久保存自己的身份。
  • Observer 的业务代码必须显式通知事实结束。
  • SDK 要记住每个版本的依赖和发送状态。
  • 一次提交被中途拒绝后,后端可能只保存了其中一部分,读取方会暂时看到不完整的一组版本。

规则位置

贡献者

页面历史