解决方案 »

  1.   

    问题一:抽象的说你可以这样理解,建议你自己动手写一个服务器,就会明白请求从socket读出来,在应用层如何多线程去处理。现在更加流行的模型是reactor,java里就是nio,可以去对比一下问题二:
    12306的高峰并发不是一般的高,个中的 处理方式很复杂
      

  2.   


    1:不管你什么服务器,在系统内部CPU需要切换线程,你线程池数量越大,他切换的越频繁,这里需要你预估一个峰值,对于多核来说,多线程是有优势的,如果请求过多,而队列太小,一般会有超时机制。底层上来讲 他的backlog会去排队,超过了那个值,会被拒绝,但由于你处理的线程过多,导致你整个系统切换变慢,他会导致你的业务逻辑变慢,造成单机雪崩现象,所以这个线程池设置是比较有讲究的。
    2:在12306中,单台服务武器已经承受不起了,QPS太小,所以需要分布式部署服务器,对于分布式处理来说,又会涉及到多个系统通信,服务器负载均衡,智能CDN,系统运维监察,服务治理等,往往会设计到上百台服务器,对于12306 可能更多,他春运的相应量不亚于taobao11.11 ,具体可以看下淘宝的技术架构,这不是一个人所能做到的,当然大系统也是由各个小系统构成的,以前的一些同步策略要改成大量的异步通知,可能只有你订单是同步的,而多个系统异步,又会涉及到消息机制等。
      

  3.   

    最近我也在做这样的socket+thread的项目,我们的做法是
    有一个客户端管理类,管理所有的客户端连接。
    字段为:Vector<Vector<Socket>>      Vector<Thread>
    比如一个vector存10个socket,存满后新建一个线程去处理这一个vector中的10个socket。
    然后在new vector 继续存储socket。  线程存入 Vector<Thread>。
    一个Thread处理一个vector,一个vector存储若干个socket。
    处理socket请求时,设置超时时间,若处理该socket的请求大于该时间,则将该socket关闭。
    判断该Thread处理的vector是否为空,为空则在管理类中删除该vector。
    大体是这样的思路,实现起来考虑的因素很多。