用户体系建设概要
业务分析
12306 铁路购票系统中,存在两类用户,分别是:会员(即当前账户登录用户)以及乘车人。
1. 会员用户
会员支持在系统中自行注册,需要注册者提供用户名、密码、证件类型、证件号、真实姓名、手机号、邮箱以及旅客类型。
其中,用户名和证件号码全局唯一,不允许注册者重复使用。
会员登录系统时,支持用户名/邮箱/手机号码三种登录方式,搭配密码完成系统用户登录行为。
2. 乘车人
一个注册会员可以添加多个乘车人。添加乘车人时需要填写真实姓名、身份证、手机号等,新增乘车人需要通过实名认证审核,审核通过方可成功。
会员选择交通工具(火车、高铁等)进行买票时,可以选择多个乘车人进行购票。
会员可以通过已支付订单查看所有订单信息,乘车人也可通过订单标签页中本人车票查看自己或其他会员购买为自己购买的订单信息。
业务难点
由于篇幅所限,本文无法详尽解答以下业务难点,但这些问题都会在后续的手摸手教学系列中逐一阐述,并给出较优解决方案。
1. 如何确定信息真实
当用户在 12306 网站注册新账号或者为自己的账号添加新的乘车人时,系统需要确保用户提交的各项信息是真实准确的,而不是虚假的。
这其中就涉及到一个很重要的概念——用户信息的认证。对用户提交的信息进行认证,就是要验证信息的真实性,确认这确实是本人自愿提交的真实信息,不是其他人冒充的。
那么如何进行有效的用户信息认证呢?这个问题可以简化为一个核心点:你需要向系统证明你就是你本人,你提供的信息都是真的。
举个简单的例子,在注册时,你提交了自己的身份证号码。但是系统怎么确认你提交的身份证号码真的属于你自己,而是通过非法途径获取然后冒充他人的呢?这就需要进行用户认证。

许多云服务提供商开放了收费的身份验证接口,这些接口底层主要调用公安部门的身份核验系统,并在云服务端增加缓存层。
12306 中的信息准确性校验主要包括:
- 注册会员时,校验用户名、证件号、手机号是否匹配,确保账号信息真实有效。
- 添加乘车人时,校验乘车人姓名、身份证号是否真实匹配, 并校验手机号可用性。
如果 12306 的用户验证依赖收费的云服务或公安接口,为了优化成本和性能,其底层系统很可能采用缓存机制来减少对外部服务的直接调用。
2. 数十亿级数据量
根据 2022 年的全国人口统计数据,现有 14 亿多总人口,每年新生人口约 956 万。为便于后续业务数据规模的判断,本文先基于这一人口总量和增长数据进行估算。

根据系统设计的假设,12306 的注册用户规模约为 10 亿,每年新增用户约 500 万。
考虑到会员可添加多名乘车人,且一家多人可能分别拥有账号,估算乘车人数据量大约为注册用户的 2-3 倍,粗略估算约 30 亿左右。
鉴于会员和乘车人数据规模都已超过 10 亿级别,远超出单机 MySQL 数据库的处理能力,所以需使用分库分表或分布式数据库来支撑海量数据。
考虑到分布式数据库普及率较低,分库分表技术仍是大多数公司的选择,所以后续文章关于大数据量的解决方案会以分库分表技术来说明。
如果使用分库分表技术,面试中这些问题都是无法避免会被问到:
- 选择分库还是分表,还是选择分库分表?基于什么考虑?
- 选择哪个字段作为分片键?选择单个分片键还是复合分片键?
- 如何在老业务上平滑上线分库分表?出现问题如何快速回滚?
- 拆分后出现单表数据量过大,如何继续扩容?扩单表还是整体扩?