支持全球80亿人口的可演进的用户中心架构
![](https://raw.githubusercontent.com/AlbinChang/UserService/main/images/UML%E7%94%A8%E4%BE%8B%E5%9B%BE.svg)
用例标识 |
USER_000001 |
用例名称 |
用户注册 |
用例类型 |
业务功能 |
用例描述 |
用户录入基本信息、登录密码, 校验通过后, 注册成功 |
角色 |
用户 |
前触发事件 |
|
事件流 |
基流
|
1、用户录入基本信息、输入密码,提交注册
2、校验用户信息通过
3、用户注册成功
|
分支流
|
|
替代流
|
2.1 校验用户信息不通过, 用户注册失败
|
后触发事件 |
事件编号 |
事件名称 |
E_USER_000001 |
用户注册成功 |
|
非功能性需求 |
支持全球80亿用户注册
|
用例标识 |
USER_000002 |
用例名称 |
用户登录 |
用例类型 |
业务功能 |
用例描述 |
用户录入登录信息, 校验通过后, 登录成功 |
角色 |
用户 |
前触发事件 |
事件编号 |
事件名称 |
E_USER_000001 |
用户注册成功 |
|
事件流 |
基流
|
1、用户录入用户号、输入密码,提交登录
2、校验用户信息通过
3、用户登录成功
|
分支流
|
1.1 用户录入手机号,输入密码,提交登录
1.2 用户录入手机号,输入验证码,提交登录
|
替代流
|
2.1 校验用户信息不通过, 用户登录失败
|
后触发事件 |
事件编号 |
事件名称 |
E_USER_000002 |
用户登录成功 |
|
非功能性需求 |
支持全球80亿用户登录
|
用例标识 |
USER_000003 |
用例名称 |
修改密码 |
用例类型 |
业务功能 |
用例描述 |
用户输入新密码, 校验通过后, 修改成功 |
角色 |
用户 |
前触发事件 |
事件编号 |
事件名称 |
E_USER_000002 |
用户登录成功 |
|
事件流 |
基流
|
1、用户输入旧密码,新密码,提交修改
2、校验信息通过
3、修改密码成功
4、用户退出登录态,跳转登录页
|
分支流
|
|
替代流
|
2.1 校验不通过, 修改密码失败
|
后触发事件 |
事件编号 |
事件名称 |
E_USER_000003 |
修改密码成功 |
|
非功能性需求 |
支持全球80亿用户
|
用例标识 |
USER_000004 |
用例名称 |
修改个人信息 |
用例类型 |
业务功能 |
用例描述 |
用户修改个人信息, 校验通过后, 修改成功 |
角色 |
用户 |
前触发事件 |
事件编号 |
事件名称 |
E_USER_000002 |
用户登录成功 |
|
事件流 |
基流
|
1、用户输入新的个人信息,提交修改
2、校验信息通过
3、修改个人信息成功
|
分支流
|
|
替代流
|
2.1 校验不通过, 修改个人信息失败
|
后触发事件 |
事件编号 |
事件名称 |
E_USER_000004 |
修改个人信息成功 |
|
非功能性需求 |
支持全球80亿用户
|
用例标识 |
USER_000005 |
用例名称 |
修改手机号 |
用例类型 |
业务功能 |
用例描述 |
用户手机号, 校验通过后, 修改成功 |
角色 |
用户 |
前触发事件 |
事件编号 |
事件名称 |
E_USER_000002 |
用户登录成功 |
|
事件流 |
基流
|
1、用户输入新的手机号,手机验证码,提交修改
2、校验信息通过
3、修改手机号成功
|
分支流
|
|
替代流
|
2.1 校验不通过, 修改手机号失败
|
后触发事件 |
事件编号 |
事件名称 |
E_USER_000005 |
修改手机号成功 |
|
非功能性需求 |
支持全球80亿用户
|
![](https://raw.githubusercontent.com/AlbinChang/UserService/main/images/%E7%94%A8%E6%88%B7%E9%A2%86%E5%9F%9F%E6%A8%A1%E5%9E%8B.svg)
1、80亿用户,无法用一个数据库存储,需要分库
2、需要有一个全局用户编号生成器,保证用户编号的唯一性
3、需要有一个数据路由服务,定位用户在哪个库
4、支持横向扩展,演进式按需扩容
1、 假设每个库存放500万用户,80亿用户,需要 80亿/500万 = 1600 个分库
2、 使用Redis作为用户编号生成的数据库,前缀U,加10个数字,有序递增生成
3、 用户编号的10个数字 求 500万 的商, 商代表分库编号, 手机号 跟 用户编号的映射关系存放在Redis, Redis需要 (11字节+11字节) * 80亿 / 1 GB = 163.9 G
4、 用户编号有序递增,求 500万 的商, 商代表分库编号,一开始只需要一个分库,就能满足需求,后续用户将超过500万,新增一个分库横向扩展,随着用户不断增长,能够演进式按需扩容
![](https://raw.githubusercontent.com/AlbinChang/UserService/main/images/%E6%80%BB%E4%BD%93er%E5%9B%BE.svg)
![](https://raw.githubusercontent.com/AlbinChang/UserService/main/images/user_base.png)
![](https://raw.githubusercontent.com/AlbinChang/UserService/main/images/user_event.png)
key |
value |
user_base.mobile |
user_base.user_id |
![](https://raw.githubusercontent.com/AlbinChang/UserService/main/images/%E7%94%A8%E6%88%B7%E6%B3%A8%E5%86%8C%E6%95%B0%E6%8D%AE%E6%B5%81%E5%9B%BE.svg)
![](https://raw.githubusercontent.com/AlbinChang/UserService/main/images/%E6%89%8B%E6%9C%BA%E5%8F%B7%E7%99%BB%E5%BD%95%E6%95%B0%E6%8D%AE%E6%B5%81%E5%9B%BE.svg)
![](https://raw.githubusercontent.com/AlbinChang/UserService/main/images/%E7%94%A8%E6%88%B7%E7%BC%96%E5%8F%B7%E7%99%BB%E5%BD%95%E6%95%B0%E6%8D%AE%E6%B5%81%E5%9B%BE.svg)
![](https://raw.githubusercontent.com/AlbinChang/UserService/main/images/%E7%94%A8%E6%88%B7%E7%BC%96%E5%8F%B7%E8%B7%AF%E7%94%B1%E6%95%B0%E6%8D%AE%E6%B5%81%E5%9B%BE.svg)
![](https://raw.githubusercontent.com/AlbinChang/UserService/main/images/%E7%B3%BB%E7%BB%9F%E8%A7%84%E5%88%92.svg)
![](https://raw.githubusercontent.com/AlbinChang/UserService/main/images/%E7%94%A8%E6%88%B7%E4%B8%AD%E5%BF%83%E5%88%86%E5%B1%82%E8%AE%BE%E8%AE%A1.svg)
针对非功能性需求,进一步的细化开发架构
![](https://raw.githubusercontent.com/AlbinChang/UserService/main/images/%E7%94%A8%E6%88%B7%E8%AF%BB%E5%86%99%E6%9C%8D%E5%8A%A1%E6%9E%B6%E6%9E%84.svg)
![](https://raw.githubusercontent.com/AlbinChang/UserService/main/images/%E7%94%A8%E6%88%B7%E6%9F%A5%E8%AF%A2%E6%9C%8D%E5%8A%A1%E6%9E%B6%E6%9E%84.svg)