如何用单片机运行类似于12306的网站?我是这么想的,与大家探讨,不一定对!
先估计一个数字,春运期间的30天或者40天里,一共发了多少车次的客运列车,这个数字没查到,只查到新闻说去年春运运了30亿人次,反正是估算,先放大到40亿(4G)人次,假定一辆列车运送人次是4K(毛估估,一节车厢256人,一车挂16节),也不管什么中途上下车的问题了,4G/4K~=1M,就按这个数量级估算。
我们用最简单的方式建模,来表示一车次列车的车票库存。简化点,先不考虑座位号,考虑所有列车都不卖坐票只卖站票的情形。比如上海始发,经停苏州,无锡,常州,到南京,包含始发和终点站一共5站。这辆列车,包括车次和时间,赋予一个唯一ID;然后它的车票库存可以表示为一个数组,数组内是N-1个元素,N是站的数量,包括始发站,第一个元素是上海到苏州的可售位置数,第二个元素是苏州到无锡的可售位置数,以此类推;假定最高位置数限制是4096,那么这个数组在售票前就是:{4096, 4096, 4096, 4096};
第一个乘客买了上海到常州的票之后,变成{4095, 4095, 4095, 4096};
第二个乘客买了苏州到南京的票之后,变成{4095, 4094, 4094, 4095};
以此类推,如果有人退票,可以加回来;
然后我们看如何把作为加进去,也很简单,把上述的数组元素的每个元素,从一个(可售位置)数拓展称为一个可售位置数C和一个Bit Array(BA),BA中的每个bit对应一个具体的座位号,座位号和Bit位置的mapping关系可以作为协议实现定义好;这里我偷个懒不画图了,你可以想想一下把上面写的一维数组展成二维的,每个可售位置数上方是一列bit,1或者0,表示这个位子已经被卖了还是可售,如果卖掉一张坐票,那就不仅仅是处理C的问题,还要把从上车和下车的站之间的一行bit都标记掉。
这样做一个车次的列车需要多少内存空间表示它的“库存”呢?假如有2048个位子(一辆车厢128,不会挂超过32节吧?),这是512Byte,C的Byte就不计了,假定有64站,两者乘出来是32K。
我们前面估了一个40天1百万车次,两个数字乘出来是32G。当然不可能用一个单片机来搞定它,但是也不需要多强劲的Mainframe。而且这个服务器是Scalable的,你随意切分。
这个服务器不提供查询服务,只提供对库存的操作,可以减票,加票/退票;内部的数据结构不需要排序,外部直接用Index来索引记录,由于运算过于简单,实际的瓶颈不会发生在计算上;
这个服务器的每次操作的结果是广播出去的,所以它的内部库存情况可以很容易被镜像,镜像服务器负责提供查询服务;
向这个服务器发送的减票/加票请求需要通过一种Agent来操作,Agent根据(通过镜像的)查询结果和算法约定决定取那些票握在手里,让乘客选,乘客购买或者放弃购买后Agent可以把票还给库存服务器;很显然Agent也是非常Scalable的。
作为一名喜欢胡思乱想的嵌入式工程师,我觉得这样的Lockless设计才是合理的,犯不上用什么分布式数据库。请大家斧正。
|