结合一个典型案例的BFF治理思考
原文地址:麻广广的博客
在Thoughtworks的第25期 技术雷达中有一个主题:便利背后的陷阱,再次强调了软件开发的一种反模式:
开发团队一般为了图方便,而在其技术生态系统的复杂环节中,引入一些不合理的行为,从而欠下长期存在的技术债务,并会引发更糟的问题。这种例子不胜枚举,包括将数据库作为集成点,使用 Kafka 作为全局编排器,以及将业务逻辑代码混杂到基础设施代码中。 诚如雷达中所说,这种反模式在软件开发中不胜枚举,开发团队必须时刻警惕,精心设计,持续地进行软件架构治理活动,避免为图一时之便而选择不合理的设计,欠下更多难以偿还的 技术债。
为了更深刻理解这种反模式带来的问题,我们先来看一个典型案例:
这个案例选择了一个在BFF(Backends For Frontends)中实现稍复杂的接口,但并不是最复杂的接口。接口的逻辑参见下图:
可视化永远是发现问题最好的手段,上图中描述的接口复杂度一目了然,甚至有点触目惊心,一个API背后的逻辑居然能复杂到这个程度,如果不加梳理并可视化出来我们可能没有这么直观的感觉。这是在BFF暴露给前端的接口,实现过程中需要调用后端10+个服务,进行几十次的服务间调用。在这几十次服务间调用过程中,有大量的读操作,以及近10次的跨服务写操作,读操作主要为了满足写操作的数据组装要求。
为了更清楚地理解这个接口设计背后的原因,我们再从业务逻辑的角度来看看这个接口都做了什么?这个接口有大量的写操作,可以从近10次的写操作中直观地看到一些端倪。通过上图中的时序,相信大家已经能看出一些问题了,咱们从业务和技术两个视角来一起看下这个接口:
业务视角
把上面的关键功能快速分类,可以分成两块:一块是更新维修项状态,以及由此触发的维修单状态和维修商品状态更新。另一块是根据更新后的状态,生成相关文档,并记录文档和维修项的关系。
技术视角
技术上的问题比较突出,重点总结为以下几点:
上面的案例虽然不能覆盖BFF实践过程中的所有问题,但大部分典型的问题都暴露出来了。我们可以借着这个案例来讨论如何在实践中优化BFF的设计,达到治理的目的。
在给出改进方案之前,为了保证方向的正确性,我们先看下BFF的设计原则:
仍然以上面案例里的场景为例,经过上面的分析,关键的问题已经找到了,就可以对症下药了。还是分两个视角来看:
从业务视角的优化显而易见,就是优化现有交互流程,将这一步操作改为两步,先完成业务数据的逻辑变更,再进行文档的逻辑处理。
技术视角
从分析中可以看到,BFF暴露出来的问题其实不仅仅是BFF自身的问题,也反映了后端服务的问题,因此要治理BFF,首先要对后端的服务进行优化治理,再调整BFF内部的问题:
在这些优化梳理和落地的过程中,一定还会发现其他相同或类似的问题,任何一个软件架构走到需要治理的地步都不是一个接口的问题,一定是一系列相互关联的问题,往往优化的过程中需要一起考虑,站在更高的视角来统一规划。
在微服务架构下,BFF模式是非常必要的一种实践,特别是在微服务比较多的情况下,BFF分离了前后端,可以让前端和后端更专注在各自的领域。在软件架构中,边界的处理是最难的,BFF作为中间这一层,作用非同小可,其落地实践对架构的影响至关重要。BFF治理是微服务架构下的软件架构治理中非常重要的一部分,通过BFF治理也能发现很多前端或后端设计的问题。
经过上面案例的分析,总结一下BFF治理的主要方向:
BFF (Backends For Frontends)是为前端设计的后端,不可图一时之方便而越俎代庖,将大部分该由后端服务提供的能力据为己有,而更应该关注在前端的体验优化上,做好前后端的隔离,让前后端能够各司其职,合理高效协作。