大数据&云计算|大数据下的用户中心如何设计( 三 )


该函数设计需要非常讲究技巧 , 且有uid生成冲突风险 。
画外音:uid冲突 , 是业务无法接受的 , 故生产环境中 , 一般不使用这个方法 。
什么是 , 基因法?
基因法的思路是:不能用login_name生成uid , 但可以从login_name抽取“基因” , 融入uid中 。
假设分8库 , 采用uid%8路由 , 潜台词是 , uid的最后3个bit决定这条数据落在哪个库上 , 这3个bit就是所谓的“基因” 。
具体的解决方案如下:
大数据&云计算|大数据下的用户中心如何设计
本文插图

(1)在用户注册时 , 设计函数login_name生成3bit基因 , login_name_gene = f(login_name) , 如上图粉色部分;
(2)同时 , 生成61bit的全局唯一id , 作为用户的标识 , 如上图绿色部分;
(3)接着把3bit的login_name_gene也作为uid的一部分 , 如上图屎黄色部分;
(4)生成64bit的uid , 由id和login_name_gene拼装而成 , 并按照uid分库插入数据;

(5)用login_name来访问时 , 先通过函数由login_name再次复原3bit基因 , login_name_gene = f(login_name) , 通过login_name_gene%8直接定位到库;
画外音:基因法 , 有点意思 , 在分库时经常使用 。
用户侧 , 如何实施“前台与后台分离”的架构方案呢?
前台用户侧 , 业务需求基本都是单行记录的访问 , 只要建立非uid属性login_name到uid的映射关系 , 就能解决问题 。
后台运营侧 , 业务需求各异 , 基本是批量分页的访问 , 这类访问计算量较大 , 返回数据量较大 , 比较消耗数据库性能 。
此时的架构 , 存在什么问题?
此时 , 前台业务和后台业务共用一批服务和一个数据库 , 有可能导致 , 由于后台的“少数几个请求”的“批量查询”的“低效”访问 , 导致数据库的cpu偶尔瞬时100% , 影响前台正常用户的访问(例如 , 登录超时) 。
画外音:本质上 , 是系统的耦合 。
大数据&云计算|大数据下的用户中心如何设计
本文插图

而且 , 为了满足后台业务各类“奇形怪状”的需求 , 往往会在数据库上建立各种索引 , 这些索引占用大量内存 , 会使得用户侧前台业务uid/login_name上的查询性能与写入性能大幅度降低 , 处理时间增长 。
对于这一类业务 , 应该采用“前台与后台分离”的架构方案 。

什么是 , 前台与后台分离的架构方案?
大数据&云计算|大数据下的用户中心如何设计
本文插图

用户侧前台业务需求架构依然不变 , 产品运营侧后台业务需求则抽取独立的 web / service / db 来支持 , 解除系统之间的耦合 , 对于“业务复杂”“并发量低”“无需高可用”“能接受一定延时”的后台业务:
(1)可以去掉service层 , 在运营后台web层通过dao直接访问db;
(2)不需要反向代理 , 不需要集群冗余;
(3)不需要访问实时库 , 可以通过MQ或者线下异步同步数据;
(4)在数据库非常大的情况下 , 可以使用更契合大量数据允许接受更高延时的“索引外置”或者“HIVE”的设计方案;
大数据&云计算|大数据下的用户中心如何设计
本文插图

总结
用户中心 , 是典型的“单KEY”类业务 , 这一类业务 , 都可以使用上述架构方案 。
常见的数据库水平切分方式有两种:
(1)范围法;
(2)哈希法;
水平切分后碰到的问题是:
(1)通过uid属性查询能直接定位到库 , 通过非uid属性查询不能定位到库;


推荐阅读