每个连接服务都是多线程的,因此可以支持多个连接。这些连接所需的线程由代理在每个服务的单独线程池中维护。当连接需要某些线程时,这些线程即添加到支持该连接的服务的线程池中。
您选择的线程模型指定了线程是专用于单个连接还是由多个连接共享:
在专用模型中,与代理的每个连接都需要两个线程:一个用于传入消息,另一个用于传出消息。这限制了可以支持的连接数,但却提高了性能。
在共享模型中,当发送或接收消息时,连接由共享线程处理。 由于每个连接都不需要专用线程,因此这种模型增加了可能的连接数,但却降低了性能,因为线程管理需要额外的开销。
代理的 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") 连接(以验证该连接是否仍然处于活动状态)的时间间隔(以秒为单位)。通过这种定期测试,可以尽早检测出连接故障,以免在尝试传输消息时失败。