应该如何理解高并发?理解apache服务和nginx对高并发的处理机制?
看过很多关于并发的文章,但是现实开发中暂时没有遇到过,有些概念比较模糊。
先举例子
我们春节抢票回家,如果某趟车9点售票,a和b都在9:00:00(精确到微秒,甚至unix时间一样的),抢深圳到武汉的票。
问题如下
1.这属于并发吗?如果是并发,会产生什么结果(如用户数据混乱之类)。如果不是,如何才能产生并发的条件?
2.如果是并发, java是相对线程安全,如果12306的服务器语言是java的话,这样是不是就不会产生有危害的结果?如果还是会产生,是否可以使用队列解决?
3.如果12306的服务器是tomcat,是不是会消耗大量的CPU资源?如果用高性能服务器nginx和php组合处理业务,会不会更高(但php性能并没有java好)?
如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。
绑定邮箱获取回复消息
由于您还没有绑定你的真实邮箱,如果其他用户或者作者回复了您的评论,将不能在第一时间通知您!
发布评论
评论(3)
问题很多,就我看到的问题来回答:
这属于并发吗? 不一定。到服务器的逻辑处理处究竟是并发还是并行还是要看其机制。
你说的数据混乱之类的,可能是指多线程操作一个对象而导致每个线程持有对象副本不一致而造成脏读脏写。就这里几个关键字你可以进行扩展搜索。
线程安全不看语言。可以用队列解决,这里会有一个临界区的概念。
消耗大量的cpu资源也是要看是什么样的操作的,比如大量的数据库持久化那么肯定是IO密集型操作,不吃CPU;反而要进行大量计算的,那么就是CPU密集型操作。在这里,如果真的是启动大量线程在后台服务器中运行,CPU会忙着切换线程而消耗尽其资源。
tomcat是个服务器,但它会不会消耗大量CPU资源还是得看你怎么使用的。同时它也是个容器,你在容器里跑app起大量线程,如之前所说,肯定会消耗大量CPU资源。就算你在ngnix+php里也会这样。
简单说一下吧。
1.你的例子场景属于并发场景,但是技术实现可以多种多样,但是不妨碍这个场景可以并行争夺资源的本质。引发的问题很容易得出,就是无顺序的并行运算修改检查共享资源(火车票票数),会导致最终结果与逻辑结果不一致。
2.你的疑惑集中在java是不是相对处理并发更安全,说明你对于java等语言的机制了解与运用不是很深入,并发问题无论什么语言都需要程序员针对应用语言的特性与提供的工具去解决实际问题,优先解决的自然是并发安全问题,也就是上面说的在并发情境下如何让共享资源的最终结果与逻辑结果一致,可以用锁、队列等技术,本质上都是在某一个关键运算点位变成顺序或者事务执行等,以保证共享资源的原子性、可见性。进阶就是并发场景下的性能与可用性。
3.语言的适用场景是不同的,没有绝对的什么语言比什么语言好,我们只能说在什么情况下一般的技术选型什么更适合。tomcat是一个web容器,但是很显然它是个java web容器,也就是说它除了提供普通的web服务外也提供java相关的很多功能。java本身是支持线程操作的,量级比进程更轻,也意味着同样配置的服务器,同一种业务,java开启的处理线程更多,处理线程越多当然高点并发性能表现就更好,也就越节省物理运算资源。然而php是以进程为单位开启的,所以并发处理能力基于上面的描述在高点是不如java web的。但是如果你的并发场景并不“高”,需要快速实现业务而且也有精通php的程序员,php当然是优先考虑。
基础这么差,无从讲起啊。