暂无图片
暂无图片
暂无图片
暂无图片
暂无图片

从 0 到 1, 构建达达快送自动化业务配置中心

达达集团技术 2021-10-08
1167


  • 1. 背景

  • 2. 案例

  • 3. 痛点和目标

    • 3.1 痛点

    • 3.2 目标

    • 3.3 业界方案调研

  • 4. 解决方案:达达快送自动化业务配置中心

    • 4.1 架构

    • 4.2 使用方式

  • 5. 成果

  • 6. 未来规划

  • 作者简介

  • 加入我们


1. 背景


在达达,有大量的业务性质的配置(后文简称“业务配置”)被存放在研发配置中心,占到了配置中心所有配置的 20%左右,占比不高,但却给系统运维带来了巨大的成本。本文将介绍如何从0到1,构建达达快送自动化业务配置中心。

首先,为什么会出现业务配置添加到研发配置中心中的情况?在设计时,我们一般会从三点进行考虑。

  • 投入产出比,在产品设计阶段,为一个不常用的功能,或是只是短期存在的业务去研发一个配置管理页面,其投入产出比相对较低。

  • 研发资源不足,需求较大时,受到了研发资源的限制,将需求进行拆分为多期,先保证核心流程,二期或后续再完成配置页面相关的研发工作。

  • 需求的紧急程度,业务需求倒排,本次需求要完成上线。评估后,要达成该上线目标,只能做出妥协,将业务配置临时添加到研发配置中心,后续再完成配置页面相关的研发工作。

达达从成立至今,已经7年。7年间,不断有业务配置被以研发配置的形式添加到研发配置中心。7年间,公司业务不断的增长,系统复杂度也不断上升,目前,公司在业务配置的维护上投入的资源巨大,已成为公司的一大痛点。


2. 案例


在达达的物流配送业务中,需要对其配送平台下的众包骑士进行管控,保证配送服务的质量,而对骑士进行“服务质量强化”培训则是其中的一大抓手。

骑士服务质量的好坏,通常会以这个骑士被投诉而产生工单的数量进行衡量。骑士没有工单,说明骑士的服务质量好,无需参加培训;一旦产生工单,就会认为该骑士的服务质量需要提升,就需要参加培训。

不妨先来看这样一个案例:普通骑士张三,在北京跑单,有一天,张三被投诉不送货上门。按照规则,张三需要在接下来的工作中完成课程。不同的地域(城市、站点),不同类型的骑士,其服务的对象存在存在差异,被投诉的原因也不一样,需要培训的内容一不一样。因此在制定骑士参加培训的规则时,通常会从多个维度考虑。

如图 2-1 所示,从城市(站点)、骑士类型、投诉原因这些角度,共同决定了该骑士需要参加的课程是什么。

图 2-1 骑士培训配置


产品需求移交之后,进行方案评估,从投入产出比、研发资源、需求的紧急程度等角度考虑,在当时的业务场景下,提升骑士的服务质量刻不容缓,急需这款产品的上线。

为了达成尽快上线,需求进行了倒排,将配置添加到了研发配置中心中是当时不错的一个选择。于是有同学设计了如图 2-2 所示的配置,为了方便理解,我将一系列id都替换成了中文描述。

图 2-2 骑士培训配置JSON


以上只是众多业务配置和研发配置混在一起的一个场景,虽然解决了当时的问题,但是也给以后产品的维护带来了巨大的成本和麻烦。


3. 痛点与目标


3.1 痛点


将业务配置配置到研发配置中,这为产品研发和迭代带来了不少便利,解决了“燃眉之急”,而带来的“后遗症”也不少。

1. 影响系统稳定

业务配置没有和研发配置隔离,业务配置的修改需要发布上线,影响系统稳定性。

2. 鲁棒性差

业务配置的多被设计成JSON格式,甚至还带有竖线、逗号,下划线等分隔符,对配置的数据没有校验,无法通过前端的业务组件,让用户以可视化的方式进行配置,鲁棒性差。

3. 效率低

整个配置的修改上线流程长,导致修改一个配置需要的时间长,效率比较低。整个流程和参与的角色如图  3-1 所示。

图 3-1 配置流程与参与角色


4. 数据安全性低

凡是有研发配置权限的用户都可以查看该系统下的业务配置信息,如果涉及到一些重要的配置信息,数据的安全性得不到保障。

5 数据分析取数困难

受限于基础设施,分析师无法直接取到研发配置中心中的数据,导致数据分析取数困难。


3.2 目标


以上痛点,促使我们开始了对业务配置的治理。寻求合适达达的方案,解决以上痛点,最终梳理并需要达成下目标:

1. 提升稳定性

将业务配置和研发配置进行隔离,业务配置的修改不需要走上线流程,减少上线次数,提升系统稳定性。

2. 良好的鲁棒性

提供可视化配置的能力,集成业务组件,保证用户填写数据的正确性。

3. 提升效率

  • 产品运营可以自助修改配置,提升上线效率。

  • 新增配置,以低代码,0代码的方式生成配置页面,快速响应紧急需求。

  • 研发读取配置,提供接口或API,使用方便,提升研发效率。

4. 提升数据安全性

新方案需要有权限控制能力,只有有权限的人才能看到相关的配置,保证配置数据的安全。

5. 高可用

通过去中心化的方式读取配置,不会存在单点问题,一旦配置系统发生故障,接入方也不会受到影响。

6. 实时性

配置一旦发生修改,接入方能及时的收到通知,并更新本地配置数据,完成配置变更。

7. 分析师取数方便

提供通用的解决方案,能让分析师获取到业务配置的数据


3.3 业界方案调研


实现以上的这些目标,即解决业务配置和研发配置混合带来的的痛。我们对业界的方案进行了调研,具体情况如下:

  • DMS,基于Json Schema的动态Json数据配置平台,现在重构中

  • 逆向工程,能在线生成从数据库表到前端页面,具体业务逻辑只需稍加修改即可。

  • 有的公司自己设计一个框架,核心思想是将配置序列化为JSON,然后使用一个大表来存储。

  • 下面对比下这三个方案,如表 3-1 所示。

表 3-1 方案对比


通过对比,我们可以直观的发现,不管是支持高可用的DMS,还是逆向工程,还是简单的使用大表存储的方案,都不能达到我们的目标。因此我们决定自研解决我们的痛点。


4. 解决方案:达达快送自动化业务配置中心


在通过调研之后,决定自研达达自己的业务配置中心,来来解决我们遇到的所有痛点。下面将介绍达达快送自动化业务配置中心的架构和使用方式。


4.1 架构


图 3-1 达达快送自动化业务配置中心架构图


从架构图 3-1 中,左侧为达达快送自动化业务配置中心的portal,业务侧可通过portal进行配置管理,主要包括配置的新增、修改,集成了日志、权限、列类型管理、配置管理、业务组件、BI数据同步这6大模块。右侧为程序读取的配置,只要项目集成dada-biz-config这个jar包,即可通过BizConfigClient提供的API方法获取用户配置的数据。

看了上面的架构,相信会有人问,为何使用Apollo存储业务配置?主要从以下几点考虑。

  • 运维成熟

  • 稳定可靠,经历多次大促

  • 配置去中心化,支持跨云同步

  • 提供开放平台API

以上架构如何达成目标的呢?

  1. 稳定性

    将研发配置和业务配置隔离,保存业务配置的 Apollo 为单独的 project 和 namespace,提升了系统稳定性。

    将业务配置访问Apollo的流量和研发配置访问Apollo的流量隔离,请求打到Apollo集群的两个不同的节点,即使业务配置的流量陡增,也不会对研发配置的Apollo服务产生影响,保证系统的稳定性。

  2. 鲁棒性:通过列类型管理模块、配置管理模块、业务组件模块,使得从配置的创建到配置的使用,全程可视化,通过业务组件模块,可以快速集成前端业务组件,提供友好的交互,保证用户配置数据的正确。

  3. 效率高

    按照开发一个配置的页面的工时进行计算,从产品编写PRD、UED设计、前端页面研发、后端接口研发、测试,总的工时在 3人/日 以上,通过达达快送自动化业务配置中心创建一个配置,只需要几分钟到数十分钟,极大的提升了研发效率。

    产品运营自助上线配置,不在需要其他角色的参与,随改随生效,极大的提升了响应业务修改配置的效率。

  4. 安全性:通过权限控制模块,可以将配置控制到哪些用户可见、可修改,达成精细化控制,严格保证数据的安全。

  5. 高可用:自研了达达快送自动化业务配置中心的 client,底层依赖 Apollo Client,去中心化,不存在单点问题。

  6. 实时性:利用 Apollo client 的配置通知机制,使得配置能在秒级别内实现本地配置的更新。

  7. 分析师取数:通过BI数据同步模块,将配置数据以大JSON的形式落入mysql中,数仓侧解析数据后,转化成中间表供分析师使用,解决取数困难的问题。


4.2 使用方式


通过达达快送自动化业务配置中心,快速创建相应的配置管理页面,并通过BizConfigClient读取配置数据,其主要流程如图 4-1 所示。

图 4-1 创建配置流程


是的,你没有看错,只要三步就能创建一个配置,全程可视化,0代码,下面我们将以以骑士培训的案例为例,为其创建一个配置。


1. 新建配置

在配置管理页面页面,可以看到创建好的配置,点击,新增按钮即可新增配置,如图 4-2 所示。


图 4-2 配置列表


点击新增按钮之后,将出现图 4-3 的弹窗,填写配置的描述信息后保存,即完成了我们的第一步【新建配置】。

图 4-3 新建配置


2. 配置列项

在新建好配置之后,点击右侧操作列中的【配置列项】,即跳转至如图 4-4 的页面,可以为配置定义有哪些列。如果将配置想象成一个“表格”的话,那这一步的操作就是为这个表格创建表头。对于骑士培训的案例,需要配置城市、站点、骑士类型、工单类型、接单天数、培训课程6列。

图 4-4 配置列项


定义完“表格”的表头,第二步就完成了,如果你好奇为何在这里可以选择城市、站点、骑士类型、工单类型等,可详见4.2.4 业务组件 和 4.2.5 配置列项。


3. 配置详情

配置列项完成之后,回到配置列表页,点击右侧操作列中的【配置详情】。可看到如图 4-5 所示的页面,我么想要的配置页面就这样出现了,用户可以通过点击左上角的新增按钮或新增默认值按钮,配置具体的业务数据。

图 4-5 配置详情


点击此处的新增按钮,即可为我们的配置添加具体的配置。如图 4-6 所示,每一列的配置都有对应的前端组件进行渲染,保证数据输入的正确性。


图 4-6 新增配置行


到此为止,我们的一个配置就配置完成了,最终配置完成的数据如图 4-7 所示。

图 4-7 配置详情


在该页面,我们可以再次编辑或者删除配置数据,也可以看看日志,如图 4-8 所示。

图 4-8 操作日志


4. 权限管理

针对上述已经创建好的配置,我们可以对其权限进行管控。在配置列表点击【权限控制】可对该配置进行权限控制。一般创建人即为该配置的owner(管理员可以修改),owner和管理员可以为该配置添加有权限操作该配置的用户,如图 4-9 所示。

图 4-9 权限控制


5. 业务组件

为了交互的友好和系统的鲁棒性考虑,我们对系统的每一列的数据类型进行了区分,可以分为3类

  • 自定义:包含boolean、string、number、decimal、date等基础类型

  • 预定义枚举:如果当前列的数据是可枚举的,那用户可以先定义一个枚举,然后在配置列项时类型选择该枚举即可,最终用户在配置页面将看到的是一个下拉组件,详情请见

  • 业务组件:针对现有业务已经在db中维护的数据,我们可以通过业务组件的方式接入系统,避免了多方维护基础数据。一般这种场景数据量较多,不适合做成枚举。

如案例中所使用的城市、站点这两个维度,是非常常用的维度,并且站点数据、城市数据相对较多,如果使用列类型枚举,则下拉框的交互方式就显得不是很友好,对于站点来说,下拉的方式的交互已经无法满足业务的需求了。

达达快送自动化业务配置中心的业务组件模块就是解决这一问题的,如图 4-10 所示,为我们选择站点的业务组件,和用户的交互方式得到了提升。

图 4-10 站点组件


6. 列类型配置

骑士培训这个配置中,还涉及到的骑士类型、工单类型两个维度,这两个维度的可选择的数据相对较少,达达快送自动化业务配置中心提供了定义列类型的能力,可以将需要配置的数据构造成一个枚举。如图 4-11,为列类型管理页面,点击新增按钮即可新增列类型,列表中的工单类型和骑士类型为已经新增好的数据。

图 4-11 列类型配置列表


图 4-12,图4-13 分别为点击新增按钮之后的页面,新增骑士类型和工单类型两大枚举。

图 4-12 配置列项-骑士类型

图 4-13 配置列项-工单类型


6. 默认配置

经过调研,我们发现很多业务都需要有一条默认的配置进行兜底。于是我们增加了默认配置的入口,允许用户配置兜底的配置,如图 4-14 所示,点击左上角第二个按钮可添加默认配置,配置方式和添加普通配置无异。

图 4-14 默认配置


7. 组合判重

我们再来看这个配置列项页面,其中有个选项为是否组合判重,图 4-15 中红框标注。我们经过调研发现,很多业务场景的配置,众多维度进行组合之后是唯一的。例如骑士培训这个案例中,上海的普通骑士,被投诉“不送货上门”时,应该只对应一条配置(需要参加哪个培训),即城市、骑士类型、工单类型应该组成唯一键。针对这样的场景,我们研发了组合判重功能,允许某些列组成唯一键,保证在这种场景下,系统在读取配置时,只会读取到一条配置。

图 4-15 配置列项-组合判重


8. 客户端读取配置API

为了方便接入,我们提供了友好的api供研发读取配置,如图 4-16 所示。

图 4-16 客户端读取配置API


经过调研,当前客户端提供了三种获取配置的方式,覆盖了获取配置的绝大多数场景。

  • getBizConfigsByKey,全量获取配置,即获取用户配置的所有数据

  • getBizConfigsByColumns,有条件的获取配置,入参conditionSet表示可以针对列进行过滤的条件,拿骑士培训的案例来说,假设我们要取上海的所有配置,则可以构造一个BizConfigCondition对象,指定需要城市这一列,指定需要匹配的值"上海",在调用方法之后,只会返回上海的配置,如果匹配不到配置,则返回默认兜底配置。

  • getBizConfigByUniqueIndex,根据唯一性条件获取配置,和getBizConfigsByColumns类似,但是传入的conditionSet必须是在配置列项时指定的参与了组合判重的列,否则如果不保证唯一性,获取到的配置将不符合预期。


5. 成果

达达快送自动化业务配置中心自上线后,截止至9月底,为系统稳定性的提升和开发效率的提升,都做出了很大的贡献。

  • 自上线以来总共接入配置296个。近2月新增配置80个,修改次数600+,预估节省200+人日。达达快送自动化业务配置中心诞生,为业务配置的实现提供了一种新的思路,尤其是需要快速迭代、时间紧急的项目,能节省研发时间,快速上线。

  • 达达快送自动化业务配置中心经历了2021年618的洗礼,没有出现任何故障,稳定、效率、安全。

  • 通过去中心化的方式,提升了系统的性能,且上限极高。

    图5-1为某一应用通过客户端获取配置的请求量,图中【今日请求量-请求方式:all】表示通过客户端getBizConfigsByKey方法获取配置,请求量qpm在7k上下,没有出现任何的系统瓶颈,远远没有达到请求量的上限。

图5-1某一应用业务配置客户端请求量


图5-2为某一应用通过客户端获取配置的响应时间,纵轴单位为毫秒,图中【今日请求量-请求方式:all】表示通过客户端getBizConfigsByKey方法获取配置,平均响应时间大概在0.1ms上下,性能强劲。

图5-2某一应用业务配置客户端响应时间


6. 未来规划

  1. 突破Apollo单个key配置数据的长度限制,目前的架构中,一个业务配置对应Apollo中的一个key,这就要求我们配置的数据的整体长度不能超过Apollo单个key配置的最大长度。后期计划突破这一掣肘,使得单个配置可以保存更多数据。

  2. 跨环境配置同步,支持将配置从dev环境同步到qa或线上,减少常见配置时的重复工作,提升效率。

  3. 集成更多更丰富的业务组件,提供更多的配置维度,以支持更多的业务场景。


作者简介

周华剑,达达集团JAVA开发工程师,2018年加入达达,目前负责达达落地配业务的研发工作、达达快送自动化业务配置中心的负责人。致力于提升软件系统稳定性,寻找能提升研发效率的通用方案,为业务快速赋能。


加入我们


达达集团目前还处于高速成长期, 欢迎对技术有追求的同学加入, 可查看链接 https://app.mokahr.com/su/zlrxpe 投递简历。



文章转载自达达集团技术,如果涉嫌侵权,请发送邮件至:contact@modb.pro进行举报,并提供相关证据,一经查实,墨天轮将立刻删除相关内容。

评论