【导语】
随着近些年来企业服务意识的不断加强,人工客服业务量指数级增长,蓬勃发展的ai技术造就了智能客服,极大的降低人力成本,提高用户直观体验,并兼顾了各个行业对于24小时客服在线的迫切需求。拍拍贷智能客服系统,目前已有相对成熟而新锐的实践和较深入的技术研究。其中相对比较基础的,就是承载客服数据完整性的智能机器人后台系统。
【背景】
拍拍贷的智能客服系统,有着业界顶尖的算法处理方案,以及成熟健壮的中台调度系统,而相对琐碎而多变的客服后台系统,也同样需要一些针对设计方面的规划,以便对整个系统的良好运行提供幕后的支撑。
后台系统主要的工作就是对于算法方面提供高可用的基础数据,系统基于spring boot/mybatis框架以及相关生态,同时包括原始的mysql数据库,查询的elasticsearch引擎,高频访问的redis缓存,多站点协调的nio/mq通讯方式,以及基于多平台的数据隔离及权限控制系统。由于机器人项目数据结构相对一致,但是站点需求又趋向于独立,因此针对快速迭代并需要稳定运作的系统本身,这里做了一些标准化的设计。
在迭代开发的过程中,由于需求的不断增加,项目逐渐产生了多站点,部分站点高度相似,数据切分相对复杂的特性。因此,在不断的架构重构中,就针对项目特点进行了大量的标准化规划。
【标准化设计】
机器人项目目前的整体标准化设计如下:
1. 项目拆分
目前机器人项目目前包含数个站点,其中站点按照业务相似度区分,大概分为三种,包括客服机器人,人工知识库,对外客服机器人项目,并且有针对其他系统提供的统一接口服务。这样的目的,首先是从业务逻辑上提供了水平拆分,并且针对不同的站点,可以提供相应的机能匹配以及定制化的监控服务。
2. 代码一致性
多站点,但是代码需要有统一的框架支撑,每个站点基础性的操作(例如数据持久化,缓存一致性管理,消息管理)都有固定的库文件,以便在通用性功能的修改升级上,保证项目基础功能的一致性。
3. 面向数据结构编程
在基础功能固定的情况下,针对各种业务最大程度的解耦,业务模块以数据结构作为基本的输入输出,做到业务与基础组件的无关性。目前的设计条件下,即使更换功能组件,也基本不会影响高度抽象业务的平稳运行。
4. 数据持久性
由于项目迭代较快,而且业务相对繁琐,表的数目也跟着逐渐上升,之前出于灵活性采用了mybatis框架。但是因为框架的本身是以sql映射作为核心,反复编写高度类似sql会增加低级错误的可能性,于是就重新开发了一套针对注解的基于mybatis基础的精简orm框架,这样在生成一个新表的时候,可以通过自定义注解配置pojo,生成一些通用的crud功能,并通过预编译保证sql的健壮性,同时也保留了mybatis的原生映射功能,但如果遇到需要深度定制的sql,仍然可以方便的利用框架进行编写。
5. 搜索优化
因为项目本身业务跨越了很多表,所以复杂搜索如果使用native sql的话,就会明显的力不从心。因此使用了elasticsearch的搜索引擎,以便对于复杂搜索操作进行更有效的操作。出于适配合适业务的考虑,编写了基于script的elasticsearch开发组件(因为公司现有的版本较低,支持并不好,因此重写了一份更通用的原生组件),同时由于站点较多,彼此之间会有相关的关联,于是设计了统一的同步中心,中间使用nio的方式进行通讯,同时提供了同步中心的长事务追溯,实时补偿以及job补偿的机制,力所能及的保证索引内容与关系数据库的最终一致性。
6. 数据隔离
由于多站点,但是数据区分共享与隔离的不同特性,因此采取了字段数据隔离的设计,在内部站点中,采用单字段区分数据来源的方式,这里就要感谢team里面的大师提供了相关的成熟框架,已达到不同站点数据的隔离性。而有些站点则相对复杂,需要提供不同的数据空间,并针对用户级别进行部分隔离,部分共享,因此设计了多级字段区别数据源头的功能,并提供了简单易用的功能组件。
7. 用户权限管理
目前搭建了新的统一权限管理平台(待大规模使用),外服站点有平台提供权限参考。这样在应用于多站点的情况下,可以通过统一站点进行权限控制,并且各个站点使用spring security/spring session的常用管理登陆方式,达到请求接口/子页面级别的权限管理,并采用分布式的session机制,由公司的redis管理中心进行session托管,这样对繁杂的站点的水平扩展更加容易,同时也不会脱离公司内部的的基础开发框架。
8. 校验/监控机制
针对输入参数的完整性验证,这里使用注解+aop的处理方式,提供针对接口字段级别的相关处理,包括输入参数的完整性,格式的校验,一些数据的预处理,以及针对接口输入参数的日志监控(elk)等,以便最大限度的降低新建接口的成本。
【待完善规划】
1. 规划基于swagger提供统一的文档规范,目前由于各站点均为接口/模版分离式设计,可以天然的切换为前后端完全分离的站点,因此api文档的编写工作往往就会比较繁重,所以需要全套的自动文档生成工具。
2. 编写基于swagger-codegen的代码自动生成工具,达到更高级别的标准化,少写重复代码才会少出错,把复制粘贴这种事,留给代码生成引擎去搞定。
3. 搭建更为健壮的测试系统,ut测试达到90%以上的代码覆盖率,保证项目的持续可交付,同时开发更深层次的测试框架,最大限度避免低级bug的产生。