小动物
2021-02-12
春运卖票 首先,先聊操作类的行为,主要就是购票。 对于购票人而言,关心的是购票结果,对花费的时间有一定的容忍度。 当用户发起下单,那说明一定选择了某辆车。那么就是购票人对某两车的票进行操作。在保证正确性的情况下,第一反应就是队列,所有对同一辆车的购票行为丢进同一个队列中,顺序处理。同一班车虽然因为不同岂止站导致车票组合情况很多,但实际票的数量固定,且数量级并不大。若真的因为购票人数多,排队过长,也问题不大,因为票很容易就卖完。后续的人不需要处理了。 从这个方案出发,服务器可以按车次来配置路由,保证热门线路。 对于查询。在没有查询换乘方案时,查询结果的数量并不多。且查询时应该可以接受一定的错误,毕竟查询和实际下单有时间差,票数量差个几张问题不大。那可以做一定的缓存保证查询。 王者荣耀 玩家每一个操作可以看成一个命令。后端可以按事件溯源架构来设计。在断线恢复后,将断线期间的事件同步至本地,恢复玩家状态即可。
4
tt
2021-02-16
老师过年好,祝您新春快乐! 对于第一个主观题,我是这么思考的。 首先,火车票动态SKU是12306的核心域,应该花很大的成本去改进,就像课程所说,12306也有雄厚的财力可以去解决,但是有啥特殊的硬件,我还不知道。这里就从咱们课程主要涉及的数据处理的视角出发去思考。 其次,购买火车票的过程主要涉及的是交易数据,应该使用关系性数据库处理最核心的交易环节。 最后,火车票售票张数绝对量很大(全国铁路已累计发售车票 1.75 亿张,每天的发售量都在 1000 万张以上),交易并发大(12306 在高峰日平均 1 秒就要承受 170 多万次点击),业务复杂(火车票的种类是动态变化的)。 1、从对数据的操作来看,无非是分成读和写两类。所以,本质还是处理读写、写写两类冲突,额外的特点是火车票是动态变化的,所以库存查询应该不适合使用REDIS之类的缓存,这样,数据库和缓存的同步成本太大了。 2、避免数据读写冲突。对不同数据的操作不会引起冲突——不同的路线不会冲突,所以应把不同的路线车票数据分开存储,这样降低了数据的并发,也减少冲突。相当于做了分库,需要在存储节点前加上带路由功能反向代理。 3、处理数据读写冲突。由于数据并发过大,为了提高处理速度,单节点不应该采用可串行化隔离级别。查询车票余量要尽可能实时,所以不需要可重复读;所以采用读已提交就可以了。同时,由于并发量比较大,也不应该采用乐观协议。 4、不需要分布式事务。一是分布式事务比较慢,影响处理速度;而是将不同路线分布到不同节点,单节点就应该足以应付数据量。 为了提高可靠性,需要考虑多机有容灾的情况,数据存储在多个副本上。为了保证交易结果的准确定,单调读\写,自读自写一致性,先读后写一致性都要满足,所以就是需要满足线性一致性。如果用关系数据库,那所有读写请求都需要发给主节点,高并发下的主从同步还是状态复制机,我的理解,比如MySQL之间同步用的BINLOG就是命令。节点状态的共识依靠分布式共识算法。
展开
3