分类存档: 余票

北京北-清华园

谢谢你,每天都能订到票的神车4471。

节后第一天上班略早,碰巧下雪没骑车改坐地铁,碰巧追上停靠清华园的4471。

4471 2014-02-07

 

以及,初次体验自动售票机。

2014-02-07 13.11.37

还有,无数次订你的票不付款。

余票网的那点事儿

yupiao 运营至今已经有三年了,逐渐由一个小网站变成了一个小系统。分享一些经验。
最初的网站是用asp.net写的,只是简单的数据获取和展现,很挫。后来研三(2012)有时间搞了python和django,逐渐才把 yupiao 搞的有点像一个互联网产品。本文也主要讨论2012年之后的事情。

服务器:

盛大云,当时在盛大工作的 Walter 推荐了他们的新产品,于是我就用一下吧,发现还真不错的说,就把网站搬了上去。后来中间因为促销优惠的原因,升级过两次机器。现在主服务器是华东 1Core + 2GB + 30GB + 15GB(云硬盘) + 2M电信网通双IP,服务器资源基本是榨干的状态。不过目前打算换阿里云了,有条件可以再考虑加台 Linode东京。
另外,参与工作的还有 BuyVM.com 在达拉斯的一台廉价VPS,CUGB ACM 的服务器,家中的廉价服务器……

爬虫:

余票的爬虫系统是一个通过 RabbitMQ 分配任务的分布式系统。爬虫在主服务器上部署 manager 分发并回收任务结果。在全球在不同网络环境下部署了多台爬虫 worker。
爬虫分布在教育网、米国vps、国内vps和国内adsl上。每个worker通过 rmq与主服务器进行任务和结果的交换,通过 api 访问基础数据,通过配置文件设置不同类型job的占比。gevent 保证高效的网络 IO 吞吐。其中一台为动态ip爬虫,通过自动重拨adsl实现IP地址轮换,抓取御策略强的网站效果极好。
说到爬虫,可以顺便提一下,我这里的数据应该是全网同步度最高的一份时刻表了。(但连票价模型都没做好……真是懒啊)

数据库:

主要是mysql和redis,redis里面放实时访问和性能要求高的数据,过时的数据存入mysql。
redis上的很多简单操作的QPS轻松万次以上,并且有成熟的持久化策略。列车和正晚点的数据主要放在redis上,列车数据并不很多,因此数据全部丢到内存中是很实惠的,redis内置的集合运算也让换乘之类关联查询的效率好很多。
mysql中的数据主要依赖django的ORM,很平常很普通。

服务:

http api server 基于 tornado + gevent,主要向web端和爬虫供应数据,包括一些远程查询及其memcached缓存(12306实时数据、天气、火车维基)。tornado和gevent相对轻量并且高效,有一些异步的特性,适合做api服务。
web server是就是django了,用到的都是基本功能,很够了。
下一次架构调整时会将比较重数据操作的部分独立做一个后端,现在这样的操作不多,所以暂时还是混在一起的。
最外层的服务是nginx,配反向代理到tornado的裸服务,用uwsgi驱动django。

备份:

看完上面的介绍,你有木有觉得,整套系统到处都是单点啊。不过,死翘翘也不怕,我有备份策略。系统代码是在Git上,所以不怕。数据库打包起来也只有几百M,每天凌晨时分异地备份一次,真遇到各种天灾人祸的话,换个地方搭一套就好了。

铁路地图:

单开一贴扯了,猛击:传送门