多客户端访问问题

时间:2022-10-09 19:27:48
如下场景:
一台机器上运行一个数据库server进程,同时有多个client发送读写请求。

问题一:
此时该server进程内部如何处理。 在同一时刻,只能处理一个请求。可能在下一个时刻切换到另一个请求?

或者更详细一点。server中有一个thread pool. 每次收到一个请求,就分配一个thread给该请求。待处理的thread保存在队列里。每个时间片会自动切换thread,挑一个来执行。是这样吗?

问题二:
考虑春运火车票抢购系统。在大量的访问情况下,也是按照thread pool进行分配,按thread正常处理的吗?

4 个解决方案

#1


问题一:

抽象的说你可以这样理解,建议你自己动手写一个服务器,就会明白请求从socket读出来,在应用层如何多线程去处理。现在更加流行的模型是reactor,java里就是nio,可以去对比一下

问题二:
12306的高峰并发不是一般的高,个中的 处理方式很复杂

#2


引用 楼主 Lucifer2603 的回复:
如下场景:
一台机器上运行一个数据库server进程,同时有多个client发送读写请求。

问题一:
此时该server进程内部如何处理。 在同一时刻,只能处理一个请求。可能在下一个时刻切换到另一个请求?

或者更详细一点。server中有一个thread pool. 每次收到一个请求,就分配一个thread给该请求。待处理的thread保存在队列里。每个时间片会自动切换thread,挑一个来执行。是这样吗?

问题二:
考虑春运火车票抢购系统。在大量的访问情况下,也是按照thread pool进行分配,按thread正常处理的吗?


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

#3


好深奥、、、、、、、、、对线程不是怎么懂

#4


最近我也在做这样的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。
大体是这样的思路,实现起来考虑的因素很多。

#1


问题一:

抽象的说你可以这样理解,建议你自己动手写一个服务器,就会明白请求从socket读出来,在应用层如何多线程去处理。现在更加流行的模型是reactor,java里就是nio,可以去对比一下

问题二:
12306的高峰并发不是一般的高,个中的 处理方式很复杂

#2


引用 楼主 Lucifer2603 的回复:
如下场景:
一台机器上运行一个数据库server进程,同时有多个client发送读写请求。

问题一:
此时该server进程内部如何处理。 在同一时刻,只能处理一个请求。可能在下一个时刻切换到另一个请求?

或者更详细一点。server中有一个thread pool. 每次收到一个请求,就分配一个thread给该请求。待处理的thread保存在队列里。每个时间片会自动切换thread,挑一个来执行。是这样吗?

问题二:
考虑春运火车票抢购系统。在大量的访问情况下,也是按照thread pool进行分配,按thread正常处理的吗?


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

#3


好深奥、、、、、、、、、对线程不是怎么懂

#4


最近我也在做这样的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。
大体是这样的思路,实现起来考虑的因素很多。