金易联技术方案


  • administrators

    1.系统架构及主要模块说明

    1.1主要模块说明

    金易联整体方案包含的主要模块有:基础通讯平台、验证中心、关系链、平台API、工单系统、派单规则、积分规则、敏感词、知识库、客户信息、员工信息、产品中心、统一网关、金易联管理后台、Android员工端、iOS员工端、小程序客户端、机器人框架。主要模块逐一介绍如下:

    (1)基础通讯平台,提供私聊、加密私聊、群聊、加密群聊、群管理等技术通讯能力,并开放相应的REST API。
    (2)验证中心,提供登入、登出验证功能。其中,金易联本身不包含用户账号系统,针对用户账号密码或者Token的验证,金易联提供标准的验证接口协议,由具体机构实现,验证中心在用户登陆时,通过调用具体机构实现的账户验证接口完成用户身份的确认。
    (3)关系链,负责基础通讯平台的好友关系管理,包括邀请、接受、拒绝、删除好友等功能。
    (4)平台API,基于基础通讯平台及其他服务模块提供的API,提供更加丰富、高级的API,供终端和服务端使用。比如,批量操作群成员等。
    (5)工单系统,管理咨询工单、留言工单、知识库工单等各种类型工单,包括派单、接单等功能。
    (6)派单规则,管理支持工单系统的各种派单规则的增删改查及上下架,派单规则决定一个工单应该派发给哪些用户,比如一个咨询工单应该先派给最近的营业部客服人员,再到同城营业部的客服人员,再到全国营业部的客服人员,最后到专项小组等。
    (7)积分规则,管理计算员工处理工单情况的积分计算规则,服务于员工激励。
    (8)敏感词,管理敏感词的增删改查及上下架,用于识别工单、聊天、知识库等是否涉及敏感词的合规场景。
    (9)知识库,供机构录入各种业务知识,支持客服和投顾在服务客户的过程中随时搜索知识库,即时解答客户的业务问题。
    (10)客户信息,客户信息管理系统,提供单条、批量客户信息导入接口供机构灌入客户信息,员工在服务客户时,能直接从聊天窗口顶部看到客户的身份、持仓、盈亏等信息。
    (11)员工信息,员工信息管理系统,提供单条、批量员工信息导入接口供机构灌入员工信息,客户在向员工咨询时,能直接从聊天窗口顶部看到员工的职位、营业部、执业编号等资质信息。
    (12)统一网关,对所有从终端访问金易联后台的请求进行鉴权、流控、路由等操作。
    (13)金易联管理后台,提供一个PC上的Web版管理终端,对知识库、敏感词、产品中心、积分规则、派单规则、人员等进行可视化管理操作。
    (14)Android员工端,提供给员工使用的Android版APP。
    (15)iOS员工端,提供给员工使用的iOS版APP。
    (16)小程序客户端,提供给客户使用的小程序版APP。
    (17)机器人开发框架,一个用于开发机器人程序的后台开发框架,开发者只需关注机器人业务逻辑。本质上,一个运行的机器人程序可以认为是机器人使用的终端,正如普通用户使用Android/iOS/小程序终端一样。金易联方案中的机器人有:智能客服,自动解答客户的业务问题,出现解答不了的情况时,客户端可以留言或者转人工客服;通知助手,将员工对客户留言问题的回复及时通知给客户;合规助手,当员工在服务客户的过程中,将聊天内容出现敏感词的情况通知给具体的合规管理人员。

    1.2系统架构

    金易联整体系统架构图,如下所示:

    0_1590629076738_93526759-e919-4689-8194-7ba9bdf6450d-image.png

    2.系统监控方案

    2.1监控方案技术架构

    金易联监控方案采用到的技术和工具主要包括:Docker、Rancher、Prometheus、Grafana,及自研发。整体技术架构如下所示:

    2.2监控范围

    2.2.1机器层面的监控

    对机器内存、CPU、存储的使用率、磁盘的读写速度、网络吞吐拥塞、建立的tcp连接数、文件描述符可用量等方面进行监控,如下图所示:

    0_1590629478471_60b9c00c-0287-4c29-a540-f1b588dfe297-image.png

    2.2.2容器层面的监控

    监控容器健康状态、内存、CPU、网络吞吐等,侧重于容器本身的指标,如下图所示:

    0_1590629496979_33f3d6a1-a4de-49fc-8f9c-e2bf5daa56d0-image.png

    2.2.3服务层面的监控

    主要涵盖:服务是否存活、可用;服务运行期间开放出来各种定制化的指标如连接数、时延、线程数、并发数(覆盖当前和平均水平)、集群服务的节点健康状况、主从节点数等;支持大多数主流关系型数据库、NOSQL存储,以及消息系统的监控,如Postgres、Mysql、Oracle、MongoDB、Redis、ElasticSearch、Memcached、kafka、Nats等。如下图所示为MongDB:

    0_1590629525144_30a0f935-efe8-43ff-a549-a32a5852c831-image.png

    2.2.4业务API层面的监控

    以最终用户的视角,定时探测业务API,监控HTTP请求响应状态码和延时,如下图所示:

    0_1590629551890_8186f241-467d-4c8d-a1be-5f06e3d2cec7-image.png

    2.2.5统一监控

    提供一个统一的页面展示当前所有可能运行异常的服务,便于运维人员了解整体服务的健康状况。如下图所示,可确认当前服务整体运行无异常:

    0_1590629577255_45403ec9-d531-4978-b000-3a06150273e7-image.png

    2.3告警

    监控指标统一汇集到prometheus后,根据配置到prometheus中的告警策略,产生告警,最终通过配置告警渠道发送出去。告警渠道支持短信、Finchat、企业微信,及其他开放消息推送接口的方式。此外,告警自动或手动恢复后还会发送恢复通知。具体如下图所示:

    0_1590629596596_c0030bc0-f67a-4217-be85-74ee111626d2-image.png

    3.系统灾备及扩容方案

    3.1灾备方案

    金易联灾备方案包括服务灾备和存储灾备。

    3.1.1服务灾备

    金易联整体架构遵循微服务的设计原则,每个服务职责单一、无状态,支持多实例高可用部署,任一实例出现问题均不会影响该服务的可用性。

    3.1.2存储灾备

    金易联使用到的存储有:MongoDB、Postgres、Minio、Redis,具体的灾备方案分别如下:
    (1)MongoDB,采用至少三个节点的副本集方式部署;
    (2)Postgres,采用至少一主一从的主从方式部署;
    (3)Minio,用于文件存储,采用至少2个实例规模的集群方式部署;
    (4)Redis,用于缓存,数据的允许数据丢失,采用一主一从部署。

    3.2扩容方案

    金易联扩容方案包括服务扩容和存储扩容。

    3.2.1服务扩容

    金易联整体架构遵循微服务的设计原则,每个服务职责单一、无状态,支持动态水平伸缩,通过Rancher API或者管理界面操作,可以秒级动态增加服务实例个数,应对线上访问量的增加

    3.2.2存储扩容

    金易联使用到的存储有:MongoDB、Postgres、Minio、Redis,具体的扩容方案分别如下:
    (1)MongoDB,结合当前访问和存储规模及增长趋势,综合采用启动MongoDB自动分片功能、增加MongoDB集群节点数量、读写分离、基于业务层面分片(分库、分表、多集群)等一或多种方法进行扩容;

    (2)Postgres,结合当前访问和存储规模及增长趋势,综合采用增加从节点数量、读写分离、数据归档、基于业务层面分片(分库、分表、多集群)等一或多种方法进行扩容;

    (3)Minio,结合当前访问和存储规模及增长趋势,综合采用增加集群节点数量、数据归档、基于业务层面分片(多集群)等一或多种方法进行扩容;

    (4)Redis,用于缓存,扩容必要性不大,确实需要的话,可以采用根据键值Hash分片的集群方式部署。

    4.系统部署手册

    4.1部署基础环境

    在部署服务之前,需要每台机器都安装Docker以及Docker Compose,目前支持1.12.6,1.13.1,17.03.2三个版本。

    4.1.1安装Docker

    安装docker17.03的脚本
    curl https://releases.rancher.com/install-docker/17.03.sh | sh
    

    4.2部署Rancher平台

    目前金易联的所有后台服务都是通过Rancher的方式来部署。所以在部署金易联之前,需要先准备足够的机器,需要把每台机器加入到Rancher的环境管理中。

    4.2.1Rancher集群模式部署
    在高可用(HA)的模式下部署运行Rancher Server,需要暴露一个额外的端口,添加额外的参数到启动命令中,并且运行一个外部的负载均衡。

    HA部署需求:

    因为版本升级架构改变,Rancher 2.x目前有两种HA安装方法:

    1.RKE HA

    这种HA安装方法基于RKE部署K8S集群和Rancher HA,此方法支持2.0.8以及之前的版本。

    2.Helm HA

    这种方法通过RKE部署K8S集群,再通过Helm去安装Rancher HA。此方法支持2.0.8以后的版本。

    具体的安装方法可以参考Rancher的官方网站:
    https://www.cnrancher.com/docs/rancher/v2.x/cn/installation/server-installation/ha-install/helm-rancher/

    4.3部署数据库服务

    金易联整套后台服务需要用到的数据库服务包括Postgres、MongoDB、Redis等数据库服务。

    4.3.1部署数据存储基础服务

    数据存储基础服务包括Postgres数据库服务,Mongo数据库服务,Minio对象存储服务。
    Postgres提供主从复制,Postgres的主从复制流程如下:

    0_1590629688131_45268479-6804-4540-8ced-64b92a477ff0-image.png

    图 1 Postgres主从模式

    在部署Postgres时,需要先准备2台物理机器,2台机器的物理硬盘要尽可能的大些。在1台机器上设置label:“finochat.pg-master=yes”, 在另外1台机器上设置label:“finochat.pg-slave=yes”。凡泰提供Postgres主从之间的复制采用异步复制的方式。

    MongoDB提供的是Replica Sets模式(副本集)。MongoDB官方目前已不推荐使用主从模式,取而代之的是副本集模式。副本集其实是一种互为主从的关系,可理解为主主模式。副本集将数据复制,多份保存,不同服务器保存同一份数据,在出现故障时自动切换。副本集比传统的Master-Slave主从复制有改进的地方就是它可以进行故障的自动转移,如果我们停掉副本集的一个成员,那么剩余的成员会再自动选举为一个成员,作为主库。

    0_1590629718764_e141c3a7-ed07-47e9-b0ee-2b41d6dae1a1-image.png

    图 2 Mongo副本集模式

    在部署MongoDB时,需要先准备三台机器,在每台机器上设置label: “mongo.env=yes”,用于调度MongoDB服务。(备注:三台机器部署MongoDB服务)。
    Storage的catalog提供了Postgres和Minio这两个基础服务。Mongo-cluster的catalog提供了MongoDB的存储服务。在设置完主机的调度标签后,接下来我们开始部署基础的数据库存储服务。

    在Rancher的管理界面中点击catalog中选择“storage”这个Stack, 点击“View Details”进入到这个Stack的详细信息页面,在“Template Version”选择“1.0.0”版本,选择后会弹出storage服务的具体配置信息:
    0_1590629749779_67d84625-3f92-40db-95a9-0a6294df5321-image.png
    图 3 storage服务catalog

    storage的配置参数可以保持默认提供的即可,点击“Launch”进行部署。storage服务部署成功后,可以看到如下的服务列表:
    0_1590629774082_eedcd159-720b-4b34-a350-30184a3d5a7c-image.png
    图 4 storage服务列表
    storage的服务启动之后,只是拉起了postgres和minio的存储服务,接下来把mongo的服务加入到storage的namespace,点击“Launch”进行部署。
    0_1590629800092_ff8bd057-de0e-4ba4-8589-7cbb04b5f860-image.png
    图 5 mongo服务

    至此,基础的存储服务已经部署好了。

    4.3.2部署Redis

    Redis数据库主要提供一个缓存数据功能,Chat 服务中会使用Redis进行热点数据的缓存,接下来说明如何部署一套Redis集群服务。

    在Rancher的管理界面中点击catalog中选择“redis-cluster”这个Stack, 点击“View Details”进入到这个Stack的详细信息页面,在“Template Version”选择“1.0.0”版本,选择后会弹出Redis cluster服务的具体配置信息:
    0_1590629881296_33216f4e-6b6b-4d0f-af6f-b9d6590d938b-image.png
    图 6 redis服务catalog

    Redis的配置参数可以根据默认的即可,点击“Launch”进行部署。Redis服务部署成功后,可以看到如下的服务列表:
    0_1590629903724_ca42a73b-5890-4241-a1e4-fd16a38638a6-image.png
    图 7 redis服务列表

    4.4部署Kafka服务

    Kafka作为消息队列的中间件服务,FinChat聊天服务基于Kafka作为消息总线,而Kafka依赖于Zookeeper存储Broker、主题和分区等元数据信息。

    在部署zookeeper和Kafka之前,需要先对主机设置调度标签。在三台要署kafka的机器上添加label: “zookeeper.env=yes” 和 “kafka.env=yes”,用于调度Kafka 和Zookeeper服务。
    在Rancher的管理界面中点击Catalog Apps 中选择“zookeeper”这个Stack, 点击“View Details”进入到这个Stack的详细信息页面,在“Template Version”选择“1.0.0”版本,选择后会弹出Zookeeper的集群配置信息:
    0_1590630551284_68895646-5779-4238-8c64-07c917d4affb-image.png
    图 8 zookeeper服务catalog

    Zookeeper的Catalog默认提供的是3个节点的集群,默认的数据存储是挂载到“/mnt/data/dendrite/zookeeper”的文件夹下,如果需要修改挂载的路径,可以根据实际情况进行配置,点击“Launch”进行部署。

    0_1590630575634_712a25c8-c039-444e-b3a3-d861f1f45e17-image.png
    图 9 zookeeper服务详细列表

    zookeeper服务部署成功后,接下来可以开始部署Kafka集群。在Rancher的管理界面中点击Catalog Apps 中选择“kafka”这个Stack, 点击“View Details”进入到这个Stack的详细信息页面,在“Template Version”选择“1.0.0”版本,选择后会弹出Kafka的集群配置信息:
    0_1591061085086_c110137e-487d-4548-a3b8-118efb39b10a-image.png
    图 10 kafka服务catalog

    需要特别注意的是,Kafka这里配置了连接Zookeeper 的服务地址,这里通过Rancher 的ServiceName.StackName:Port方式进行访问,默认情况下,部署的是zookeeper的stack名称,点击“Launch”进行部署。Kafka服务部署成功后,可以看到如下的详细列表:
    0_1591061113259_83c82938-18a1-416c-befe-b5798d837e36-image.png
    图 11 kafka服务详细列表

    4.5部署金易联基础服务

    金易联基础服务主要是提供聊天相关的平台级功能,作为整个金易联的服务总线。在部署之前,需要先准备好server的域名,以及苹果推送服务的APNs证书文件。准备若干台服务器(具体数量和部署规模相关),用来部署金易联基础服务,其中至少一台要有访问外网的权限,用于苹果消息推送。

    在Rancher的管理界面中点击Catalog Apps中选择“chat”这个Stack, 点击“View Details”进入到这个Stack的详细信息页面,在“Template Version”选择“1.0.0”版本,选择后会弹出Chat服务的具体配置信息:
    0_1591061135747_990862aa-6a99-4def-a1a3-42d8307b23b2-image.png
    图 12 IM内核 catalog

    chat涉及的配置参数比较多,具体各个参数的含义如下:

    catalog配置说明

    1. Broker Nodes: Kafka的Broker节点配置信息
    2. DB URI: Postgres数据库链接地址字符串
    3. CACHE RUI: Redis数据库连接字符串
    4. DOMAIN NAME: IM的域名信息
    5. FED CERT: 配置的证书文件,保持默认即可;
    6. private key: 
    7. upload url: 员工端类型,使用1来表示员工端
    8. download url: 客户端类型,使用2来表示客户端
    9. thumbnail: 获取头像缩略图的URL
    10. as_id: AS服务的App Id 
    11. as_url: AS服务的URL地址,指向AS服务的地址,保持默认值即可
    12. as_token: AS服务的Token,需要跟Platform的msg-bridge的as_token保持一致;
    13. hs_token: HomeServer的Token信息,需要跟Platform的msg-bridge的token保持一致;
    14. sender_localpart: 匹配过滤Sender的信息,@*.表示接收所有的用户消息;
    15. as_namespace_users: 需要过滤的某个用户的信息,AS默认接收所有的消息;
    16. as_namespace_alias: 需要过滤的某个房间的别名信息,默认不填;
    17. as_namespace_rooms: 需要过滤的房间的信息,默认不填
    

    确认上述的配置信息准确无误后,点击“Launch”进行部署。chat服务部署成功后,可以看到如下的详细列表:
    0_1591061164515_951d78f7-d2f6-4edf-b86a-0c4aefb7e3a4-image.png
    图 13 chat服务详细列表

    网关服务提供FinChat的所有访问入口,该服务主要提供服务的路由、路由配置初始化和一个可视化的管理面板,查看当前gateway的路由配置信息。

    在Rancher的管理界面中点击Catalog Apps中选择“gateway”这个Stack, 点击“View Details”进入到这个Stack的详细信息页面,在“Template Version”选择“1.0.0”版本,选择后会弹出gateway服务的具体配置信息:
    0_1591061189103_88e9437f-890f-47dd-92ea-95007a6b2b62-image.png
    图 14 网关服务catalog

    确认上述的配置信息准确无误后,点击“Launch”进行部署。服务部署成功后,可以看到如下详细的列表:
    0_1591061217891_582d7953-7072-4344-8697-1fc86af36c59-image.png
    图 15 gateway 服务列表

    gateway服务部署成功后,接下来继续部署platform相关的服务。在Rancher的管理界面中点击Catalog Apps中选择“platform”这个Stack, 点击“View Details”进入到这个Stack的详细信息页面,在“Template Version”选择“1.0.0”版本,选择后会弹出platform服务的具体配置信息:
    0_1591061247243_67bc1511-eccd-4c7f-b3f9-ddf16ae12a50-image.png
    图 16 platform服务catalog

    需要注意的是这里AS token 和HomeServer Token 以及Id需要和chat 的Stack中的配置信息保持一致,否则msg-bridge无法收到HomeServer 推送过来的消息。确认上述的配置信息准确无误后,点击“Launch”进行部署。服务部署成功后,可以看到如下详细的服务列表:
    0_1591061270113_ab1e7c39-3f30-423a-a64a-6e7919d262c4-image.png
    图 17 platform服务详细列表

    在platform服务部署成功后,接下来继续部署Auth服务,该服务主要是对接客户的登录认证。

    在Rancher的管理界面中点击Catalog Apps中选择“auth”这个Stack, 点击“View Details”进入到这个Stack的详细信息页面,在“Template Version”选择“1.0.0”版本,选择后会弹出auth服务的具体配置信息:
    0_1591061290295_36e097ac-0cda-43d8-8d57-2b1383658fb8-image.png
    图 18 auth服务catalog
    确认上述的配置信息准确无误后,点击“Launch”进行部署。Auth服务部署成功后,可以看到如下的详细信息:
    0_1591061318267_5a5dac49-b97f-4c26-8425-ded3dbcf0f8e-image.png
    图 19 auth服务详细列表
    部署完auth服务之后,接下来继续部署adapter服务,该服务主要用于对接用户登录认证的适配。

    在Rancher的管理界面中点击Catalog Apps中选择“adapter”这个Stack, 点击“View Details”进入到这个Stack的详细信息页面,在“Template Version”选择“1.0.2”版本,选择后会弹出adapter服务的具体配置信息:
    0_1591150878242_4eace05c-6116-4fea-88fe-49183e541542-image.png
    图 20 adapter服务catalog

    上述小程序的APP_ID和APP_SECRET需要根据实际的使用情况进行配置。确认上述的配置信息准确无误后,点击“Launch”进行部署。

    4.6部署金易联业务服务

    金易联业务服务主要用于智能客服、系统派单、工单管理、知识库管理和搜索、敏感词管理等。

    在Rancher的管理界面中点击catalog中选择“swan”这个Stack, 点击“View Details”进入到这个Stack的详细信息页面,在“Template Version”选择“1.0.0”版本,如果当前模板版本有更新的版本,则选择最新的版本,选择后会弹出服务的具体配置信息:
    0_1591150921351_e96f3eba-d9da-42e1-a210-3abe244aea71-image.png
    图 21 工单系统catalog

    检查相关的配置信息,确认准确无误后,点击“Launch”进行服务的部署。在工单系统服务部署成功后,即可看到如下的服务列表,具体如下:
    0_1591150941562_871f570b-14be-4ed5-8376-a9ad595da274-image.png
    图 22 swan服务列表

    金易联业务服务涉及的参数进行相关的说明:

    1. max_advisory: 咨询工单最大未处理数, 默认值1000
    2. knowledge_static_prefix: 知识库静态页面地址,主要修改域名部分
    3. tag_text_url: 智能标签服务调用地址
    4. mongo_domain: 数据库域名信息,使用rancher的service-name.stack-name方式
    5. mongo_auth: mongo数据库密码
    6. knowledge_port: 知识库搜索端口,保持默认值;
    7. detall_url: 知识库详情前缀,保持默认值
    8. assist_id: 智能助理账号id,根据实际情况进行变更
    9. assist_password: 智能助理密码,根据实际情况填写
    10. customer_id智: 能客服账号id
    11. customer_port: 智能客服接口端口,保持默认值即可
    12. customer_password: 智能客服密码
    13. bots_init: 机器人注册信息,用户客户初次登录添加对应的机器人账号;
    14. minaAppID: 小程序的AppID;
    15. avatar_url: 机器人初始化头像地址;
    

    4.7部署监控

    整套监控方案包括:

    (1)cadvisor: 提供容器监控服务,该服务会占用宿主机的18080端口,每台宿主机都需要部署该服务;
    (2)node-exporter: 宿主机监控服务,该服务会占用宿主机的9100端口,每台宿主机都需要部署该服务;
    (3)grafana: 监控展示面板;
    (4)prometheus: 监控数据存储;
    (5)alertmanager: 监控告警管理中心;
    (6)alert-webhook: 监控告警通知服务;
    (7)api-porber: API探测服务;
    在了解了整套监控方案后,根据我们提供的catalog来部署一套监控服务。在部署监控服务之前,需要在部署该监控服务的宿主机上添加以下两个label: “monitor.grafana=finochat”,“monitor.prometheus=finochat”。
    在Rancher的管理界面中点击catalog中选择“monitor”这个Stack, 点击“View Details”进入到这个Stack的详细信息页面,在“Template Version”选择 1.0.0版本,选择后会弹出监控服务的具体配置信息:
    0_1591150969917_2c778cb2-35bc-45a5-920b-9e055b0588c7-image.png
    图 23监控配置详情

    上述变量配置中,每个变量的具体含义如下:

    catalog配置说明

    1. app: 用于设置机器的label,使用默认值即可
    2. admin password: 设置grafana的admin用户密码
    3. db path: 指定配置文件路径,不同机构的grafana面板配置不同
    4. prometheus config file: 设置promethues收集监控数据的配置文件,不同机构的监控指标不同
    5. alarm bot userid: 报警机器人id
    6. environment: 作为监控信息的机构环境名称
    7. api host: 设置api探针监控进行服务探测的api地址
    8. auth userid: api探测使用的用户id(去除finochat前后缀)
    9. auth fcid: api探测使用的用户id
    10. auth app token: api探测使用的用户token
    11. auth app type: api探测使用的app type
    12. auth login type: api探测使用的用户登陆方式
    

    在部署时,主要确认下“alarm bot userid”账号是否存在可用。信息确认无误以后,点击 “Launch”进行部署。部署成功后,在Rancher上看到每个服务的状态都为active,具体如下:
    0_1591150991668_76b7af78-9e33-4351-81a2-34b0f8455bf3-image.png
    图 24监控服务详情