有这样的一个案例:电影院的抢票秒杀 : 一共有3个步骤 :登陆进去 后 页面A第一步: 进去后系统给你分配哪一天的第几场?
页面A第二部:在本页面上面系统给出了当前可用的日期和当天可用抢购的 场次,但是要输入一个 确认码,比如 姓名、身份证号等
页面A第三步:输入了后,点击确认,确认订购抢票。完成如果上一场抢完,则从第一步进去后,系统自动会给你安排下一场的抢票之前的时候做了个程序,按照流程 从第一步到第三步可以抢到票,但是现在很难抢到了,不知道是不是人太多了,抢的时候服务器很慢,而且总是发出请求后,半天才反应,然后提示说已经被预定了,程序只能又从第一步开始重新获取最新的系统分配的场次和日期,但是进去后又被抢了,又的重复。现在的时候如果想抢多张票的话,就开几个线程,一个线程抢一张,所以有没有可优化的步骤?服务器上的web程序是asp.net做的,如果我现在增加线程,每张票我也是用多线程,如果我要抢3张票,每张票用3个线程去抢,那一共就会有 9个线程,可能会增加抢到的可能性。其他的方面有没有可优化的地方?我使用的是 httpwebreqeust 来连接服务器 ,如果是Socket会不会快点?如果不是抢票的时间段进去的话,那速度很快 ,但是如果是在抢票的时候进去的话 就非常慢。

解决方案 »

  1.   

    哦,看来我理解错了你的意思。你的程序是以抢到票为目的,而不管会不会导致别人的堵塞,对吗?如果是这样,那我还想不到什么好主意。这种情况只能考虑提高你程序的运行性能了。
    至于Socket和httpwebreqeust哪个性能更好,你做实验对比下,不就清楚了?因为比较理想化,理论上分析出来的结果,实际使用中并不见得是那么回事儿。
      

  2.   

    是的,目的就是抢到票,因为这个时候人很多,肯定会有阻塞的,程序上的优化,我估计很难了,瓶颈主要在服务器的网络阻塞这个上面。如果必须按照这个流程来做的话,分三步,除非直接跳到第三步,在第三步直接伪造viewstate,因为我抓包看了,那些场次和日期信息没有藏在隐藏的input里面,还有验证问题也没有隐藏在input的hidden类型里面,也没有在cookie里面,session的可能性不大,因为这样非常消耗服务器的资源,所以我估计应该是放在viewstate里面,伪造viewstate的话,就是当开始抢的时候,自然每个人进去都是开始按照顺序有系统按日期和场次来订票,我伪造的话,直接伪造第后面的剩余的场次,不知道这样可行不,估计很难,asp.net会检查这个viewstate,而且这个也不是很好伪造。
    看来只能增加线程数,提高并发,这样才有可能提高抢到的可能性。Socket和httpwebrequeset的话,估计这样的开销可以忽略。