开源消息中间件复杂并发连接控制的研究与实现
2016-02-07吕德奎崔艳军
◆吕德奎 崔艳军
(中国电子科技集团公司第二十八研究所 江苏 210007)
开源消息中间件复杂并发连接控制的研究与实现
◆吕德奎 崔艳军
(中国电子科技集团公司第二十八研究所 江苏 210007)
消息中间件(Message-Oriented Middleware)是解决异构分布式系统中通信与排队的中间件技术,ActiveMQ是一款基于Java语言的JMS规范的技术实现,是一款企业级常用的JMS产品。本文研究了当前ActiveMQ在涉及多厂家、跨平台应用时,由于客户端连接技术不统一、连接不规范、连接后不释放、数据格式发送不符合规范等因素,碰到的ActiveMQ服务中心因阻塞而宕掉的问题基础上,分析了当前几种常用解决手段;依据JMX底层规范与实现,设计并实现了一种基于JMX的客户端连接问题的解决方法与处理规范、提高ActiveMQ服务中心的运行稳定性。经过大量的实际应用,在数百家客户端并发连接时、消息量达5千/秒以下时能够保证ActiveMQ服务中心长期有效的运行,从而提高了企业应用的基础数据的连续性与稳定性。
ActiveMQ;消息总线;JMX;JMS;并发连接优化
0 引言
随着信息网络的迅速发展,越来越多的公司、单位、组织建立了各种应用系统和资源系统,这些系统对推动信息化的发展起了举足轻重的作用,然而这些系统可能是建立在不同的环境下,如何进行互操作和资源共享,成为了迫切需要解决的问题。
现有的应用系统中,不同应用之间通信存在以下问题:一是通信双方的环境如操作系统、协议等不同可能造成双方无法进行数据交换;二是服务器必须与客户端保持连接通信的状态,被动的等待远程客户端的通信请求,因此性能随着用户数目的增加而不断下降;三是存在因多用户、多数据库的连接,而导致系统死锁和崩溃的潜在可能;四是明确发送和接收双方调用的接口,一旦一方发生变化,必须在第一时间通知对方,否则会造成数据的丢失和通信的阻碍;五是程序更新维护难,一旦程序的变更,就需要对系统进行重大修改,增加了维护和管理难度。
为解决以上问题,引进了一个“中间层”,将系统的表示层、逻辑层和数据层分隔开来,成为独立的单元,这个“中间层”就是中间件。系统的开发者不需要将数据传输层和逻辑处理写入应用程序中,只需通过中间件提供的API,将应用程序与中间件、服务器有效快速的连接起来,实现资源的共享和互操作。
MOM(Message-Oriented Middleware(消息中间件)是解决异构分布式系统中通信和排队问题的中间件技术,ActiveMQ则是MOM的一个跨语言跨平台实现[7],是一款常用的企业级JMS实现产品,因其实时性高,数据指标接收速度快,取得了良好业绩。但是当涉及数百家单位、而且客户端连接技术不统一、连接不规范、连接后不释放、数据格式发送不符合规范等因素时,会导致中心ActiveMQ每隔一个月左右因阻塞而宕掉。
本文针对企业应用现象,在分析了消息队列中间件国内外应用现状的基础上,通过研究ActiveMQ的自身实现架构,主要以JMX(Java Management Extensions,Java管理扩展)为主,通过Java、ActiveMQ的内部设计机制,实现一种按照预先设计的规则库监控各连接客户端并对不规则连接进行优化处理方法,保证ActiveMQ中心能够长期稳定的运行,保障监控数据的顺利接收,提高了企业应用的数据连续性与稳定性。
1 不规则并发连接问题总计
ActiveMQ是基于Java JMS的分布式、跨平台的消息应用平台软件,其使用方法与数据库类似,需要先建立连接(Connection)与会话(Session),访问结束时需要显式关闭连接和连接会话,当客户端因为某种因素未执行关闭时将会导致ActiveMQ服务中心因最大连接数耗尽而导致服务宕掉,从而影响系统应用、导致企业数据的丢失等问题。
从上述分析可以了解,可以得出以下几点结论:
(1)ActiveMQ本身有连接数限制,据测试并发连接数达1500以上时,ActiveMQ将会出现存取消息数据效率快速下降、无法建立新的连接等问题。
(2)JVM有大小限制,据测试ActiveMQ最大JVM为1G左右。
(3)ActiveMQ 无法建立新连接,从而无法接收新的消息数据。
(4)ActiveMQ的连接不关闭,可能导致会话死锁。
(5)ActiveMQ死锁可能使消息数据无法消费,长期导致JVM溢出,甚至导致服务宕掉。
在上述结论基础上,研究企业应用现状,可能导致大量并发数问题产生的原因大致包括:
(1)客户端连接Connection使用完未关闭,下次使用建立新的连接Connection。
(2)客户端会话Session使用完未关闭,下次使用建立新的会话Session。
(3)客户端连接采用连接池技术(Pooled Connection)时,当应用厂家众多时如超过数百家,可能会导致连接资源耗尽。
(4)客户端发送未使用队列,导致JVM溢出,导致新的Connection无法建立等情况。
2 并发数优化设计与实现
本节从ActiveMQ大量并发连接数下由于客户端连接不合理带来的问题开始分析,比较了几种连接数问题处理方法,最终提取并设计一种基于JMX规则库的连接数优化方案。
2.1 几种优化方法的比较
(1)显式关闭连接和会话
显式关闭的应用场景为客户端能够显式关闭连接和会话,企业应用时尤其现代化信息系统建设涉及跨厂家、跨平台,需要大量的应用业务数据集成。各厂家接口开发人员技术素质参差不齐,多厂家接口开发时间不一,尤其是测试不到位时,将会经常导致连接溢出现象,从而需要厂商接口进行进一步的优化。
ActiveMQ连接溢出将会对数据集成方带来巨大应用压力,某一厂家接口问题可能会导致全体数据的丢失,从而影响信息系统的整体使用。
此种办法要求开发商严格按照标准技术进行开发,此方式对集成方来说属于被动式连接处理,实际情况因为种种因素可能短期内不会有改善。
(2)Server端连接关闭
客户端关闭方法是对技术的严格要求才能实现。Server端连接关闭由ActiveMQ服务应用厂商进行处理。Server端关闭的一般方法为,设计ActiveMQ 插件,利用ActiveMQ API提供的方法,获得客户端连接情况,并采取办法进行关闭。
利用服务端ActiveMQ API关闭连接Connection,在很大程度上能够解决连接未关闭的问题,而且此方法为主动式的关闭。
但是当连接出现死锁时,服务端ActiveMQ API可能会失效。
2.2 优化方法的设计与实现
从2.1节两种常用的解决情况分析来看,效果并不理想,甚至非常耗费联合调试精力。本节采用另一种Java底层机制设计并实现ActiveMQ连接数及JVM占有量的监控与管理方法。
JMX(jdk1.5默认不开启,jdk1.6默认开启)是一个为应用程序、设备、系统等植入管理功能的框架。JMX可以跨越一系列异构操作系统平台、系统体系结构和网络传输协议,灵活的开发无缝集成的系统、网络和服务管理应用。任何基于JVM运行的应用程序在一定条件下,不做任何代码编写,即可使用JMX对JVM相关参数及方法进行监控与管理,如:关闭线程、查看堆栈量、查看进程内部类数量等。
ActiveMQ很好的实现了JMX协议,可以通过底层协议对其进行监控与管理。
(1)设计
基于JMX的ActiveMQ连接数优化的设计,主要包括:连接客户端管理规则库、ActiveMQ监控参数、监控处理方案等设计。
图1 监控示意图
①连接客户端管理规则库
必须的定义:客户端连接源(IP)、每个连接源最大连接数、处理规则、连接对象最近一次执行时间、日志记录规则等内容。
客户端连接源用于确保连接ActiveMQ服务中心的连接对象处于授权状态,并且授权可建立的最大的连接数,如机器A最大可建立10个连接,机器B最大可建立5个连接。当机器连接超过规则库配置的最大连接数时,将会按照处理规则处理连接对象,如通过JMX技术手段,强制中断该机器的所有连接对象等。
②ActiveMQ监控参数
监控参数:当前连接数、当前队列堆积数、JVM内存信息。监控参数用于辅助查看当前ActiveMQ运行状态,当出现指标偏离正常现象时,可以为处理规则提供一定的处理参考依据。比如当前连接数超过ActiveMQ警戒值时,通知处理规则进行强制处理当前所有连接对象,如中断长时间未执行的连接对象。
③监控处理方案
处理规则库一次性初始化加载,对ActiveMQ以心跳时间片轮询方式定期监控其连接状态,当异常时,利用规则库进行处理。
(2)实现
根据规则配置库,当出现连接异常时,如超过机器授权最大连接数时或超过ActiveMQ警戒值时,对ActiveMQ并发连接进行规则处理,下面是获取连接数以及强制关闭连接客户端的伪代码。
①查询当前所有连接对象
②强制停止连接对象
3 结束语
ActiveMQ是Apache旗下一款JMS工具,支持.NET、C++、Java等多种访问方式,在企业级系统中大量应用,又因其实时性高,数据指标接收速度快,取得了良好业绩。但当涉及数百家单位、而且客户端连接不规范等因素时,会导致中心ActiveMQ服务阻塞而宕掉。本文通过以JMX的基础技术,利用规则管理库的思想,通过底层技术层面与业务规则相结合的手段,保障ActiveMQ中心在连接Connection问题下能够长期稳定的运行,保障监控数据的顺利接收。与此同时,本文的设计思路可为其他Java应用提供了一个良好的参考与借鉴。
另外,本文仅对并发连接数及相关的状态做了一定研究与实验,后续需要进一步对其他参数进行研究,争取实现ActiveMQ全方位管理,达到更好的应用效果。
[1]Sun Mierosystems.Java Message Service Specifi ca-tion. http://java.sun.com/Products/ims.
[2]Apache ActiveMQ.http://activemq.apache.org.
[3]邱云.基于JMS的信息发布平台的研究与实现[D].电子科技大学,2005.
[4]汪红兵,佘春东,范植华,李磊,徐帆江.基于JMS的数据推送系统的设计与实现[J].计算机应用,2005.
[5]彭珍,曾广周.基于JMS规范的群组通信中间件的研究[J].计算机工程与设计,2005.
[6]张帆.基于JMS的消息中间件的设计[D].武汉理工大学,2007.
[7]戴俊.基于ActiveMQ的异步消息总线的设计与实现[J].计算机系统应用,2010.
[8]李英芳.基于网络报税系统的消息队列中间件的研究与设计[D].西安电子科技大学,2006.