写点什么

架构误区系列 21:模型的边界和流式处理

作者:agnostic
  • 2024-10-06
    上海
  • 本文字数:1138 字

    阅读完需:约 4 分钟

最近发生的一个线上问题:远期交易需要每月给用户提供合约价值的报表。但是由于建设路径的因素,在途的远期单据有新旧两个系统承载,但是合约价值报表需要汇总产出,只从新系统产出。最近一个改造需要通过合约发起方的不同地区,决策用什么样的币种展示合约价值。例如中国用 CNY,欧洲用 EUR,英国用 GBP,等等。在处理用户地区时,开发的同学拿合约号反查询了合约信息,从中得到用户/合约的地区。同时由于新系统查询不到老系统的合约(未调用聚合查询接口),导致老系统的合约价值报表都没有生成。


这个问题引发了一个信息架构上的思考:如何确定模型的边界,是否允许跨边界的查询(回查)。

我的观点也是明确的:模型和模型之间需要有明确的边界,不同边界的模型之间应该采用流式处理的模式,上游模型生成下游模型,下游的模型不应该再跨边界去查询上游模型。

理由也很简单:边界之间的模型转换,是两个领域之间的转换。不同的领域有不同的关注点,一般来说,单向的模型转换会丢失信息。下游只需要获取自身需要的信息,不应该去回查拿到自己不关心的信息。这也可以避免由于对其他领域的背景知识(多条链路、多个模型、多个系统)缺乏而导致的问题的产生。


结合上述故障举一个例子。例如我们的系统有四个领域:

  • 资金订单域:承载用户的资金单据,例如前述的远期单据。

  • 电商订单域:承载用户原始的电商单据,包括订单、物流单、报关单。属于外部导入的数据。

  • 监管报表域:为了满足监管要求,给到央行和用户的报表,从上述两个域抽取需要的信息架构而成。

  • 账单域:承载展示给用户的动账信息,和必要的业务交易和状态信息。


上述领域的信息流图如下:

是一个单向的流转关系:

  • 资金订单由用户生成,关注于账户、金额、付款目的地、状态等要素。

  • 电商订单从外部电商系统获取,关注于商品采购、物流和报关信息,并附带相应的金额。

  • 监管报表聚合资金订单和电商订单的信息,关注用户的商品、物流和报关信息,以及这些单据和资金订单的金额匹配关系。

  • 账单从资金订单中抽取,用快照的方式保存用户的账户动账信息和期末余额信息,同时附加相应的资金订单状态信息和付款目的地信息等。


可以看出来,四个领域关注点不同、生命周期不同、信息要素不同。下游的账单和监管报表域,会根据自身的需要,忽略到上游域的部分信息要素。这个时候要再做回查,即使不考虑架构链路复杂性,也会面临如下问题:

  • 账单保存的是一个账户的快照信息,再去实时回查,获取的信息的时间点会和账单快照的时间片不一致。

  • 监管报表有一个聚合功能,实时回查,不一定能还原到合适的聚合点。


总之:

  • 领域和领域模型时间有明确的边界,边界就是两个领域的关注点的差异。

  • 上游领域模型推导出下游领域模型,这是一个单向的过程,不可逆。

  • 下游不应该通过回查获取需要的信息,应该在正向的推导过程中沉淀需要的信息。


发布于: 刚刚阅读数: 4
用户头像

agnostic

关注

常识、KISS、高可用、合规架构、架构治理 2019-02-14 加入

二十年架构经验,互联网金融专业架构师。Open Group Master Certified Architect

评论

发布
暂无评论
架构误区系列21:模型的边界和流式处理_领域模型_agnostic_InfoQ写作社区