BFF实践三大常见问题

标签: | 发表时间:2022-08-26 15:20 | 作者:
出处:https://insights.thoughtworks.cn

BFF—— Backends for frontends(服务于前端的后端),是为了让后端API满足不同的前端使用场景,而演进出来的一种模式。BFF在改善前端用户体验上起到了非常大的作用,但因为介于前端和后端之间,在落地实施过程中很容易踩坑,在这篇文章中,我们看看在实施BFF的过程中可能遇到哪些“坑”。为了帮助快速理解后面讲到的问题,我们先来简单回顾下BFF的由来和应用场景。

BFF的由来

随着移动设备的快速发展以及产品对用户交互体验的关注度增强,前后端分离的架构模式也逐渐被大多数企业所采用。在这种模式下,统一的后端API很难满足在不同场景下对用户体验的不同需求。

BFF模式应运而生,一方面BFF隔离了前端UI展示对后端API的需求,企业可以专注在后端构建核心业务能力,另一方面,BFF根据已有的后端API,快速满足前端在UI展示上的需求,来不断提升用户体验;

从知识管理的角度,BFF模式让知识边界定义得更清晰,后端专注于构建业务能力,不需要考虑前端各种场景适配的问题;而前端更关注用户体验,可以随时独立发布更新。

BFF的应用场景

BFF应用场景(图片来自BFF@SoundCloud)

面向前端

BFF为前端而生,随着前端技术(iOS、Android、小程序、Web等)的不断发展,不同前端对后端要求有很大差异,后端服务很难提供满足多个前端的统一接口,BFF则可以针对前端的特定需求,作出适配:

  • 针对前端UI展示逻辑的不同,对后端API返回的数据进行裁剪和重新组织,提供面向前端的定制化格式的数据。
  • 根据前端业务需求,对后端多个API返回的数据进行聚合。
  • 对一些特定场景的数据进行缓存,提高性能,进而提升用户体验。

面向后端

BFF隔离了前端UI展示对后端API的定制化需求,可以很好地支持后端服务的演进:

BFF实践的三大问题

BFF模式在前后端分离的架构模式下的确有很多好处,完美隔离了前后端,貌似从此以后前端干前端的,后端干后端的,大大降低前后端之间的冲突和依赖。然而事实并非如此,在实施BFF的过程中,大家仍然会遇到各种问题,我总结了实施落地BFF三大常见问题如下:

问题一:重复代码

通常情况下我们会为每个不同的前端构建一个BFF,还可能会为一些特定的场景建立BFF(如对第三方系统提供API),不可避免地,多个BFF之间会出现大量的重复代码,比如可能会存在相同的数据转换逻辑,相同的API数据聚合逻辑等等。

重复代码通常被认为是一种坏味道,但在BFF这个场景下,这些重复的代码是为了某一个特定的前端服务的,因此处理这个重复要相对谨慎,如果一味粗暴地去掉这些重复,很有可能引发某一个前端需求变化会影响到其他前端应用的情况。

如果确实有些代码重复且相对稳定,可以尝试采取下面的方法来消除重复:

  • 共享库,将重复的代码抽取出来放到共享库中,不同的BFF通过依赖共享库来达到代码复用,但要考虑哪些代码能够抽取到共享库中,可以参考我之前的文章《 消灭微服务的坏味道 之 共享库》。
  • 将重复的代码放到后端服务中,这种方法适用于重复的代码实际承载了真实的业务逻辑,而不只是在做简单的数据聚合和数据格式转换,那么应该把这些重复的代码下沉到指定的后端服务中。

问题二:滑向ESB(Enterprise Service Bus,企业服务总线)

除了大量的重复代码,在微服务架构下,另外一个问题通常会出现在业务演进过程中。当新的业务需求产生时,具体要在哪个后端服务中实现有时候不是一个很容易回答的问题,特别是不同的服务有不同的团队归属时,如果每个服务的归属团队都认为新的业务需求不是自己服务的业务范畴,最可能的结果就是让BFF负责帮忙组合各个服务的功能,完成这个新的业务需求。渐渐地,BFF朝着 ESB的方向发展,变成了集成各个微服务,对外提供新能力的中间件。

这种趋势某种程度上违背了BFF设计的初衷,BFF为了适配前端而生,更关注解决前端的用户体验问题,而真实的业务能力应该由后端服务来承接,而不是BFF。

要解决这个问题,首先要清晰地定义每个服务的业务职责,为了避免服务过多很难划分清晰边界,最开始服务尽量不要拆得太小;另外要建立规则来处理新的需求,哪些需求属于BFF的范畴,哪些属于业务能力,业务能力应该下沉到后端服务中,如果现有服务无法承载这种能力,可以考虑新增服务,而不是写在BFF中。

问题三:性能问题

第三个比较常见的问题就是性能问题,相信你一定遇到过下面的场景,既然有了BFF,前端的设计开始放飞自我,可以把想展示的信息一股脑都放在一起展示,极端情况下BFF可以获取到任意服务的数据进行组合,我曾见过在一个BFF接口中调用了后端服务几十次来拼凑前端需要的数据,可想而知这个接口的性能一定很差。

为了解决这种情况带来的性能问题,通常会采用并发获取数据然后拼装的方式,这明显增加了代码实现和维护的复杂度,往往会引发新的问题。

因此,在实际开发过程中要非常警惕这种问题的发生,如果一个BFF接口调用了3个以上接口,那就要警惕了,需要分析下后端服务拆分得合不合理,前端UI展示的数据是否有必要放在一起,否则性能问题会逐渐成为一个不可避免的问题。

小结

架构设计是通过合理的组件拆分以及定义组件之间的关系,将系统整体的复杂性分散到不同的组件中,在更低的维度上解决问题,分而治之。BFF在前后端分离的架构模式下隔离了前端和后端的关注点,特别是在多个前端或第三方的情况下,BFF都是非常好的选择。然而,在实施过程中,仍然要时刻警惕,明确BFF设计的初衷,避免因引入BFF而带来了更多的问题。

参考资料

相关 [bff 实践 三大] 推荐:

BFF实践三大常见问题

- -
BFF—— Backends for frontends(服务于前端的后端),是为了让后端API满足不同的前端使用场景,而演进出来的一种模式. BFF在改善前端用户体验上起到了非常大的作用,但因为介于前端和后端之间,在落地实施过程中很容易踩坑,在这篇文章中,我们看看在实施BFF的过程中可能遇到哪些“坑”.

中台背景下如何用Node做BFF层

- - 掘金前端
中台的概念在最近几年很火,并且也是大势所趋. 服务器端改造成中台,避免不了使用微服务. 服务器端微服务化之后,和我们传统意义上的前后端协同开发是有区别的,我们有幸在公司中台改造中,也对前端开发模式及框架进行了改造. 常见的服务器端语言有java、php、c#、python、golang、nodejs.

微服务架构~BFF和网关是如何演化出来的 - 大大的橙子 - 博客园

- -
BFF(Backend for Frontend)和网关Gateway是微服务架构中的两个重要概念,这两个概念相对比较新,有些开发人员甚至是架构师都不甚理解. 本文用假想的公司案例+图示的方式,解释BFF和网关是什么,它们是怎么演化出来的. 希望对架构师设计和落地微服务架构有所启发. 我们先把时间推回到大致2011年左右.

实践与共享:可“一键”轻松激活Office 2010 系列三大VOL版本的“Office 2010 Toolkit 2.2 ”

- duyao678 - 翱翔
        “Office 2010 Toolkit 2.2”是“迷你KMS”更新换代后的最新版本. 虽是单一可执行程序,但一身承担两大职能:“KMS服务器”和“客户激活端”. 可轻松激活Office Pro Plus 2010、Visio Premium 2010、Project  Pro 2010 的VOL版.

OpenStack实践

- - 开放博客
作者:Baihuogou DevOps Team. 我们在公司内部部署OpenStack主要是内部管理虚拟机的需要. 公司内部之前使用virt-manager来管理内部虚拟机,但是缺点有二:. 虽然提供图形界面,但是是桌面软件形式,需要安装软件. 所以现在需要一个新的管理软件来解决这些问题,满足两个特性:.

『DevOps 最佳实践』 — DevOps 实践

- -
Culture – 文化:公司各个角色一起担当业务变化,实现有效协作和沟通;. Automation – 自动化:在价值链中尽量除去手工步骤;. Lean – 精益:运用精益原则更频繁地交付价值;. Metrics – 度量:度量并使用数据来优化交付周期;. Sharing – 分享:分享成功和失败的经验来相互学习.

jQuery最佳实践

- andi - 阮一峰的网络日志
上周,我整理了《jQuery设计思想》. 那篇文章是一篇入门教程,从设计思想的角度,讲解"怎么使用jQuery". 今天的文章则是更进一步,讲解"如何用好jQuery". 我主要参考了Addy Osmani的PPT《提高jQuery性能的诀窍》(jQuery Proven Performance Tips And Tricks).

PHP最佳实践

- xiangqian - 阮一峰的网络日志
虽然名字叫《PHP最佳实践》,但是它主要谈的不是编程规则,而是PHP应用程序的合理架构. 它提供了一种逻辑和数据分离的架构模式,属于MVC模式的一种实践. 我觉得,这是很有参考价值的学习资料,类似的文章网上并不多,所以一边学习,一边就把它翻译了出来. 根据自己的理解,我总结了它的MVC模式的实现方式(详细解释见译文):.

ios5.1.1越狱实践

- - CSDN博客推荐文章
今天一口气越狱了三台ipad,虽然是第一次越狱,但是借助于现在网络的发达,基本算是很顺利就完成了越狱. 1,下载TinyUmbrella(小雨伞,名字不错). 这个软件的用处是把没有越狱的ipad的shsh文件备份出来,这样以后可以降级到未越狱前的某个版本. 注意,该软件需要有Java环境. 所以,现在相关的java环境后,安装后就可以打开.

MongoDB最佳实践

- - NoSQLFan
将 MongoDB加入到我们的服务支持列表中,是整个团队年初工作计划中的首要任务. 但我们感觉如果先添加一项对NoSQL存储的支持,而不是先升级已支持的关系型数据库,可能对用户不太好,毕竟目前的用户都使用关系型数据库. 所以我们决定将引入MongoDB这项工作放到升级MySQL和PostgreSQL之后来做.