Chinaunix首页 | 论坛 | 博客
  • 博客访问: 1699539
  • 博文数量: 607
  • 博客积分: 10031
  • 博客等级: 上将
  • 技术积分: 6633
  • 用 户 组: 普通用户
  • 注册时间: 2006-03-30 17:41
文章分类

全部博文(607)

文章存档

2011年(2)

2010年(15)

2009年(58)

2008年(172)

2007年(211)

2006年(149)

我的朋友

分类: 项目管理

2009-06-25 14:11:59

卷2 并发和网络对象
第一章 描述了并发和网络的面向对象应用程序和中间件面临的挑战.通过一个实际例子,一个并发Web服务器,来展示关键的几个方面:服务访问,配置,事件处理,同步,并发等.

第二章至第五章是本书的主体.模式,和各种真实的编码技术.

第六章,组合各种模式
第七章,模式的继往开来

第二章 并发和网络对象
挑战1.服务访问和配置
挑战之一即是安全性.
支持服务和应用程序的动态和静态演进是另外一个挑战.
理想地,配置和重配置对于访问不同的服务的客户端是透明的.要确保不因为重新配置而重编译,重链接,重启动.
很多OS支持动态链接技术.Linux 定义了dlopen(),dlsym(),dlclose() API.

挑战2.事件处理
事件处理都是被构造成层状结构,每一层都是有限状态机设计思想。

挑战3.并发
一个进程是一些资源的集合,这些资源包括虚拟内存,I/O句柄,信号句柄等。进程为执行程序指令提供了环境。
线程是指令执行的序列。流行的线程模型有POSIX pThreads 和Win32 Threads.

挑战4.同步
许多网络程序的效率,反应,和设计都得益于线程机制的使用。
使用了低级的OS技术的互斥锁有2个弱点:容易出错,不可伸缩。


设计一个并发Web服务器



JAWS是一个著名的开源Web Server。是ACE的应用。

事件分派器(Event Dispatcher):该组件负责协调JAWS的并发策略和它的I/O策略。Web客户的被动连接建立遵循接受器(Acceptor)模式 [19]。新到来的请求由一种并发策略服务。在事件被处理时,它们被分派到协议处理器(Protocol Handler),后者由一种I/O策略参数化。从一系列可选方案中选择,以动态绑定到特定并发策略和I/O策略的机制遵循策略(Strategy)模式 [5]。
 
并发策略(Concurrency Strategy):该构架实现的并发机制(比如单线程、Thread-per-Request,或线程池)可被适配性地选择:在运行时使用状态(State)模式,或在初始化时预先确定。服务配置器(Service Configurator)模式[20]用于在运行时将特定的并发策略配置进Web服务器。当并发涉及多线程时,策略会创建遵循主动对象(Active Object)模式[15]的协议处理器。
 
I/O策略(I/O Strategy):该构架实现多种I/O机制,比如异步、同步和反应式I/O。多种I/O机制可以同时使用。异步I/O通过前摄器(Proactor)[21]和异步完成令牌(Asynchronous Completion Token)[22]模式来实现。反应式I/O通过反应堆(Reactor)模式[14]来完成。反 应式I/O利用Memento模式[5]来捕捉请求状态,并使其外在化,以在后面将其恢复。
 
协议处理器(Protocol Handler):该构架允许系统开发者将JAWS构架应用于Web系统应用的变种。协议处理器由并发策略和I/O策略来参数化。这些策略对协议处理器来说是不透明的(通过使用适配器(Adapter) [5]模式)。在JAWS中,该组件实现了HTTP/1.0请求方法的解析与处理。该抽象使得其他协议(比如HTTP/1.1和DICOM)能够很容易地 结合进JAWS。要增加新协议,开发者只需简单地编写新的协议处理器实现,随后将其配置进JAWS构架中。
 
协议流水线(Protocol Pipeline):该构架使过滤器操作能够很容易地与正在被协议处理器处理的数据进行合成。这种集成是通过采用适配器模式来完成的。流水线遵循用于输入处理的管道和过滤器(Pipes and Filters)模式[23]。使用服务配置器模式,可在运行时动态链接流水线组件。
 
缓存式虚拟文件系统(Cached Virtual Filesystem):该组件通过减少文件系统访问开销来改善Web服务器性能。可以遵循策略模式[5]来选择多种缓存策略,比如LRU、LFU、提示式策略和结构化策略。这使得开发者可以根据有效性来对不同的缓存策略进行裁剪,并静态或动态地配置最佳策略。各个Web服务器的缓存通过使用单体(Singleton)模式[5]来实例化。
 
Tilde Expander该组件是另一种缓存组件,它使用理想哈希表[24]来将简写的用户登录名(例 如,~schmidt)映射到用户主目录(例如,/home/cs/faculty/schmidt)。当个人Web页面存储在用户主目录中、而用户目录 又没有驻留在共同的根上时,该组件能够充分地减少访问系统用户信息文件(比如/etc/passwd)所需的磁盘I/O开销。通过服务配置器模式的效力, 可以动态地解除Tilde Expander的链接,并将其重新链接进服务器(例如,在新用户加入系统时)。







JAWS架构包括3部分

1.Event Dispatcher 事件分发器
接受客户请求并分发给合适的协议处理器

2.Protocol Handler 协议处理器
对请求时间进行解析和协议处理。有HTTP/1.0 或者HTTP/1.1等。

3.Cached Virtual Filesystem 文件缓存系统
通过减少文件系统的过负荷来提高哦性能.有LRU和LFU策略。

应用模式来解决JAWS的公共的设计挑战

JAWS是一种面向对象的构架,支持多种Web服务器策略的配置,比如异步I/O和LRU缓存的线程池并发模型 vs.使用同步I/O和LFU缓存的Thread-per-Request并发模型。因为JAWS是一个构架,可以系统地对这些策略进行定制,独立地或协作地进行评估,以决定最佳的策略方案。使用这些方案,JAWS可以静态地和动态地改变自己的行为,以为给定的软件/硬件平台和工作负载采用最为有效的策略。JAWS的自适配软件特性使其成为用于构造高性能Web服务器的强大应用构架。

在开发者配置和优化Web服务器时,他们面对的是一组异常丰富的设计策略。
并发模型:Thread-per-Request vs. 线程池
事件分派模型:同步 vs. 异步分派
文件缓存模型:LRU vs. LFU
协议处理模型:HTTP/1.0 vs. HTTP/1.1

没有哪种配置对于所有硬件/软件平台和工作负载来说都是最佳的。

JAWS如何应用模式来解决公共的设计挑战的呢?

封装底层的OS API
JAWS 用ACE Thread_Mutex封装了相应的非对象的API和数据。


应用Reactor反应器模式和Acceptor-Connector模式来分割传统的解复用和连接管理。
select()




通过多线程提升服务器形成

通过半同步-半异步模式来处理HTTP GET请求。
使用了反应器 HTTP_Handler来构JAWS的异步层。
worker 线程同步地执行了HTTP协议处理。

实现一个同步请求队列





阅读(875) | 评论(0) | 转发(0) |
给主人留下些什么吧!~~