一种基于Kafka消息中间件的双向通信系统及方法与流程

文档序号:12363216阅读:2839来源:国知局
一种基于Kafka消息中间件的双向通信系统及方法与流程

本发明属于分布式系统节点间通信技术领域,更具体地,涉及一种基于Kafka消息中间件的双向通信系统及方法。



背景技术:

消息中间件是一种广泛运用在分布式系统中的用于节点间通信的软件。Kafka是由LinkedIn公司开发并开源的消息中间件。Kafka消息中间件主要由生产者、代理者和消费者组成,生产者发布消息,代理者将消息从生产者转发到消费者,消费者接收并处理消息。在实际运用中,一般会将多个Kafka代理者以集群的方式运行形成Kafka集群。Kafka提供一种特殊的发布/订阅模式。在传统的发布/订阅模式中,生产者向某个消息主题发布消息,订阅者则向代理者订阅并获取某个主题下的消息。在Kafka消息中间件技术中,主题是指Kafka集群维护的按照不同分类进行区分的消息流。Kafka对主题进行了分区,Kafka消息是具有键和值的消息,具有相同的键的消息会进入到同一个分区,同一个分区的消息会发送到相同的消费者。这样具有相同键的消息、主题分区和消费者会有一定的映射关系。

在这种消息转发模式下,Kafka只支持单向的消息转发,不能直接支持反方向的消息转发,因此在某些需要反方向通信的环境中,如工业现场监控、智能家居等应用场景,Kafka则不能完全满足数据采集与控制的需求。



技术实现要素:

针对现有技术的以上缺陷或改进需求,本发明提供了一种基于Kafka消息中间件的双向通信系统及方法,其目的在于解决现有Kafka不能支持反方向消息转发的问题。

为实现上述目的,按照本发明的一个方面,提供了一种基于Kafka消息中间件的双向通信系统,该系统包括发布者、订阅者、Kafka集群以及数据库;

其中,发布者和订阅者均包含Kafka生产者和Kafka消费者,且均具有向Kafka集群发布和从Kafka集群接收消息的能力;

其中,发布者用于与消息流进行通信、向Kafka集群发布上传消息、从Kafka集群接收下发消息;订阅者用于与其他应用程序通信,获取或者生成下发消息、向Kafka集群发布下发消息、从Kafka集群接收上传消息;数据库用于存储消息流标识与发布者标识之间的映射关系。

优选的,上述的双向通信系统,采用Redis分布式内存数据库存储上述映射关系,以提高短时大量查询的访问效率。

优选的,上述的双向通信系统,订阅者中具有一张维护消息流标识与发布者标识之间映射关系的消息流发布者Hash表、一张发布者标识与发布者主题之间映射关系的发布者主题Hash表;其中,发布者、发布者标识和发布者主题具有一一对应的关系且全局唯一;

发布者中具有一张维护消息流标识与外部消息流映射关系的消息流标识Hash表;

上传消息是指从发布者发送到订阅者的消息;

下发消息是指从订阅者发送到发布者的消息;

发布者主题是指发布者需要订阅的主题并从该主题下接受下发消息;

订阅者主题是指订阅者需要订阅的主题并从该主题下接受上传消息;

外部消息流是指外部数据源按照任意网络通信方式提供的包含任意格式和类型数据的消息序列。

为实现本发明目的,按照本发明的另一个方面,基于上述的双向通信系统,提供了一种基于Kafka消息中间件的双向通信方法,包括发布者处理过程和订阅者处理过程;

其中,发布者处理过程包括以下步骤:

(a1)发布者从配置文件中获取相关配置,包括发布者主题、用于上传消息的订阅者主题、发布者标识;对消息流标识Hash表进行初始化处理,从Kafka集群订阅发布者主题;

(a2)当外部消息流中有消息需要上传时,发布者从外部消息流中获取上传信息;

以该上传消息为基础构建Kafka消息,并将此Kafka消息发布到Kafka集群中当前发布者上传消息的订阅者主题下;

(a3)当发布者从Kafka集群接收到需要下发的Kafka消息,解析Kafka消息取出拟下发的消息,将拟下发的消息发送到指定的外部消息流;

其中,订阅者处理过程包括以下步骤:

(b1)订阅者从配置文件中读取相关配置,包括订阅者主题、发布者标识与发布者主题的映射关系;消息流发布者Hash表和消息流主题Hash表进行初始化处理,并从Kafka集群订阅订阅者主题;

(b2)当订阅者从Kafka集群接收到拟上传的Kafka消息,根据Kafka消息更新消息流标识与发布者标识之间的映射关系,从Kafka消息中将抽取应用层消息,并发送到第三方应用程序;

(b3)当订阅者自身产生拟下发消息或者收到第三方应用程序的拟下发信息时,订阅者以所述拟下发消息为基础构建Kafka消息,并将Kafka消息发布到Kafka集群的主题下。

优选地,上述的双向通信方法,其步骤(a2)包括以下子步骤:

(a2.1)从外部消息流获取需要上传的消息;

(a2.2)在发布者标识与消息流标识之间添加分隔符,并按字符串相连接的方式组合构成Kafka消息的键,以从外部消息流获取的上传消息的内容构成Kafka消息的值,并发布到用于上传消息的订阅者主题;

(a2.3)判断是否有新的外部消息流加入到发布者,若是,则进入步骤(a2.4);若否,则进入步骤(a2.1);

(a2.4)生成一个随机数作为新的外部消息流的消息流标识;

(a2.5)判断步骤(a2.4)中生成的新的消息流标识是否已经存在于消息流标识Hash表中,若是,则进入步骤(a2.4);若否,则进入步骤(a2.6);

(a2.6)将新的消息流标识与外部消息流的映射关系插入到消息流标识Hash表中,进入步骤(a2.1)。

优选地,上述的双向通信方法,其步骤(a3)包括以下子步骤:

(a3.1)从Kafka集群获取Kafka消息;

(a3.2)获取所述Kafka消息的消息流标识,并以所述消息流标识为键在消息流标识Hash表中查找外部消息流映射值;

(a3.3)获取Kafka消息的值;并根据上述外部消息流映射值确定外部消息流,将Kafka消息的值发送给上述外部消息流,并进入步骤(a3.1)。

优选地,上述的双向通信方法,其步骤(b2)包括以下子步骤:

(b2.1)从Kafka集群获取需要上传的Kafka消息;

(b2.2)以分隔符为分割标志、以字符串拆分的方式分割Kafka消息的键,以获得消息流标识和发布者标识;

(b2.3)以消息流标识为键在消息流发布者Hash表中查找发布者标识,若没有查找到发布者标识映射值,则进入步骤(b2.4),否则进入步骤(b2.5);

(b2.4)将消息流标识与发布者标识的映射关系插入到消息流发布者Hash表中,并进入步骤(b2.8);

(b2.5)将步骤(b2.2)中获得的发布者标识和步骤(b2.3)中查找到的发布者标识进行比较;若两者的值不同,则进入步骤(b2.6),否则进入步骤(b2.7);

(b2.6)根据步骤(b2.2)中获得的消息流标识和发布者标识的映射关系,更新消息流发布者Hash表,并进入到步骤(b2.8);

(b2.7)将步骤(b2.1)中获取的Kafka消息的值,即需要上传的消息,和步骤(b2.2)中获得的消息流标识发送给消息处理程序,并进入步骤(b2.1);

(b2.8)在数据库中更新消息流标识与发布者标识之间的映射关系,并进入步骤(b2.7)。

优选地,上述的双向通信方法,其步骤(b3)包括以下子步骤:

(b3.1)接收消息处理应用层下发的消息和消息流标识;

(b3.2)以消息流标识为键,在消息流发布者Hash表中查找发布者标识映射值;若查找到,进入步骤(b3.3);否则,进入步骤(b3.4);

(b3.3)以查找到的发布者标识的映射值为键,在发布者主题Hash表中查找发布者主题映射值;若查找到,则进入步骤(b3.5);否则,进入步骤(b3.4);

(b3.4)向用户反馈消息下发失败,进入步骤(b3.1);

(b3.5)以步骤(b3.1)接收到的消息流标识为键,以消息内容为值构建Kafka消息,并将该Kafka消息发布到步骤(b3.3)中查找到的发布者主题映射值中,进入步骤(b3.1)。

总体而言,通过本发明所构思的以上技术方案与现有技术相比,能够取得下列有益效果:

(1)本发明所提出的基于Kafka消息中间件的双向通信系统及方法,由于对发布者、订阅者与任意方向消息流的映射关系采用分布式存储机制,因此极大地沿袭了Kafka消息中间件的分布式处理能力,并具备海量实时通信能力;

(2)本发明所提出的基于Kafka消息中间件的双向通信系统及方法,通过建立发布者、订阅者与消息流的映射关系,在消息订阅者中维护了消息流标识与发布者的映射关系、以及发布者与发布者主题之间的映射关系,实现了基于Kafka消息中间件的双向通信,解决了现有Kafka消息中间件不支持反方向消息转发的问题;

相比于现有技术而言,本发明提出的基于Kafka消息中间件的双向通信具备分布式处理、高吞吐量、高可靠性等优势,并且可以支持任意应用接入、处理任意类型通信协议;本发明提供的这种系统及方法可应用于某些需要反方向通信的环境,譬如工业现场监控、智能家居等应用场景,进行双向的数据采集与控制。

附图说明

图1是本发明实施例中的基于Kafka消息中间件的双向通信系统的系统结构示意图;

图2是本发明实施例中发布者初始化流程示意图;

图3是本发明实施例中发布者消息上传流程示意图;

图4是本发明实施例中发布者消息下发流程示意图;

图5是本发明实施例中订阅者初始化流程示意图;

图6是本发明实施例中订阅者消息上传流程示意图;

图7是本发明实施例中订阅者消息下发流程示意图。

具体实施方式

为了使本发明的目的、技术方案及优点更加清楚明白,以下结合附图及实施例,对本发明进行进一步详细说明。应当理解,此处所描述的具体实施例仅仅用以解释本发明,并不用于限定本发明。此外,下面所描述的本发明各个实施方式中所涉及到的技术特征只要彼此之间未构成冲突就可以相互组合。

本发明的核心在于充分利用Kafka消息中间件的主题和主题分区,将发布者主题与发布者相关联,以使订阅者能够精准地将消息发送到相应的发布者。

如图1所示,是基于Kafka消息中间件的双向通信系统的系统结构示意图,该系统包括发布者、订阅者、Kafka集群以及数据库;发布者和订阅者都包含了Kafka生产者和Kafka消费者,两者都具有向Kafka集群发布和从Kafka集群接收消息的能力;

其中,发布者的功能包括:与消息流进行通信、向Kafka集群发布上传消息和从Kafka集群接收下发消息;订阅者的功能包括:与其他应用程序通信获取或者产生下发消息、向Kafka集群发布下发消息和从Kafka集群接收上传消息。

数据库用于保存所有的消息流标识和发布者标识的映射关系;实施例中,使用Redis分布式内存数据库来存储该映射关系;Redis分布式内存数据库在本发明这种短时大量的查询场景中具有极高的访问效率;订阅者中具有一张维护消息流标识到发布者标识映射关系的消息流发布者Hash表、发布者标识到发布者主题映射关系的发布者主题Hash表;发布者、发布者标识和发布者主题具有一一对应的关系且全局唯一;发布者具有维护消息流标识到外部消息流映射关系的消息流标识Hash表。

实施例中,基于上述的双向通信系统,提供的基于Kafka消息中间件的双向通信方法,包括发布者处理过程和订阅者处理过程;

其中,发布者处理过程包括以下步骤:

(a1)发布者初始化:发布者从配置文件中获取相关配置,包括发布者主题、用于上传消息的订阅者主题、发布者标识;对消息流标识Hash表进行初始化处理,从Kafka集群订阅发布者主题;

实施例中,相关配置包括发布者主题、拟发布消息的主题、发布者标识,以及Kafka集群IP地址;

(a2)发布者消息上传:当外部消息流中有消息需要上传时,发布者从外部消息流中获取上传信息;

以该上传消息为基础构建Kafka消息,并将此Kafka消息发布到Kafka集群中当前发布者上传消息的订阅者主题下;

(a3)发布者消息下发:当发布者从Kafka集群接收到需要下发的Kafka消息,解析Kafka消息取出拟下发的消息,将拟下发的消息发送到指定的外部消息流;

其中,订阅者处理过程包括以下步骤:

(b1)订阅者初始化:订阅者从配置文件中读取相关配置,包括订阅者主题、发布者标识与发布者主题的映射关系;消息流发布者Hash表和消息流主题Hash表进行初始化处理,并从Kafka集群订阅订阅者主题;

(b2)订阅者消息上传:当订阅者从Kafka集群接收到拟上传的Kafka消息,根据Kafka消息更新消息流标识与发布者标识之间的映射关系,从Kafka消息中将抽取应用层消息,并发送给第三方应用程序进行处理;

(b3)订阅者消息下发:当订阅者收到其他程序需要下发的信息或者产生需要下发的消息时,订阅者以下发消息为基础构建Kafka消息,并将Kafka消息发布到Kafka集群相应的主题下。

图2所示,是实施例中步骤(a1)的发布者初始化的流程示意图,具体包括如下的步骤:

S201,从配置文件读取发布者主题、用于上传消息的订阅者主题和发布者标识;

S202,初始化一张维护从消息流标识到外部消息流映射关系的消息流标识Hash表;

S203,从Kafka集群订阅发布者主题;

S204,启动用于执行消息上传流程的线程;

S205,启动用于执行消息下发流程的线程。

图3所示,是实施例中步骤(a2)的发布者消息上传流程的示意图,具体包括如下的步骤:

S301,从外部消息流获取一条需要上传的消息;

S302,在发布者标识和消息流标识之间添加“:”字符并按字符串相连接的方式组合起来构成Kafka消息的键,以步骤S301中从外部消息流获取的上传消息的内容构成Kafka消息的值,并发布到用于上传消息的订阅者主题;

S303,判断是否有新的外部消息流加入到发布者,若是,则进入步骤S304;若否,则进入步骤S301;

S304,生成一个随机数作为新的外部消息流的消息流标识;

S305,判断步骤S304中生成的新的消息流标识是否已经存在于消息流标识Hash表中,若是,则进入步骤S304;若否,则进入步骤S306;

S306,将新的消息流标识和外部消息流的映射关系插入到消息流标识Hash表中,并进入步骤S301。

图4所示,是实施例中步骤(a3)的发布者消息下发流程的示意图,具体包括如下的步骤:

S401,从Kafka集群获取Kafka消息;

S402,取出步骤S401中获取的Kafka消息的键,Kafka消息的键即是消息流标识,以消息流标识为键在消息流标识Hash表中查找外部消息流映射值;

S403,将取到的Kafka消息的值,即下发消息的内容,发送给步骤S402中确定的外部消息流,进入步骤S401。

图5所示,是实施例中步骤(b1)的订阅者初始化流程的示意图,具体包括如下的步骤:

S501,初始化一张维护从发布者标识到发布者主题映射关系的发布者主题Hash表;

S502,从配置文件中读取订阅者主题;

S503,从配置文件中读取发布者标识到发布者主题映射关系并插入到发布者主题Hash表中;

S504,初始化一张维护从消息流标识到发布者标识映射关系的消息流发布者Hash表;

S505,从Kafka集群订阅需要订阅的主题以获取上传的Kafka消息;

S506,启动用于执行消息上传流程的线程;

S507,启动用于执行消息下发流程的线程。

图6所示,是实施例中步骤(b2)的订阅者消息上传流程的示意图,具体包括如下的步骤:

S601,从Kafka集群获取需要上传的Kafka消息;

S602,以“:”字符为分割标志以字符串拆分的方式拆解Kafka消息的键以获得消息流标识和发布者标识;

S603,以消息流标识为键在消息流发布者Hash表中查找发布者标识映射值,如果没有查找到发布者标识映射值,则进入步骤S604;如果查找到了发布者标识映射值,则进入步骤S605;

S604,将消息流标识和发布者标识的映射关系插入到消息流发布者Hash表中,并进入步骤S608;

S605,将步骤S602中分析得到的发布者标识和步骤S603中查找到的发布者标识相比较,若两者不同,进入步骤S606;否则进入步骤S607;

S606,将步骤S602分析得到的消息流标识和发布者标识的映射关系更新到消息流发布者Hash表中,并进入步骤S608;

S607,将步骤S601中获取的Kafka消息的值,即需要上传的消息,和步骤S602中获得的消息流标识发送给外部消息处理程序,并进入步骤S601;

S608,将新的消息流标识和发布者标识的映射关系更新到数据库中,并进入步骤S607。

图7所示,是实施例中步骤(b2)的订阅者消息下发流程的示意图,具体包括如下的步骤:

S701,从消息处理程序接收需要下发的消息和消息流标识;

S702,以消息流标识为键在消息流发布者Hash表中查找发布者标识映射值,若没有查找到发布者标识映射值就进入步骤S704,否则进入步骤S703;

S703,以步骤S702中查找到的发布者标识为键在发布者主题Hash表中查找发布者主题映射值,若没有查找到发布者主题映射值就进入步骤S704;如果查找到了发布者主题映射值就进入步骤S705;

S704,通知用户消息下发失败,并进入步骤S701;

S705,以步骤S701接收到的消息流标识为键,以下发消息内容为值构建下发的Kafka消息,并将Kafka消息发布到步骤S703中查找到的发布者主题中,进入步骤S701。

本领域的技术人员容易理解,以上所述仅为本发明的较佳实施例而已,并不用以限制本发明,凡在本发明的精神和原则之内所作的任何修改、等同替换和改进等,均应包含在本发明的保护范围之内。

当前第1页1 2 3 
网友询问留言 已有0条留言
  • 还没有人留言评论。精彩留言会获得点赞!
1