一次购买火车票的思考

在这片神奇的国家里,作为最大规模迁徙的春运每年都是让我为购买一张回家的火车票而绞尽脑汁,这里就不吐槽12306有多烂了,毕竟它省去了很多排队的时间,这次抢火车票最开始用的是360抢票浏览器,票一放出来就立马被抢光了,最后好不容易捡到了一张,后来在网上有网友吐槽说360是为了骗取12306的账号,这个就不得而知了。

先说一下360浏览器的抢票流程吧,首先你要输入自己12306的账号和密码登陆,然后这个软件从12306上拉取你的乘车人信息,然后再进行选定车次等操作就可以开始抢票了,一般我的账号里面有多个人的信息,这些人的信息是在12306上自己输入的,必要的有身份证号、性别、姓名等,并且这些信息要和身份证系统匹配才能提交,好了,那既然12306账号和购买车票的人没有任何关系(一个账号可以为任何一个人买票,只要身份信息能够通过审核),那么为什么不将12306的账号屏蔽掉呢?

前天看到支付宝钱包给阿里旅行APP做的广告,第一次买火车票与最少10块钱的红包,刚好还需要购买一张火车票,于是就下载一个阿里旅行试了一下,阿里旅行购买火车票的操作是这个样子的,首先使用支付宝账号登陆,然后摇红包(可以略去,也就摇到了10元),接着选择你需要购买的班次,选定完成之后再输入乘车人的信息(身份证号、姓名、性别),最后用支付宝支付,这样就成功买到了一张好车票。买完车票之后给我发了两条短信,第一条短信是告诉我付款成功,等待出票。第二条短信是告诉我车票成功,车次、时间、座位等信息。

第二天突然想起来这张票,就到12306上确认一下车次和时间,但是查看订单发现没有这张票啊,难道是我没有订到车票?!但是钱都付了啊,座位信息都告诉我了啊,这是怎么回事?!这时候才想起来,这张票的购买过程中我并没有输入自己的12306账号,所以肯定在我的订单里面没有这张票 ,最后在火车站取出票之后我才放下心来。

但是这个过程让我有所思考,阿里的这样的购票方式的确有点不同于其他的购票APP(例如360浏览器,网易火车票),但是仔细想一下,我要从网上买一张火车票必备的信息是什么?不就是乘坐火车的车次、日期和乘车人的信息,那为什么非要用我的账号购买呢,反正取票的时候刷的是身份证而不是12306账号,所以在购票的过程中完全可以把12306账号屏蔽掉,用户输入必要的信息,其他的都交给APP做吧。

作为码农立马就和技术联系到一块了,我们经常说操作系统是系统硬件资源的管理者,它屏蔽了计算机各种复杂的硬件,提交良好的接口给用户使用,最常见的例子吧,例如操作系统的内存管理,操作系统屏蔽了物理内存的分配操作,每一个进程在创建的时候都会分配4G(32位)的逻辑内存,而用户所使用的地址也都是这些逻辑地址,我们不关系也不用关心我们的数据存放在内存具体的哪个地方(甚至存在磁盘上),在每次读取数据的时候再使用逻辑地址映射到物理地址,再通过访问物理地址获取数据,而对于编程者来说这些过程都是透明的。以前接触过一些面向小文件的存储系统,例如TFS、haystack,这种系统的需求是实现对小文件高效、快速、可靠的存储,一般的实现都是通过小文件合并成大文件的方式,在存储一个文件的时候,需要为这个文件生成一个全局唯一的标示符,然后将文件内容追加的写入到一个大文件中(可能要写多份),接着在元数据服务器上记录这个标识符和该文件每一个备份的对应关系(每一个备份存储在哪一台服务器上,在哪一个大文件中,偏移量是多少等),之后的读取操作就可以通过这个对象的标示符来完成。这样,存储系统为我们屏蔽了存储、备份等细节,之所以能这样实现,类似于内存管理一样,我们并不关系我们实际的对象存储在那台服务器上,我们只需要能够在写入成功之后能够成功的读取它。

以上的两个例子还是有所区别的,在内存管理中,我们是首先知道我的虚拟内存的地址,然后我要在这个地址存储一些数据,内存管理模块再去为这段地址建立映射关系,读取这段数据的时候还是使用这个虚拟地址。就像我知道我的身份证号,我要用这个号码买一张好车票一样,取票的时候使用这个身份证号。而对象存储中则不一样,它里面的标示符信息是在存储文件的时候系统为用户分配的,而不是用户指定的。这个过程就好比我用我的身份证买一张火车票,成功之后发给我一条短信,这条短信上有这张票的一个唯一标识,我可以通过这个标识信息取到火车票。

但是,这种屏蔽在用户希望了解内部实现的时候就会让人烦恼,就像我在用自己的账号查看火车票的时候找不到一样。最近在学习一些大数据的根据,主要需要学习的有mapreduce、hive、sqoop、pig。我们知道每一个mapreduce任务都会在提交的时候被分配一个jobid,然后我们可以通过这个jobid查看该任务的执行状态详情。而sqoop的IMPROT、EXPORT操作都是转换成mapreduce任务来实现
的,hive的sql查看操作也是通过mapreduce完成的,但是每一个sqoop命令或者一个hive查询命令都有sqoop或者hive的标示符,这些工具向我们屏蔽了提交mapreduce的过程。我们现在项目有一个需求就是查看这些mapreduce的状态,那么我们就需要获得这些jobid,但是hive护着sqoop给我们返回的只有它们的id,这层映射对用户是透明的,也就让我焦头烂额的想办法怎么查找到每一个sqoop和hive命令对应的jobid。

pig的解决方案不错,pig在执行run(PigRunner.run)一个脚本的时候可以选择的传递一个参数,这个参数是一个Listener对象,需要实现Pig内部的PigProgressNotificationListener接口的方法,这样,在整个任务执行的过程中的各个阶段都会回调相应的函数,这样我们就可以通过一些方法来获取mapreduce的信息了。

在hive中也有一些hook,这些hook需要在配置文件中设置,在一个命令执行之前和执行时回调这些函数,但是从这里面暂时没有获取到jobid信息,另外,在hive中有一个格式化的日志,可以通过打开格式化日志通过捕获日志输出的方式获取。在sqoop中好像可以通过sqoopClient的方式访问sqoop server来获得每一个job的提交(这里的job是sqoop的job),在提交之后可以通过接口获得jobid,但是我们的输入是一个sqoop的完整命令,怎么将这个命令解析之后再使用sqoopClient访问还是一个难题。

最后,买到的那张火车票由于种种原因需要在发车的前一天退票,但是我不知道哪一个用户帮我买的火车票,所以我就不能到12306网站上把这张票退了,这时候只能再去联系阿里旅行APP,所以这一层的封装使我和12306彻底解耦了,不用再去和12306网站打交道,省去了不少烦心事,这的确是一个不错的方案。

时间: 2024-08-06 05:43:51

一次购买火车票的思考的相关文章

抛砖引玉之一 —— 由12306引发的抢购模式的思考

本文不涉及数据库原理,不会简单的对比oracle.mysql.sqlserver这些RDBMS的优异(事实上也很难得出结论),只是基于个人观点引发的一点思考,欢迎拍砖: 一个话题总要有切入点,但这次的切入点显得有些突兀: 事实上,我们是从数据库的负载均衡问题聊起来的.前面的内容不再赘述,只是话题忽的引到12306订单系统如何应对大并发的问题上: 由于没有现成的资料,无法评论12306的应用以及数据库架构是否合理.不过从表象上可以猜到一些倪端: 表象:在春运期间,一般车票是提前N天开始预订,但在放

你对金钱的态度是什么?自我思考

最近听<冬吴相对论>,节目里面提出了一个问题:“你对金钱的态度是什么?”,节目里主持人的态度就是要“敬畏金钱”.这个话题我很感兴趣,因为日常生活离不开钱这个字,但从未认真总结过. 我对金钱的态度很简单,做金钱的朋友,不要被你的贪婪吞噬自己,也不要被它引诱你失去自己,你要做的是了解自己,你就能知道你能吸引什么样的朋友.但发现简单的事情原来是最难做好的,就如佛祖说人们本来都是有无上的智慧,只是渐渐被尘世蒙蔽双眼,悟的过程其实是清楚地认识自我的过程,般若智慧原本就在你身上.小时候看香港的电影里面有个

在线买火车票为什么要安装根证书?

原地址:http://personbeta.iteye.com/blog/986241 在线买火车票为什么要安装根证书? 在线买火车票为什么要安装根证书? 2012年1月8日发表评论阅读评论 本文想简单谈谈那个所谓的“根证书”.在访问铁道部网上售票官网 www.12306.cn 后,有一个醒目的提示,为保证顺畅购票,需要下载安装根证书.那么什么是根证书?为什么买火车票的时候需要下载和安装,在淘宝等在线交易网站购物时候为什么就不需要这样做? 今年开始,人民群众们终于可以通过互联网购买火车票了.虽然

火车票预订可行性报告

1.1引言 1.1.1编写目的: 为明确将要设计的软件是否有开发价值,撰写本文档.本文档供项目经理.设计人员.开发人员.客户参考.可行性研究的目的是为了对问题进行研究,以最小的代价在最短的时间内确定问题是否可解.经过对此项目进行详细调查研究,初拟系统实现报告,对软件开发中将要面临的问题及其解决方案进行初步设计及合理安排.明确开发风险及其所带来的经济效益. 1.1.2 定义: 本项目主要用于可输入.添加.删除及修改列车信息,并能实现查询.订票.退票等功能.此系统还应能够打出取票通知和帐单,以保证能

火车票预订可行性分析报告

      火车票预订可行性分析报告 一.可行性研究报告 1.引言 1.1编写目的 1.2项目背景 1.3定义 1.4参考资料 2.可行性研究的前提 2.1要求 2.2目标 2.3条件.假定和限制 2.4可行性研究方法 2.5决定可行性的主要因素 3.对现有系统的分析 3.1处理流程和数据流程 3.2工作负荷 3.3费用支出 3.4人员 3.5设备 3.6局限性 4.所建议技术可行性分析 4.1对系统的简要描述 4.2处理流程和数据流程 4.3与现有系统比较的优越性 4.4采用建议系统可能带来的

火车票预订系统可行性报告

一.可行性研究报告 1.引言 1.1编写目的 1.2项目背景 1.3定义 1.4参考资料 2.可行性研究的前提 2.1要求 2.2目标 2.3条件.假定和限制 2.4进行可行性研究的方法 2.5评价尺度 3.对现有系统的分析 3.1处理流程和数据流程 3.2工作负荷 3.3费用支出 3.4人员 3.5设备 3.6局限性 4.所建议技术可行性分析 4.1对系统的简要描述 4.2处理流程和数据流程 4.3与现有系统比较的优越性 4.4采用建议系统可能带来的影响 4.5技术可行性评价 5.所建议系统经

火车票预购系统社会因素可行性分析及其他供选择的方案

6.社会因素可行性分析 6.1法律因素 火车票订票系统是一个结局亿万中国人出行的系统,毫不夸张的说,它是一项关系着国计民生的重要环节,不仅为人们提供了快捷的服务,更重要的是可以在足不出户的情况下就能够解决购买火车票的问题,它使得中国的订票系统更加理性化也更加人性化,这也是在新时代的一种进步,能够使人们享受到现今科技带来的便利服务!且该项目为独立开发,在技术上没有使用任何现有的软件与方法.所以在法律方面不会存在侵犯专利权.侵犯版权等问题,完全按照合同规定的责任履行. 6.2用户使用可行性 使用本软

分布式队列编程:模型、实战

介绍 作为一种基础的抽象数据结构,队列被广泛应用在各类编程中.大数据时代对跨进程.跨机器的通讯提出了更高的要求,和以往相比,分布式队列编程的运用几乎已无处不在.但是,这种常见的基础性的事物往往容易被忽视,使用者往往会忽视两点: 使用分布式队列的时候,没有意识到它是队列. 有具体需求的时候,忘记了分布式队列的存在. 文章首先从最基础的需求出发,详细剖析分布式队列编程模型的需求来源.定义.结构以及其变化多样性.通过这一部分的讲解,作者期望能在两方面帮助读者:一方面,提供一个系统性的思考方法,使读者能

C#编程总结(三)线程同步

C#编程总结(三)线程同步 在应用程序中使用多个线程的一个好处是每个线程都可以异步执行.对于 Windows 应用程序,耗时的任务可以在后台执行,而使应用程序窗口和控件保持响应.对于服务器应用程序,多线程处理提供了用不同线程处理每个传入请求的能力.否则,在完全满足前一个请求之前,将无法处理每个新请求.然而,线程的异步特性意味着必须协调对资源(如文件句柄.网络连接和内存)的访问.否则,两个或更多的线程可能在同一时间访问相同的资源,而每个线程都不知道其他线程的操作. "如果觉得有用,请帮顶! 如果有