架构误区系列 21:模型的边界和流式处理
最近发生的一个线上问题:远期交易需要每月给用户提供合约价值的报表。但是由于建设路径的因素,在途的远期单据有新旧两个系统承载,但是合约价值报表需要汇总产出,只从新系统产出。最近一个改造需要通过合约发起方的不同地区,决策用什么样的币种展示合约价值。例如中国用 CNY,欧洲用 EUR,英国用 GBP,等等。在处理用户地区时,开发的同学拿合约号反查询了合约信息,从中得到用户/合约的地区。同时由于新系统查询不到老系统的合约(未调用聚合查询接口),导致老系统的合约价值报表都没有生成。
这个问题引发了一个信息架构上的思考:如何确定模型的边界,是否允许跨边界的查询(回查)。
我的观点也是明确的:模型和模型之间需要有明确的边界,不同边界的模型之间应该采用流式处理的模式,上游模型生成下游模型,下游的模型不应该再跨边界去查询上游模型。
理由也很简单:边界之间的模型转换,是两个领域之间的转换。不同的领域有不同的关注点,一般来说,单向的模型转换会丢失信息。下游只需要获取自身需要的信息,不应该去回查拿到自己不关心的信息。这也可以避免由于对其他领域的背景知识(多条链路、多个模型、多个系统)缺乏而导致的问题的产生。
结合上述故障举一个例子。例如我们的系统有四个领域:
资金订单域:承载用户的资金单据,例如前述的远期单据。
电商订单域:承载用户原始的电商单据,包括订单、物流单、报关单。属于外部导入的数据。
监管报表域:为了满足监管要求,给到央行和用户的报表,从上述两个域抽取需要的信息架构而成。
账单域:承载展示给用户的动账信息,和必要的业务交易和状态信息。
上述领域的信息流图如下:
是一个单向的流转关系:
资金订单由用户生成,关注于账户、金额、付款目的地、状态等要素。
电商订单从外部电商系统获取,关注于商品采购、物流和报关信息,并附带相应的金额。
监管报表聚合资金订单和电商订单的信息,关注用户的商品、物流和报关信息,以及这些单据和资金订单的金额匹配关系。
账单从资金订单中抽取,用快照的方式保存用户的账户动账信息和期末余额信息,同时附加相应的资金订单状态信息和付款目的地信息等。
可以看出来,四个领域关注点不同、生命周期不同、信息要素不同。下游的账单和监管报表域,会根据自身的需要,忽略到上游域的部分信息要素。这个时候要再做回查,即使不考虑架构链路复杂性,也会面临如下问题:
账单保存的是一个账户的快照信息,再去实时回查,获取的信息的时间点会和账单快照的时间片不一致。
监管报表有一个聚合功能,实时回查,不一定能还原到合适的聚合点。
总之:
领域和领域模型时间有明确的边界,边界就是两个领域的关注点的差异。
上游领域模型推导出下游领域模型,这是一个单向的过程,不可逆。
下游不应该通过回查获取需要的信息,应该在正向的推导过程中沉淀需要的信息。
版权声明: 本文为 InfoQ 作者【agnostic】的原创文章。
原文链接:【http://xie.infoq.cn/article/fe0a6ce7d84e78c559ba65293】。文章转载请联系作者。
评论