china-pub.com 第20章ASP和消息队列服务器 上一章讨论了如何使用COM+添加应用程序和组件的事务处理能力。本章研究另一种增 加应用程序可扩展性的方法 迄今为止,我们假设一个服务器是一个始终有效的完美世界,但是如果没有这个前提, 整个的系统会崩溃吗?显然不会。不过有必要采用一个异步通信系统,通常称为消息或者消 息队列。 在消息方案中,应用程序不再是执行一般的方法调用和等待一个响应,取而代之的是, 调用者简单地发一个“消息”给服务器,然后按正常程序进行处理,因此消息不仅允许客户 处理其他工作,而且由于利用了 Microsoft消息队列(MSMQ),服务器甚至可以是不可用的, 因为消息可以被排队并在以后处理。 本章将讨论消息排队的以下几个方面内容 ·消息排队的定义 MSMQ及其结构 MSMQ的管理 如何使用COM对象与MSMQ交互。 在ASP应用程序中MSMQ组件的使用。 MSMQ消息的异步响应 ·如何将MSMQ合并到事务中。 首先,介绍消息排队的背景知识。 20.1消息排队的定义 消息排队是允许不同的应用程序使用“存储和传送”过程进行彼此交流的系统 这些应用程序可以在相同或不同的硬件平台上。这些平台可以位于同一场所、同一LAN 或者是由电子装置相连的任何地方,这种连接甚至不需要是永久的或可靠的,除此之外,这 些平台甚至可在不同的操作系统中运行 听起来好像是一个非常复杂的系统。当今 Internet世界的特点是各种各样的应用程序 各种不同的地理位置、各种各样的连接类型和操作系统同时存在。能在这些系统之间传送数 据已经成为主张互连的人们的共同目的 在复杂的系统环境中,SQL、ODBC、FTP和HTTP等技术都为数据在系统之间传送提供 了不同的机制,这些技术的主要缺点是面向特定的应用程序类型。当数据需要在复杂的平台 间有效转换时,非常需要一种中间的应用程序。交换数据的格式和平台到平台的交互规则应 当留给特定的应用程序去完成。这种技术只是一个通信信道。利用这些系统已经创建出大量 系统的事实,并不意味着不存在更为有效的通信方法。 消息中间件系统在大型计算机领域中是众所周知的,多年来已经成为大容量的事务处理
下载 第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等技术都为数据在系统之间传送提供 了不同的机制,这些技术的主要缺点是面向特定的应用程序类型。当数据需要在复杂的平台 间有效转换时,非常需要一种中间的应用程序。交换数据的格式和平台到平台的交互规则应 当留给特定的应用程序去完成。这种技术只是一个通信信道。利用这些系统已经创建出大量 系统的事实,并不意味着不存在更为有效的通信方法。 消息中间件系统在大型计算机领域中是众所周知的,多年来已经成为大容量的事务处理
588s:3商程 Chinapub.com 下载 应用程序的模式。在个人计算机中也有许多消息技术,但我们主要考虑MSMQ,因为MSMQ 与ASP和其他微软开发工具紧密相关 20.1.1MsMQ的定义 MsMQ的基本概念非常简单,就是应用程序的电子邮件 与电子邮件一样,MSMQ消息也有发送者和接收者。然而接收者有些不同,MSMQ中消 息接收者定义为访问队列者(这是由 Windows域安全性设置的)。这样在单一的队列中多个接收 者能够响应单一的消息。在大多数使用MSMQ的网络应用程序中,消息的发送者是Web服务 器(IS),消息的接收者是自定义的应用程序。 当MSMQ消息形成后,即被打包到一个“容器”中,并发送到一个队列中,等待接收者 读取。这些队列不管网络连接的状态和可靠性如何,都能够保证消息传送(存储和传送) 自定义应用程序不一定在不同的机器上,但是放在另一台机器上可提供更好的 可扩展性。 在大多数使用MSMQ的ASP应用程序中,消息从ASP脚本或从COM组件中传送到同一个 服务器或另外一个机器中的队列中。一旦消息发送,ASP可以继续进行处理。在后台,另一 个自定义服务器端应用程序(通常用COM相容的工具创建,如 Visual basic或 Visual c++)响应 消息并开始着手处理。另外的一个响应并处理MSMQ消息的可能途径是建立一个使用 Ⅴ SCript来打开队列的SQL7.0服务器作业 MSMQ也可以和其他的消息系统相互通信。 Level8系统正在开发第三方解决方 案用于与其他平台上的MSMQ通信,例如 Sun solaris、 HP UNIX、OS/2、VMS和 AS/400平台等。 1.消息 前面已经提到MSMQ中的消息与电子邮件消息相类似,然而,它们不是发送给单个用户 或一组用户,而是从一个应用程序发送到一个计算机的一个队列中 MSMQ消息主要由三部分构成 标签 目标队列 标签与电子邮件消息中的主题非常相似,大多数情况下标签用来把各种类型的消息分组, 使自定义的应用程序能够区分消息所包含的内容 MSMQ消息的正文是各种各样的,能够保存从字符串、数组到COM对象的任何内容。消 息排队系统本身不检査实际内容,并且消息内容的格式也没有明确的标准。这意味着内容格 式由传递消息的两个应用程序自行决定。 例如,以创建一个Excl应用程序对象为例,载入一个电子表格,并设置MSMQ消息的正 文为 Excel的实例。读取这条消息时, Excel对象的实例就会被取出来。唯一的需要是消息的发 送者和接收者都必须将此组件注册到系统上。 消息也可包括实现专有的消息,例如谁是发送者和接收者、发送的时间标识 甚至是截止日期,即如果超过这一时间不进行读取将删除消息
应用程序的模式。在个人计算机中也有许多消息技术,但我们主要考虑 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 高级编程 下载
Chinaopub coM M20 AS RAER M 589 MSMQ消息也包括决定消息读取顺序的优先级属性,它与电子邮件中的优先级非常类似 息中的优先级可以是0~7的任何整数,决定消息存放到队列中的顺序。新添加的消息不一定 就存放在队列的底部。例如一个优先级为6的消息将放在优先级为5的前面。数目越小,优先 级越低。MSMQ消息的缺省优先级为3。但是发送到事务处理消息队列中的消息会将优先级自 动设置为0,这是因为事务忽略优先级 2.队列 消息队列是指消息被目标应用程序取走之前所存放的地方。与电子邮件比较,队列类似 于收件信箱。消息在期满或被读取前存放在队列中(除非清除队列)。 系统中可以有多个队列,但MSMQ支持大量连接的系统的分层结构。然而,在任何具体 的机器中,队列管理器管理着本机的所有队列,通常包含在此机器上预定接收消息的所有队 列,但也不总是这样。如果网络管理员对远程队列管理器进行适当的配置,大多数的消息产 品允许直接确定远程机器中队列的位置。队列管理器决定这个消息的最终目标是否是本地 如果是本地,就把消息放在目标队列中。如果不是本地,通过目录服务器找出目标队列所在 的机器。一旦目标队列服务器收到消息,就将其存放在目标队列中, 每个队列属于单个服务器,但一个服务器可以有多个队列。 队列的主要属性有 ·标签:通常用来定义队列的简单字符串。 ID:用来定义队列的唯一的GUID。 TypeD:用来定义队列类型或组的唯一的GUID Typed很有可能在多个队列中是相同的,这些队列组合在一起执行共同的任务。 另外,在MSMQ20中有四种类型的队列 ·输出队列( outgoing queue):当远程MSMQ服务器不起作用时保存消息。它们为MSMQ 提供了操作灵活性,即使在另外一个服务器不工作时也一样不会丢失消息。不能通过应 用程序使用输出队列,它只能由MSMQ内部用于存储和传送消息 系统队列( system queue):也是由MSMQ内部使用的,对自定义应用程序不起作用的。 这种队列的例子是无法投递的邮件的队列、报告队列和报纸队列 ·公共队列( public queue):它是MSMQ中最常用的一种队列,自定义应用程序用这个队列 完成业务需要。公共队列存储在 Active Directory服务中,因此,对于企业范围内的所有 其他MSMQ服务器都是可知的。 个人队列( private queue):可在自定义应用程序中使用。然而在 Active Directory中没有 个人队列。因而它们对本地计算机以外的应用程序来说是不可用的 虽然消息队列可以通过编程建立,但是多数情况下,消息队列是通过 Computer Management 插件的MSMQ部分建立的,管理MSMQ的有关信息可参考下面的203节“管理MSMQ”的内容。 20.1.2使用MSMQ和ASP的原因 为什么使用MSMQ?为什么不通过DCOM开发使ASP能获得所需功能的简单COM组件? 为了回答这个问题,我们提出以下几个问题 如果正在运行COM对象的服务器不可用怎么办?
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 下载
590Ap;高程 China-pub. coM 下载 ·如果运行时间太长,ASP页超时而且用户放弃怎么办? 如果由于在正常时间内因为表格锁定或处理器紧张而不能进行处理怎么办? 这些问题是开发MSMQ服务的原因。通过使用MSMQ,这些问题可以通过相对比较简单 的方法来解决。 (1)如果正在运行COM对象的服务器不可用该怎么办? 如果客户不是直接和COM对象对话而是发给MSMQ一个消息,则在客户和服务(COM)对 象之间提供另一抽象层。这就是所谓的异步通信的松散连接。 当然,通常COM对象不能自己运行,但可以开发响应消息和调用COM对象功能的服务器 端可执行程序。由于客户与后台分离,只要Web服务器(IS)安装了MSMQ客户,客户可以仅 仅发出消息并继续运行 (2)如果运行时间太长怎么办? 这个问题的解决方法和上面的情况一样。通过把处理工作移到后台服务器上进行,客户 就不必等到任务完成 (3)如果由于在正常时间内不能进行处理该怎么办? 如果处理工作在正常的高峰时间内不能完成,这个任务可以存放在消息队列中直到预定 的服务器端可执行程序准备处理此项任务(队列中的消息),这允许任何数量的消息或任务同时 存储或运行。 这就是所谓的批处理。 速度与可用性的比较 通常消息中间件被认为是一种提高可用性和可扩展性的技术。这不应该与速度混淆。消 息总是比低层的内部处理通信的方法要慢,如套接字( Socket或命名管道( named pipe)。毕竟 消息最终要利用这些方法来传递。中间件技术向通信协议基本性能增加了协商( negotiation)和 通告( notification)的开销。 消息中间件认为不论技术怎么快,都达不到足够快的速度。这不仅包括处理器也包括通 信。除非机器能在零时间内无限装载,否则总有可能过载,这就是消息中间件的设计原因 首先,通过将异步通信引入到处理中,在等待一个消息的响应时,客户可以去处理别的 任务。因为队列管理器把输入的消息存放在一个缓冲区中,即队列中。接收服务器没有必要 具有足以处理峰值通信量的速度,仅仅需要满足系统中通信量的平均值的处理需求。在峰值 过程中,进入的额外消息将退到队列中去,当通信量减少时再发送,然后从队列中清除。在 有额外消息退到队列中去时,对于必须同步处理消息的系统会失败,即可用性差。但是异步 消息系统的服务仍然可用 因而,消息是一个可扩展的解决方法,异步消息系统的优点在于可以成功地处 理更多的通信量,而不在于处理速度。 这也说明了低层协议中增加的附加特性的作用。消息中间件对企业级系统提供一系列重 要的特性以降低额外开销 它改善了可用性 它考虑了偶然断开计算机连接这种可能出现的情况,这在基本协议中是不允许的 它允许传送者和接收者知道发出的消息已收到,并且一旦收到就能知道
• 如果运行时间太长,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 高级编程 下载
chinaopub coM M20 3 AS RAER 591 载 当我们继续学习本章内容时,请记住速度在创建可扩展的企业级系统时并不是最重要的 2.消息与同步通信的比较 应用程序之间的通信不一定必须使用消息队列来进行,如果业务环境需要同步完成一些 工作,那么像DCOM这样的通信方法更适合执行这种类型的处理。如果每个应用程序都连接 到LAN,并且所有应用程序的服务器是在快速的、本地的、可靠的链路上进行连接的,也可 以不用消息。另外,对许多开发人员来说,消息队列是新的和不熟悉的技术。他们可能不愿 意在这方面花费精力 下面的准则可以帮助你决定使用消息队列: 如果与你通信的应用程序不能保证与你的应用程序在同一时间运行。 如果消息很重要,丢失将会导致严重后果 如果应用程序不是总和接收者的应用程序相连接。 ·如果异步执行许多与其他应用程序的通信任务,并且可能不关心它们的响应 20.2MsMQ结构 MSMQ系统结构的基本部分是消息、队列、队列管理器和允许程序访问信息的接口。系 统在物理位置方面工作是透明的。这意味着应用程序将消息发送到另一应用程序中时,可以 不必关心消息实际上是如何到达对方的。MSMQ为在系统中查找可用的队列提供设施。一旦 应用程序发现感兴趣的队列,就可以发送消息给它而不必关心消息是如何到达那里的 MSMQ控制消息所走的路径,并可以(如果有必要)保证消息到达最终目的地 MsMQ结构由一对多服务器和工作站构成,它们负责路由、发送和接收消息。 每个计算机可以包含多个消息队列,并且在每个队列内可以包含多个消息 202.1服务器类型 MSMQ可以安装在各种各样的服务器和客户上。MSMQ有四种不同的服务器安装: 主企业控制器 ·主站点控制器 备用站点控制器。 路由器 主企业控制器 主企业控制器(PEC是MSMQ结构的根层,为使MSMQ实现正常的功能,每个企业网络必 须包含一个PEC。在MSMQ1.0中,PEC需要 SQL Server6.5或更高版本。在MSMQ2.0中,由 于消息和队列存储在 Active Directory服务(ADS)中,因此,不需要 SQL Server ADS是 Windows2000的一部分。在NT4上,在MSMQ2.0安装前,必须安装 ADS。任一版本ADS只能在 Windows nt4 Server上或 Windows2000 Server上安装。 EC是大多数的队列存储的地方,尤其是在较小的网络中。随着网络规模的扩大,对远 程站点来说,在主站点控制器中保留自己的队列可能更为高效 PEC常常位于公司总部或主要分部,这是因为所有其他服务器必须能够访问PEC并向其注
当我们继续学习本章内容时,请记住速度在创建可扩展的企业级系统时并不是最重要的 因素。 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 下载
592 ASP3高级编程 China°beo 下载 册(存储在ADS中)。如果公司的网络仅包含一个小的LAN,需要的服务器仅是PEC,并且它可 以与IS合并在同一个服务器中。在大型企业中,PEC用于存储其他MSMQ服务器的位置和队 列的信息,并在它们之间路由消息,通常在此服务器上仅有 Backoffice服务。 2.主站点控制器 公司WAN的远程分支或站点中通常存在一个主站点控制器(PSC),PSC能与远程LAN上的 本地客户通信,并将消息反馈给PEC。每个分支都有一个PSC,提供返回PEC的单点通信。这 有助于节省资源,例如网络通信,这对远程站点是重要的,特别是在较慢网络链路上。 如上所述,在小的LAN中,并不总是需要PSC,其工作可由PEC来完成。 3.备用站点控制器 备用站点控制器(BSC)用于存储PSC中信息的只读副本。通常每个站点安装一个BSC,就 像PSC一样。如果PSC失败,它提供故障屏蔽支持 4.路由器 随着企业中MSMQ结构的不断扩大,MSMQ路由器将会变得非常有用。路由器不仅能够 将消息传递到目标队列,而且也能使服务器使用不同的网络协议互相通信,例如TCP/IP和 IPX。 MSMQ路由服务器没有存储消息的本地队列,它仅能够确定传送消息的最佳路由。当网 络部分关闭时,MSMQ路由服务器非常有用。路由器会试着寻找消息到达目的地的其它路径。 在PEC和PSC服务器中也包含MSMQ路由器的功能。由于每个站点都要求包含PEC或PS 这意味着每个站点都包含某种路由器。 20.2.2客户类型 客户安装比较容易掌握,因为只包含两种安装选项 ·从属客户 独立客户 1.独立客户 MSMQ的独立客户可以安装在运行 Windows9x、 Windows nt4或 Windows2000的计算 机上。独立客户具有发送消息给其他MSMQ服务器队列和从其他MSMQ服务器中读取消息的 能力,还可以在本地队列中存储消息。 MSMQ的独立客户常安装在应用程序服务器和网络服务器上。由于独立客户可以存储消 息,它们不依赖于运行在目标计算机上的MSMQ服务。对COM组件或ASP脚本来说,在想发 送消息但MSMQ服务器不可用时,这是非常有用的。这时,独立客户在本地队列中存储消息 等到MSMQ服务器变为可用,才传送消息(存储和传送) 尽管独立客户可以具有本地队列,但它们不需要安装ADS或 SQL Server,而是把消息和 队列信息存放在文件和注册表中。这允许客户在本地具有许多MSMQ功能。独立客户也具有 通过使用 MSMQEvent对象异步响应消息的能力。 安装MSMQ独立客户时,安装向导将会对PEC给出相应地提示信息,这样客户机 可以向PEC注册。 2.从属客户 MSMQ从属客户是 Windows9X、 Windows nt4和 Windows200客户的另一选择。独立
册(存储在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 高级编程 下载
Chinaopub coM M20 AS RAER M& 593 和从属安装之间的主要区别是从属客户不能在本地存储消息,从属客户也不能在其他服务器 上建立队列或从队列中异步读取消息 从属客户访问MSMQ服务器时,只能发送和读取消息。由于没有本地队列,所以也不能 接收消息。 由于终端用户响应消息的需求不大,从属客户通常安装在终端用户工作站上 20.2.3站点布局图 图20-1是跨越WAN并具有中心LAN的MSMQ安装布局图。 站点B PEC主企业控制器 主站点控制器 Bc备用站点控制器 MSM MSM MSMQ 路由服务器 站点D MSMQ独立的或非 图20-1SMQ安装布局图 多路径 配置企业级的MSMQ安装时,必须确定两个路由器之间链路的费用。这种费用由相关因 素决定。链路速度、链路有效带宽和实际链路货币花費等,这些都可算入计算机链路费用 当执行动态路由时,MSMQ会计算出发送者和接收者间的最“廉价”的链路,并以此路径发 送信息。由于不必明确创建静态路径,这使MSMQ的配置更简单。这允许MSMQ绕过网络柘 扑的断点发送消息,因此提高了消息服务的可用性 20.2.4投递选项 微软消息队列服务器有三种可供选择的消息投递方式,每种投递消息的方式具有不同的 优点和缺点,这三种投递类型是 内存式 磁盘式。 事务式。 1.内存式的投递 在这种投递类型中,当消息通过消息队列系统从一个队列管理器传送到另一个队列管理 器时,消息依然存储在系统内存中。如果在网络和队列管理器中存在消息不能与网络中的下 个队列处理器联系的问题,那么这条消息将会被保存直到连接能恢复。内存式的投递非常
和从属安装之间的主要区别是从属客户不能在本地存储消息,从属客户也不能在其他服务器 上建立队列或从队列中异步读取消息。 从属客户访问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 下载 站点A MSMQ 客户 MSMQ 客户 PEC PEC MSMQ 客户 MSMQ 客户 主企业控制器 主站点控制器 备用站点控制器 路由服务器 独立的或非 独立的客户 MSMQ 客户 MSMQ 客户 MSMQ 客户 MSMQ 客户 站点B 站点C 站点D
594Ap高程 Chinaopub com 下载 迅速,这是由于消息从来不会从系统内存中传送到磁盘。虽然这种类型的消息可以在两个队 列管理器之间网络连接失败的情况下继续存在,但是当所在的机器出现故障时将会丢失。这 是获得内存式投递的速度优势所必须付出的代价 2.磁盘式的投递 当消息从一个队列处理器传送到另一个队列处理器时,消息存储在每个机器的硬盘上 当消息传到下一个机器时,随着发送机器完成传送,从前一个机器的硬盘上删除消息。由于 消息必须写入所通过的所有机器的磁盘,所以会比内存式的投递花费更长的时间才能到达目 的地。毕竟磁盘输入输出要比内存慢几个数量级。好处是系统岀现故障时能够恢复消息,这 种投递方法意味着消息通过队列管理器时,将每个消息写入磁盘,系统出现故障时不会破坏 消息。此方式要求MSMQ服务器使用可恢复文件系统,如NTFS 3.事务式投递 最后,从传送者到接收者的所有消息的处理可被认为是一个事务。由于事务支持ACID特 性,这意味着事务式投递的消息具有原子性、一致性、隔离性和持久性 持久性意味着当消息在系统中传输时,事务性消息利用磁盘式投递方法将每个 消息写入永久性的存储器中。原子性意味着消息只投递一次,并以发送的次序投递 事务性消息利用COM事务控制特性来提供消息投递的事务特性。这种投递方法的好处是MSMQ 消息可以参与使用数据库操作的事务。这允许在使用MSMQ的应用程序中建立复杂的业务规则 20.3管理MSMQ MSMQ2.0像 Windows2000中的许多服务一样,通过MMC插件来进行管理。MSMQ插件 位于 Computer Mangement插件之下,如图20-2所示。 图202MSMQ插件 MSMQ的MMC插件完成的任务一般是增加一个新的队列,向MSMQ服务器增加新的队列 非常容易。 20.3.1增加队列 打开 Computer Management插件,然后打开 Message Queuing的下一级列表,如图20-3所示
迅速,这是由于消息从来不会从系统内存中传送到磁盘。虽然这种类型的消息可以在两个队 列管理器之间网络连接失败的情况下继续存在,但是当所在的机器出现故障时将会丢失。这 是获得内存式投递的速度优势所必须付出的代价。 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 Q MSMQ 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 高级编程 下载
Chinaopub coM M20 ASP RAER ME595 c的母度 图20-3增加队列的窗口 下一步,右击 Public Queues文件夹选择New,然后选择 Public Queue。现在MMC将显 个提示对话框,询问队列名称和队列是否为事务性的,如图20-4所示 名称一般是一个用户友好的字符串,可用 来识别队列(标签)。事务性设置决定了队列传 送和接收消息时是否需要事务。本章后面将进 介绍事务。现在只是简单地命名此队列为 ASPTrans并设置为事务性的。 OKCancel 在本章的最后将在MSMQ的示例中使 用这个队列。 图20-4确定队列名称的对话框 MSMQ将创建一个新的名为 ASPTrans的公共队列,如图20-5所示。 Uers and Removable orace and Aopl 日 WMI Contro Internet iny 图20-5创建一个公共队列后的窗口
图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 确定队列名称的对话框
596Asp高程 China°beo 下载 现在此队列设置为用来接收消息。首先来看一下队列的设置和MSMQ缺省值 20.3.2消息队列的属性 为了查看MSMQ队列的属性,右击左边目录树中或者右边的MMC插件中的队列,并选择 Properties。将出现一个 Properties.对话框,此 Properties对话框包含此消息队列的所有属性设置 如图20-6所示 Genera ]securitY 囫 watcher\ASPTrans Type ID E0A3GA76364E214B9540357A44031日 Lmit message stot ape to你B Pivacylvet Optiona彐Baop彐 Enabled mi joumal storage toⅨKB 图20-6设置队列属性的对话框 在 Properties对话框中主要有两部分, General和 Security. General由以下几部分组成 Label:描述队列的字符串(队列名称) Type ID:可用于把多个队列组合在一起的GUID ID:当队列建立时由MSMQ服务器分配的GUID Limit message storage:管理员为防止队列不断扩大而设置的队列限额。 · Authenticated:决定队列是否接受客户证书。 Transactional:指定队列是否需要事务 · Privacy level:确定队列是否使用加密和在消息的哪一部分加密 · Base Priority:确定队列接受的最低优先级。缺省值是0,设置值可以是从O到7之间的整 · Journal:决定日志是否有效和大小的限制,日志在读取后保留消息而不进行删除 队列属性的第二部分是 Security。在这里决定谁有权读取、发送和管理队列,如图20-7所 在 Permissions区域中有两个项要注意。这个队列对每个用户都提供了 Write message访问, 而不是 Receive message访问。这意味着Web站点的客户可以发送消息而不能读取消息(除非 Web应用程序需要用户被验证,这是正常的需要)。权限应该是比较严格的, Everyone组应被
现在此队列设置为用来接收消息。首先来看一下队列的设置和 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 Priority:确定队列接受的最低优先级。缺省值是 0,设置值可以是从0到7之间的整 数。 • Journal:决定日志是否有效和大小的限制,日志在读取后保留消息而不进行删除。 队列属性的第二部分是 S e c u r i t y。在这里决定谁有权读取、发送和管理队列,如图 2 0 - 7所 示。 在P e r m i s s i o n s区域中有两个项要注意。这个队列对每个用户都提供了 Write Message访问, 而不是Receive Message访问。这意味着 We b站点的客户可以发送消息而不能读取消息 (除非 We b应用程序需要用户被验证,这是正常的需要 )。权限应该是比较严格的, E v e r y o n e组应被 596计计ASP 3 高级编程 下载