ACL 和俄罗斯套娃

逻辑复杂的系统中,我们经常能看到“规则引擎”和“决策树”之类的东西。

在数据准备好的前提下,规则引擎和决策树都可以理解成在大宽表上进行决策的过程,两者进行逻辑运算需要较为统一的数据格式,即需要对不同来源的数据内容进行统一抽象。

在之前的文章中,我写过 一劳永逸接入所有下游数据系统,讲的便是复杂系统中对准备数据过程的一种抽象。这种抽象在方法论大湿们发明的概念中早有总结:Anti Corruption Layer。你可以把它叫做 adapter,也可以把它称为 facade,或者把它贯名 anti corruption layer,你的听众听不懂哪一个名词,你就尽量用那种叫法,可以显得自己博学多才出世高人。

数据准备过程是典型的对外部系统进行适配的过程,在一个中大型规模的公司,没有进行过数据治理的前提下,必然会产生大量的像下图架构的技术产品:

即每一个子领域,都会诞生相应 Anti Corruption Layer。该 ACL 对领域内的服务模块负责,并提供统一的数据能力。功能较为完善方便的 ACL,进行外部的接入可以做到基本不用开发,至少在数据这层可以做到 low code/no code。

ACL 的诞生充分说明了所有的抽象都是在原来的基础上加一层的事实。部门内的 ACL 层会由单独的小组来维护,在使用 ACL 模块时,有时会遇到 ACL 团队基于稳定性考虑,不愿意去接入某些第三方系统的情况。理由可能是历史上一直由业务方直接进行对接,希望保持这种“与历史一致”的惰性。或者第三方系统的 SLA 不满足 ACL 层对外的 SLA 承诺,担心因为第三方系统挂掉而导致整个 ACL 层雪崩。

这样就产生了很多耐人寻味的结果。以之前的图为例,假如说公共的 ACL 层现在不想配合模块 C 进行外部系统 4 和外部系统 5 的接入,C 系统被逼迫重新搞出了自己的一层 ACL 来应对这种情况,并把之前的 ACL 层当作外部系统来进行抽象,就变成了下面这样,参考虚线框内部分:

到这一步,基本可以预见,随着公司越来越大,数据系统越来越多。我们在原有的系统上不断地进行层层迭加。最终的系统长这样:

俄罗斯套娃(俄语:матрёшка)是俄罗斯特产的木制玩具,一般由多个一样图案的空心木娃娃一个套一个组成,最多可达十多个,通常为圆柱形,底部平坦可以直立。颜色有红色,蓝色,绿色,紫色等。最普通的图案是一个穿着俄罗斯民族服装的姑娘,叫做“玛特罗什卡”,这也成为这种娃娃的通称。

当 ACL 本身负责生产数据时,还可能有更有意思的结果,比如某 ACL A 的开发人员需要给业务提供指标 X,经过打听得知该指标 X 在 ACL B 系统中,进行一番接入后,得到了:

去掉真相迷雾,实际上 X 指标是由 ACL A 自己内部生产的同名指标 Y。

嗯,为什么人会不认识自己