发明内容
基于此,有必要提供一种能满足多样性场景需求的消息传递方法、系统和消息中间件系统。
一种消息传递方法,包括:
接收消息生产端输入的特性参数,并根据特征参数选择匹配中间件生成消息;消息包括消息体,消息体包括与匹配中间件对应的标识;
根据消息体的标识,查找与匹配中间件对应的通道,并将消息存储在通道中;
根据通道确定与通道对应的路由路径,将消息路由至与通道对应的队列中;
接收消息消费端的消费请求,查找与消费端对应的队列,根据消费请求将对应的队列中的消息发送给消息消费端。
在其中一种实施方式中,根据消息体的标识,查找与匹配中间件对应的通道,并将消息存储在通道中的步骤,包括:
获取通道的元数据,查找与消息体的标识对应的元数据并确定元数据对应的通道;
将消息存储在通道中。
在其中一种实施方式中,根据通道确定与通道对应的路由路径,将消息路由至与通道对应的队列中的步骤,包括:
获取队列的元数据,查找与通道的元数据对应的队列的元数据并确定通道对应的队列;
将消息路由至队列中。
在其中一种实施方式中,特征参数包括:消息是否支持事务性,消息是否支持顺序性,消息是否需要重新添加到队列,消息是否需要设置过期时间、消息是否需要死信队列,消息是否需要用户域管理以及消息是否有数据的流量需求的任意一项或多项。
一种消息传递系统,包括:
消息生成模块,用于接收消息生产端输入的特性参数,并根据特征参数选择匹配中间件生成消息;消息包括消息体,消息体包括与匹配中间件对应的标识;
存储模块,用于根据消息体的标识,查找与匹配中间件对应的通道,并将消息存储在通道中;
路由模块,用于根据通道确定与通道对应的路由路径,将消息路由至与通道对应的队列中;
消息发送模块,用于接收消息消费端的消费请求,查找与消费端对应的队列,根据消费请求将对应的队列中的消息发送给消息消费端。
在其中一种实施方式中,存储模块包括:
第一查找单元,用于获取通道的元数据,查找与消息体的标识对应的元数据并确定元数据对应的通道,
存储单元,用于将消息存储在通道中。
在其中一种实施方式中,路由模块包括:
第二查找单元,用于获取队列的元数据,查找与通道的元数据对应的队列的元数据并确定通道对应的队列;
路由单元,用于将消息路由至队列中。
在其中一种实施方式中,特征参数包括:消息是否支持事务性,消息是否支持顺序性,消息是否需要重新添加到队列,消息是否需要设置过期时间、消息是否需要死信队列,消息是否需要用户域管理以及消息是否有数据的流量需求的任意一项或多项。
一种消息中间件系统,包括:多个类型的中间件、与每个中间件对应的多个通道以及与每个通道对应的多个队列;
中间件,用于根据与其匹配的特性参数生成消息,消息包括消息体,消息体包括与匹配中间件对应的标识;
通道,用于根据消息体的标识,存储对应的中间件生成的消息;
队列,用于路由与其对应通道的消息
在其中一种实施方式中,特征参数包括:消息是否支持事务性,消息是否支持顺序性,消息是否需要重新添加到队列,消息是否需要设置过期时间、消息是否需要死信队列,消息是否需要用户域管理以及消息是否有数据的流量需求的任意一项或多项;中间件包括kafka、rabbitmq和Rocketmq。
该消息传递方法,通道对面消息生产端,队列面对消息消费端,通道与队列预先建立对应关系。当消息生产端需要产生消息时,根据输入的特征参数选择匹配中间件生成消息并存储在该匹配中间件对应的通道中,根据通道确定与通道对应的路由路径,将消息路由至通道对应的队列中,当接收到消费端的消费请求时,查找与消费端对应的队列,根据消费请求将对应的队列中的消息发送给消息消费端。该消息传递方法,能够根据消息生产端输入的特征参数选择匹配的中间件生成消息,支持多种类型的消息中间件,因此,能够满足多种业务场景的需求。
具体实施方式
如图1和图2所示,一种消息传递方法,包括以下步骤:
S10:接收消息生产端输入的特性参数,并根据特征参数选择匹配中间件生成消息。
消息生产端是指消息生产者所在的用户端,消息生产者是指消息数据的源头,消息数据的生产方。消息生产者通过平台输入与消息相关的特征参数,根据特征参数选择匹配的中间件生成消息。
消息包括消息体,消息体是各类型中间件消息的head/body所支持特性上取并集,在数据压缩方面采用protobuf的方式编码传输。消息体包括与匹配中间件对应的标识。
S30:根据消息体的标识,查找与匹配中间件对应的通道,并将消息存储在通道中。
通道(Channel)面向消息生产者,是消息数据的一个存储管道。每种中间件包括多个通道,生成消息后,根据其消息体的标识,查找与该标识对应的通道,将消息存储在该通道中。
S50:根据通道确定与通道对应的路由路径,将消息路由至与通道对应的队列中。
队列(Queue)面向消息消费者,是消息数据路由后的队列,一个通道(Channel)可与多个队列(Queue)对应,因此,一个通道(Channel)的消息可以发往多个队列(Queue),一个队列(Queue)可以消息多个通道(Channel)的消息。
S70:接收消息消费端的消费请求,查找与消费端对应的队列,根据消费请求将对应的队列中的消息发送给消息消费端。
队列(Queue)面向消费者,消息消费端与队列预先对应,当接收到消息消费端的消费请求时,查找与消费端对应的队列,根据消费请求将对应的队列中的消息发送给消息消费端。
该消息传递方法,通道对面消息生产端,队列面对消息消费端,通道与队列预先建立对应关系。当消息生产端需要产生消息时,根据输入的特征参数选择匹配中间件生成消息并存储在该匹配中间件对应的通道中,根据通道确定与通道对应的路由路径,将消息路由至通道对应的队列中,当接收到消费端的消费请求时,查找与消费端对应的队列,根据消费请求将对应的队列中的消息发送给消息消费端。该消息传递方法,能够根据消息生产端输入的特征参数选择匹配的中间件生成消息,支持多种类型的消息中间件,因此,能够满足多种业务场景的需求,且消息生产端不关心消息数据会最终到达哪里,何时数据会被拿走,消费者拿取消息数据时不关心数据本身,直接从与其对应的队列中获取消费消息。
在另一种实施方式中,中间件包括kafka、rabbitmq和Rocketmq等多种方式。Kafka对消息的并发比较大的场景支持的比较好,Rabbitmq对消息的事务场景支持的比较好。
在另一种实施方式中,特征参数包括:消息是否支持事务性,消息是否支持顺序性,消息是否需要重新添加到队列,消息是否需要设置过期时间、消息是否需要死信队列,消息是否需要用户域管理以及消息是否有数据的流量需求的任意一项或多项。
用户根据需求输入消息的特征参数,自动选择匹配的中间件类型,例如,若消息特征参数为支持事务性,将匹配Rocketmq或rabbitmq中间件。
根据用户输入的特征参数选择匹配的中间件类型生成消息,将消息存储在与该匹配的中间件对应的通道中,根据通道确定与该通道对应的路由路径,再将消息路至该队列中。该消息传递方法中的通道和队列在不同的中间件中代表的实体含义不同,如表1所示。
表1通道和队列在不同的中间件中代表的实体含义
中间件类型 |
通道 |
队列 |
Kafka |
Topic |
GroupId |
Rabbitmq |
Exchange |
Queue |
Rocketmq |
Topic |
GroupName |
… |
… |
… |
以Kafka为命名,在Kafka中间件中,通道对应的是Kafka中的Topic,队列对应的是Kafka中的GroupId。
在一种实施方式中,如图3所示,步骤S30具体包括:
S31:获取通道的元数据,查找与消息体的标识对应的元数据并确定元数据对应的通道。
通道的元数据表征通道的属性,Channel主要属性:vms.inboundName=(kafka->topic/rabbitmq->exchange)
vms.clusterId=(connectionstring);
ClusterId描述的是逻辑的连接字符串,其抽象了kafka和rabbitmq的连接,其指代的数据结构:
configServer=(kafkazookeeper地址)
Brokerserver=(kafka/rabbitmq的真实连接字符串)
BrokerServer.product=(用于区分kafka和rabbitmq)
ConfigServer.product=(用于描述configserver类型)
其它属性:如rabbimq使用的vhost/username/password属性
通道(Channel)对消息发送起至关重要的作用,客户端应该连接那个消息系统,发送到kafka哪个topic或者rabbitmq的哪个exchange,需从其属性字段中获得对应内容。
S32:将消息存储在通道中。
在另一种实施方式中,如图4所示,步骤S50具体包括:
S51:获取队列的元数据,查找与通道的元数据对应的队列的元数据并确定通道对应的队列。
队列的元数据表征通道的属性,一种实施方式的队列的属性如下所示:
vms.outboundName=(kafka->groupid/rabbitmq->queuename)
vms.clusterId=(connectionstring)
vms.bindings=(kafka->topicNm/rabbitmq->bindingrelationship)
此处vms.clusterid同channel的vms.clusterid,在此不再赘述。
队列(Queue),主要应用在消费逻辑中,通过其中指定的属性来确定连接哪类消息系统以及确定消费路由路径。
S52:将消息路由至队列中。
本发明的消息传递方法,通过将多种类型的中间件进行整合,当消息生产端需要产生消息时,根据输入的特征参数选择匹配中间件生成消息并存储在该匹配中间件对应的通道中,根据通道确定与通道对应的路由路径,将消息路由至通道对应的队列中,当接收到消费端的消费请求时,查找与消费端对应的队列,根据消费请求将对应的队列中的消息发送给消息消费端。该消息传递方法,能够根据消息生产端输入的特征参数选择匹配的中间件生成消息,支持多种类型的消息中间件,能够满足多种业务场景的需求。
本发明还提供一种消息传递系统,如图5所示,包括:
消息生成模块10,用于接收消息生产端输入的特性参数,并根据特征参数选择匹配中间件生成消息;消息包括消息体,消息体包括与匹配中间件对应的标识。
消息生产端是指消息生产者所在的用户端,消息生产者是指消息数据的源头,消息数据的生产方。消息生产者通过平台输入与消息相关的特征参数,根据特征参数选择匹配的中间件生成消息。
消息包括消息体,消息体是各类型中间件消息的head/body所支持特性上取并集,在数据压缩方面采用protobuf的方式编码传输。消息体包括与匹配中间件对应的标识。
存储模块20,用于根据消息体的标识,查找与匹配中间件对应的通道,并将消息存储在通道中。
通道(Channel)面向消息生产者,是消息数据的一个存储管道。每种中间件包括多个通道,生成消息后,根据其消息体的标识,查找与该标识对应的通道,将消息存储在该通道中。
路由模块30,用于根据通道确定与通道对应的路由路径,将消息路由至与通道对应的队列中。
队列(Queue)面向消息消费者,是消息数据路由后的队列,一个通道(Channel)可与多个队列(Queue)对应,因此,一个通道(Channel)的消息可以发往多个队列(Queue),一个队列(Queue)可以消息多个通道(Channel)的消息。
消息发送模块40,用于接收消息消费端的消费请求,查找与消费端对应的队列,根据消费请求将对应的队列中的消息发送给消息消费端。
队列(Queue)面向消费者,消息消费端与队列预先对应,当接收到消息消费端的消费请求时,查找与消费端对应的队列,根据消费请求将对应的队列中的消息发送给消息消费端。
该消息传递系统,通道对面消息生产端,队列面对消息消费端,通道与队列预先建立对应关系。当消息生产端需要产生消息时,根据输入的特征参数选择匹配中间件生成消息并存储在该匹配中间件对应的通道中,根据通道确定与通道对应的路由路径,将消息路由至通道对应的队列中,当接收到消费端的消费请求时,查找与消费端对应的队列,根据消费请求将对应的队列中的消息发送给消息消费端。该消息传递系统系统,能够根据消息生产端输入的特征参数选择匹配的中间件生成消息,支持多种类型的消息中间件,能够满足多种业务场景的需求,且消息生产端不关心消息数据会最终到达哪里,何时数据会被拿走,消费者拿取消息数据时不关心数据本身,直接从与其对应的队列中获取消费消息。
在另一种实施方式中,中间件包括kafka、rabbitmq和Rocketmq等多种方式。Kafka对消息的并发比较大的场景支持的比较好,Rabbitmq对消息的事务场景支持的比较好。
在另一种实施方式中,特征参数包括:消息是否支持事务性,消息是否支持顺序性,消息是否需要重新添加到队列,消息是否需要设置过期时间、消息是否需要死信队列,消息是否需要用户域管理以及消息是否有数据的流量需求的任意一项或多项。
用户根据需求输入消息的特征参数,自动选择匹配的中间件类型,例如,若消息特征参数为支持事务性,将匹配Rocketmq或rabbitmq中间件。
根据用户输入的特征参数匹配的中间件类型生成消息,将消息存储在与该匹配的中间件对应的通道中,根据通道确定与该通道对应的路由路径,再将消息路至该队列中。该消息传递系统中的通道和队列在不同的中间件中代表的实体含义不同,如表1所示。
以Kafka为命名,在Kafka中间件中,通道对应的是Kafka中的Topic,队列对应的是Kafka中的GroupId。
在另一种实施方式中,存储模块20包括:
第一查找单元,用于获取通道的元数据,查找与消息体的标识对应的元数据并确定元数据对应的通道。
通道的元数据表征通道的属性,Channel主要属性:vms.inboundName=(kafka->topic/rabbitmq->exchange)
vms.clusterId=(connectionstring);
ClusterId描述的是逻辑的连接字符串,其抽象了kafka和rabbitmq的连接,其指代的数据结构:
configServer=(kafkazookeeper地址)
Brokerserver=(kafka/rabbitmq的真实连接字符串)
BrokerServer.product=(用于区分kafka和rabbitmq)
ConfigServer.product=(用于描述configserver类型)
其它属性:如rabbimq使用的vhost/username/password属性
通道(Channel)对消息发送起至关重要的作用,客户端应该连接那个消息系统,发送到kafka哪个topic或者rabbitmq的哪个exchange,需从其属性字段中获得对应内容。
存储单元,用于将消息存储在通道中。
在另一种实施方式中,路由模块包括:
第二查找单元,用于获取队列的元数据,查找与通道的元数据对应的队列的元数据并确定通道对应的队列。
队列的元数据表征通道的属性,一种实施方式的队列的属性如下所示:
vms.outboundName=(kafka->groupid/rabbitmq->queuename)
vms.clusterId=(connectionstring)
vms.bindings=(kafka->topicNm/rabbitmq->bindingrelationship)
此处vms.clusterid同channel的vms.clusterid,在此不再赘述。
队列(Queue),主要应用在消费逻辑中,通过其中指定的属性来确定连接哪类消息系统以及确定消费路由路径。
路由单元,用于将消息路由至队列中。
本发明的消息传递系统,通过将多种类型的中间件进行整合,当消息生产端需要产生消息时,根据输入的特征参数选择匹配中间件生成消息并存储在该匹配中间件对应的通道中,根据通道确定与通道对应的路由路径,将消息路由至通道对应的队列中,当接收到消费端的消费请求时,查找与消费端对应的队列,根据消费请求将对应的队列中的消息发送给消息消费端。该消息传递系统,能够根据消息生产端输入的特征参数选择匹配的中间件生成消息,支持多种类型的消息中间件,能够满足多种业务场景的需求。
本发明还提供一种消息中间件系统,包括多个类型的中间件、与每个中间件对应的多个通道以及与每个通道对应的多个队列。
中间件,用于根据与其匹配的特性参数生成消息,消息包括消息体,消息体包括与匹配中间件对应的标识。
消息生产者通过平台输入与消息相关的特征参数,根据特征参数选择匹配的中间件生成消息。消息包括消息体,消息体是各类型中间件消息的head/body所支持特性上取并集,在数据压缩方面采用protobuf的方式编码传输。消息体包括与匹配中间件对应的标识。
通道,用于根据消息体的标识,存储对应的中间件生成的消息。
通道(Channel)面向消息生产者,是消息数据的一个存储管道。每种中间件包括多个通道,生成消息后,根据其消息体的标识,查找与该标识对应的通道,将消息存储在该通道中。
队列,用于路由与其对应通道的消息。
队列(Queue)面向消息消费者,是消息数据路由后的队列,一个通道(Channel)可与多个队列(Queue)对应,因此,一个通道(Channel)的消息可以发往多个队列(Queue),一个队列(Queue)可以消息多个通道(Channel)的消息。
具体的,特征参数包括:消息是否支持事务性,消息是否支持顺序性,消息是否需要重新添加到队列,消息是否需要设置过期时间、消息是否需要死信队列,消息是否需要用户域管理以及消息是否有数据的流量需求的任意一项或多项;中间件包括kafka、rabbitmq和Rocketmq。
Kafka对消息的并发比较大的场景支持的比较好,Rabbitmq对消息的事务场景支持的比较好。
在另一种实施方式中,特征参数包括:消息是否支持事务性,消息是否支持顺序性,消息是否需要重新添加到队列,消息是否需要设置过期时间、消息是否需要死信队列,消息是否需要用户域管理以及消息是否有数据的流量需求的任意一项或多项。
用户根据需求输入消息的特征参数,自动选择匹配的中间件类型,例如,若消息特征参数为支持事务性,将匹配Rocketmq或rabbitmq中间件。
根据用户输入的特征参数选择匹配的中间件类型生成消息,将消息存储在与该匹配的中间件对应的通道中,根据通道确定与该通道对应的路由路径,再将消息路至该队列中。
该消息中间件系统,能够根据消息生产端输入的特征参数选择匹配的中间件生成消息,支持多种类型的消息中间件,因此,能够满足多种业务场景的需求,且消息生产端不关心消息数据会最终到达哪里,何时数据会被拿走,消费者拿取消息数据时不关心数据本身,直接从与其对应的队列中获取消费消息。
在具体的实施方式中,通过通道和消息的元数据确定中间件与通道以及通道与队列的对应关系。
以上实施例的各技术特征可以进行任意的组合,为使描述简洁,未对上述实施例中的各个技术特征所有可能的组合都进行描述,然而,只要这些技术特征的组合不存在矛盾,都应当认为是本说明书记载的范围。
以上所述实施例仅表达了本发明的几种实施方式,其描述较为具体和详细,但并不能因此而理解为对发明专利范围的限制。应当指出的是,对于本领域的普通技术人员来说,在不脱离本发明构思的前提下,还可以做出若干变形和改进,这些都属于本发明的保护范围。因此,本发明专利的保护范围应以所附权利要求为准。