ActiveMQ的设计
MQ消息服务产品功能(新版)
一.背景
消息中间件对目前大中型互联网来说是非常重要的,在业务数据流动中仅次于RPC服务调用,担负着越来越复杂的网站业务从主流程上解耦和减压的重要责任。
目前,MQ在走秀网中广泛用于如下生产系统:商品中心、促销中心、渠道中心、CMS、搜索引擎、秀团。不像Web2.0网站,这些网站对消息的可靠性要求不是很高,走秀网电商的特点,它是一个在线交易系统,对商品、价格、库存、促销相关信息的发送和中转,使得MQ作为消息中间件,对消息的可靠性要求非常高,因此新的版本MQ设计和使用MQ必须遵循可靠性优先的设计原则。
二.功能特色
新版的基于ActiveMq的异步消息服务系统有如下特点:
1) 高可靠 基于事务、消息持久化的消息发送和存储,以及提供本地消息存储提供更高的可靠性
2) 高性能 异步消息发送可到7000-10000条/秒
3) 动态线性扩展 增加服务器可动态横向扩容
4) 统一配置管理 通过spring相关配置文件,减少代码量
5 ) 简单易用 只需实现几个API接口 见本文第七部分-编程接口
6)管理和监控
Ø 线性扩展服务器,应对系统规模发展
Ø 提供故障处理模式,更快处理故障
Ø 数据监控界面,轻松知道性能瓶颈
Ø 服务器端验证队列属性,更少错误发生
二.设计思路
Ø 支持客户端存储,提高系统可靠性。发送端和接受端通过嵌入式数据库Berkeley DB提供本地存储。
Ø 实现连接池功能,提供消息数据源,简化应用使用和配置难度。
Ø 封装MQ接口,实现MQ系统对应用透明,以便支持多种MQ服务器,甚至实现不同服务器混合部署,目前已经实现对ActiveMQ 的支持。
Ø 支持客户端Cluster支持以便取代效率不高的MQ系统的负载均衡。
Ø 支持1 .. N,N .. 1,N .. N多种客户端对服务器的配置。
Ø 支持协议转换和消息过滤。
四. 总体架构
五.功能模块:
系统流程
功能层次
六.集群
更好的可靠性、可伸缩性和可扩展性。新的版本中实现动态扩容增加系统规模和容量。
1.单个集群
2.横向扩展
向集群中添加机器,横向扩展集群容量
七.编程接口
Connector
现有MQ系统以Queue为单位抽象,每个Queue都要配置serverAddress,userName,password,连接数量等信息,每个客户端都会配置连接池,配置复杂,连接重用效率低,加重服务器负载。本次设计借鉴数据库概念,为每组服务器配置一个数据源,每个Queue看成是数据源中的一个数据实体,类似于数据库中表的概念,这样应用只要两个信息:数据源和Queue就可以配置一个Sender或者Reciever,简化了开发人员对消息系统的理解,同时也因为和数据库配置类似,有利于降低学习曲线。
JmsSource接口说明:
说明:接口很简单,只要使用getConnection()方法,就可以得到一个连接,但是需要注意的是,使用连接后必须释放,否则会到致连接池耗尽。
Sender
JmsSender代表一个消息发送端,由一个JmsSource和一个queue唯一对应。接口说明如下:
接口说明:接口很简单,只需要调用send(obj)方法就可以发送消息到对应的队列中,对象必须实现Serializable接口。
Reciever
JmsReciever代表一个消息接受端,接受服务器push过来的消息,所以还需要实现一个JmsWorker接口,提供业务处理逻辑,义务功能。
接口说明:JmsReciever接口与JmsSender接口有所不同,因为接收端是被动的接受,所以必须明确调用start()方法,告诉服务器已经准备好了,可以接受消息,在特殊情况下也可以调用stop()暂停消息接受。另外,还需要提供一个JmsWorker对象作为JmsReciever处理消息的工具。
JmsWorker接口只要一个方法,processMessage(Serializable msg),应用需要在这个接口实现自己的义务规则来处理消息,如果处理成功返回True,否则为False。
Extension
扩展部分包括JmsFilter和JmsTransformer,分别处理消息过滤和消息协议转换。
接口说明: