基于数据库的分布式消息中间件系统及其运行方法

文档序号:6505638阅读:604来源:国知局
基于数据库的分布式消息中间件系统及其运行方法
【专利摘要】本发明公开了一种基于数据库的分布式消息中间件系统及其运行方法。该分布式消息中间件系统包括消息采集组件、数据库、消息分发组件和消息交换组件,数据库中包括消息容器;消息采集组件用于接收来自消息生产者的消息并交给消息交换组件;消息分发组件用于接收来自消息消费者的消费请求并交给消息交换组件;消息交换组件用于将来自消息采集组件的消息存入消息容器,还用于根据消费请求从消息容器中读出消息并交给消息分发组件以供给消息消费者进行消费。本发明结合了数据库的可靠性、高可用性、事务性和易于运维以及消息队列服务的异步性和应用解耦性等优点,并且显著地提高了在面对高并发的业务场景时的运行性能。
【专利说明】基于数据库的分布式消息中间件系统及其运行方法
【技术领域】
[0001]本发明涉及一种分布式消息队列服务,尤其是涉及一种基于数据库的分布式消息中间件系统以及该分布式消息中间件系统的运行方法。
【背景技术】
[0002]关系型数据库是企业应用系统常用的数据存储方案,具有可靠性、可用性、事务、优化的资源竞争等特性,同时由于获得大量使用的缘故,企业通常都具有丰富的数据库运维经验,因而也易于运维和管理。但是关系型数据库在面对高并发、高吞吐量的业务时性能表现不佳。
[0003]消息队列服务是企业应用之间实现异步通信的常见方案,通常具有异步、高吞吐量、应用解耦等优点。为了支持消息的可靠递交,消息队列服务需要将消息进行持久化,但是由于关系型数据库的先天缺陷,在常用的消息队列服务系统中持久化方案一般都是自行开发的,很少利用现有的关系数据库,这大大提高了编程的复杂性,对消息系统的运维和监控也很不方便。而少量使用关系数据库实现持久化的方案,虽然在编程复杂度和后期运维上有便利性,但是在面对高并发的业务场景时会发生严重的性能问题。

【发明内容】

[0004]本发明要解决的技术问题是为了克服现有技术中在利用数据库实现消息的持久化时,在面对高并发的业务场景时会发生严重的性能问题的缺陷,提供一种基于数据库的分布式消息中间件系统以及该分布式消息中间件系统的运行方法,其结合了数据库的可靠性、高可用性、事务性和易于运维以及消息队列服务的异步性和应用解耦性等优点,并且显著地提高了在面对高并发的业务场景时的运行性能。
[0005]本发明是通过下述技术方案来解决上述技术问题:
[0006]一种基于数据库的分布式消息中间件系统,其特点在于,该分布式消息中间件系统包括消息采集组件、数据库、消息分发组件和消息交换组件,
[0007]数据库中包括消息容器,消息容器通过与数据库中存有消息的消息表对应而存储消息;
[0008]消息采集组件用于接收来自消息生产者的消息并交给消息交换组件;
[0009]消息分发组件用于接收来自消息消费者的消费请求并交给消息交换组件;
[0010]消息交换组件用于将来自消息采集组件的消息存入消息容器,还用于根据消费请求从消息容器中读出消息并交给消息分发组件以供给消息消费者进行消费。
[0011]在本发明中,消息交换组件与消息容器之间是相互绑定的,消息交换组件仅向绑定的消息容器中存入消息以及仅从绑定的消息容器中读出消息。
[0012]在消息采集过程中:消息生产者向消息采集组件发送消息,消息中包括有消息交换地址、消息主题以及消息内容等消息数据;消息采集组件根据接收到的消息交换地址选择消息交换组件,并将消息交给选定的消息交换组件进行处理;被选定的消息交换组件将消息存入消息容器,从而完成采集。
[0013]在消息分发过程中:消息消费者向消息分发组件发起消息消费请求,消费请求中包括有消费者标识、消息交换地址、消费的消息主题等信息;消息分发组件根据消息交换地址选择消息交换组件,并将消费请求交由选定的消息交换组件进行处理;被选定的消息交换组件从绑定的消息容器中取出符合条件的消息,并返回给消息消费者。
[0014]消息容器是对数据库的逻辑划分,其负责将消息数据持久化保存,以保证消息的可靠性。每个消息容器都与数据库中的一张存储有消息的物理数据表(即消息表)对应,因此也可以说,每个消息容器中均存储有其对应的那一张物理数据表中的所有消息。
[0015]本发明中的消息交换组件支持点对点(Queue)消息交换语义和发布/订阅(pub/sub )消息交换语义,此处与传统的消息组件内涵相同,故不做赘述。
[0016]较佳地,该分布式消息中间件系统还包括生产端消息代理和消费端消息代理,消息生产者通过生产端消息代理与消息采集组件通信,消息消费者通过消费端消息代理与消息分发组件通信。
[0017]消息代理主要提供应用集成所必须的数据的递送、收集、翻译、过滤、映射和路由等功能,其能够屏蔽不同的硬件平台、数据库、消息格式、通信协议之间的鸿沟与差异,提供应用到应用之间的高效、便捷的通信能力。
[0018]较佳地,消息交换组件的数量为一个或多个,每个消息交换组件与一个或多个数据库中的消息容器绑定,每个数据库中的消息容器的数量为一个或多个,消息采集组件和/或消息分发组件的数量为一个或多个。
[0019]同一个数据库中多个消息容器的分布能够分担不同消息交换地址上的压力,保证系统平稳运行;当数据库成为访问瓶颈时,多个数据库的分布能够分担系统压力,保证系统平稳运行。而每个消息交换组件则既可以与一个数据库中的一个或多个消息容器绑定,也可以与多个数据库中的消息容器(每个数据库中同样可以有一个或多个消息容器)绑定。
[0020]多个消息采集组件则实现了消息采集服务的水平扩展,在来自消息生产者的压力大时,便可以通过增加消息采集组件的数量来扩展消息采集的处理能力。类似地,多个消息分发组件则实现了消息分发服务的水平扩展,在消费请求量大时,便可以通过增加消息分发组件的数量来实现消息分发服务的负载均衡,从而提高系统的可用性。
[0021]较佳地,消息容器的数量为多个,每个消息容器均具有用于表征该消息容器中的消息的命中率的权重,消息交换组件用于根据权重选择存入消息的消息容器及读出消息的消息容器,以加快数据库处理速度以及平衡各个数据库之间的负载比率。
[0022]如果消息交换组件上交换的消息数量太多,为了提高消息吞吐率,同时也为了不给数据库带来太大压力,每个消息交换组件可以和多个消息容器绑定,并将该多个消息容器分布到多个数据库中,当需要存入消息时,消息交换组件会根据消息容器的权重选择一个消息容器并存入消息。
[0023]较佳地,消息采集组件用于接收来自消息生产者的消息并放入本地缓存队列,仅在本地缓存队列已满或定时器到期时才将本地缓存队列中的消息交给消息交换组件。
[0024]此处的定时器用于确定一定的时间间隔,本发明对该时间间隔的具体取值没有限制。在将消息存入消息容器时不是直接写入,而是采用上述异步方式实现,当定时器到期或者本地缓存队列已满时,才由专门的写入线程将消息存入消息容器,这样能够在保证消息吞吐率的同时,大大降低数据库的访问压力。
[0025]较佳地,消息交换组件从消息容器中读出批量消息并缓存于消息分发组件中以供给消息消费者进行消费。
[0026]较佳地,该分布式消息中间件系统还包括监控组件,监控组件用于:对每个消息容器中已交给消息分发组件的消息进行记录,在采用多个消息分发组件的情况下,这将能够防止同一消息被重复消费;和/或,对已交给消息分发组件的消息的存储位置以及所交至的消息分发组件进行记录,在采用多个消息分发组件的情况下,每个消息分发组件都在自己的批量范围内进行消费,便可以解决多个消息分发组件同时消费消息的问题;和/或,对已交给消息分发组件的批量消息中已被消费的消息进行记录,这便实现了对批量消息中当前被消费的消息的位置的标记,当消费超时或是程序崩溃之后,都会从当前这个标记的位置处开始消费,并且这个标记还可以用于重发消息,由此便提高了系统的可靠性。
[0027]本发明还提供了一种基于数据库的分布式消息中间件系统的运行方法,其特点在于,该分布式消息中间件系统包括消息采集组件、数据库、消息分发组件和消息交换组件,数据库中包括消息容器,消息容器通过与数据库中存有消息的消息表对应而存储消息;
[0028]该运行方法包括:
[0029]S1、消息采集组件接收来自消息生产者的消息并交给消息交换组件;
[0030]S2、消息交换组件将来自消息采集组件的消息存入消息容器;
[0031]S3、消息分发组件接收来自消息消费者的消费请求并交给消息交换组件;
[0032]S4、消息交换组件根据消费请求从消息容器中读出消息并交给消息分发组件以供给消息消费者进行消费。
[0033]较佳地,该分布式消息中间件系统还包括生产端消息代理和消费端消息代理,消息生产者通过生产端消息代理与消息采集组件通信,消息消费者通过消费端消息代理与消息分发组件通信。
[0034]较佳地,消息交换组件的数量为一个或多个,每个消息交换组件与一个或多个数据库中的消息容器绑定,每个数据库中的消息容器的数量为一个或多个,消息采集组件和/或消息分发组件的数量为一个或多个。
[0035]较佳地,消息容器的数量为多个,每个消息容器均具有用于表征该消息容器中的消息的命中率的权重,消息交换组件用于根据权重选择存入消息的消息容器及读出消息的消息容器。
[0036]较佳地,SI包括:
[0037]S11、消息采集组件接收来自消息生产者的消息并放入本地缓存队列;
[0038]S12、判断是否满足本地缓存队列已满或定时器到期,若是则进入S13,若否则再次执行S12 ;
[0039]S13、消息采集组件将本地缓存队列中的消息交给消息交换组件。
[0040]较佳地,消息交换组件从消息容器中读出批量消息并缓存于消息分发组件中以供给消息消费者进行消费。
[0041 ] 较佳地,该分布式消息中间件系统还包括监控组件,监控组件执行:对每个消息容器中已交给消息分发组件的消息进行记录;和/或,对已交给消息分发组件的消息的存储位置以及所交至的消息分发组件进行记录;和/或,对已交给消息分发组件的批量消息中已被消费的消息进行记录。
[0042]在符合本领域常识的基础上,上述各优选条件,可任意组合,即得本发明各较佳实例。
[0043]本发明的积极进步效果在于:本发明结合了数据库的可靠性、高可用性、事务性和易于运维以及消息队列服务的异步性和应用解耦性等优点,并且显著地提高了在面对高并发的业务场景时的运行性能。
【专利附图】

【附图说明】
[0044]图1为本发明的分布式消息中间件系统的结构框图。
[0045]图2为本发明中消息交换组件与消息容器之间一对一映射的示意图。
[0046]图3为本发明中消息交换组件与消息容器之间单库一对多映射的示意图。
[0047]图4为本发明中消息交换组件与消息容器之间多库一对多映射的示意图。
[0048]图5为本发明的消息采集过程的流程图。
[0049]图6为本发明的消息分发过程的流程图。
[0050]图7为本发明的应用实例I的示意图。
[0051]图8为本发明的应用实例2的示意图。
[0052]图9为本发明的应用实例3的示意图。
【具体实施方式】
[0053]下面通过实施例的方式进一步说明本发明,但并不因此将本发明限制在所述的实施例范围之中。
[0054]本实施例提供了一种基于数据库的分布式消息中间件系统,如图1所示,该分布式消息中间件系统包括消息采集组件1、数据库2、消息分发组件3和消息交换组件4。
[0055]数据库2中包括消息容器21,消息容器21通过与数据库中存有消息的消息表对应而存储消息;
[0056]消息采集组件I用于接收来自消息生产者的消息并交给消息交换组件4进行处理;
[0057]消息分发组件3用于接收来自消息消费者的消费请求并交给消息交换组件4进行处理;
[0058]消息交换组件4用于将来自消息采集组件I的消息存入消息容器21,还用于根据消费请求从消息容器21中读出消息并交给消息分发组件3以供给消息消费者进行消费。
[0059]在本实施例中,消息交换组件的数量可以为一个或多个,每个消息交换组件可以与一个或多个数据库中的消息容器绑定,每个数据库中的消息容器的数量可以为一个或多个。另外,消息采集组件和/或消息分发组件的数量也可以为一个或多个。
[0060]具体地,消息交换组件与数据库中的消息容器之间的映射关系可以有以下三种:
[0061](I)(单库或多库)一对一映射
[0062]本实施例中的单库或多库分别指的是单个数据库或是多个数据库。
[0063]如图2所示,每个消息交换组件与一个数据库中的一个消息容器绑定,即与该消息容器所对应的消息表绑定。这是适用场合最为广泛的映射关系,当系统压力较大时,可以采用多个数据库,通过数据库的分布从而由不同的数据库来分担系统压力。
[0064](2)单库一对多映射
[0065]每个消息交换组件与一个数据库中的多个消息容器(消息表)绑定,其中图3所示为一个消息交换组件与两个消息容器绑定的情况。这种映射关系尤其适用于系统的整体压力不太大,但是有部分消息交换地址上交换的消息过多的场合,此时多个消息容器便实现了消息容器的分布,从而由多个消息容器来均衡压力。
[0066](3)多库一对多映射
[0067]每个消息交换组件与多个数据库中的消息容器(消息表)绑定,其中每个数据库中可以有一个或多个消息容器,图4所示为一个消息交换组件与两个数据库中的单一消息容器绑定的情况。当系统整体压力较大时,这种映射关系由于不但从数据库的物理层面进行了分布,还进一步地从数据库内部的逻辑层面进行了分布(即消息容器的分布),因此能够通过多个数据库以及多个消息容器有效地分担系统压力,从而保证系统的平稳运行。
[0068]每个消息容器均具有用于表征该消息容器中的消息的命中率的权重,消息交换组件用于根据权重选择存入消息的消息容器及读出消息的消息容器,以加快数据库处理速度以及平衡各个数据库之间的负载比率。
[0069]消息交换组件和消息容器的映射关系如表1至表4所示:
[0070]表1
[0071]
【权利要求】
1.一种基于数据库的分布式消息中间件系统,其特征在于,该分布式消息中间件系统包括消息采集组件、数据库、消息分发组件和消息交换组件; 数据库中包括消息容器,消息容器通过与数据库中存有消息的消息表对应而存储消息; 消息采集组件用于接收来自消息生产者的消息并交给消息交换组件; 消息分发组件用于接收来自消息消费者的消费请求并交给消息交换组件; 消息交换组件用于将来自消息采集组件的消息存入消息容器,还用于根据消费请求从消息容器中读出消息并交给消息分发组件以供给消息消费者进行消费。
2.如权利要求1所述的分布式消息中间件系统,其特征在于,该分布式消息中间件系统还包括生产端消息代理和消费端消息代理,消息生产者通过生产端消息代理与消息采集组件通信,消息消费者通过消费端消息代理与消息分发组件通信。
3.如权利要求2所述的分布式消息中间件系统,其特征在于,消息交换组件的数量为一个或多个,每个消息交换组件与一个或多个数据库中的消息容器绑定,每个数据库中的消息容器的数量为一个或多个,消息采集组件和/或消息分发组件的数量为一个或多个。
4.如权利要求3所述的分布式消息中间件系统,其特征在于,消息容器的数量为多个,每个消息容器均具有用于表征该消息容器中的消息的命中率的权重,消息交换组件用于根据权重选择存入消息的消息容器及读出消息的消息容器。
5.如权利要求1-4中任意一项所述的分布式消息中间件系统,其特征在于,消息米集组件用于接收来自消息生产者的消息并放入本地缓存队列,仅在本地缓存队列已满或定时器到期时才将本地缓存队列中的消息交给消息交换组件。·
6.如权利要求1-4中任意一项所述的分布式消息中间件系统,其特征在于,消息交换组件从消息容器中读出批量消息并缓存于消息分发组件中以供给消息消费者进行消费。
7.如权利要求1-4中任意一项所述的分布式消息中间件系统,其特征在于,该分布式消息中间件系统还包括监控组件,监控组件用于:对每个消息容器中已交给消息分发组件的消息进行记录;和/或,对已交给消息分发组件的消息的存储位置以及所交至的消息分发组件进行记录;和/或,对已交给消息分发组件的批量消息中已被消费的消息进行记录。
8.一种基于数据库的分布式消息中间件系统的运行方法,其特征在于,该分布式消息中间件系统包括消息采集组件、数据库、消息分发组件和消息交换组件,数据库中包括消息容器,消息容器通过与数据库中存有消息的消息表对应而存储消息; 该运行方法包括: 51、消息采集组件接收来自消息生产者的消息并交给消息交换组件; 52、消息交换组件将来自消息采集组件的消息存入消息容器; 53、消息分发组件接收来自消息消费者的消费请求并交给消息交换组件; 54、消息交换组件根据消费请求从消息容器中读出消息并交给消息分发组件以供给消息消费者进行消费。
9.如权利要求8所述的运行方法,其特征在于,该分布式消息中间件系统还包括生产端消息代理和消费端消息代理,消息生产者通过生产端消息代理与消息采集组件通信,消息消费者通过消费端消息代理与消息分发组件通信。
10.如权利要求9所述的运行方法,其特征在于,消息交换组件的数量为一个或多个,每个消息交换组件与一个或多个数据库中的消息容器绑定,每个数据库中的消息容器的数量为一个或多个,消息采集组件和/或消息分发组件的数量为一个或多个。
11.如权利要求10所述的运行方法,其特征在于,消息容器的数量为多个,每个消息容器均具有用于表征该消息容器中的消息的命中率的权重,消息交换组件用于根据权重选择存入消息的消息容器及读出消息的消息容器。
12.如权利要求8-11中任意一项所述的运行方法,其特征在于,SI包括: 511、消息采集组件接收来自消息生产者的消息并放入本地缓存队列; 512、判断是否满足本地缓存队列已满或定时器到期,若是则进入S13,若否则再次执行S12 ; 513、消息采集组件将本地缓存队列中的消息交给消息交换组件。
13.如权利要求8-11中任意一项所述的运行方法,其特征在于,消息交换组件从消息容器中读出批量消息并缓存于消息分发组件中以供给消息消费者进行消费。
14.如权利要求8-11中任意一项所述的运行方法,其特征在于,该分布式消息中间件系统还包括监控组件,监控组件执行:对每个消息容器中已交给消息分发组件的消息进行记录;和/或,对已交给消息分发组件的消息的存储位置以及所交至的消息分发组件进行记录;和/或, 对已交给消息分发组件的批量消息中已被消费的消息进行记录。
【文档编号】G06F17/30GK103856393SQ201310287640
【公开日】2014年6月11日 申请日期:2013年7月9日 优先权日:2013年7月9日
【发明者】梁晓靖 申请人:携程计算机技术(上海)有限公司
网友询问留言 已有0条留言
  • 还没有人留言评论。精彩留言会获得点赞!
1