文档章节

Web服务器如何保证请求的独立处理

kukudeku
 kukudeku
发布于 2016/08/22 10:56
字数 1371
阅读 215
收藏 3

在了解Web服务器如何保证并发线程的独立性之前,我们先了解一下Web服务器处理并发请求的工作模型

  1. 单线程的Web服务器,也即Servlet是单例模式。Web服务器一次处理一个请求,结束后读取并处理下一个请求。在某请求处理过程中,其他请求将被挂起,因此在并发量较大的场景中将会出现严重的性能问题。
  2. 多进程/多线程Web服务器。这种服务器生成多个进程或线程并行处理多个用户请求,进程或线程可以事先生成,也可以按需生成。这种服务器可以为每个用户请求生成一个单独的进程或线程来进行相应,不过,一旦并发请求达到成千上万时,多个同事运行的进程或线程将会大量消耗系统资源,并且新建一个线程,销毁一个线程的开销是很大的,它时常会大于实际处理请求本身的额开销,因此这种方式并不能充分利用计算机资源,提升并发的效率也是有限的,如果碰到线程安全的问题,需要使用到线程的锁机制,那并发提升就会受到更大的限制。
  3. 线程池策略Web服务器。为了改善以上两个web服务器架构,很多服务器利用了线程池技术。线程池技术就是事先创建一批线程,这批线程在到达服务器之前,这些线程处于待命状态,当请求到达后,程序从线程池中去除一个线程,这个线程处理到达的请求,请求处理完毕,该线程被线程池回收。一般地,一个线程对应一个请求,当线程数达到服务器所能处理的最大数量,则线程挂起等待或者启用线程池拒绝策略(请求实在太多了,线程池处理不过来了,JDK的线程池提供了一个队列机制,让这些请求排队等待,这样避免请求丢失。如果队列容量超过了计算机处理能力,队列会抛弃无法处理的请求,这个叫做线程池的拒绝策略)
  4. I/O多路复用Web服务器。这个服务器原理我还没有仔细研究过,有兴趣的你抽时间可以问问度娘。其实实现一个非阻塞的请求是个大课题,里面使用到了很多先进和复杂的技术例如:回调函数和轮询等,对于非阻塞的开发我目前掌握的还不够好,等我有天完全掌握了它我一定会再写一篇文章,不过这里要提到的是像java里netty技术,nginx,php的并发处理都用到这种机制的原理,特别是现在很火的nodejs它产生的原因就是依靠这种非阻塞的技术来编写更高效的web服务器,可以说nodejs把这种技术用到了极致,不过这里要纠正下,非阻塞是针对IO操作的技术,对于nodejs,netty的实现机制有更好的术语描述就是事件驱动(其实就是使用回调函数,观察者模式实现的)以及异步的IO技术(就是非阻塞的IO技术)

    现在了解了Web服务器处理并发请求的工作模型,那我们接下来接着谈一下Web服务器并发环境下如何保证线程独立。线程独立也就是线程安全。

    线程安全的定义:在多线程环境下能够正确执行的代码就是线程安全的。在单线程环境下,运行程序总能返回唯一结果。

    Servlet是多线程环境下的,即有可能有多个请求发给一个Servlet实例,每个请求就是一个线程。在JavaWeb服务器环境下并发,要注意的安全问题最简单的实现方法就是不要再Servlet或者Struts的Action中使用类变量或者实例变量。如果有这些变量,可以将它们转化为方法的参数传入,以消除它们。被Servlet或Action调用的类中(如值对象、领域模型类)中是否可以安全的使用实例变量?如果你在每次方法调用时新建一个对象,再调用它们的方法,则不存在同步问题---因为它们不是多个线程共享的资源,只有共享的资源才需要同步---而Servlet和Action的实例对于多个线程是共享的。换句话说,Servlet和Action的实例会被多个线程同时调用,而过了这一层,如果在你自己的代码中没有另外启动线程,且每次调用后续业务对象时都是先新建一个实例再调用,则都是线程安全的。

 

© 著作权归作者所有

kukudeku
粉丝 121
博文 49
码字总数 121805
作品 0
杭州
程序员
私信 提问
Golang Web学习(13)—— 搭建简单的Web服务器

本文为转载,原文:Golang Web学习(13)—— 搭建简单的Web服务器 Golang 1、Web工作方式 我们平时浏览网页的时候,会打开浏览器,输入网址后按下回车键,然后就会显示出你想要 浏览的内容。...

ChainZhang
2018/01/14
0
0
如何在Web项目里,启动独立线程,不受tomcat影响?

请教个问题,在web项目里,我开启了一个独立的线程,循环执行任务,线程执行的任务是通过前台页面发起请求产生的。这样就存在一个问题,我开启的这个独立线程会受到Tomcat启动和关闭的限制,...

一条大河波浪宽
2014/07/01
3K
9
「架构技术专题」如何构建网站高可用架构(详细分析篇)?(6)

网站的可用性(Avaliability)描述网站可有效访问的特性。 1、网站可用性的度量与考核 网站不可用时间(故障时间)=故障修复时间点-故障发现(报告)时间点 网站年度不可用时间=(1-网站不可...

java进阶架构师
2018/07/29
0
0
分布式web架构中Session管理的方法

分布式架构 单体架构中,Session管理方案是在用户进行登录的时候将Session存放在应用服务器的内存中,由于只有一个应用服务器节点,用户的所有请求都是这个唯一节点进行响应处理,所以能够轻...

刘诗书
2017/11/23
0
0
servlet的执行原理与生命周期

一、先从servlet容器说起:大家最为熟悉的servlet容器就是Tomcat ,Servlet 容器是如何管理 Servlet? 先看一下tomcat的容器模型: 从上图可以看出 Tomcat 的容器分为四个等级,真正管理Ser...

Sheamus
2016/03/07
85
0

没有更多内容

加载失败,请刷新页面

加载更多

15、SpringMVC进行json交互

SpringMVC进行json交互 json数据格式在接口调用中、html页面中较常用,json格式比较简单,解析还比较方便。 请求json、输出json。要求请求的是json串,前端页面中需要将请求的内容转成json,...

快乐的瓶子
31分钟前
7
0
delphi版插apc杀进程驱动源码

从c代码转的,备份一下,里面有硬编码unit MyDriver;{$HINTS OFF}{$WARNINGS OFF}interfaceusesnt_status, ntoskrnl, native, winioctl, fcall, macros;typeTKILL = ...

simpower
34分钟前
4
0
带你上手一款下载超 10 万次的 IDEA 插件

作者 | 倪超(银时) 阿里云开发者工具产品专家 本文整理自 11 月 7 日社群分享,每月 2 场高质量分享,点击加入社群。 导读:Cloud Toolkit 是本地 IDE 插件,帮助开发者更高效地开发、测试...

阿里云官方博客
35分钟前
4
0
GMAT语法7个常考重要考点分析

GMAT语法考点多,并非所有考点都值得重点关注。实际上GMAT语法存在一些高频考点,考生需要优先掌握它们才能更好地保证得分。同时GMAT备考中大家还需要培养连续做题的耐力。下面小编就来做具体...

bole6
39分钟前
4
0
最佳实践 | RDS & POLARDB归档到X-Pack Spark计算

X-Pack Spark服务通过外部计算资源的方式,为Redis、Cassandra、MongoDB、HBase、RDS存储服务提供复杂分析、流式处理及入库、机器学习的能力,从而更好的解决用户数据处理相关场景问题。 RD...

一肥仔
41分钟前
4
0

没有更多内容

加载失败,请刷新页面

加载更多

返回顶部
顶部