Bakka's Blog

在软件领域里,payload 指的是:真正要传输、处理或执行的“有效数据”部分,也就是去掉各种包装信息之后,核心的内容。

我这里说的 payload 处理,简单来说就是处理输入数据,把它转换为另一种便于调用的结构化数据。我的问题是,为什么不直接传入最终的格式,而是额外维护一个 layer 呢?

这层的作用就是:把“外部格式”翻译成“内部格式”。

为什么不直接传最终格式?为什么要多一层?运行时编排时,为什么我们需要这个 layer?

事实上在后端世界里,这种转换和组装是很常见的,比如 DTO 校验或者 Mapper。归根结底,是因为外部世界是不可信的,并且无法控制外部世界的输入,需要保护可靠性,所以这一层校验是必须加的。

但是在系统内部,外部往往也是可控的程序。为什么不选择直接组装成需要的格式传输,而是再独立分一个 adapter layer 呢?

拆分的好处如下。

第一,隔离抽象

上层用“业务动作”的语言,下层用“执行模型”的语言,中间层就是翻译器。

第二,稳定契约

即使上下层都归同一个团队维护,你也希望:

  • 上层接口尽量稳定
  • 下层内部结构可以继续演进

否则每次下层重构,都会把改动扩散到上层。

第三,收口复杂度

很多下层真正需要的数据,不一定都由上层直接提供。中间层可能会补:

  • 默认值
  • 配置中心数据
  • 上下文信息
  • traceId / operator / env
  • 规则计算结果

所以它不是“单纯再包一层”,而是在组装执行上下文。