![]() | |
Sun Java System Message Queue 3 2005Q1 技术概述 |
第 4 章
消息服务器消息服务器中介绍了 Message Queue 消息服务器,它由单个代理或一组协同工作的代理(代理群集)组成,用于执行消息路由和传送。
本章介绍代理的内部结构及其各种组件,并简要说明在开发及生产环境中配置和管理代理需要执行的步骤。本章包含以下小节:
了解代理的功能组成部分有助于您配置所需的代理功能,调整操作以及优化性能。因此,本章内容可能更合乎管理员而非应用程序开发者的需要。
代理体系结构为进行消息传送,代理会建立与客户机之间的通信通道、进行验证和授权、正确路由消息、确保可靠传送以及提供用于监视系统性能的数据。
为了实现这么多复杂的功能,代理使用了大量的各种内部组件,每个组件都在传送过程中担当着各自不同的角色。这些代理组件如图 4-1 所示,表 4-1 则对这些组件进行了简要说明。其中消息路由器组件执行关键的消息路由和传送服务,而其他组件则提供消息路由器所依赖的重要的支持服务。
图 4-1
代理组件
在配置代理时,实际上是配置这些服务,以便根据负荷条件、应用程序复杂性等因素来优化代理的性能。
代理组件以下几节介绍图 4-1 中显示的各个代理组件及其功能和行为。有关这些组件的相应属性和配置过程,请参见 Message Queue 管理指南。
连接服务
Message Queue 代理支持与应用程序客户机和管理客户机的通信。每个连接服务由其服务类型和协议类型指定。
服务类型 指定服务提供的是 JMS 消息传送服务 (NORMAL),还是支持管理工具的 Message Queue 管理服务 (ADMIN)。
表 4-2 显示了 Message Queue 代理当前支持的连接服务。
表 4-2 代理支持的连接服务
服务名称
服务类型
协议类型
jms
NORMAL
TCP
ssljms
NORMAL
TLS(其安全性基于 SSL)
httpjms(企业版)
NORMAL
HTTP
httpsjms(企业版)
NORMAL
HTTPS(其安全性基于 SSL)
admin
ADMIN
TCP
ssladmin
ADMIN
TLS(其安全性基于 SSL)
可以将代理配置为运行以上任一或全部连接服务。每个连接服务均支持特定的验证和授权(访问控制)功能(请参见安全性管理器)。每个连接服务都是多线程的,从而支持多个连接。
每个连接服务仅在由代理的主机名和端口号指定的特定端口上可用。端口可动态分配,或者可指定连接服务可用的端口。图 4-2 中显示了常规模式。
图 4-2 连接服务支持
端口映射器
连接服务由公共的端口映射器来分配端口。端口映射器本身位于标准端口号 7676。当 Message Queue 客户机运行时建立与代理的连接时,首先与端口映射器进行通信,请求其所需的连接服务端口号。
可以通过在配置 jms、ssljms、admin 和 ssladmin 连接服务时为其分配静态端口号的方式忽略端口映射器的分配。不过,通常仅在特殊情况下使用静态端口号,例如,通过防火墙建立连接(请参见 HTTP/HTTPS 支持),一般不建议使用静态端口号。
线程池管理器
每个连接服务都是多线程的,从而支持多个连接。这些连接所需的线程在线程池中进行维护,而线程池又由线程池管理器组件来管理。通过配置线程池管理器,可以设置线程池中维护的线程的最大和最小数量。当连接需要线程时,这些线程将被添加到线程池中。当线程数量超过最小数量时,系统将关闭变为空闲状态的线程,直到达到最小阈值,以此来节省内存资源。线程池中的线程可专用于单个连接,也可根据需要分配到多个连接。
HTTP/HTTPS 支持
HTTP/HTTPS 支持允许 Message Queue 客户机使用 HTTP 协议(而非通过直接 TCP 连接)与代理进行交互。如果需要使用防火墙将客户机与代理分隔,则可以使用 HTTP/HTTPS 服务,因为它允许通过防火墙进行通信。
图 4-3 显示了提供 HTTP/HTTPS 支持所需的主要组件。
图 4-3 HTTP/HTTPS 支持体系结构
- 在 Message Queue 客户端,HTTP 或 HTTPS 传输驱动程序将 JMS 消息封装到 HTTP 请求中,并确保将这些请求以正确的顺序发送给 Web 服务器。
- 必要时,客户机可以选择使用 HTTP 代理服务器与 Web 服务器进行交互。
- HTTP 或 HTTPS 隧道 Servlet (均随 Message Queue 一起提供)被装入 Web 服务器,并在将 JMS 消息转发给代理之前,从客户机 HTTP 请求中提取出 JMS 消息。HTTP/HTTPS 隧道 Servlet 还将代理响应发送回客户机。可以使用一个 HTTP/HTTPS 隧道 Servlet 访问多个代理。
- 在代理端,代理启动时将建立其与隧道 Servlet 的连接。在从 HTTP 或 HTTPS 隧道 Servlet 发送消息时,httpjms 或 httpsjms 连接服务相应地解开消息,并将其提交到代理的消息路由器组件。
图 4-3 中所示的 HTTP 与 HTTPS 的体系结构非常相似。主要区别在于,HTTPS(httpsjms 连接服务)中的隧道 Servlet 与客户机和代理之间的连接都是安全的。
Message Queue 的 HTTPS 隧道 Servlet 将自签名证书传递给请求连接的任何代理。代理使用该证书建立与 HTTPS 隧道 Servlet 的加密连接。建立此连接后,就可以协商建立 Message Queue 客户机和隧道 Servlet 之间的安全连接。
可以使用 Message Queue 管理指南中介绍的属性来配置 httpjms 和 httpsjms 服务。
消息路由器
使用支持的连接服务在客户机与代理之间建立起连接后,即可进行消息的路由和传送。
Message Queue 消息传送基于两个传送阶段:首先,从生产者客户机传送到代理上的物理目标,然后再从代理上的目标传送到一个或多个消费者客户机。消息路由器管理这一过程:将到达的消息置于相应的目标上,然后再将消息路由并传送到相应消费者。
本节介绍不同种类的目标以及按单独及统一方式对这些目标的内存资源进行管理。第 3 章“可靠消息传送” 中介绍了消息的路由和传送机制。
物理目标
物理目标表示代理的物理内存中的位置(传入消息在被路由到消费者客户机前将存储在其中)。
可按创建方式和创建目的将目标划分为以下几个类别:管理员创建、自动创建、临时及停用消息队列。
管理员创建的目标
管理员创建的目标是管理员使用 Message Queue 管理工具创建的。这些目标对应于以编程方式创建的逻辑目标,或者对应于客户机查找的目标受管理对象。
Message Queue 消息服务器是消息传送系统的核心,因此其性能和可靠性对企业应用程序的正常运行至关重要。因为目标可能使用大量的资源(取决于它们处理的消息的数量和大小以及注册的消息消费者的数量和长期性),所以需要对它们严格地进行管理,以确保消息服务器的性能和可靠性。因此为应用程序创建目标、监视目标以及根据需要重新配置它们的资源要求已成为管理员的标准做法。
自动创建的目标
自动创建的目标是在需要时由代理自动创建的,不需要管理员进行干预。特别是,每当消息消费者或消息生产者尝试访问不存在的目标时,就会创建一个自动创建的目标。在需要动态创建目标时,就会使用这些目标:通常是在开发和测试阶段。可以配置代理以启用或禁用自动创建功能。
当自动创建目标时,可能会导致不同客户机应用程序(使用相同的目标名称)之间发生冲突,或者导致系统性能降低(由于支持目标需要使用资源)。因此,当不再使用自动创建的目标时,也就是当目标不再与消息消费者客户机保持连接且不再包含任何消息时,代理会自动将其销毁。重新启动代理后,只有当自动创建的目标包含持久性消息时,才会重新创建这些目标。
临时目标
某些客户机需要一个目标来接收对发送至其他客户机的消息的回复。这些客户机应用程序使用 JMS API 明确创建和销毁的目标称为临时目标。这些目标是为连接而创建的,并由代理维护,而且仅在连接期间存在。临时目标无法由管理员销毁,而且只要此目标在使用中(即连接有活动的消息消费者),那么它也无法由客户机应用程序销毁。临时目标与管理员创建或自动创建的目标不同(后两者包含持久性消息),它们不会被持久保存,并且在重新启动代理时也不会重新创建临时目标;但是,可通过 Message Queue 管理工具看到这些内容。
停用消息队列
停用消息队列是一种在代理启动时自动创建的专用目标,用于存储停用消息,以便进行诊断。停用消息是指由于非正常处理或显式管理操作原因而从系统中删除的消息。消息被视为停用的可能原因有:过期、因超出内存限制而被从目标中删除或传送尝试失败。
可以使用两种方法,将消息置于停用消息队列中:
消息被置于停用消息队列时,其他属性信息也将写入到消息中,从而为您提供有关停用原因的信息。
内存资源管理
消息服务器在资源方面很有限:内存、CPU 周期等。因此,根据代理所支持的消息传送应用程序的使用模式,消息服务器可能会在无响应或不稳定的位置发生崩溃。特别是,当目标的消息生成速度远远高于消息使用速度时,就可能会出现该问题。
消息路由器具有管理内存资源并防止代理用尽内存的机制。它使用三级内存保护,使系统在资源不足时仍可正常运行:目标消息限制、系统范围限制以及系统内存阈值。
目标消息限制
由于消息可以在目标中保留相当长的一段时间,因此内存资源可能会成为一个问题。为目标分配内存时,您一定希望分配得恰到好处,向一个目标分配过多内存会导致内存不足,而太少的话消息就会被拒绝。
为了根据各个目标的负荷要求实现灵活性,可以设置一些属性来管理它们各自的内存资源和消息流。例如,可指定目标允许的最多生产者数量、目标允许的最多消息数(或最大消息量)以及任何一条消息大小的最大值。
还可以指定在达到任何此类限制时,消息路由器作出以下四种响应中的哪一种。四种限制行为是:
系统范围消息限制
系统范围消息限制构成了第二道防线。可指定应用于代理中所有目标的系统范围限制:消息总数和所有消息占用的内存。如果达到了任何系统范围消息限制,消息路由器将拒绝新消息。
系统内存阈值
系统内存阈值是第三道防线。可指定可用系统内存的阈值,代理可利用阈值采取更为严肃的操作以防内存过载。采取的操作取决于内存资源的状态:绿色(可用内存充足)、黄色(代理内存不足)、橙色(代理内存严重不足)、红色(代理无可用内存)。随着代理的内存状态由绿色变为黄色,再变为橙色,最后变为红色,代理所采取的措施也会越来越严格,操作类型如下:
这些措施都会降低性能。
如果达到系统内存的阈值,则说明没有适当地设置目标到目标的消息限制以及系统范围消息限制。在某些情况下,阈值不可能及时地捕捉到潜在的内存过载。因此,您不应依赖此功能,而应该分别配置目标,共同优化内存资源。
通过仔细地监视和调整,这些基于目标的限制和行为可以用于平衡消息的内流和外流,以免发生系统过载。尽管这些机制会造成开销并限制消息的吞吐量,但它们可以维护操作的完成性。
持久性管理器
对于发生故障后待恢复的代理,需要重新创建其消息传送操作的状态。这需要它将所有持久性消息以及基本的路由和传送信息保存到数据存储库中。要进行恢复,代理还必须完成以下操作:
持久性管理器用于管理所有这些状态信息的存储和检索。
代理重新启动时,会使用由持久性管理器管理的数据来重新创建目标和长期订阅,恢复持久性消息,回滚打开的事务,并为未传送的消息重新创建其路由表。然后代理才可以恢复消息传送。
Message Queue 既支持内置的持久性模块,也支持插入的持久性模块(请参见图 4-4)。内置的持久性是基于文件的数据存储库。插入的持久性使用 Java 数据库连接 (JDBC) 接口,并需要 JDBC 兼容的数据存储库。通常,内置的持久性比插入的持久性速度更快,但某些用户更希望获得与 JDBC 兼容的数据库系统提供的冗余和管理控制。
图 4-4 持久性管理器支持
内置的持久性 默认的 Message Queue 持久性存储器解决方案是基于文件的数据存储库,它使用单个文件来存储持久性数据。为减少添加和删除消息带来的碎片,可压缩基于文件的数据存储库。要使可靠性最大化,可指定持久性操作使用物理存储设备与内存中状态同步。这有助于消除因系统崩溃而导致的数据丢失,但会使性能下降。由于数据存储库中可能包含敏感或专用消息,因此应对数据存储库文件进行保护以防止未授权的访问。
插入的持久性 您可以代理进行设置,以访问可通过 JDBC 驱动程序访问的任何数据存储库。这将涉及到设置多个与 JDBC 相关的代理配置属性以及使用 Message Queue 数据库管理器实用程序来创建具有相应模式的数据存储库。Message Queue 管理指南中详细说明了上述过程和相关的配置属性。
安全性管理器
Message Queue 提供验证和授权(访问控制)功能,同时也支持加密功能:
验证和授权功能取决于用户系统信息库(请参见图 4-5):包含消息传送系统的用户信息(用户名、密码和组成员资格)的文件、目录或数据库。用户名和密码用于在请求连接至代理时对用户进行验证。用户名和组成员资格(与访问控制文件配套使用)用于授权操作,例如为目标生成消息或使用目标的消息。
可以填充 Message Queue 提供的用户系统信息库,也可以将原有的 LDAP 用户系统信息库插入到代理中。平面文件用户系统信息库易于使用,但也容易受到安全性攻击,因此仅用于测试和开发目的。LDAP 用户系统信息库比较安全,因此最适合用于生产目的。
以下各小节介绍了验证、授权和加密。有关更详细信息,请参见 Message Queue 管理指南。
验证
Message Queue 安全性支持基于密码的验证。当客户机请求连接到代理时,该客户机必须提供用户名和密码。安全性管理器将把客户机提交的用户名和密码与用户系统信息库中存储的用户名和密码进行比较。密码在从客户机传送到代理的过程中,将使用 Base -64 编码或消息摘要 (MD5) 进行编码。要想获得更安全的传送,请参见加密。可以分别配置每个连接服务使用的编码的类型,也可以基于代理范围设置编码方式。
授权
客户机应用程序的用户通过验证后,即可以获得授权来执行各种 Message Queue 相关的活动。安全性管理器既支持基于用户的访问控制,也支持基于组的访问控制:根据用户在用户系统信息库中分配到的用户名或组的不同,该用户所拥有的执行特定 Message Queue 操作的权限也不同。可以在访问控制属性文件中指定访问控制(请参见图 4-5)。
图 4-5 安全性管理器支持
当用户尝试执行某个操作时,安全性管理器将检查该用户的用户名和组成员资格(在用户系统信息库中)是否属于被授予访问该操作权限的用户名或组成员资格(在访问控制属性文件中)。访问控制属性文件指定了执行以下操作的权限:
您可以在用户系统信息库中定义组并使用户与这些组关联(虽然在平面文件用户系统信息库中不完全支持组)。然后,通过编辑访问控制属性文件,可以根据用户或组的目的(生成、使用或浏览消息)指定它们可以访问的目标。可以分别指定各个目标或指定所有目标仅能够被特定用户或组访问。
另外,如果将代理配置为允许自动创建目标(请参见自动创建的目标),则可以通过编辑访问控制属性文件来控制代理可为谁自动创建目标。
加密
要对客户机和代理之间发送的消息进行加密,需要使用基于安全套接字层 (SSL) 标准的连接服务。SSL 通过在启用 SSL 的代理与启用 SSL 的客户机之间建立加密连接来提供连接级别的安全性。
监视服务
代理包含大量用于监视和诊断其操作的组件。包括:
图 4-6 中是常规模式的图解。
度量生成器
图 4-6 所示的度量生成器提供有关代理活动的信息,如流入流出代理的消息、代理内存中的消息数量及其使用的内存量、打开的连接数量和正在使用的线程数量。
可以打开或关闭度量数据的生成,并指定生成度量报告的频率。
图 4-6 监视服务支持
记录程序
图 4-6 所示的 Message Queue 记录程序记录由代理代码和度量生成器生成的信息,并将该信息写入多个输出通道中:标准输出(控制台)、日志文件以及 Solaris 平台上的 syslog 守护程序进程。
您可以指定记录程序所收集的信息类型以及写到每个输出通道的类型。对于日志文件,还可以指定何时关闭日志文件并将输入转移到新文件。在日志文件达到指定的大小或生存期后,将保存该文件并创建一个新的日志文件。
有关如何配置记录程序以及如何使用它来获取性能信息的详细信息,请参见 Message Queue 管理指南。
度量消息生产者(企业版)
图 4-6 所示的度量消息生产者组件按一定的时间间隔接收度量生成器的信息,并将信息写入消息,然后根据消息中包含的度量信息类型,将消息发送至多个度量主题目标之一。
订阅这些度量主题目标的 Message Queue 客户机可以使用目标中的消息,并处理消息中包含的度量信息。这样,开发者就可以创建自定义监视工具来支持消息传送应用程序。有关每种类型的度量消息报告的度量数量的详细信息,请参见 Message Queue Developer's Guide for Java Clients,其中介绍了如何开发使用度量消息的 Message Queue 客户机。有关如何配置度量消息生成的信息,请参见 Message Queue 管理指南。
开发和生产环境要开发和测试消息传送应用程序以及在生产环境中部署和管理这些应用程序,您需要使用 Message Queue 服务提供的消息传送基础结构。
本节介绍在开发和生产环境中使用 Message Queue 的各种方法。涵盖下列主题:
尽管管理员负责设置和管理生产环境和任务,但开发者了解这些环境也是非常重要的,因为只有这样他们才能为管理员提供设置和配置此环境的某些部分所需的信息以及确定客户机是否按预期方式工作。
开发环境和任务
在开发环境中,工作的重点是 Message Queue 客户机应用程序编程。Message Queue 服务主要用于测试。
即装即用式配置
Message Queue 产品被设计为即装即用式。可以使用默认值启动代理,并为您提供默认的数据存储库、用户系统信息库以及访问控制属性文件。
默认用户系统信息库是使用默认条目创建的,这些条目允许在安装 Message Queue 代理后即可使用它,而无需管理员进行任何干预。换句话说,使用代理之前无需设置初始用户/密码。可以使用默认用户名 (guest) 和密码 (guest) 来验证客户机用户。
此外,还提供了多个样例应用程序来指导您开发新的应用程序。
开发惯例
在开发环境中,强调的是灵活性,您通常采用以下惯例:
- 您想做最少的管理工作,主要是为开发者启动代理以便用于测试。
- 您使用数据存储库(基于内置文件持久性)、用户系统信息库(基于文件的用户系统信息库)和访问控制属性文件的默认实现方案。利用这些默认的实现方案进行开发测试通常已经足够了。
- 可以使用简单文件系统对象存储(通过创建用于该用途的目录)来存储受管理对象;也可以在客户机代码中实例化受管理对象,而根本不使用对象存储。
- 如果是执行多代理测试,很可能不会使用主代理(请参见群集同步)。
- 您通常使用自动创建的目标,而不使用明确创建目标。
生产环境和任务
在生产环境中,必须对应用程序进行部署、管理和调节以获得最佳的性能。在此类环境中,对消息传送基础结构进行管理和调节是一项很重要的要求(如果不是至关重要的)。
此外,部署必须在规模和可用性方面都能满足企业的要求。这就需要对消息服务进行自定义配置和设置,调节性能和扩展系统以应对日益增加的负荷,并对消息服务和特定于应用程序的资源进行日常监视和管理。因此,管理任务取决于消息系统的复杂性和它必须支持的应用程序的复杂性。以下各节将管理任务划分为设置操作和维护操作两类。有关执行这些任务所需的过程,请参见 Message Queue 管理指南。
设置操作
生产环境要求设置安全访问,配置连接工厂和目标对象,设置群集,配置持久性存储以及管理内存。
设置生产环境通常需要执行以下全部设置操作或至少执行某些设置操作:
维护操作
在生产环境中,需要对 Message Queue 消息服务器资源进行监视和控制。应用程序性能、可靠性和安全性是优先考虑的因素,并且需要使用 Message Queue 管理工具执行如下所述的若干任务:
维护生产环境