专利名称:一种分布式消息处理系统及其中的设备和方法
技术领域:
本发明涉及消息处理领域,具体涉及一种分布式消息处理系统及其中的设备和方法。
背景技术:
目前用于消息(如日志)处理的消息系统有很多,比较流行的是分布式消息系统。 分布式消息系统的具体形式有很多,如Spread、Kafka等。
下面仅以常用的一种分布式消息系统Kafka为例进行说明。
Kafka是用于日志处理的分布式消息系统,主要针对日志数据容量大,但对可靠性要求不是很高的业务。这些系统中的日志数据主要包括用户行为,例如,登录、浏览、点击、 分享以及喜欢等,还包括系统运行日志,例如,CPU (Central Processing Unit,中央处理器)、内存、磁盘、网络、系统及进程等的运行状态。
图I为相关技术中Kafka系统架构示意图。该Kafka系统包括以下四个角色 Producer (消息产生者,简称PD) 11、Broker (简称BK) 12、Consumer (消息处理者,简称 CS) 13以及Zooke印er(管理者,简称ZK) 14,每个角色都可以是多个。Consumer 13在Kafka 系统中负责处理消息;Producer 11在Kafka系统中负责产生消息;Broker 12是Kafka系统中用来存放消息的地方,负责接收Producer 11发来的消息,当Consumer 13有请求时, 将这些消息返回给Consumerl3 ;ZooKeeper 14是一个开放源码的分布式应用程序协调服务,包含一个简单的原语集,是Hadoop和Hbase的重要组件,分布式应用可以使用它来实现诸如统一命名服务、配置管理、分布式锁服务、集群管理等功能。Producer 11发送消息到 Broker 12,消息持久化存储在Broker 12上,Consumer 13再从Broker 12取得消息进行处理。 Zookeeper 14 用来存储 Producer 11, Consumer 13,与 Brokerl2 的一些状态信息。
Kafka系统对消息的处理是采用pull (拉)的方式,每次由Consumer 13从Broker 12上获取要处理的消息。成功处理的消息的位置Offset由Consumerl3来保存。
在上述消息处理方式中,Consumer 13需要自己对成功处理的消息的位置Offset 进行管理、保存,Off set—般保存在Consumer 13所属的消息处理设备的内存或者本地磁盘上,当消息处理设备意外终止或者机器磁盘坏掉后,之前保存的Offset就丢失了。当重新启动消息处理设备后,将从最近一次保存的Offset、或者从头开始消费,Consumer 13无法紧接上次成功处理的消息的位置继续对消息进行处理。发明内容
鉴于上述问题,提出了本发明以便提供一种克服上述问题或者至少部分地解决上述问题的分布式消息处理系统及其中的设备和方法。
依据本发明的一个方面,提供了一种在分布式消息处理系统中的消息管理设备, 该分布式消息处理系统还包括一个或多个消息存储设备和一个或多个消息处理设备,其中每条消息具有相应的主题,消息存储设备为相应主题建立一个或者多个存储分区,并且根据消息的主题将消息存储在相应主题的存储分区之一中,消息管理设备包括消息分布状态存储器,被配置为至少存储每个消息存储设备中有关存储分区的信息、以及每个存储分区中有关消息处理设备当前要处理的消息的位置信息;传输接口,被配置为接收消息处理设备发送的消息处理请求,消息处理请求至少包括所请求处理消息的主题;分区状态查询器,被配置为在消息分布状态存储器中查询与消息处理请求中的主题相对应的存储分区信息,并经由传输接口将所查询到的存储分区信息发送给相应消息处理设备;以及消息位置管理器,被配置为处理通过传输接口接收的、来自消息处理设备的消息位置查询请求,从消息分布状态存储器中获取与该消息位置查询请求中的存储分区相对应的存储分区的当前要处理消息的位置信息、并经由传输接口发送给相应消息处理设备;以及被配置为处理通过传输接口接收的、来自消息处理设备的消息位置更新请求,基于消息位置更新请求中的消息大小,更新消息分布状态存储器中、与消息位置更新请求中的存储分区相对应的存储分区的当前要处理消息的位置信息。
可选的,消息分布状态存储器中还存储有消息处理设备每次所要处理的消息的大小;分区状态查询器还被配置为在消息分布状态存储器中查询相应消息处理设备所要处理的消息的大小,并通过传输接口发送给相应消息处理设备。
根据本发明的另一个方面,还提供了一种在分布式消息处理系统中的消息处理设备,该分布式消息处理系统还包括一个或多个消息存储设备和消息管理设备,其中每条消息具有相应的主题,消息存储设备为相应主题建立一个或者多个存储分区,并且根据消息的主题将消息存储在相应主题的存储分区之一中,消息管理设备中存储有每个消息存储设备中有关存储分区的信息以及每个存储分区中当前要处理的消息的位置信息,该消息处理设备包括存储信息获取器,被配置为生成消息处理请求,消息处理请求至少包括所请求处理消息的主题;传输接口,被配置为将消息处理请求发送给消息管理设备,并接收消息管理设备发送的与消息处理请求中的主题相对应的一个或者多个存储分区信息;消息位置管理器,被配置为选择存储分区信息之一,从消息管理设备中获取所选择的存储分区的当前要处理消息的位置信息;以及消息获取器,被配置为生成消息获取请求,消息获取请求包括所请求处理消息的主题、所选择的存储分区、该存储分区的当前要处理消息的位置信息和所要处理的消息大小;传输接口还被配置为将消息获取器生成的消息获取请求发送给该存储分区所在的消息存储设备,以及接收该存储分区所在的消息存储设备发送的对应于消息获取请求的消息。
根据本发明的又一个方面,还提供了一种分布式消息处理系统,包括如上的消息管理设备;一个或者多个如上的消息处理设备;以及一个或多个消息存储设备。
根据本发明的再一个方面,还提供了一种消息管理方法,该方法适于在分布式消息处理系统中的消息管理设备上执行,该分布式消息处理系统还包括一个或多个消息存储设备和一个或多个消息处理设备,其中每条消息具有相应的主题,消息存储设备为相应主题建立一个或者多个存储分区,并且根据消息的主题将消息存储在相应主题的存储分区之一中,消息管理方法包括接收消息处理设备发送的消息处理请求,消息处理请求至少包括所请求处理消息的主题;查询与消息处理请求中的主题相对应的存储分区信息,并将所查询到的存储分区信息发送给相应消息处理设备,其中,消息管理设备中至少存储每个消息存储设备中有关存储分区的信息、以及每个存储分区中有关消息处理设备当前要处理的消息的位置信息;以及处理来自消息处理设备的消息位置查询请求,查询与该消息位置查询请求中的存储分区相对应的存储分区的当前要处理消息的位置信息、并发送给相应消息处理设备;以及处理来自消息处理设备的消息位置更新请求,基于消息位置更新请求中的消息大小,更新与消息位置更新请求中的存储分区相对应的存储分区的当前要处理消息的位置信息。
可选的,上述消息管理方法还包括查询相应消息处理设备所要处理的消息的大小、并发送给相应消息处理设备,其中消息管理设备中还存储有消息处理设备每次所要处理的消息的大小。
根据本发明的又一个方面,还提供了一种消息处理方法,该方法适于在分布式消息处理系统中的一个或者多个消息处理设备上执行,该分布式消息处理系统还包括一个或多个消息存储设备和消息管理设备,其中每条消息具有相应的主题,消息存储设备为相应主题建立一个或者多个存储分区,并且根据消息的主题将消息存储在相应主题的存储分区之一中,消息管理设备中存储有每个消息存储设备中有关存储分区的信息以及每个存储分区中当前要处理的消息的位置信息,该消息处理方法包括生成消息处理请求,消息处理请求至少包括所请求处理消息的主题;将消息处理请求发送给消息管理设备,并接收消息管理设备发送的与消息处理请求中的主题相对应的一个或者多个存储分区信息;选择一个或者多个存储分区信息之一,从消息管理设备中获取所选择的存储分区对应的当前要处理消息的位置信息;生成消息获取请求,消息获取请求包括所请求处理消息的主题、所选择的存储分区、该存储分区的当前要处理消息的位置信息和所要处理的消息大小;以及将消息获取请求发送给该存储分区所在的消息存储设备,以及接收该存储分区所在的消息存储设备发送的对应于消息获取请求的消息。
本发明的技术方案在消息管理设备上存储有每个消息存储设备中有关存储分区的信息、以及每个存储分区中有关消息处理设备当前要处理的消息的位置信息,当消息处理设备获取要处理的消息时,只需从消息管理设备查询消息处理设备处理的主题下的消息在消息存储设备上的存储分区信息,以及消息处理设备在相应的存储分区的当前要处理的消息的位置信息,即可发送请求消息从消息存储设备获取消息进行处理,这样,即使消息处理设备发生故障,在消息处理设备恢复正常后,仍然可以紧接上次成功处理消息的位置获取消息进行处理,避免了消息的重复处理或遗漏。
上述说明仅是本发明技术方案的概述,为了能够更清楚了解本发明的技术手段, 而可依照说明书的内容予以实施,并且为了让本发明的上述和其它目的、特征和优点能够更明显易懂,以下特举本发明的具体实施方式
。
通过阅读下文优选实施方式的详细描述,各种其他的优点和益处对于本领域普通技术人员将变得清楚明了。附图仅用于示出优选实施方式的目的,而并不认为是对本发明的限制。而且在整个附图中,用相同的参考符号表示相同的部件。在附图中
图I示出了一种Kafka系统架构示意图2示出了根据本发明一个实施例的分布式消息处理系统的示意图3示出了根据本发明一个实施例的消息存储设备内部存储结构的示意图;7
图4示出了根据本发明一个实施例的消息管理方法的流程图;以及
图5示出了根据本发明一个实施例的消息处理方法的流程图。
具体实施方式
下面将参照附图更详细地描述本公开的示例性实施例。虽然附图中显示了本公开的示例性实施例,然而应当理解,可以以各种形式实现本公开而不应被这里阐述的实施例所限制。相反,提供这些实施例是为了能够更透彻地理解本公开,并且能够将本公开的范围完整的传达给本领域的技术人员。
图2示出了根据本发明一个实施例的分布式消息处理系统的示意图。如图所示, 该分布式消息处理系统包括消息产生设备100、消息存储设备200、消息处理设备300和消息管理设备400。消息产生设备100、消息存储设备200和消息处理设备300分别可以为一个或多个,图2中仅示例性给出了两个消息产生设备100、两个消息存储设备200,以及一个消息处理设备300和一个消息管理设备400,本领域技术人员可以理解,本发明实施例对消息产生设备100、消息存储设备200、消息处理设备300和消息管理设备400的数目并没有限制。
消息产生设备100可以是网络设备、服务器、计算机或其它可以产生消息的任何设备,这里的消息可以是任何种类信息的数据,如日志数据。每条消息具有相应的主题,如该主题可以是某种具体的用户行为,如登录行为、浏览行为、点击行为、分享行为或者喜欢行为等,又如该主题可以是某种具体的系统运行日志,如CPU、内存、磁盘、网络、系统及进程的运行状态等。例如,在一个实施例中,消息产生设备100为网络服务器,在用户浏览该网络服务器的某网络页面时,该网络服务器随之产生一条主题为浏览该网络页面的消息。
在消息产生设备100产生消息后,将产生的消息发送给消息存储设备200。消息产生设备100向消息存储设备200发送消息时,可以随机发送,也可以根据用户指定的回调函数进行发送。消息产生设备100将产生的消息发送给消息存储设备200的一个示例代码如下$zkCluster =! IocalhostJlSl';
$msg = array(' message content');
$topic =! test';
$Producer = new Kafka—Producer ($zkCluster);
$Producer- > send (array ($msg),Stopicr );
本领域技术人员可以理解,以上传递消息的代码仅仅是一个示例,任何可以实现将消息产生设备100产生的消息发送到消息存储设备200的代码实现都在本发明的保护范围内。
消息存储设备200接收到消息产生设备100发送的消息后,将接收到的消息进行存储。消息存储设备200有多种具体的存储方式,例如,消息存储设备200按照消息的主题进行存储。具体而言,可以为每个消息主题建立一个或多个存储分区,将接收到的每条消息存储在相应主题的存储分区之一中。
为了更好的介绍消息存储设备200的内部存储结构,请同时参看图3,其为根据本发明一个实施例的消息存储设备200内部存储结构的示意图。在图3中,示出了第一消息存储设备2001、第二消息存储设备2002和第三消息存储设备2003,以及每个消息存储设备内部的消息存储路径。此外,还示出了与这些消息存储设备进行信息交互的第一消息产生设备1001和第二消息产生设备1002,以及第一消息处理设备3001和第二消息处理设备 3002。
第一消息产生设备1001和第二消息产生设备1002产生的主题为Topicl以及 Topic2的消息,会被发送到可以用来存储Topicl的消息和Topic2的消息的第一消息存储设备2001、第二消息存储设备2002和第三消息存储设备2003。
因为分布式消息处理系统基于消息的主题(Topic)来进行消息管理,所以相应的,在消息存储设备中也是基于Topic来进行存储的。每个Topic的消息可以存储在一个或多个存储分区(Partition)中,当存储在多个存储分区时,这些多个存储分区可以位于一个消息存储设备上,也可以位于多个消息存储设备上。在图3中,主题为Topicl的消息存储在第一消息存储设备2001中Topicl下的存储分区parti和存储分区part2、第二消息存储设备2002中Topicl下的存储分区parti和存储分区part2,以及第三消息存储设备 2003中Topicl下的存储分区parti。主题为Topic2的消息存储在第一消息存储设备2001 中Topic2下的存储分区parti、第二消息存储设备2002中Topic2下的存储分区parti,以及第三消息存储设备2003中Topic2下的存储分区parti。其中每个存储分区具有多条消息,每条消息相对于存储分区头部具有不同的位置。例如,根据本发明的一个实施例,每条消息都具有消息id,消息id由其逻辑位置决定,即从消息id可直接定位到消息的存储位置,避免id到存储位置的额外映射。
上面通过图3详细介绍了图2中消息存储设备200的一种内部存储结构,下面再回到图2所示的实施例。消息存储设备200在存储其接收的消息后,可以将每次有关存储分区更新的信息发送给消息管理设备400,由消息管理设备400保存。
以上介绍了一个实施例中的消息产生设备100和消息存储设备200,下面结合对某个主题下的消息的具体处理过程,继续介绍消息处理设备300和消息管理设备400。由于消息处理设备300中的各部件和消息管理设备400中的各部件信息交互较多,因此下面先概括介绍消息处理设备300中所包括的各部件,以及消息管理设备400包括的各部件,然后在具体信息交互过程中对涉及到的各部件再进行更详细的介绍。
消息处理设备300包括传输接口 304、存储信息获取器302、消息位置管理器306 和消息获取器308,消息管理设备400包括传输接口 404、消息分布状态存储器402、分区状态查询器406和消息位置管理器408。
当消息处理设备300需要处理某个Topic的消息时,首先通过消息处理设备300 的存储信息获取器302生成消息处理请求,该消息处理请求至少包括消息处理设备300所请求处理消息的主题,然后通过消息处理设备300的传输接口 304将消息处理请求传送给消息管理设备400的传输接口 404。
消息管理设备400的传输接口 404接收到来自消息处理设备300的消息处理请求后,将该消息处理请求发送给分区状态查询器406,然后分区状态查询器406在消息分布状态存储器402中查询与该消息处理请求中的主题相对应的一个或多个存储分区信息。
具体而言,由于消息分布状态存储器402中存储有消息管理设备400接收的、来自每个消息存储设备200的有关存储分区的信息,因此分布状态查询器406可以根据消息处理请求中指定的消息的主题,从消息分布状态存储器402中查询该主题下的消息存储在哪些或哪个消息存储设备200的哪些或哪个存储分区上。例如,假定分布状态查询器406查询到共有5个存储分区存储消息处理请求中指定主题下的消息,每个存储分区用bix)ker_ id-partition_id 标识,分别是bl_pl, bl_p2, b2_pl, b2_p2, b3_pl,则将查询到的包含该 5 个存储分区标识的存储分区信息,通过传输接口 404发送给相应的消息处理设备300的传输接口 304。
消息处理设备300的传输接口 304接收到来自消息管理设备400、与消息处理请求中的主题相对应的一个或多个存储分区信息后,转发给消息位置管理器306进行处理。
具体而言,消息位置管理器306从一个或多个存储分区信息中依次选择一个存储分区信息,然后从消息管理设备400中获取所选择的存储分区信息对应的当前要处理消息的位置信息。例如,消息位置管理器306包括选择模块和消息位置查询模块,首先选择模块从一个或多个存储分区信息中依次选择一个存储分区信息,在选择存储分区信息时,可以是从一个或多个存储分区信息中依次随机选择一个存储分区信息,也可以是按照消息存储设备200的编号及在相应的消息存储设备200上的存储分区的编号依次选择一个存储分区信息。然后消息位置查询模块根据选择模块选择的存储分区信息生成相应的消息位置查询请求,消息位置查询请求中包括选择模块所选择的存储分区信息,进而通过传输接口 304将消息位置查询模块所生成的消息位置查询请求发送给消息管理设备400的传输接口 404,以便从消息管理设备400中获取该存储分区信息对应的当前要处理的消息的位置信肩、O
消息管理设备400的传输接口 404接收到来自消息处理设备300的消息位置查询请求后,将该消息位置查询请求转发给消息位置管理器408。因为在消息分布状态存储器 402中还存储有每个存储分区中有关消息处理设备当前要处理的消息的位置信息,所以消息位置管理器408接收到消息位置查询请求后,从消息分布状态存储器402中查询与该消息位置查询请求中的存储分区相对应的存储分区的当前要处理的消息的位置信息,查询完毕后将查询结果通过传输接口 404发送给相应消息处理设备300的传输接口 304。如果消息分布状态存储器402中不存与该消息位置查询请求中的存储分区相对应的存储分区的当前要处理的消息的位置信息,可以由消息位置管理器408将相应存储分区当前要处理的消息的位置信息的初始值设为0,并发送给相应的消息处理设备300。另外,也可以由消息位置管理器408将不存在相应存储分区当前要处理的消息的位置信息直接发送给消息处理设备300,由消息处理设备300将相应存储分区当前要处理的消息的位置信息的初始值设为O。
应当注意的是,在上一个实施例中,消息处理设备300的存储信息获取器302先向消息管理设备400发送消息处理请求,获得消息管理设备400返回的结果后,消息位置管理器306再向消息管理设备400发送消息位置查询请求。在又一个实施例中,消息处理设备 300的存储信息获取器302和消息位置管理器306也可以将消息处理请求和消息位置查询请求同时发送给消息管理设备400。例如,假定消息管理设备400同时接收到来自消息处理设备300的消息处理请求和消息位置查询请求,进而分布状态查询器406根据消息处理请求查询到共有5个存储分区存储消息处理请求中指定主题下的消息,然后消息位置管理器408根据分布状态查询器406的查询结果以及消息位置查询请求,进一步查询这5个存储分区当前分别要处理的消息的位置信息,最后将这5个存储分区当前分别要处理的消息的位置信息一并发送给相应的消息处理设备300。
消息处理设备300的传输接口 304在接收到消息管理设备400返回的、与消息位置查询请求中的存储分区相对应的存储分区的当前要处理的消息的位置信息后,将该位置信息经消息位置管理器306转发给消息获取器308 ;或者也可由传输接口 304将接收到的位置信息直接发送给消息获取器308。
消息处理设备300在从消息管理设备400查询到所处理主题的消息的存储分区信息及在相应存储分区的当前要处理的消息位置信息后,消息获取器308即可生成消息获取请求,并通过传输接口 304将该消息获取请求发送给消息管理器306所选择的存储分区所在的消息存储设备200。消息获取请求中需要指明Topic, Partition, Offset, Fetchsize 四个参数,Topic是指要处理什么主题的消息,Partition是指要处理该Topic下哪个存储分区的消息,Offset是指从该存储分区的哪个位置开始取消息,Fetchsize是指从该存储分区的Offset处取多少长度的消息。在这四个参数中,Topic, Partition和Offset参数已经在上面和消息管理设备400的交互过程中获得,Fetchsize参数可以由消息获取器308 根据消息处理设备300本身的状况来决定。
消息处理设备300的消息获取器308将生成的消息获取请求发送给相应的消息存储设备200的一个示例代码如下
$zkCluster = ' Iocalhost:2181;;
$topic = ' test';
$Consumer = new Kafka_Consumer ($zkCluster, $topic);
$msg = $ Consumer- > fetchMsg ();
本领域技术人员可以理解,以上传递消息获取请求的代码仅仅是一个示例,任何可以实现将消息处理设备300产生的消息获取请求发送到消息存储设备200的代码实现都在本发明的保护范围内。
需要说明的是,消息处理设备300所要处理的消息大小Fetchsize —般是一个固定值,如IM(兆)。Fetchsize可以保存在消息处理设备300本地,在这种情况下,消息获取器308在生成消息获取请求时,只需在消息处理设备300的本地磁盘中查询Fetchsize即可。本领域技术人员可以理解,Fetchsize也可保存在消息管理设备400的消息分布状态存储器402中,这种情况下,可以在分区状态查询器403从分布状态存储器402查询信息来处理消息获取请求时,将Fetchsize与有关存储分区的信息一起获取并发送给消息处理设备 300的消息位置管理器306。当然,也可由消息处理设备300的存储信息获取器302或消息位置管理器306生成Fetchsize获取请求,再将Fetchsize获取请求发生到消息管理设备 400,进而从消息管理设备400中的消息分布状态存储器402查询获取所要处理的消息大小 Fetchsize0
消息存储设备200在接收到消息处理设备300的消息获取器308生成的消息获取请求后,查询与该消息获取请求中的Topic和Partition对应的存储分区,并从该存储分区从Offset指定的位置开始截取长度为Fetchsize的消息,然后将查询的消息返回给消息处理设备300。在又一个实施例中,消息处理设备300还包括消息处理器,消息处理器对消息存储设备200返回的消息按消息格式进行解析,假如解析得到三条消息及其长度分别是msgl, Ienl ;msg2, len2 ;msg3, len3,那么消息处理器依次处理这三条消息。
在又一个实施例中,消息处理设备300还包括消息位置更新器。在消息处理器成功处理消息后,消息位置更新器生成消息位置更新请求,并经由传输接口 304将所生成的消息位置更新请求发送给消息管理设备400,消息位置更新请求包括消息处理器最近一次或多次成功处理的消息大小及该消息所在的存储分区信息。
消息管理设备400的传输接口 404在接收到来自消息处理设备300的消息位置更新请求后,转发给消息位置管理器408。消息位置管理器408基于消息位置更新请求中的消息大小,更新消息分布状态存储器402中、与消息位置更新请求中的存储分区相对应的存储分区的当前要处理消息的位置信息。在具体实现当前要处理的消息的位置信息offset 的更新时,可以有多种方式。例如,消息位置更新器可以在消息处理器每成功处理完一条消息,就生成包含所处理消息大小的消息位置更新请求,如当消息处理器成功处理完消息 msgl时,消息位置更新器生成包含msgl的大小Ienl的消息位置更新请求,消息管理设备 400的消息位置管理器408将新的位置信息offset+lenl存入到消息分布状态存储器402 中的节点/consumer/offset/bl-pl中。当消息处理器成功处理完第二条消息msg2时,消息位置更新器生成包含msg2的大小len2的消息位置更新请求,消息管理设备400的消息位置管理器408再在新的offset上再加上len2,并更新消息分布状态存储器402中的节点 /consumer/offset/bl-pl 的内容。
如果对于对安全性要求不高的主题,可以在消息处理器成功处理完多条消息后, 再由消息位置更新器生成消息位置更新请求更新消息管理设备400的消息分布状态存储器402中相应存储分区的offset。例如,在上面的例子中,也可在消息处理器成功处理完三条消息msgl、msg2、msg3后,消息位置更新器再生成包含三条消息大小Ienl+len2+len3的消息位置更新请求并发送给消息管理设备400,消息管理设备400的消息位置管理器408将新的位置信息offset+lenl+len2+len3存入到消息分布状态存储器402中节点/consumer/ offset/bl-pl中,对offset进行更新,这样可以增加一些效率。
通过以上本发明的多个实施例可以看出,本发明实施例通过将每个存储分区中有关消息处理设备当前要处理的消息的位置信息offset保存在消息管理设备中,避免了消息处理设备每次处理消息时需要在本地来计算offset,可以降低消息处理设备的使用成本,提高其资源的利用效率。
进一步,因为在消息管理设备400上存储有每个消息存储设备200中有关存储分区的信息、以及每个存储分区中有关消息处理设备300当前要处理的消息的位置信息,因此当消息处理设备300获取要处理的消息时,只需从消息管理设备400查询消息处理设备 300处理的主题下的消息在消息存储设备200上的存储分区信息,以及消息处理设备300 在相应的存储分区的当前要处理的消息的位置信息,即可发送消息获取请求从消息存储设备200获取相应的消息进行处理,这样,即使消息处理设备300发生故障,在消息处理设备 300恢复正常后,仍然可以紧接上次成功处理消息的位置获取消息进行处理,避免了消息的重复处理或遗漏。
与前述本发明一个实施例分布式消息处理系统相对应,图4示出了根据本发明一个实施例的适于在分布式消息处理系统中的消息管理设备上执行的消息管理方法的流程图。该分布式消息处理系统包括一个或多个如图2实施例所描述的消息产生设备100、一个或多个如图2实施例所描述的消息存储设备200、一个或多个如图2实施例所描述的消息处理设备300以及如图2实施例所描述的消息管理设备400。该消息管理方法适于在图2实施例所描述的消息管理设备400上执行。
该消息管理方法始于步骤S410,在步骤S410中,接收消息处理设备发送的消息处理请求,该消息处理请求至少包括所请求处理消息的主题。本步骤可以通过前述消息管理设备400中的传输接口 404来执行,相关的技术实现可以参考前述消息管理设备400中的传输接口 404在各实施例中的相关描述,此处不再赘述。
在步骤S410接收到消息处理请求后,步骤S420在消息管理设备中查询与消息处理请求中的主题相对应的存储分区信息,并将所查询到的存储分区信息发送给相应的消息处理设备。具体而言,由于消息管理设备中通常存储有每个消息存储设备中有关存储分区的信息、以及每个存储分区中有关消息处理设备当前要处理的消息的位置信息,因此,在本步骤中,可以根据消息处理请求中指定的消息的主题,从消息管理设备中查询该主题下的消息存储在哪个或哪些消息存储设备的哪个或些存储分区上。例如,假定查询到共有5 个存储分区存储该主题的消息,每个存储分区用broker_id-pa;rtition_id标识,分别是: bl-pl,bl-p2,b2-pl,b2-p2,b3_pl,则将查询到的包含这5个存储分区标识的存储分区信息发送给相应的消息处理设备。当消息管理设备中还存储有消息处理设备所要处理的消息的大小时,还可在查询有关存储分区信息的同时,查询相应消息处理设备所要处理的消息的大小,一并发送给相应的消息处理设备。本步骤可以通过前述消息管理设备400中的分区状态查询器406来执行,相关的技术实现可以参考前述分区状态查询器406在各实施例中的相关描述,此处不再赘述。
通过步骤S420,消息处理设备已经获得了其要处理的主题下的消息的存储分区信息,因此后续消息处理设备就会根据选择的存储分区信息生成消息位置查询请求,并发送给消息管理设备。于是,在步骤S430中处理来自消息处理设备的消息位置查询请求。例如,在消息管理设备中查询与该消息位置查询请求中的存储分区相对应的存储分区的当前要处理消息的位置信息,然后将查询到的位置信息发送给相应消息处理设备。
在具体实现本步骤时可以有多种方式,例如,假定消息处理设备获取的存储分区共有5个,分别是bl-pl,bl-p2,b2-pl,b2-p2,b3-pl,依次轮流从这5个存储分区中选择一个存储分区生成消息位置查询请求,如果当前要查询bl-pl存储分区当前要处理的消息的位置信息,则生成包含bl-pl存储分区的消息位置查询请求给消息管理设备,在步骤S430 中从消息管理设备中相应的节点/consumer/offset/bl-pl查询到bl-pl存储分区当前要处理的消息的位置信息Offset,并发送给相应的消息处理设备。如果消息管理设备中不存在该节点,则将bl-pl存储分区当前要处理的消息的位置信息的初始值设为0,并发送给相应的消息处理设备。另外,也可以将不存在该节点的信息直接发送给消息处理设备,由消息处理设备将bl-pl存储分区当前要处理的消息位置信息的初始值设为O。本步骤可以通过前述消息管理设备400中的消息位置管理器408来执行,相关的技术实现可以参考前述消息位置管理器408在各实施例中的相关描述,此处不再赘述。
通过步骤S430,消息处理设备已经获得了所选择的存储分区的当前要处理的消息的位置信息,因此可以据此从消息存储设备的相应存储分区获取相应的消息,并对消息进行处理。由于消息处理设备对消息的处理会导致后续处理消息的位置信息的变化,因此消息处理设备会向消息管理设备发送消息位置更新请求。具体而言,在步骤S440中,处理来自消息处理设备的消息位置更新请求,基于消息位置更新请求中的消息大小,更新消息管理设备中、与消息位置更新请求中的存储分区相对应的存储分区的当前要处理消息的位置信息。在更新消息管理设备中相应存储分区的当前要处理的消息位置信息offset时,消息处理设备可以在每成功处理完一条消息,就发送消息位置更新请求更新消息管理设备中相应存储分区的offset。例如当消息处理设备成功处理完消息msgl时,消息管理设备根据消息处理设备发送的包含Ienl的消息位置更新请求,将新的位置信息offset+lenl存入到消息管理设备的相应节点/consumer/offset/bl-pl中;当消息处理设备成功处理完第二条消息msg2时,消息管理设备根据消息处理设备发送的包含len2的消息位置更新请求,在新的offset上再加上len2,并更新相应消息管理设备中的内容。
如果对于对安全性要求不高的主题,可以在消息处理设备成功处理完多条消息后再更新相应消息管理设备中的offset,例如,在上面的例子中,也可以在消息处理设备成功处理完三条消息后,消息管理设备根据消息处理设备发送的包含Ienl+len2+len3的消息位置更新请求,将新的位置信息offset+lenl+len2+len3存入到消息管理设备的相应节点 /consumer/offset/bl-pl中,这样可以增加一些效率。
步骤S430可以通过前述消息管理设备400中的消息位置管理器408来执行,相关的技术实现可以参考前述消息位置管理器408在各实施例中的相关描述,此处不再赘述。
上述实施例中,由于在消息管理设备上存储有每个消息存储设备中有关存储分区的信息、以及每个存储分区中有关消息处理设备当前要处理的消息的位置信息,当消息处理设备获取要处理的消息时,只需从消息管理设备查询消息处理设备处理的主题下的消息在消息存储设备上的存储分区信息,以及消息处理设备在相应的存储分区的当前要处理的消息的位置信息,即可发送消息获取请求从消息存储设备获取相应的消息进行处理,这样, 即使消息处理设备发生故障,在消息处理设备恢复正常后,仍然可以紧接上次成功处理消息的位置获取消息进行处理,避免了消息的重复处理或遗漏。
与前述本发明一个实施例分布式消息处理系统相对应,图5示出了根据本发明一个实施例的适于在分布式消息处理系统中的消息处理设备上执行的消息处理方法的流程图。该分布式消息处理系统包括一个或多个如图2实施例所描述的消息产生设备100、一个或多个如图2实施例所描述的消息存储设备200、一个或多个如图2实施例所描述的消息处理设备300以及如图2实施例所描述的消息管理设备400。该消息处理方法适于在图2实施例所描述的消息处理设备300上执行。
该消息处理方法始于步骤S510,在步骤S510中,生成消息处理请求,消息处理请求至少包括所请求处理消息的主题。具体而言,消息处理设备根据要处理的消息主题生成消息处理请求。本步骤可以通过前述消息处理设备300中的存储信息获取器302来执行, 相关的技术实现可以参考前述存储信息获取器202在各实施例中的相关描述,此处不再赘述。
进而,在步骤S520中,将步骤S510中生成的消息处理请求发送给消息管理设备, 并接收消息管理设备发送的与消息处理请求中的主题相对应的一个或者多个存储分区信息。在将消息处理请求发送给消息管理设备后,消息管理设备根据消息处理请求中指定的主题,查询出与该主题相对应的一个或者多个存储分区信息,并发送给相应的消息处理设备。本步骤可以通过前述消息处理设备300中的传输接口 304来执行,相关的技术实现可以参考前述消息处理设备300中的传输接口 304在各实施例中的相关描述,此处不再赘述。
此后,在步骤S530中,先从步骤S520获取的一个或者多个存储分区信息中选择一个存储分区信息,然后获取所选择的存储分区信息对应的当前要处理消息的位置信息。具体而言,可以通过如下方式实现从步骤S520获取的一个或者多个存储分区信息中依次选择一个存储分区信息(该步骤可以通过前述的选择模块来执行)。例如,可以是先从一个或者多个存储分区信息中依次随机选择一个存储分区信息,也可以是按照消息存储设备的编号及在相应的消息存储设备上的存储分区的编号依次选择一个存储分区信息;然后根据所选择的存储分区信息生成消息位置查询请求并发送给消息管理设备,消息位置查询请求包括所选择的存储分区信息,以从消息管理设备中获取与所选择的存储分区信息对应的当前要处理消息的位置信息(该步骤可用通过前面的消息位置查询模块来执行)。步骤S530 可以通过前述消息处理设备300中的消息位置管理器306来执行,相关的技术实现可以参考前述消息处理设备300中的消息位置管理器306在各实施例中的相关描述,此处不再赘述。
然后,在步骤S540中,根据步骤S520和S530获得的存储分区信息和相应的存储分区中当前要处理的消息的位置信息生成消息获取请求,该消息获取请求包括所请求处理消息的主题、所选择的存储分区、该存储分区的当前要处理消息的位置信息和所要处理的消息大小。本步骤可以通过前述消息处理设备300中的消息获取器308来执行,相关的技术实现可以参考前述消息处理设备300中的消息获取器器308在各实施例中的相关描述, 此处不再赘述。
最后,在步骤S550中,将步骤S540生成的消息获取请求发送给对应的存储分区所在的消息存储设备,以及接收该存储分区所在的消息存储设备返回的对应于该消息获取请求的消息。本步骤可以通过前述消息处理设备300中的传输接口 304来执行,相关的技术实现可以参考前述消息处理设备300中的传输接口 304在各实施例中的相关描述,此处不再赘述。
此外,需要指出的是,在执行步骤S520时,也可以将消息处理请求和消息位置查询请求同时发送给消息管理设备。例如,假定消息管理设备根据消息处理请求查询到共有5 个存储分区存储某主题下的消息,消息管理设备还可以根据查询到的结果,进一步查询这5 个存储分区当前分别要处理的消息位置信息,并将这5个存储分区当前分别要处理的消息位置信息同时应步骤S520的请求返回给消息处理设备。这样,步骤S530同样可以依次轮流从这5个存储分区选择一个存储分区及相应的存储分区中当前要处理的消息的位置信息。
上述消息处理方法还可以包括以下步骤对接收到的对应于消息获取请求的消息进行处理。例如,对消息存储设备根据消息获取请求返回的相应的消息按消息格式进行解析,假如解析得到三条消息及其长度分别是msgl, Ienl ;msg2, len2 ;msg3, len3,对这三条消息依次进行处理。本步骤可以通过前述消息处理设备300中的消息处理器来执行,相关的技术实现可以参考前述消息处理设备300中的消息处理器在各实施例中的相关描述,此处不再赘述。
上述消息处理方法还包括以下步骤生成消息位置更新请求并发送给消息管理设备,消息位置更新请求包括最近一次或多次成功处理的消息大小及该消息所在的存储分区信息。在本步骤中,可以有多种实现方式,例如,可以在每成功处理完一条消息,就发送包含所处理消息大小的消息位置更新请求给消息管理设备,消息管理设备更新相应存储分区的当前要处理的消息位置信息offset。例如当成功处理完消息msgl时,生成包含msgl 的大小Ienl的消息位置更新请求,并发送给消息管理设备,消息管理设备将新的位置信息 offset+lenl存入到相应节点/consumer/offset/bl-pl中;当成功处理完第二条消息msg2 时,生成包含msg2的大小len2的消息位置更新请求,并发送给消息管理设备,消息管理设备再在新的offset上再加上len2,并更新相应节点/consumer/offset/bl-pl的内容。
在另一种实现方式中,如果对于对安全性要求不高的主题,可以在成功处理完多条消息后,再生成消息位置更新请求更新消息管理设备中相应存储分区的offset,例如,在上面的例子中,也可在成功处理完三条消息mSgl、mSg2、mSg3后,再生成包含三条消息大小 Ienl+len2+len3的消息位置更新请求并发送给消息管理设备,消息管理设备将新的位置信息 offset+lenl+len2+len3 存入到相应节点 /consumer/offset/bl-pl 中,对 offset 进行更新,这样可以增加一些效率。本步骤可通过前述消息处理设备300中的消息位置更新器来执行,相关的技术实现可以参考前述消息处理设备300中的消息位置更新器在各实施例中的相关描述,此处不再赘述。
上述实施例中,由于消息管理设备上存储有每个消息存储设备中有关存储分区的信息、以及每个存储分区中有关消息处理设备当前要处理的消息的位置信息,因此当消息处理设备获取要处理的消息时,只需从消息管理设备查询消息处理设备处理的主题下的消息在消息存储设备上的存储分区信息,以及消息处理设备在相应的存储分区的当前要处理的消息的位置信息,即可发送消息获取请求从消息存储设备获取消息进行处理,这样,即使消息处理设备发生故障,在消息处理设备恢复正常后,仍然可以紧接上次成功处理消息的位置获取消息进行处理,避免了消息的重复处理或遗漏。
在此提供的算法和显示不与任何特定计算机、虚拟系统或者其它设备固有相关。 各种通用系统也可以与基于在此的示教一起使用。根据上面的描述,构造这类系统所要求的结构是显而易见的。此外,本发明也不针对任何特定编程语言。应当明白,可以利用各种编程语言实现在此描述的本发明的内容,并且上面对特定语言所做的描述是为了披露本发明的最佳实施方式。
在此处所提供的说明书中,说明了大量具体细节。然而,能够理解,本发明的实施例可以在没有这些具体细节的情况下实践。在一些实例中,并未详细示出公知的方法、结构和技术,以便不模糊对本说明书的理解。
类似地,应当理解,为了精简本说明书公开并帮助理解各个发明方面中的一个或多个,在上面对本发明的示例性实施例的描述中,本发明的各个特征有时被一起分组到单个实施例、图、或者对其的描述中。然而,并不应将该公开的方法解释成反映如下意图即所要求保护的本发明要求比在每个权利要求中所明确记载的特征更多的特征。更确切地说,如下面的权利要求书所反映的那样,发明方面在于少于前面公开的单个实施例的所有特征。因此,遵循具体实施方式
的权利要求书由此明确地并入该具体实施方式
,其中每个权利要求本身都作为本发明的单独实施例。
本领域那些技术人员可以理解,可以对实施例中的设备中的模块进行自适应性地改变并且把它们设置在与该实施例不同的一个或多个设备中。可以把实施例中的模块或单元或组件组合成一个模块或单元或组件,以及此外可以把它们分成多个子模块或子单元或子组件。除了这样的特征和/或过程或者单元中的至少一些是相互排斥之外,可以采用任何组合对本说明书(包括伴随的权利要求、摘要和附图)中公开的所有特征以及如此公开的任何方法或者设备的所有过程或单元进行组合。除非另外明确陈述,本说明书(包括伴随的权利要求、摘要和附图)中公开的每个特征可以由提供相同、等同或相似目的的替代特征来代替。
此外,本领域的技术人员能够理解,尽管在此所述的一些实施例包括其它实施例中所包括的某些特征而不是其它特征,但是不同实施例的特征的组合意味着处于本发明的范围之内并且形成不同的实施例。例如,在下面的权利要求书中,所要求保护的实施例的任意之一都可以以任意的组合方式来使用。
本发明的各个部件实施例可以以硬件实现,或者以在一个或者多个处理器上运行的软件模块实现,或者以它们的组合实现。本领域的技术人员应当理解,可以在实践中使用微处理器或者数字信号处理器(DSP)来实现根据本发明实施例的设备中的一些或者全部部件的一些或者全部功能。本发明还可以实现为用于执行这里所描述的方法的一部分或者全部的设备或者装置程序(例如,计算机程序和计算机程序产品)。这样的实现本发明的程序可以存储在计算机可读介质上,或者可以具有一个或者多个信号的形式。这样的信号可以从因特网网站上下载得到,或者在载体信号上提供,或者以任何其他形式提供。
应该注意的是上述实施例对本发明进行说明而不是对本发明进行限制,并且本领域技术人员在不脱离所附权利要求的范围的情况下可设计出替换实施例。在权利要求中, 不应将位于括号之间的任何参考符号构造成对权利要求的限制。单词“包含”不排除存在未列在权利要求中的元件或步骤。位于元件之前的单词“一”或“一个”不排除存在多个这样的元件。本发明可以借助于包括有若干不同元件的硬件以及借助于适当编程的计算机来实现。在列举了若干装置的单元权利要求中,这些装置中的若干个可以是通过同一个硬件项来具体体现。单词第一、第二、以及第三等的使用不表示任何顺序。可将这些单词解释为名称。
本申请可以应用于计算机系统/服务器,其可与众多其它通用或专用计算系统环境或配置一起操作。适于与计算机系统/服务器一起使用的众所周知的计算系统、环境和 /或配置的例子包括但不限于个人计算机系统、服务器计算机系统、瘦客户机、厚客户机、 手持或膝上设备、基于微处理器的系统、机顶盒、可编程消费电子产品、网络个人电脑、小型计算机系统、大型计算机系统和包括上述任何系统的分布式云计算技术环境,等等。计算机系统/服务器可以在由计算机系统执行的计算机系统可执行指令(诸如程序模块)的一般语境下描述。通常,程序模块可以包括例程、程序、目标程序、组件、逻辑、数据结构等等,它们执行特定的任务或者实现特定的抽象数据类型。计算机系统/服务器可以在分布式云计算环境中实施,分布式云计算环境中,任务是由通过通信网络链接的远程处理设备执行的。 在分布式云计算环境中,程序模块可以位于包括存储设备的本地或远程计算系统存储介质上。
权利要求
1.一种在分布式消息处理系统中的消息处理设备,该分布式消息处理系统还包括一个或多个消息存储设备和消息管理设备,其中每条消息具有相应的主题,消息存储设备为相应主题建立一个或者多个存储分区,并且根据消息的主题将消息存储在相应主题的存储分区之一中,所述消息管理设备中存储有每个消息存储设备中有关存储分区的信息以及每个存储分区中当前要处理的消息的位置信息,该消息处理设备包括 存储信息获取器,被配置为生成消息处理请求,所述消息处理请求至少包括所请求处理消息的主题; 传输接ロ,被配置为将所述消息处理请求发送给所述消息管理设备,并接收所述消息管理设备发送的与所述消息处理请求中的主题相对应的ー个或者多个存储分区信息; 消息位置管理器,被配置为选择所述ー个或者多个存储分区信息之一,从所述消息管理设备中获取所选择的存储分区的当前要处理消息的位置信息;以及 消息获取器,被配置为生成消息获取请求,所述消息获取请求包括所请求处理消息的主题、所选择的存储分区、该存储分区的当前要处理消息的位置信息和所要处理的消息大小; 所述传输接ロ还被配置为将所述消息获取器生成的消息获取请求发送给该存储分区所在的消息存储设备,以及接收该存储分区所在的消息存储设备发送的对应于所述消息获取请求的消息。
2.如权利要求I所述的消息处理设备,所述消息位置管理器包括 选择模块,被配置为从所述ー个或者多个存储分区信息中依次选择ー个存储分区信息; 消息位置查询模块,被配置为生成消息位置查询请求并经由所述传输接ロ将所生成的消息位置查询请求发送给所述消息管理设备,所述消息位置查询请求包括所述选择模块所选择的存储分区信息,以及从所述消息管理设备中获取该存储分区信息对应的当前要处理消息的位置信息。
3.如权利要求I所述的消息处理设备,还包括 消息处理器,被配置为对所述传输接ロ接收的对应于所述消息获取请求的消息进行处理。
4.如权利要求3所述的消息处理设备,还包括 消息位置更新器,被配置为生成消息位置更新请求并经由所述传输接ロ将所生成的消息位置更新请求发送给所述消息管理设备,所述消息位置更新请求包括所述消息处理器最近一次或多次成功处理的消息大小及该消息所对应的存储分区信息。
5.—种分布式消息处理系统,包括 一个或者多个如权利要求1-4中任一项所述的消息处理设备; ー个或多个消息存储设备;以及 消息管理设备,其包括 消息分布状态存储器,被配置为至少存储每个消息存储设备中有关存储分区的信息、以及每个存储分区中有关消息处理设备当前要处理的消息的位置信息; 传输接ロ,被配置为接收消息处理设备发送的消息处理请求,所述消息处理请求至少包括所请求处理消息的主题;分区状态查询器,被配置为在所述消息分布状态存储器中查询与所述消息处理请求中的主题相对应的存储分区信息,并经由所述传输接ロ将所查询到的存储分区信息发送给相应消息处理设备;以及 消息位置管理器,被配置为处理通过所述传输接ロ接收的、来自消息处理设备的消息位置查询请求,从所述消息分布状态存储器中获取与该消息位置查询请求中的存储分区相对应的存储分区的当前要处理消息的位置信息、并经由所述传输接ロ发送给相应消息处理设备;以及被配置为处理通过所述传输接ロ接收的、来自消息处理设备的消息位置更新请求,基于所述消息位置更新请求中的消息大小,更新所述消息分布状态存储器中、与所述消息位置更新请求中的存储分区相对应的存储分区的当前要处理消息的位置信息。
6.如权利要求5所述的分布式消息处理系统,其中,所述消息分布状态存储器中还存储有消息处理设备每次所要处理的消息的大小; 所述分区状态查询器还被配置为在所述消息分布状态存储器中查询相应消息处理设备所要处理的消息的大小,并通过所述传输接ロ发送给相应消息处理设备。
7.—种消息处理方法,该方法适于在分布式消息处理系统中的一个或者多个消息处理设备上执行,该分布式消息处理系统还包括一个或多个消息存储设备和消息管理设备,其中每条消息具有相应的主题,所述消息存储设备为相应主题建立一个或者多个存储分区,并且根据消息的主题将消息存储在相应主题的存储分区之一中,所述消息管理设备中存储有每个消息存储设备中有关存储分区的信息以及每个存储分区中当前要处理的消息的位置信息,该消息处理方法包括 生成消息处理请求,所述消息处理请求至少包括所请求处理消息的主题; 将所述消息处理请求发送给所述消息管理设备,并接收所述消息管理设备发送的与所述消息处理请求中的主题相对应的ー个或者多个存储分区信息; 选择所述ー个或者多个存储分区信息之一,从所述消息管理设备中获取所选择的存储分区信息对应的当前要处理消息的位置信息; 生成消息获取请求,所述消息获取请求包括所请求处理消息的主题、所选择的存储分区、该存储分区的当前要处理消息的位置信息和所要处理的消息大小;以及 将所述消息获取请求发送给该存储分区所在的消息存储设备,以及接收该存储分区所在的消息存储设备发送的对应于所述消息获取请求的消息。
8.如权利要求7所述的消息处理方法,所述选择所述ー个或者多个存储分区信息之一,从所述消息管理设备中获取所选择的存储分区信息对应的当前要处理消息的位置信息包括 从所述一个或者多个存储分区信息中依次选择ー个存储分区; 生成消息位置查询请求并发送给所述消息管理设备,所述消息位置查询请求包括所述选择模块所选择的存储分区信息,从所述消息管理设备中获取与所选择的存储分区信息对应的当前要处理消息的位置信息。
9.如权利要求7所述的消息处理方法,还包括 对所述接收的对应于所述消息获取请求的消息进行处理。
10.如权利要求9所述的消息处理方法,还包括 生成消息位置更新请求并发送给所述消息管理设备,所述消息位置更新请求包括最近一次或多次成 功处理的消息大小及该消息对应的存储分区信息。
全文摘要
本发明公开了一种分布式消息处理系统及其中的设备和方法。其中消息处理设备包括存储信息获取器,生成消息处理请求,消息处理请求包括所请求处理消息的主题;传输接口,将消息处理请求发送给消息管理设备,并接收与该主题相对应的一个或多个存储分区信息;消息位置管理器,选择一个或多个存储分区信息之一,从消息管理设备中获取所选择的存储分区信息对应的当前要处理消息的位置信息;以及消息获取器,生成消息获取请求,消息获取请求包括所请求处理消息的主题、所选择的存储分区、该存储分区的当前要处理消息的位置信息和所要处理的消息大小;传输接口将消息获取请求发送给该存储分区所在的消息存储设备,以及接收对应于消息获取请求的消息。
文档编号G06F9/50GK102981911SQ20121043638
公开日2013年3月20日 申请日期2012年11月5日 优先权日2012年11月5日
发明者代兵, 陈超, 桂勇哲, 朱超, 王超 申请人:北京奇虎科技有限公司, 奇智软件(北京)有限公司