【asp源码栏目提醒】:网学会员asp源码为您提供ASP 3高级编程(第20章 ASP和消息队列服务器) - 技术总结参考,解决您在ASP 3高级编程(第20章 ASP和消息队列服务器) - 技术总结学习中工作中的难题,参考学习。
下载第20章
ASP和消息队列服务器上一章讨论了如何使用C O M 添加应用程序和组件的事务处理能力。
本章研究另一种增加应用程序可扩展性的方法。
迄今为止,我们假设一个服务器是一个始终有效的完美世界,但是如果没有这个前提,整个的系统会崩溃吗?显然不会。
不过有必要采用一个异步通信系统,通常称为消息或者消息队列。
在消息方案中,应用程序不再是执行一般的方法调用和等待一个响应,取而代之的是,调用者简单地发一个“消息”给服务器,然后按正常程序进行处理,因此消息不仅允许客户处理其他工作,而且由于利用了Microsorft 消息队列 M S M Q ,服务器甚至可以是不可用的,因为消息可以被排队并在以后处理。
本章将讨论消息排队的以下几个方面内容:?? 消息排队的定义。
?? MSMQ及其结构。
?? MSMQ的管理。
?? 如何使用C O M对象与M S M Q交互。
?? 在A S P应用程序中M S M Q组件的使用。
?? MSMQ消息的异步响应。
?? 如何将M S M Q合并到事务中。
首先,介绍消息排队的背景知识。
20.1 消息排队的定义消息排队是允许不同的应用程序使用“存储和传送”过程进行彼此交流的系统。
这些应用程序可以在相同或不同的硬件平台上。
这些平台可以位于同一场所、同一L A N或者是由电子装置相连的任何地方,这种连接甚至不需要是永久的或可靠的,除此之外,这些平台甚至可在不同的操作系统中运行。
这听起来好像是一个非常复杂的系统。
当今I n t e r n e t世界的特点是各种各样的应用程序、各种不同的地理位置、各种各样的连接类型和操作系统同时存在。
能在这些系统之间传送数据已经成为主张互连的人们的共同目的。
在复杂的系统环境中,S Q L、O D B C、F T P和H T T P等技术都为数据在系统之间传送提供了不同的机制,这些技术的主要缺点是面向特定的应用程序类型。
当数据需要在复杂的平台间有效转换时,非常需要一种中间的应用程序。
交换数据的格式和平台到平台的交互规则应当留给特定的应用程序去完成。
这种技术只是一个通信信道。
利用这些系统已经创建出大量系统的事实,并不意味着不存在更为有效的通信方法。
消息中间件系统在大型计算机领域中是众所周知的,多年来已经成为大容量的事务处理应用程序的模式。
在个人计算机中也有许多消息技术,但我们主要考虑M S M Q,因为M S M Q与A S P和其他微软开发工具紧密相关。
20.1.1 MSMQ的定义M S M Q的基本概念非常简单,就是应用程序的电子邮件。
与电子邮件一样,M S M Q消息也有发送者和接收者。
然而接收者有些不同,M S M Q中消息接收者定义为访问队列者这是由Wi n d o w s域安全性设置的。
这样在单一的队列中多个接收者能够响应单一的消息。
在大多数使用M S M Q的网络应用程序中,消息的发送者是We b服务器 I I S ,消息的接收者是自定义的应用程序。
当M S M Q消息形成后,即被打包到一个“容器”中,并发送到一个队列中,等待接收者读取。
这些队列不管网络连接的状态和可靠性如何,都能够保证消息传送存储和传送。
自定义应用程序不一定在不同的机器上,但是放在另一台机器上可提供更好的可扩展性。
在大多数使用M S M Q的A S P应用程序中,消息从A S P脚本或从C O M组件中传送到同一个服务器或另外一个机器中的队列中。
一旦消息发送,A S P可以继续进行处理。
在后台,另一个自定义服务器端应用程序通常用C O M相容的工具创建,如Visual Basic或Visual C响应消息并开始着手处理。
另外的一个响应并处理M S M Q消息的可能途径是建立一个使用V B S c r i p t来打开队列的S Q L 7 . 0服务器作业。
M S M Q也可以和其他的消息系统相互通信。
Level 8系统正在开发第三方解决方案用于与其他平台上的M S M Q通信,例如Sun Solaris、H P _ U N I X、O S / 2、V M S和A S / 4 0 0平台等。
1. 消息前面已经提到M S M Q中的消息与电子邮件消息相类似,然而,它们不是发送给单个用户或一组用户,而是从一个应用程序发送到一个计算机的一个队列中。
M S M Q消息主要由三部分构成:?? 标签。
?? 正文。
?? 目标队列。
标签与电子邮件消息中的主题非常相似,大多数情况下标签用来把各种类型的消息分组,使自定义的应用程序能够区分消息所包含的内容。
M S M Q消息的正文是各种各样的,能够保存从字符串、数组到C O M对象的任何内容。
消息排队系统本身不检查实际内容,并且消息内容的格式也没有明确的标准。
这意味着内容格式由传递消息的两个应用程序自行决定。
例如,以创建一个E x c e l应用程序对象为例,载入一个电子表格,并设置M S M Q消息的正文为E x c e l的实例。
读取这条消息时,E x c e l对象的实例就会被取出来。
唯一的需要是消息的发送者和接收者都必须将此组件注册到系统上。
消息也可包括实现专有的消息,例如谁是发送者和接收者、发送的时间标识、甚至是截止日期,即如果超过这一时间不进行读取将删除消息。
588
ASP 3 高级编程下载M S M Q消息也包括决定消息读取顺序的优先级属性,它与电子邮件中的优先级非常类似。
消息中的优先级可以是0 7的任何整数,决定消息存放到队列中的顺序。
新添加的消息不一定就存放在队列的底部。
例如一个优先级为6的消息将放在优先级为5的前面。
数目越小,优先级越低。
M S M Q消息的缺省优先级为3。
但是发送到事务处理消息队列中的消息会将优先级自动设置为0,这是因为事务忽略优先级。
2. 队列消息队列是指消息被目标应用程序取走之前所存放的地方。
与电子邮件比较,队列类似于收件信箱。
消息在期满或被读取前存放在队列中除非清除队列。
系统中可以有多个队列,但M S M Q支持大量连接的系统的分层结构。
然而,在任何具体的机器中,队列管理器管理着本机的所有队列,通常包含在此机器上预定接收消息的所有队列,但也不总是这样。
如果网络管理员对远程队列管理器进行适当的配置,大多数的消息产品允许直接确定远程机器中队列的位置。
队列管理器决定这个消息的最终目标是否是本地。
如果是本地,就把消息放在目标队列中。
如果不是本地,通过目录服务器找出目标队列所在的机器。
一旦目标队列服务器收到消息,就将其存放在目标队列中。
每个队列属于单个服务器,但一个服务器可以有多个队列。
队列的主要属性有:?? 标签:通常用来定义队列的简单字符串。
?? ID:用来定义队列的唯一的G U I D。
?? Ty p e I D:用来定义队列类型或组的唯一的G U I D。
Ty p e I d很有可能在多个队列中是相同的,这些队列组合在一起执行共同的任务。
另外,在MSMQ 2.0中有四种类型的队列:?? 输出队列outgoing queue:当远程M S M Q服务器不起作用时保存消息。
它们为M S M Q提供了操作灵活性,即使在另外一个服务器不工作时也一样不会丢失消息。
不能通过应用程序使用输出队列,它只能由M S M Q内部用于存储和传送消息。
?? 系统队列system queue:也是由M S M Q内部使用的,对自定义应用程序不起作用的。
这种队列的例子是无法投递的邮件的队列、报告队列和报纸队列。
?? 公共队列public queue:它是M S M Q中最常用的一种队列,自定义应用程序用这个队列完成业务需要。
公共队列存储在Active Directory服务中,因此,对于企业范围内的所有其他M S M Q服务器都是可知的。
?? 个人队列private queue:可在自定义应用程序中使用。
然而在Active Directory中没有个人队列。
因而它们对本地计算机以外的应用程序来说是不可用的。
虽然消息队列可以通过编程建立,但是多数情况下,消息队列是通过Computer Management插件的M S M Q部分建立的,管理M S M Q的有关信息可参考下面的2 0 . 3节“管理M S M Q”的内容。
20.1.2 使用M S M Q和A S P的原因为什么使用M S M Q?为什么不通过D C O M开发使A S P能获得所需功能的简单C O M组件?为了回答这个问题,我们提出以下几个问题:?? 如果正在运行C O M对象的服务器不可用怎么办?第2 0章A S P和消息队列服务器589下载?? 如果运行时间太长,A S P页超时而且用户放弃怎么办??? 如果由于在正常时间内因为表格锁定或处理器紧张而不能进行处理怎么办?这些问题是开发M S M Q服务的原因。
通过使用M S M Q,这些问题可以通过相对比较简单的方法来解决。
1 如果正在运行C O M对象的服务器不可用该怎么办?如果客户不是直接和C O M对象对话而是发给M S M Q一个消息,则在客户和服务 C O M 对象之间提供另一抽象层。
这就是所谓的异步通信的松散连接。
当然,通常C O M对象不能自己运行,但可以开发响应消息和调用C O M对象功能的服务器端可执行程序。
由于客户与后台分离,只要We b服务器 I I S 安装了M S M Q客户,客户可以仅仅发出消息并继续运行。
2 如果运行时间太长怎么办?这个问题的解决方法和上面的情况一样。
通过把处理工作移到后台服务器上进行,客户就不必等到任务完成。
3 如果由于在正常时间内不能进行处理该怎么办?如果处理工作在正常的高峰时间内不能完成,这个任务可以存放在消息队列中直到预定的服务器端可执行程序准备处理此项任务队列中的消息,这允许任何数量的消息或任务同时存储或运行。
这就是所谓的批处理。
1. 速度与可用性的比较通常消息中间件被认为是一种提高可用性和可扩展性的技术。
这不应该与速度混淆。
消息总是比低层的内部处理通信的方法要慢,如套接字 S o c k e t 或命名管道named pipe。
毕竟消息最终要利用这些方法来传递。
中间件技术向通信协议基本性能增加了协商 n e g o t i a t i o n 和通告 n o t i f i c a t i o n 的开销。
消息中间件认为不论技术怎么快,都达不到足够快的速度。
这不仅包括处理器也包括通信。
除非机器能在零时间内无限装载,否则总有可能过载,这就是消息中间件的设计原因。
首先,通过将异步通信引入到处理中,在等待一个消息的响应时,客户可以去处理别的任务。
因为队列管理器把输入的消息存放在一个缓冲区中,即队列中。
接收服务器没有必要具有足以处理峰值通信量的速度,仅仅需要满足系统中通信量的平均值的处理需求。
在峰值过程中,进入的额外消息将退到队列中去,当通信量减少时再发送,然后从队列中清除。
在有额外消息退到队列中去时,对于必须同步处理消息的系统会失败,即可用性差。
但是异步消息系统的服务仍然可用。
因而,消息是一个可扩展的解决方法,异步消息系统的优点在于可以成功地处理更多的通信量,而不在于处理速度。
这也说明了低层协议中增加的附加特性的作用。
消息中间件对企业级系统提供一系列重要的特性以降低额外开销:?? 它改善了可用性。
?? 它考虑了偶然断开计算机连接这种可能出现的情况,这在基本协议中是不允许的。
?? 它允许传送者和接收者知道发出的消息已收到,并且一旦收到就能知道。
590
ASP 3 高级编程下载当我们继续学习本章内容时,请记住速度在创建可扩展的企业级系统时并不是最重要的因素。
2. 消息与同步通信的比较应用程序之间的通信不一定必须使用消息队列来进行,如果业务环境需要同步完成一些工作,那么像D C O M这样的通信方法更适合执行这种类型的处理。
如果每个应用程序都连接到L A N,并且所有应用程序的服务器是在快速的、本地的、可靠的链路上进行连接的,也可以不用消息。
另外,对许多开发人员来说,消息队列是新的和不熟悉的技术。
他们可能不愿意在这方面花费精力。
下面的准则可以帮助你决定使用消息队列:?? 如果与你通信的应用程序不能保证与你的应用程序在同一时间运行。
?? 如果消息很重要,丢失将会导致严重后果。
?? 如果应用程序不是总和接收者的应用程序相连接。
?? 如果异步执行许多与其他应用程序的通信任务,并且可能不关心它们的响应。
20.2 MSMQ结构M S M Q系统结构的基本部分是消息、队列、队列管理器和允许程序访问信息的接口。
系统在物理位置方面工作是透明的。
这意味着应用程序将消息发送到另一应用程序中时,可以不必关心消息实际上是如何到达对方的。
M S M Q为在系统中查找可用的队列提供设施。
一旦应用程序发现感兴趣的队列,就可以发送消息给它而不必关心消息是如何到达那里的。
M S M Q控制消息所走的路径,并可以如果有必要保证消息到达最终目的地。
M S M Q结构由一对多服务器和工作站构成,它们负责路由、发送和接收消息。
每个计算机可以包含多个消息队列,并且在每个队列内可以包含多个消息。
20.2.1 服务器类型M S M Q可以安装在各种各样的服务器和客户上。
M S M Q有四种不同的服务器安装:?? 主企业控制器。
?? 主站点控制器。
?? 备用站点控制器。
?? 路由器。
1. 主企业控制器主企业控制器 P E C 是M S M Q结构的根层,为使M S M Q实现正常的功能,每个企业网络必须包含一个P E C。
在MSMQ 1.0中,P E C需要SQL Server 6.5或更高版本。
在MSMQ 2.0中,由于消息和队列存储在Active Directory服务 A D S 中,因此,不需要SQL Server。
A D S是Windows 2000的一部分。
在NT 4上,在MSMQ 2.0安装前,必须安装A D S。
任一版本A D S只能在Windows NT 4 Server上或Windows 2000 Server上安装。
P E C是大多数的队列存储的地方,尤其是在较小的网络中。
随着网络规模的扩大,对远程站点来说,在主站点控制器中保留自己的队列可能更为高效。
P E C常常位于公司总部或主要分部,这是因为所有其他服务器必须能够访问P E C并向其注第2 0章A S P和消息队列服务器591下载册存储在A D S中。
如果公司的网络仅包含一个小的L A N,需要的服务器仅是P E C,并且它可以与I I S合并在同一个服务器中。
在大型企业中,P E C用于存储其他M S M Q服务器的位置和队列的信息,并在它们之间路由消息,通常在此服务器上仅有B a c k O ff i c e服务。
2. 主站点控制器公司WA N的远程分支或站点中通常存在一个主站点控制器 P S C ,P S C能与远程L A N上的本地客户通信,并将消息反馈给P E C。
每个分支都有一个P S C,提供返回P E C的单点通信。
这有助于节省资源,例如网络通信,这对远程站点是重要的,特别是在较慢网络链路上。
如上所述,在小的L A N中,并不总是需要P S C,其工作可由P E C来完成。
3. 备用站点控制器备用站点控制器 B S C 用于存储P S C中信息的只读副本。
通常每个站点安装一个B S C,就像P S C一样。
如果P S C失败,它提供故障屏蔽支持。
4. 路由器随着企业中M S M Q结构的不断扩大,M S M Q路由器将会变得非常有用。
路由器不仅能够将消息传递到目标队列,而且也能使服务器使用不同的网络协议互相通信,例如T C P / I P和I P X。
M S M Q路由服务器没有存储消息的本地队列,它仅能够确定传送消息的最佳路由。
当网络部分关闭时,M S M Q路由服务器非常有用。
路由器会试着寻找消息到达目的地的其它路径。
在P E C和P S C服务器中也包含M S M Q路由器的功能。
由于每个站点都要求包含P E C或P S C,这意味着每个站点都包含某种路由器。
20.2.2 客户类型客户安装比较容易掌握,因为只包含两种安装选项:?? 从属客户?? 独立客户1. 独立客户M S M Q的独立客户可以安装在运行Windows 9x 、Windows NT 4或Windows 2000的计算机上。
独立客户具有发送消息给其他M S M Q服务器队列和从其他M S M Q服务器中读取消息的能力,还可以在本地队列中存储消息。
M S M Q的独立客户常安装在应用程序服务器和网络服务器上。
由于独立客户可以存储消息,它们不依赖于运行在目标计算机上的M S M Q服务。
对C O M组件或A S P脚本来说,在想发送消息但M S M Q服务器不可用时,这是非常有用的。
这时,独立客户在本地队列中存储消息,等到M S M Q服务器变为可用,才传送消息存储和传送。
尽管独立客户可以具有本地队列,但它们不需要安装A D S或SQL Server,而是把消息和队列信息存放在文件和注册表中。
这允许客户在本地具有许多M S M Q功能。
独立客户也具有通过使用M S M Q E v e n t对象异步响应消息的能力。
安装M S M Q独立客户时,安装向导将会对P E C给出相应地提示信息,这样客户机可以向P E C注册。
2. 从属客户M S M Q从属客户是Windows 9X、Windows NT 4和Windows 2000客户的另一选择。
独立592
ASP 3 高级编程下载和从属安装之间的主要区别是从属客户不能在本地存储消息,从属客户也不能在其他服务器上建立队列或从队列中异步读取消息。
从属客户访问M S M Q服务器时,只能发送和读取消息。
由于没有本地队列,所以也不能接收消息。
由于终端用户响应消息的需求不大,从属客户通常安装在终端用户工作站上。
20.2.3 站点布局图图2 0 - 1是跨越WA N并具有中心L A N的M S M Q安装布局图。
图20-1 SMQ安装布局图多路径配置企业级的M S M Q安装时,必须确定两个路由器之间链路的费用。
这种费用由相关因素决定。
链路速度、链路有效带宽和实际链路货币花费等,这些都可算入计算机链路费用。
当执行动态路由时,M S M Q会计算出发送者和接收者间的最“廉价”的链路,并以此路径发送信息。
由于不必明确创建静态路径,这使M S M Q的配置更简单。
这允许M S M Q绕过网络柘扑的断点发送消息,因此提高了消息服务的可用性。
20.2.4 投递选项微软消息队列服务器有三种可供选择的消息投递方式,每种投递消息的方式具有不同的优点和缺点,这三种投递类型是:?? 内存式。
?? 磁盘式。
?? 事务式。
1. 内存式的投递在这种投递类型中,当消息通过消息队列系统从一个队列管理器传送到另一个队列管理器时,消息依然存储在系统内存中。
如果在网络和队列管理器中存在消息不能与网络中的下一个队列处理器联系的问题,那么这条消息将会被保存直到连接能恢复。
内存式的投递非常第2 0章A S P和消息队列服务器593下载站点AMSMQ客户MSMQ客户PECPECMSMQ客户MSMQ客户主企业控制器主站点控制器备用站点控制器路由服务器独立的或非独立的客户MSMQ客户MSMQ客户MSMQ客户MSMQ客户站点B站点D站点C迅速,这是由于消息从来不会从系统内存中传送到磁盘。
虽然这种类型的消息可以在两个队列管理器之间网络连接失败的情况下继续存在,但是当所在的机器出现故障时将会丢失。
这是获得内存式投递的速度优势所必须付出的代价。
2. 磁盘式的投递当消息从一个队列处理器传送到另一个队列处理器时,消息存储在每个机器的硬盘上。
当消息传到下一个机器时,随着发送机器完成传送,从前一个机器的硬盘上删除消息。
由于消息必须写入所通过的所有机器的磁盘,所以会比内存式的投递花费更长的时间才能到达目的地。
毕竟磁盘输入输出要比内存慢几个数量级。
好处是系统出现故障时能够恢复消息,这种投递方法意味着消息通过队列管理器时,将每个消息写入磁盘,系统出现故障时不会破坏消息。
此方式要求M S M Q服务器使用可恢复文件系统,如N T F S。
3. 事务式投递最后,从传送者到接收者的所有消息的处理可被认为是一个事务。
由于事务支持A C I D特性,这意味着事务式投递的消息具有原子性、一致性、隔离性和持久性。
持久性意味着当消息在系统中传输时,事务性消息利用磁盘式投递方法将每个消息写入永久性的存储器中。
原子性意味着消息只投递一次,并以发送的次序投递。
事务性消息利用C O M 事务控制特性来提供消息投递的事务特性。
这种投递方法的好处是M S M Q消息可以参与使用数据库操作的事务。
这允许在使用M S M Q的应用程序中建立复杂的业务规则。
20.3 管理M S M QMSMQ 2.0像Windows 2000中的许多服务一样,通过M M C插件来进行管理。
M S M Q插件位于Computer Mangement插件之下,如图2 0 - 2所示。
图20-2 MSMQ插件M S M Q的M M C插件完成的任务一般是增加一个新的队列,向M S M Q服务器增加新的队列非常容易。
20.3.1 增加队列打开Computer Management插件,然后打开Message Queuing的下一级列表,如图2 0 - 3所示。
594
ASP 3 高级编程下载图20-3 增加队列的窗口下一步,右击Public Queues文件夹选择N e w,然后选择Public Queue。
现在M M C将显示一个提示对话框,询问队列名称和队列是否为事务性的,如图2 0 - 4所示。
名称一般是一个用户友好的字符串,可用来识别队列标签。
事务性设置决定了队列传送和接收消息时是否需要事务。
本章后面将进一步介绍事务。
现在只是简单地命名此队列为A S P Tr a n s并设置为事务性的。
在本章的最后将在M S M Q的示例中使用这个队列。
M S M Q将创建一个新的名为A S P Tr a n s的公共队列,如图2 0 - 5所示。
图20-5 创建一个公共队列后的窗口第2 0章A S P和消息队列服务器595下载图20-4 确定队列名称的对话框现在此队列设置为用来接收消息。
首先来看一下队列的设置和M S M Q缺省值。
20.3.2 消息队列的属性为了查看M S M Q队列的属性,右击左边目录树中或者右边的M M C插件中的队列,并选择P r o p e r t i e s。
将出现一个P r o p e r t i e s对话框,此P r o p e r t i e s对话框包含此消息队列的所有属性设置,如图2 0 - 6所示。
图20-6 设置队列属性的对话框在P r o p e r t i e s对话框中主要有两部分,G e n e r a l和S e c u r i t y。
G e n e r a l由以下几部分组成:?? Label:描述队列的字符串队列名称。
?? Type ID:可用于把多个队列组合在一起的G U I D。
?? ID:当队列建立时由M S M Q服务器分配的G U I D。
?? Limit message storage:管理员为防止队列不断扩大而设置的队列限额。
?? Authenticated:决定队列是否接受客户证书。
?? Tr a n s a c t i o n a l:指定队列是否需要事务。
?? Privacy level:确定队列是否使用加密和在消息的哪一部分加密。
?? Base Pri.