微盛|团队技术博客

以标签业务为例阐述领域化分析过程

春晓

2023-03-30

以标签业务为例阐述领域化分析过程

一、复杂多变的产品业务需求

梳理当前业务中标签相关的信息点

  • 企业标签
    • 企业所有成员可见
    • 打在客户身上
    • 创建方是: 企微管家 PC 后台,企业微信,从 OPEN 过来的外部系统
  • 素材标签
    • 企业内所有成员可见
    • 打在组合素材上
    • 创建方是:企微管家 PC 后台
  • 自动标签
    • 企业所有成员可见
    • 打在客户身上,员工不能手动打,大数据根据客户行为,识别客户意向与偏好并打标签
    • 按场景区分是否可以打自动标签:比如客户列表-批量打标签功能不展示
    • 标签的定义,来自于模板创建
    • 大数据根据客户行为来自动给客户打标签
    • 创建方是:企微管家 PC 后台
  • 业务标签
    • 不同业务线可根据业务需要创建自己的业务标签;不同业务线创建的标签互不可见,可满足不同业务线间标签数据隔离要求
    • 管理组可见; 打在客户身上
    • 部分成员可使用可见和可使用的权限判定不同
    • 需要和企业微信规则组关联;打标时,客户/员工参数需转明文
    • 没有接入企微的标签变更回调,使用缓存+过期时间得到相对较好的访问体验
    • 创建方是: 企微管家 PC 后台,企业微信
  • 外部标签
    • 企业内所有成员可见;打在客户上
    • 创建方是:外部系统-xxx
    • (按场景区分是否可以打标签)客户列表-批量打标签功能不展示/不能打 xxx 标签
    • 支持各个业务的筛选
    • 标签数据不同步企业微信
  • 工单标签
    • 企业所有成员可见
    • 打在企业上,最终转化为打在客户好友上
    • 需要在添加客户回调处,进行打标 check
    • 创建方是:内部工单系统

二、领域分析

1. 确定业务场景

1.1. 业务现状

  • 基于标签开展的业务场景
    • 给客户打标签(实际是员工给客户打标签,属于员工维度数据,而非客户维度,下文所指客户无特殊说明也指的是客户员工好友关系)
    • 给群打标签
    • 根据标签筛选客户(筛选结果用群发等各种场景)
    • 根据标签筛选客户群(筛选结果用群发等各种场景)
    • 提供开放平台接口能力
  • 当前标签现状
    • image.png

1.2. 业务痛点

  • 业务实现强依赖企业微信(无论是标签的定义,还是打标签的行为,都是先在企微得到结果后,再执行企微管家 saas 平台的业务逻辑)
    • 企业标签、自动标签、业务标签、给客户打标签等等
    • 在企微管家中维护标签定义时(新增企业标签),先调用企业微信接口新增标签,返回成功时才会保存到本地 db 中;
    • 同样,在企微管家给客户打标签时,先调用企业微信接口打标签,返回成功时才会将标签保存到客户好友上。
  • 企微性能瓶颈
    • 企业微信的 API 接口(标签定义、打标签)存在调用次数限流(1 万次/分,15 万次/小时)、并发请求限流(并发频率约 15 tps)等限制,致使企微管家的性能难以突破瓶颈。
    • 一次企微接口调用耗时 300~500 ms(KA 场景下通常耗时更久),阻塞式调用的情况下,企微管家相关功能的接口响应能力难以达到预期。
  • 标签 id 体系复杂
    • 企业微信的标签在企业微信的不同应用(三方/代开发/自建)下,标签 id 会各不相同(明文密文等不同的形态),业务侧对接存在理解成本。
  • 业务对接需求
    • 越来越多标签对接的需求,如二方系统工单 CRM 标签对接,三方系统如 xx 外部系统标签、智能外呼标签等。
    • 每种标签的业务能力存在部分差异,如:xx 外部系统标签数据只与微盛系统互通,而不与企业微信互通。工单 CRM 标签需要支持当添加客户时自动打上工单 crm 标签等。

1.3. 即将或已接入的外部系统标签

  • 智能外呼标签(AiOutBoundTag):
    • 用于和外部系统标签打通,实现客户标签的展示与筛选
  • 工单 CRM 标签(CompanyTag):
    • 用于和内部工单系统标签大同,实现自动给新添加的好友打上指定标签
  • 外部标签:
    • 用于和外部系统标签打通,实现客户标签的展示与筛选,但数据不同步给企业微信

1.4. 微盛标签体系需要具备以下能力

  • 微盛标签定义,可以和企微解耦,且同步企业微信的过程需要异步化
  • 微盛打标签,可以和企微解耦,且同步企业微信的过程需要异步化
  • 微盛标签 id 需要归一化
  • 易扩展、易接入的对接外部系统标签能力

2. 标签系统概念语义

2.1. 标签系统概念语义

  • 标签系统
  • 标签

2.2. 标签(Tag)

  • 什么是标签
    • 标签,就是对一个系统对象的某个维度特征的描述,从而能够基于标签进行快速筛选。
  • 标签组
    • 一个企业会有很多标签,为了方便管理,通常会以组将标签进行归总。
  • 标签的目标对象(作用对象)
    • 标签不是孤立存在的,当一个标签被定义后,紧接着需要声明它能够作用的目标业务对象,就是打标签的落脚点。
    • 这个对象,可以是群、员工、企业等等实体对象,也可以是客户(好友关系)等关系对象,即标签理论上可以作用在任何业务对象上。
  • 示例图
    • image.png
    • image.png

2.3. 标签系统

  • 系统对外能力
    • 根据某种给定的规则,将外部系统的标签,承接到系统内
    • 根据某种约定的规则,将系统内的标签,同步给外部系统
  • 系统自身能力
    • 标签定义
    • 标签业务应用
  • 标签系统架构
    • image.png

3. 标签的业务意义

  • 有了目标对象,就可以承载标签的两个重要业务意义,打标签和标签筛选。
  • image.png

4. 标签定义的分类

  • 适用于同一种业务目标对象的标签,从业务理解的角度上,通常我们会将他们定义为一类标签,这就是标签定义的分类。
  • image.png
  • image.png

5. 标签定义的业务类型

上面说了标签定义的分类,实际上同一类标签定义,因为业务场景的需要,也能再区分出不同的特性类型。

  • 企业标签
    • 作用对象可以是任何业务对象,但是标签的使用者,是全企业成员
  • 业务标签
    • 作用对象可以是任何业务对象,但是标签的使用者,是部分组织架构成员
  • 自动标签
    • 作用对象可以是任何业务对象,但是标签的定义者和使用者,不是员工,而是数据平台(是大数据平台根据行为,基于规则生成的标签定义,作用到目标对象上)

上面三种现有的标签的区别,无非是标签的定义侧不同,或者标签的对应的数据权限不同,这就是业务场景下的类型。

6. 标签定义的场景

  • 标签定义
    • 就是构建标签基础数据。
  • 定义场景
    • image.png
  • 示例:工单标签
    • 拆解:工单系统定义标签,标签打在企业上,到企微管家,实际是作用在客户上
    • 过程: 扩展一种定义的实现 CrmDefiniteTag,定义是来自外部的
    • 目标对象:是客户,需要企业到客户的转换
    • image.png

7. 打标签

上面说了标签定义,有了标签定义,有了目标业务对象,就到了打标签这个业务场景了。

打标签两个要素:触发规则、生效规则

  • 触发规则
    • Check 是否需要调用打标签
    • 场景相关,默认不会执行打标签,有需要才会接入
    • 工单标签:绑定的是添加客户回调场景,生效规则是从工单转换来的那些标签
  • 生效规则
    • Check 打什么标签
    • 主动调用:默认生效,要打的标签,就在参数里
    • 定时触发:比如自动标签,根据规则解析生效,生效规则决定了打什么标签
  • 业务流程
    • image.png

8. 标签的生命周期

  • image.png

9. 标签生效的平台边界

  • 标签一旦被定义下来,默认就在企微管家 saas 平台下生效了(无论在企微是否生效)。
  • 同时,目前的业务场景,通常也会在企业微信平台同步生效。
  • 扩展点:标签支持随时开启/接入新的生效平台 (KA 私有化场景)

10. 不同平台的标签类型

  • 对于企业微信的同一个标签,用不同的密钥或者接口,拿到的标签 id 并不相同。
  • 同样,不排除其他的外部平台,对于同一个标签,也有不同的 id 形态。
  • 主要是为了兼容企业微信的三方应用标签(三方应用 accesstoken 获取)、客户联系标签(客户联系 accesstoken 获取)

11. 外部平台标签的接入

  • 接入示例
    • image.png
  • 接入思路
    • 通常外部平台的标签体系,也是基于标签组,标签 id,标签名称的,所以对接的核心其实就是,把标签定义建立映射关系,再具体点,就是绑定标签 id。
    • image.png

12. 平台间标签的对接规则

  • 既然可以对接新的生效平台,就涉及对接的匹配规则。
  • 扩展点:对接的规则,是可以自定义扩展的。
    • 比如对于企微的对接,不同的密钥或者接口:
    • image.png
    • image.png

三、领域设计

1. 领域的核心能力(Domain Core Ability)

  • 标签定义
  • 打标签
  • 标签筛选(标签选择器)
  • 标签数据同步第三方系统
  • 外部系统标签同步微盛
  • 标签 id 归一

可以简单理解为领域服务对外提供的核心业务接口

2. 领域对象的能力 (Domain Entity Ability)

  • 标签 TagEntity
    • 判断一个标签的目标对象是谁(客户、客户群、素材等等)
    • 判断一个标签的业务类型(企业标签、自动标签、业务标签等等)

充血模型/贫血模型

3. 领域服务的能力 (Domain Service Ability)

  • TagService 的标签查询
    • 查我是管理员的业务标签
    • 查我所在管理组的业务标签
    • 带权限查所有业务标签
    • 不带权限查所有业务标签

比充血实体的粒度更粗

四、工程实践

1. 工程实践主要路径

  • 业务场景的拆分和归纳
  • 业务流程的分解
  • 技术细节的落地

2. 业务场景的拆分和归纳

2.1. 业务场景拆分归纳思路

  • 整理用例
    • 梳理所有当前业务的实现,转成领域化的通用语言(目标对象,操作人,业务场景)
  • 执行流程
    • 技术保障的阶段,以及实现所有业务需要的阶段节点和执行步骤,用业务扩展点来支撑
  • 示例
    • image.png

2.2. 示例一:标签选择器

  • 标签选择组件中,展示什么样的数据?
    • image.png
  • 什么样的业务场景,什么样的当前用户,看到的是哪些标签?
    • 创建员工活码场景,分管用户,活码的员工是自己,看到的是“所有企业标签”+“我作为管理范围内的员工,所在的管理组,管理的业务标签”
    • 创建员工活码场景,分管用户,活码的员工不仅仅是自己,看到的是“所有企业标签”+“我作为管理员,所在的管理组,管理的业务标签”
    • image.png
  • 基于 Business+Use Case+Scenario 实现的业务扩展点
    • 营销+创建员工活码+自己
    • 营销+创建员工活码+不仅仅是自己
  • 对应的领域服务能力
    • 查我是管理员的业务标签
    • 查我所在管理组的业务标签

2.3. 示例二:标签定义

  • 基于 Business+Use Case+Scenario 实现的业务扩展点
    • 企微管家+群标签+default
    • 企微管家+客户标签+企业标签
    • 企微管家+客户标签+业务标签
  • 对应的领域能力
    • 目标对象
    • 业务类型

2.4. 其他示例

  • 标签的接入
  • 平台/租户+类型+映射规则
  • 标签对外部平台的透出
  • 平台+accesstoken
  • 标签的加密
  • 租户+类型+规则

3. 业务流程分解

3.1. 业务流程分解思路

  • 过程分解+结构化思维
  • 形成业务流程上的执行节点
  • Pipeline 式的代码结构
  • 设计模式的使用
  • 流程引擎

3.2. 示例一:标签定义的执行流程

  • 执行步骤
    • 业务校验
    • 类型转换
    • 加解密
    • 业务逻辑执行
    • 同步至外部平台
    • 发布事件通知
    • 结果集处理
  • 代码示例
    • image.png

4. 技术细节落地

  • 细节点
    • 事务处理
    • 缓存
    • 重试
    • 补偿
    • 对账
    • 异常处理
  • 解决办法
    • 通用的交给框架
    • 遵循代码规范
    • Case by case

五、小结

image.png

Tags: 后端

作者: 春晓