[关闭]
@jiangyifen 2017-10-20T08:49:19.000000Z 字数 3347 阅读 698

RSMW 多租户改造项

中间件

0. 多租户方案概述

0.1 数据库方案

备注:
1)由于rsmw没有牵涉到自定义表,所以可以比较方便地采用【tenantId列】,也就是“共享表”的方案。对于有自定义表的项目,采用独立schema的方案比较适合
2)如何确定登陆用户属于哪个tenant?对于tenantId列的方案中,可以直接通过登录名确定tenant;而在非tenantId列的方案中,就需要通过域名或登陆界面的用户输入(如直接输入tenant,或用户名@tenant之类的形式)来确定tenant

0.2 改造工作

0.2.1 全局的config

增加租户前缀长度,默认设置为4
tenantPrefixLength = 4
这个长度主要是在tenant增删改查时,用于生成tenantPrefix或校验的

0.2.2 asterisk

所有呼叫,尽早确认tenantId,tenantPerfix,并且保存到channelVariable中

0.2.3 cache

MyCache数据结构考虑

0.2.4 Java

entity,service,controller增加tenantId

注意,这些字段要和tenantId做联合唯一(索引、页面校验)
rsmw_contact.phonenumber
rsmw_moh.name
rsmw_blacklist.phonenumber

config区分全局配置项和租户配置项

不需要增加tenantId列的表:

所有的多对多link表
rsmw_mobile_info (应当改名成sys_mobile_info)

rsmw_gateway 需要tenantId列(tenantId=0代表属于全局,而不是属于特定tenant)

2. 租户的增删改查

datatable套路
save,update的modal页面分两部分,一部分是tenant本身的字段,另一部分用于维护tenantConfig

tenant字段

2.1 新增租户

向导形式:
1)租户名称(客户公司名称,前缀由系统生成)
2)填写接入号(后台校验是否已存在)
3)填写分机数量

注意,tenantPerfix的长度需要严格根据ConfigKeys.tenantPrefixLength检查,一位不能多一位不能少

租户实体类

实体 字段 说明 类型 长度 索引 必填
rsmw_tenant id 主键 bigint 20 PK
rsmw_tenant name 租户名称 varchar 64
rsmw_tenant tenantPerfix 租户前缀(1000~9999) int 11 唯一

3. 租户的自助操作界面(独立模块)

用户登录

登陆名:租户管理员的手机号+密码;手机号作为字段,保存在租户表,并做唯一性约束
在tenantManager中设置手机号;初始密码通过短信发送到手机;

功能

看状态:sip分机状态、技能组概览、技能组详情

查话单,听录音:话单和录音、语音留言

电话会议:会议大厅、会议录音

配置:SIP分机(仅限编辑)、呼入路由、IVR、IVR语音资源、技能组、技能组提示音、电话会议、语音信箱、背景音乐、黑名单
所有可以让用户自己新增的项,都需要限制数量!!

查报表

【暂缓,需要测试多方时的cpu消耗】
电话会议界面需要单独账号登陆
操作电话会议(按开通功能,免费开放1个会议室,并只能开3分钟的会议,并在页面提示订购方式)
查电话会议录音(按开通功能)

QQD 多租户改造项

1 数据库方案

1.1 表方案

备注:
1)由于qqd牵涉到自定义表,所以不适合采用【tenantId列】,也就是“共享表”的方案。对于有自定义表的项目,采用独立schema的方案比较适合。
2)如何确定登陆用户属于哪个tenant?对于tenantId列的方案中,可以直接通过登录名确定tenant;而在非tenantId列的方案中,就需要通过域名或登陆界面的用户输入(如直接输入tenant,或用户名@tenant之类的形式)来确定tenant。
3)qqd的表,包含一个全局库(qqd+rsmw),X个租户库(qqd_1, qqd_2, qqd_X)

参照udesk,在登陆界面输入注册时填写的域名,点击跳转(参考http://www.udesk.cn/login_notification)。登陆的indexController可以用域名来明确tenantId

1.2 表维护

[方案2]:用user_user表的uuid作为aid
这个貌似更好。就是有较大的测试量

2 修改工作

2.1 Entity

不用动

单租户版本 的superDao需要修改成 多租户分库版本 superDaoMultitenant

2.2 Service

相关method的定义,都在第一个参数的位置,增加Long tenantId字段

各处的loadToCache要考虑仅加载指定tenant的数据:
QqdCache里的相关map改成 Map>
原有的loadToCache需要增加tenantId参数
Init中执行的loadToCache需要for循环轮询所有tenant

单租户版本的superDao访问全局库
多租户分库版本的superDaoMultitenant访问租户库

单租户版本的congifService访问全局库
多租户分库版本的configServiceMultitenant访问租户库

单租户版本的extColumnService需要修改成多租户分库版本 extColumnServiceMultitenant

2.3 SqlBuilder

为了实现不同租户连接数据库里不同的schema,相关的DbUtil.getDbname()改成DbUtil.getDbname(Long tenantId)

SqlBuilder中如何获取TenantId?
从CommRequestParams.request获取。可以用SessionUtil.getTenantId(HttpServletRequest request)

2.4 报表sqlBuilder

rsmw包下的报表是用tenantId列的方案,所以需要加上where tenantId=xx

2.5 后台线程、所有DbUtil.defaultTenantId

注意哪些线程与tenant有关

注意所有使用DbUtil.defaultTenantId的地方

2.6 群呼是否要做些限制??

多租户版本是否要群呼?之前许总明确提过,多租户版本不要群呼。
待定

3 运营者管理员界面

rcc/boss,功能包括

租户的管理(租户增删改查,租期,费用,座席数量等。注意关键操作要有日志)
录音的管理
线路的配置

4 单租户和多租户,从license上要做哪些区分

租户数量

添加新批注
在作者公开此批注前,只有你和作者可见。
回复批注