消息代理可以提供各种连接服务,这些连接服务使用各种传输协议来支持应用程序客户端和管理客户端。 连接属性中列出了与连接服务相关的代理配置属性。
表 4–1 显示了可用的连接服务,这些服务可以通过以下两个特性进行区分:
表 4–1 Message Queue 连接服务
服务名称 |
服务类型 | |
---|---|---|
NORMAL | ||
NORMAL | ||
NORMAL | ||
NORMAL | ||
ADMIN |
TCP |
|
ADMIN |
TLS(基于 SSL 的安全性) |
通过设置代理的 imq.service.activelist 属性,可以将其配置为运行上述任意或全部连接服务。此属性的值是一个连接服务列表,当代理启动时,会激活该列表中的连接服务;如果未明确指定此属性,则默认情况下将激活 jms 和 admin 服务。
每个连接服务还支持特定的验证和授权功能;有关详细信息,请参见安全服务。
每个连接服务仅在由主机名(或 IP 地址)和端口号指定的特定端口上可用。 您可以明确地为服务指定静态端口号,也可以让代理的端口映射器动态指定端口号。端口映射器自身驻留在代理的主端口上,该端口通常位于标准端口号 7676 上。(如果需要,您可以通过代理配置属性 imq.portmapper.port,用其他端口号来覆盖标准端口号。) 默认情况下,每个连接服务在启动时都在端口映射器中注册自身。当客户端创建与代理的连接时,Message Queue 客户端运行时环境首先与端口映射器联系,为所需的连接服务请求端口号。
或者,也可以使用 imq.serviceName.protocolType. port 配置属性(其中 serviceName 和 protocolType 标识特定的连接服务, 如表 4–1 中所示)来覆盖端口映射器的设置,并明确地为连接服务指定一个静态端口号。(只有 jms、 ssljms、admin 和 ssladmin 连接服务可以通过这种方式进行配置;httpjms 和 httpsjms 服务使用不同的配置属性,如附录 C,HTTP/HTTPS 支持 中所述。)但是,静态端口通常仅在特殊情况下(例如要穿过防火墙建立连接)使用(请参见通过防火墙连接),建议不要在一般情况下使用静态端口。
如果有两个或更多的主机可用(例如,在一台计算机中安装了多个网卡),则可以使用代理属性来指定连接服务应该绑定到哪个主机。 imq.hostname 属性为所有连接服务指定一个默认主机;如果需要,以后可以使用 imq.serviceName. protocolType.hostname (对于 jms、 ssljms、admin 或 ssladmin 服务)或imq.portmapper.hostname(对于端口映射器自身)来覆盖此默认值。
如果同时收到多个端口映射器请求,则它们将存储在操作系统后备队列 (backlog) 中等待操作。 imq.portmapper.backlog 属性指定后备队列中的请求的最大数量。 如果超过此限制,随后的任何请求都将被拒绝,直到后备队列中的请求减少。
每个连接服务都是多线程的,因此可以支持多个连接。这些连接所需的线程由代理在每个服务的单独线程池中维护。当连接需要某些线程时,这些线程即添加到支持该连接的服务的线程池中。
您选择的线程模型指定了线程是专用于单个连接还是由多个连接共享:
在专用模型中,与代理的每个连接都需要两个线程:一个用于传入消息,另一个用于传出消息。这限制了可以支持的连接数,但却提高了性能。
在共享模型中,当发送或接收消息时,连接由共享线程处理。 由于每个连接都不需要专用线程,因此这种模型增加了可能的连接数,但却降低了性能,因为线程管理需要额外的开销。
代理的 imq.serviceName. threadpool_model 属性指定了为给定连接服务使用两个模型中的哪一个。此属性接受两个字符串值中的一个:dedicated 或 shared。如果未明确设置此属性,则默认情况下采用 dedicated。
还可以通过设置代理属性 imq.serviceName. min_threads 和 imq.serviceName. max_threads 来指定服务线程池中的最小线程数和最大线程数。 当可用线程数超过指定的最小阈值时, Message Queue 将在线程变为空闲状态时将其关闭,直到再次达到最小阈值,以此来节省内存资源。 如果负载较重,线程数可能会增加,直到达到线程池的最大数量;此后,新的连接将被拒绝,直到某个线程变得可用。
共享线程模型使用分配器线程为活动连接指定线程。 代理属性 imq.shared.connectionMonitor_limit 指定单个分配器线程可以监视的最大连接数。 此属性的值越小,为连接指定线程的速度越快。imq.ping.interval 属性指定代理定期测试 ("ping") 连接(以验证该连接是否仍然处于活动状态)的时间间隔(以秒为单位)。通过这种定期测试,可以尽早检测出连接故障,以免在尝试传输消息时失败。