CN110225133B - 消息发送方法、节点、装置、***及相关设备 - Google Patents
消息发送方法、节点、装置、***及相关设备 Download PDFInfo
- Publication number
- CN110225133B CN110225133B CN201910538329.6A CN201910538329A CN110225133B CN 110225133 B CN110225133 B CN 110225133B CN 201910538329 A CN201910538329 A CN 201910538329A CN 110225133 B CN110225133 B CN 110225133B
- Authority
- CN
- China
- Prior art keywords
- message
- sent
- message sending
- node
- producer
- Prior art date
- Legal status (The legal status is an assumption and is not a legal conclusion. Google has not performed a legal analysis and makes no representation as to the accuracy of the status listed.)
- Active
Links
Images
Classifications
-
- H—ELECTRICITY
- H04—ELECTRIC COMMUNICATION TECHNIQUE
- H04L—TRANSMISSION OF DIGITAL INFORMATION, e.g. TELEGRAPHIC COMMUNICATION
- H04L67/00—Network arrangements or protocols for supporting network services or applications
- H04L67/01—Protocols
- H04L67/10—Protocols in which an application is distributed across nodes in the network
- H04L67/1001—Protocols in which an application is distributed across nodes in the network for accessing one among a plurality of replicated servers
-
- H—ELECTRICITY
- H04—ELECTRIC COMMUNICATION TECHNIQUE
- H04L—TRANSMISSION OF DIGITAL INFORMATION, e.g. TELEGRAPHIC COMMUNICATION
- H04L67/00—Network arrangements or protocols for supporting network services or applications
- H04L67/01—Protocols
- H04L67/10—Protocols in which an application is distributed across nodes in the network
- H04L67/1095—Replication or mirroring of data, e.g. scheduling or transport for data synchronisation between network nodes
-
- H—ELECTRICITY
- H04—ELECTRIC COMMUNICATION TECHNIQUE
- H04L—TRANSMISSION OF DIGITAL INFORMATION, e.g. TELEGRAPHIC COMMUNICATION
- H04L67/00—Network arrangements or protocols for supporting network services or applications
- H04L67/14—Session management
- H04L67/146—Markers for unambiguous identification of a particular session, e.g. session cookie or URL-encoding
-
- H—ELECTRICITY
- H04—ELECTRIC COMMUNICATION TECHNIQUE
- H04L—TRANSMISSION OF DIGITAL INFORMATION, e.g. TELEGRAPHIC COMMUNICATION
- H04L67/00—Network arrangements or protocols for supporting network services or applications
- H04L67/50—Network services
- H04L67/55—Push-based network services
Landscapes
- Engineering & Computer Science (AREA)
- Computer Networks & Wireless Communication (AREA)
- Signal Processing (AREA)
- Computer And Data Communications (AREA)
Abstract
本发明公开了一种消息发送方法、节点、装置、***及相关设备,该方法应用于包括至少两个消息发送节点的消息发送***,包括:消息发送***中任意一个消息发送节点接收生产者发送的待发送消息;任意一个消息发送节点将待发送消息同步至消息发送***中的其他消息发送节点,以便消息发送***中任意一个或多个消息发送节点将待发送消息发送至消费者。在本发明中,即使消息发送***中一个或多个消息发送节点出现故障也不影响消息发送***的正常运行,避免了节点的主备切换操作对消息发送的影响,降低了消息发送服务中断的风险。
Description
技术领域
本申请涉及通信技术领域,尤其涉及一种消息发送方法、节点、装置、***及相关设备。
背景技术
目前,在消息发送***中一般设置有备用节点进行消息的备份,利用备用节点内的消息备份来保证消息发送的可靠性。具体处理流程是:
消息生产者(以下简称生产者)与消息发送***中的主节点建立通信连接,并在产生消息后,将消息顺序发往消息发送***中的主节点。主节点将消息放入对应队列中并按照接收的顺序统一编号后,将队列中的消息同步至备用节点。备用节点在收到队列中有序的消息后,回复确认信息至主节点,主节点再对接收到的消息回复确定信息给生产者。最后,由主节点或备用节点将消息发送给消息消费者。
在消息发送***中,因为,主节点和备用节点的身份和处理逻辑不同,同一时刻消息发送***中有且只能有一个主节点,以保证***的正常工作,所以在主节点故障时需要进行节点的主备切换。但是,若备用节点切换过早,消息发送***中将存在两个主节点,导致脑裂;若备用节点未及时切换或在主备用节点切换期间,消息发送***又无法正常工作。
发明内容
有鉴于此,本申请实施例提供了一种消息发送方法、节点、装置、***及相关设备,能够解决现有技术中节点的主备切换导致消息发送***无法正常工作的问题。
本申请实施例第一方面提供了一种消息发送方法,应用于消息发送***,所述消息发送***包括至少两个消息发送节点;所述方法包括:
所述消息发送***中任意一个消息发送节点接收生产者发送的待发送消息;
所述任意一个消息发送节点将所述待发送消息同步至所述消息发送***中的其他消息发送节点,以便所述消息发送***中任意一个或多个消息发送节点将所述待发送消息发送至消费者。
可选的,所述待发送消息携带有生产者标识和消息编号;在所述消息发送节点接收到所述待发送消息之后,所述方法还包括:
所述消息发送节点将所述待发送消息放入与所述待发送消息携带的生产者标识对应的重组队列;
所述消息发送节点根据所述消息编号对所述重组队列中的消息进行排序。
可选的,所述消息发送节点根据所述消息编号对所述重组队列中的消息进行排序,之后还包括:
所述消息发送节点判断所述待发送消息携带的消息编号是否为期望消息编号;
当所述待发送消息携带的消息编号是所述期望消息编号时,所述消息发送节点将所述重组队列中从所述期望消息编号开始消息编号连续的全部消息发送给消费者,并更新所述期望消息编号;
其中,初始的期望消息编号为最小消息编号,更新后的期望消息编号为全部已发送的消息所携带的最大消息编号的下一个消息编号。
可选的,所述消息发送节点将所述重组队列中从所述期望消息编号开始消息编号连续的全部消息发送给消费者,之后还包括:
所述消息发送节点将所述重组队列中已发送的消息移出。
可选的,所述消息发送节点将所述重组队列中从所述期望消息编号开始消息编号连续的全部消息发送给消费者,之后还包括:
所述消息发送节点查找发送的各个消息中来源为所述生产者的消息;
从查找出来源为所述生产者的消息中,确定消息编号最大的消息;
根据确定出的消息编号最大的消息所携带的消息编号,回复消息确定给所述生产者。
本申请实施例第二方面提供了一种消息发送方法,应用于消息发送***,所述消息发送***包括至少两个消息发送节点;所述方法包括:
生产者预先与所述消息发送***中各个消息发送节点均建立通信连接;
所述生产者将生产的待发送消息发送给所述消息发送***中任意一个消息发送节点,以使接收到所述待发送消息的消息发送节点将所述待发送消息同步至所述消息发送***中其他消息发送节点后,所述消息发送***中任意一个或多个消息发送节点将所述待发送消息发送至消费者。
可选的,所述待发送消息携带有生产者标识和消息编号,以使所述消息发送节点将所述待发送消息放入与所述待发送消息携带的生产者标识对应的重组队列,并根据所述消息编号对所述重组队列中的消息进行排序。
可选的,所述方法还包括:
若所述生产者在预设超时时间内未接收到所述消息发送节点发送的与所述待发送消息对应的消息确认,则所述生产者再次将所述待发送消息发送给所述消息发送***中的任意一个消息发送节点。
可选的,所述预设超时时间根据所述待发送消息发送次数的增加而增加。
可选的,所述方法还包括:
当所述预设超时时间大于预设阈值时,生产者重置所述预设超时时间。
可选的,所述生产者将生产的待发送消息发送给所述消息发送***中的任意一个节点,具体包括:
所述生产者获取与所述消息发送***中每个消息发送节点建立的通信连接的服务质量;
所述生产者经服务质量超出预设阈值的通信连接发送所述待发送信息。
可选的,所述生产者获取与所述消息发送***中每个消息发送节点建立的通信连接的服务质量,具体包括:
所述生产者向所述消息发送节点发送心跳请求报文,以使所述消息发送节点在收到所述心跳请求报文后,回复心跳应答报文至所述生产者;
所述生产者根据接收到的心跳应答报文获取与所述消息发送节点之间通信连接的服务质量。
本申请实施例第三方面提供了一种消息发送节点,所述消息发送节点部署于消息发送***,所述消息发送***还包括至少一个与所述消息发送节点对等的对等消息发送节点;所述消息发送节点包括:接收模块、同步模块和发送模块;
所述接收模块,用于接收生产者发送的第一待发送消息;还用于接收任意一个所述对等消息发送节点发送的第二待发送消息;所述第二待发送消息由所述生产者发送给所述对等消息发送节点;
所述同步模块,用于将所述第一待发送消息发送至每个所述对等消息发送节点;
所述发送模块,用于将所述第一待发送消息和/或所述第二待发送消息发送给消费者。
可选的,所述第一待发送消息和所述第二待发送消息携带有生产者标识和消息编号;所述消息发送节点还包括:重组模块和排序模块;
所述重组模块,用于将所述第一待发送消息放入与所述第一待发送消息携带的生产者标识对应的重组队列,将所述第二待发送消息放入与所述第二待发送消息携带的生产者标识对应的重组队列;
所述排序模块,用于根据所述消息编号对所述重组队列中的消息进行排序。
可选的,所述消息发送节点还包括:判断模块和应答模块;
所述判断模块,用于所述待发送消息携带的消息编号是否为期望消息编号;
所述发送模块,具体用于当所述判断模块判断所述待发送消息携带的消息编号是所述期望消息编号时,将所述重组队列中从所述期望消息编号开始消息编号连续的全部消息发送给消费者,并更新所述期望消息编号;
其中,初始的期望消息编号为最小消息编号,更新后的期望消息编号为全部已发送的消息所携带的最大消息编号的下一个消息编号。
可选的,还包括:移出模块;
所述移出模块,用于将所述重组队列中已发送的消息移出。
可选的,还包括:查找模块、确定模块和应答模块;
所述查找模块,用于查找发送的各个消息中来源为所述生产者的消息;
所述确定模块,用于从所述查找模块查找出来源为所述生产者的消息中,确定消息编号最大的消息;
所述应答模块,用于根据所述确定模块确定出的消息编号最大的消息所携带的消息编号,回复消息确定给所述生产者。
本申请实施例第四方面提供了一种消息发送装置,应用于消息发送***,所述消息发送***包括至少两个消息发送节点;所述装置包括:连接建立模块、消息生产模块和消息发送模块;
所述连接建立模块,用于与所述消息发送***中各个消息发送节点均建立通信连接;
所述消息生产模块,用于生产待发送消息;
所述消息发送模块,用于将所述待发送消息发送给所述消息发送***中任意一个消息发送节点,以使接收到所述待发送消息的消息发送节点将所述待发送消息同步至所述消息发送***中其他消息发送节点后,所述消息发送***中任意一个或多个消息发送节点将所述待发送消息发送至消费者。
可选的,所述待发送消息携带有生产者标识和消息编号,以使所述消息发送节点将所述待发送消息放入与所述待发送消息携带的生产者标识对应的重组队列,并根据所述消息编号对所述重组队列中的消息进行排序。
可选的,还包括:应答等待模块;
所述应答等待模块,用于在预设超时时间内未接收到所述消息发送节点发送的与所述待发送消息对应的消息确认时,触发所述消息发送模块再次将所述待发送消息发送给所述消息发送***中的任意一个消息发送节点。
可选的,所述预设超时时间根据所述待发送消息发送次数的增加而增加。
可选的,还包括:时间重置模块;
所述时间重置模块,用于当所述预设超时时间大于预设阈值时,重置所述预设超时时间。
可选的,所述消息发送模块,具体包括:获取子模块、判断子模块和发送子模块;
所述获取子模块,用于获取与所述消息发送***中每个消息发送节点建立的通信连接的服务质量;
所述判断子模块,用于根据获取的服务质量,判断服务质量最高的通信连接;
所述发送子模块,用于经所述判断子模块判断的服务质量最高的通信连接发送所述待发送信息。
可选的,所述获取子模块,具体包括:第一子模块、第二子模块和第三子模块;
所述第一子模块,用于向所述消息发送节点发送心跳请求报文,以使所述消息发送节点在收到所述心跳请求报文后,回复心跳应答报文至所述生产者;
所述第二子模块,用于接收所述消息发送节点回复的心跳应答报文;
所述第三子模块,用于根据所述第二子模块接收到的心跳应答报文,获取与所述消息发送节点之间通信连接的服务质量。
本申请实施例第五方面提供了一种消息发送***,包括至少两个如上述第三方面提供的消息发送节点中的任意一种。
可选的,还包括如上述第四方面提供的消息发送装置中的任意一种。
本申请实施例第六方面提供了一种计算机存储介质,所述计算机可读存储介质用于存储程序代码,所述程序代码用于执行上述第一方面和第二方面提供的消息发送方法中的任意一种。
本申请实施例第七方面提供了一种消息发送设备,包括处理器以及存储器:
所述存储器,用于存储程序代码,并将所述程序代码传输给所述处理器;
所述处理器,用于根据所述程序代码中的指令执行上述第一方面和第二方面提供的消息发送方法中的任意一种。
与现有技术相比,本申请至少具有以下优点:
在本申请实施例中,消息发送***包括的多个消息发送节点均可以接收由生产者发送的待发送消息,并在接收到生产者发送的待发送消息后同步至消息发送***中其他消息发送节点以保证消息发送的可靠性。消息发送***中各个消息发送节点身份平等,生产者可以向消息发送***中任意一个消息发送节点发送待发送消息,消费者也可以从消息发送***中的任意一个消息发送节点处得到待发送消息,即使消息发送***中一个或多个消息发送节点出现故障也不影响消息发送***的正常运行,避免了节点的主备切换操作对消息发送的影响,降低了消息发送服务中断的风险。
附图说明
为了更清楚地说明本申请实施例或现有技术中的技术方案,下面将对实施例或现有技术描述中所需要使用的附图作简单地介绍,显而易见地,下面描述中的附图仅仅是本申请中记载的一些实施例,对于本领域普通技术人员来讲,在不付出创造性劳动的前提下,还可以根据这些附图获得其它的附图。
图1为现有的一种主备集群结构的消息发送***的示意图;
图2为本申请实施例提供的消息发送方法的一种应用场景示意图;
图3为本申请实施例一提供的一种消息发送方法的流程示意图;
图4为本申请实施例一提供的另一种消息发送方法的流程示意图;
图5为本申请实施例一提供的一种消息发送方法的另一种应用场景示意图;
图6为本申请实施例一提供的另一种消息发送方法的流程示意图;
图7为本申请实施例一提供的另一种消息发送方法的流程示意图;
图8为本申请实施例二提供的一种消息发送方法的流程示意图;
图9为本申请实施例三提供的一种消息发送节点的结构示意图;
图10为本申请实施例四提供的另一种消息发送装置的结构示意图。
具体实施方式
为了使本技术领域的人员更好地理解本申请方案,下面将结合本申请实施例中的附图,对本申请实施例中的技术方案进行清楚、完整地描述,显然,所描述的实施例仅是本申请一部分实施例,而不是全部的实施例。基于本申请中的实施例,本领域普通技术人员在没有做出创造性劳动前提下所获得的所有其他实施例,都属于本申请保护的范围。
应当理解,在本申请中,“至少一个(项)”是指一个或者多个,“多个”是指两个或两个以上。“和/或”,用于描述关联对象的关联关系,表示可以存在三种关系,例如,“A和/或B”可以表示:只存在A,只存在B以及同时存在A和B三种情况,其中A,B可以是单数或者复数。字符“/”一般表示前后关联对象是一种“或”的关系。“以下至少一项(个)”或其类似表达,是指这些项中的任意组合,包括单项(个)或复数项(个)的任意组合。例如,a,b或c中的至少一项(个),可以表示:a,b,c,“a和b”,“a和c”,“b和c”,或“a和b和c”,其中a,b,c可以是单个,也可以是多个。
为了便于理解,下面首先介绍本申请实施例中涉及的多个技术术语。
集群:多个逻辑节点构成一个整体共同对外提供服务。
主备集群:由一个主节点和多个备用节点构成一个集群,备用节点依赖主节点,通过同步主节点的状态来保持正常工作,主节点故障,集群将中断服务。
对等集群:由多个角色平等的节点组成一个集群,节点没有主次之分,任意一个节点出现故障,集群都可保持正常工作。
消息生产者(以下简称为生产者):生产消息并发送至消息发送***。
消息消费者(以下简称为消费者):从消息发送***接收消息并处理。
消息发送***:接收各生产者发来的消息,按顺序发送给各消费者。
消息重组:发送方同时发送多条消息,由于中间设备或***原因,消息到达接收方时可能乱序,接收方需先缓存乱序的消息,此过程称为消息重组,缓存乱序消息的装置称为重组队列。
现有的消息发送***一般利用主备集群结构来保证***的可靠性。请参见图1,该图示出了现有的一种主备集群结构的消息发送***。
主备集群由一个主节点和多个备用节点(图1仅以一个备用节点为例示出)构成,备用节点依赖于主节点,通过同步主节点的状态以使备用节点保持正常工作。消息发送的具体流程如下:
生产者1和生产者2均和主节点建立通信连接,主节点为每个通信连接均设置一个重组队列,利用不同的通信连接区分不同的生产者,来保证消息发送的可靠有序。消息发送过程中,生产者1和生产者2分别经其对应的通信连接将消息1、2、和3顺序发往主节点,主节点将收到的消息放入全局队列后统一编号(例如编号为1-6),以保证同步至备用节点时消息的顺序可靠,然后将全局队列中的消息同步到各个备用节点。备用节点在收到同步的消息后,回复确认信息给主节点,主节点再分别回复确认信息给生产者1和生产者2。最后主节点和备用节点在将消息发送给连接上的消费者。
从以上流程中可看出,同一时间消息发送***中必须存在一个且只能存在一个主节点,一旦主节点发生故障,消息发送***将中断服务。因此,在主节点故障时,为了恢复消息发送***的正常工作,需要将***中的备用节点切换为主节点,进行节点的主备切换。
然而,现有的主备切换机制可能会出现以下问题:在主节点正常运行时,若备用节点误切到主节点,则会导致***中存在多个主节点,无法正常工作;在主节点故障时,若其他备用节点未及时切换到主节点,则会导致***中没有主节点,无法正常工作;主备切换期间,***中没有主节点导致服务中断。
为了解决主备集群中节点的主备切换会导致***无法正常工作的问题,本申请实施例提供了一种消息发送方法、节点、***和装置消息发送方法,利用对等集群结构构建消息发送***,使得消息发送***中多个消息发送节点的身份平等,生产者可以将生产的待发送消息发送至***中任意一个消息发送节点,消费者也可以从消息发送***中的任意一个消息发送节点处获得待发送消息,在部分消息发送节点故障时,消息发送***仍可以正常工作,避免了主备切换操作,降低了消息发送服务中断的风险。
基于上述思想,为使本申请的上述目的、特征和优点能够更加明显易懂,下面结合附图对本申请的具体实施方式做详细的说明。
本申请实施例提供的一种消息发送方法,应用于消息发送***,参见图2,该图为本申请实施例提供的消息发送***的结构示意图。在本申请实施例中,消息发送***包括多个消息发送节点,一个或多个生产者均可以与消息发送***中各个消息发送节点建立通信连接,消息发送***中多个消息发送节点均可以向连接的消费者发送其上存储的消息。在一个具体的例子中,生产者可以为订阅发布***中订阅消息的发送者(publisher),消费者可以是订阅发布***中的接收者(subscriber),消息发送***可以是订阅发布***中的消息代理(broker)。图2仅以消息发送***中任意两个消息发送节点,即第一节点101和第二节点102,以及多个生产者中任意两个生产者,即生产者a和生产者b为例进行说明,本申请实施例对消息发送***中消息发送节点的数量和连接的生产者的数量不进行限定。
为了便于说明,下面结合图2所示的消息发送***对本申请实施例提供的应用于消息发送***的消息发送方法进行详细说明。
实施例一:
参见图3,该图为本申请实施例一提供的一种消息发送方法的流程示意图。
本申请实施例一提供的消息发送方法,具体可以包括如下步骤S301-S302。
S301:消息发送***中任意一个消息发送节点接收生产者发送的待发送消息。
在本申请实施例中,由于消息发送***中的任意一个消息发送节点均可以从生产者处直接接收待发送消息,***中部分消息发送节点故障也不会影响消息发送***消息接收机制的正常工作。以图2所示的消息发送***为例,接收到生产者发送的待发送消息的节点可以是第一节点101也可以是第二节点102,为了便于说明,下面以第一节点101接收到生产者发送的待发送消息为例对本申请实施例提供的消息发送方法进行说明。
可以理解的是,待发送消息的生产者可以是消息发送***中连接的任意一个生产者(如图2所示的生产者a或生产者b),在一个具体的例子中,待发送消息可以是订阅发送***中由消息的发布者生产的订阅消息。
在实际应用中,生产者可以根据各个通信连接的服务质量(quality of service,QoS)来选择发送待发送消息的通信连接,从而能够实现负载均衡的作用。本申请对实现负载均衡的具体方法不进行限定,例如生产者可以根据与各个消息发送节点之间通信连接的响应速度,选择响应速度最快的通信连接发送待发送消息。
S302:消息发送节点将从生产者处接收到的待发送消息同步至消息发送***中的其他消息发送节点,以便消息发送***中任意一个或多个消息发送节点将待发送消息发送至消费者。
可以理解的是,第一节点101可以将待发送消息同步至消息发送***中的其余全部消息发送节点,也可以将待发送消息同步至消息发送***中的其余部分消息发送节点。由消息发送***中接收到待发送消息的消息发送节点中的任意一个或多个将该待发送消息发送至消费者。
在实际应用中,为了保证消息发送的可靠性和便捷性,消息发送***中的全部消息发送节点均可以接收到该待发送消息,各个消息发送节点接收到的待发送消息可以是由生产者发送的,也可以是消息发送***中其余任意一个消息发送节点同步的,这里不进行限定。这样,当任意消费者与消息发送***中任意一个消息发送节点建立通信连接后,均可以直接从连接的消息发送节点上获得待发送消息,实现消息的发送。需要说明的是,本申请实施例不对消费者的数量及其具体连接的消息发送节点进行限定,这里不再赘述。
在本申请实施例中,消息发送***包括的多个消息发送节点均可以接收由生产者发送的待发送消息,并在接收到生产者发送的待发送消息后同步至消息发送***中其他消息发送节点以保证消息发送的可靠性。消息发送***中各个消息发送节点身份平等,生产者可以向消息发送***中任意一个消息发送节点发送待发送消息,消费者也可以从消息发送***中的任意一个消息发送节点处得到待发送消息,即使消息发送***中一个或多个消息发送节点出现故障也不影响消息发送***的正常运行,避免了节点的主备切换操作对消息发送的影响,降低了消息发送服务中断的风险。
上述内容对消息发送***中任意一个消息发送节点如何实现消息的发送进行了说明,由于在本申请实施例中,消息发送节点接收到的待发送消息的来源有多个(即生产者和消息发送***中的其他消息发送节点),消息发送节点无法获悉接收到的待发送消息的确切顺序,可能导致消息发送的不可靠。以图2所示的消息发送***为例,当生产者a先直接向第一节点101发送第一条消息,再向第二节点102发送第二条消息,然后再向第一节点101发送第三条消息。由于第二条消息由第二节点同步至第一节点101,受网络延时等各种因素的影响,第一节点101无法明确接收到的第一条消息、第二条消息和第三条消息之间的顺序,导致消息发送的不可靠。并且,由于可能有多个生产者(如生产者a和生产者b)同时向消息发送***中的消息发送节点发送待发送消息,第一节点101无法确定由其他消息发送节点同步的待发送消息的来源也会导致消息发送的乱序和不可靠。
为了保证消息发送的顺序性和完整性,在本申请实施例一些可能的实现方式中,待发送消息不仅携带有消息编号,还携带有该待发送消息生产者的生产者标识,以使消息发送节点在消息重组和发送时不会混淆各个生产者生产的消息,保证消息发送的准确性和消息发送***的可靠性。作为一个示例,生产者标识可以是***对生产者的编号、生产者的身份标识(ID)、IP地址等,本申请对此不进行限定。
基于此,消息发送节点在接收到待发送消息之后,为了保证消息发送的准确、可靠,还可以对接收到的待发送消息进行消息重组。具体的,参见图4,在步骤S301之后还可以包括S401-S402:
S401:消息发送节点将待发送消息放入与待发送消息携带的生产者标识对应的重组队列。
S402:消息发送节点根据所述消息编号对重组队列中的消息进行排序。
在本申请实施例中,消息发送***中的任意一个消息发送节点(如图2所示的第一节点101和第二节点102)均为每个连接的生产者建立一个与该生产者对应的重组队列(可称为有名重组队列)。消息发送***中的任意一个消息发送节点均可以根据待发送消息携带的生产者标识,将直接接收到的或通过消息同步获得的待发送消息放入与其携带的生产者标识对应的重组队列中,在不混淆各个生产者生产的待发送消息的情况下,根据待发送消息携带的消息编号对重组队列中的消息进行消息重组。
继续以图2示出的***为例,参见图5,第一节点和第二节点都分别为生产者a和生产者b建立一个与其生产者标识对应的有名重组队列,分别用于对生产者a发送的待发送消息a1、a2和a3以及生产者b发送的待发送消息b1、b2和b3进行消息重组,避免不同生产者生产的消息发生混淆。其中,a和b为生产者的标识,1-3为消息编号。
有鉴于待发送消息携带的生产者标识和消息序号,以及消息发送***中每个消息发送节点为各个生产者标识对应设置的有名重组队列和各个消息发送节点之间的消息同步,无论生产者将待发送消息发往消息发送***中的哪个消息发送节点,最终消息发送***中的每个消息发送节点总能收到该生产者的所有待发送消息,并且可以保证待发送消息的顺序和生产者生产和发送的顺序一致,保证了信息发送的一致性和可靠性。
这里需要说明的是,本申请实施例对步骤S302和步骤S401-S402的执行顺序不进行限定,第一节点可以先对接收到的待发送消息进行消息重组,再将待发送消息同步至第二节点,也可以先将待发送消息同步至第二节点后再进行消息重组,还可以并行执行消息的同步和消息的重组。
在本申请实施例中,生产者生产的待发送消息可以携带有消息编号和生产者标识,消息发送***中每个消息发送节点均为与其建立通信连接的生产者设置一个与其生产者标识对应的重组队列。在接收到待发送消息时,消息发送节点可以根据待发送消息携带的生产者标识,将该待发送消息放入对应的重组队列中,在不会混淆各个生产者生产的待发送消息的情况下,根据待发送消息携带的消息编号进行消息重组,以保证消息的有序。当消息发送***部分消息发送节点故障时,仍可以实现消息重组和顺序发送,进一步保证了消息发送的可靠性。
上述内容对消息发送***中消息发送节点如何接收到待发送消息以及在一些例子中如何对消息进行重组进行了说明,下面继续说明消息发送节点如何向消费者发送待发送消息。由于消息发送节点已经根据待发送消息携带的生产者标识和消息编号进行了消息重组,为了保证消息发送的顺序性和完整性,消息发送节点也会按照待发送消息携带的生产者标识和消息编号将重组队列中的消息顺序发送给消费者。
具体的,在本申请实施例一些可能的实现方式中,参见图6,在步骤S402之后还可以包括:
S601:消息发送节点判断待发送消息携带的消息编号是否为期望消息编号;若是,则执行步骤S602。
S602:消息发送节点将重组队列中从期望消息编号开始消息编号连续的全部消息发送给消费者,并更新期望消息编号。
在本申请实施例中,初始的期望消息编号为最小消息编号(例如1),更新后的期望消息编号为全部已发送的消息所携带的最大消息编号的下一个消息编号。这样,就可以保证消息发送节点将重组队列中已经有序的消息发送给消费者,保证了消息发送的可靠性。为了方便理解,下面结合一个具体的例子对步骤S601-S602进行说明。
以图5所示为例,初始的期望消息编号为1。在一种可能的情况中,第一节点中与a对应的重组队列为空,此时第一节点接收到待发送消息a1,第一节点将待发送消息a1发送给消费者,将期望消息编号更新为2;在另一种可能的情况中,第一节点中与a对应的重组队列存在待发送消息a2,因为期望消息编号为1,所以第一节点不发送待发送消息a2,此时第一节点接收到待发送消息a1,第一节点将待发送消息a1和a2发送给消费者,将期望消息编号更新为3;在又一种可能的情况中,第一节点中与a对应的重组队列存在待发送消息a2和a3,因为期望消息编号为1,所以第一节点不发送待发送消息a2和a3,此时第一节点接收到待发送消息a1,第一节点将待发送消息a1、a2和a3发送给消费者,第一节点可以将消息a1、a2和a3逐一顺序发送给消费者,也可以将消息a1、a2和a3打包批量发送给消费,然后将期望消息编号更新为4;以此类推,这里不再一一赘述。
需要说明的是,消息发送***中的任意消息发送节点可以逐一将每个生产者生产的待发送消息,按照各个待发送消息携带的消息编号发送给消费者。继续以图5为例,可以先将生产者a生产的待发送消息a1、a2和a3顺序发送给消费者,再将生产者b生产的待发送消息b1、b2和b3顺序发送给消费者;也可以先将生产者b生产的待发送消息b1、b2和b3顺序发送给消费者,再将生产者a生产的待发送消息a1、a2和a3顺序发送给消费者,本申请实施例对此不进行限定。
在本申请实施例一些可能的实现方式中,为了减少数据量,在步骤S602之后,还可以包括:
S603:消息发送节点将重组队列中已发送的消息移出。
继续依照前面的一个例子进行说明,当第一节点中与a对应的重组队列存在待发送消息a2,因为期望消息编号为1,所以第一节点不发送也不移出待发送消息a2,此时第一节点接收到待发送消息a1,第一节点将待发送消息a1和a2发送给消费者,并将待发送消息a1和a2移出与a对应的重组队列。
上述内容介绍了消息发送节点如何将待发送消息发送给消费者。在具体实施时,为了保证消息发送的完整性,消息发送节点可以在将待发送消息发送给消费者后向对应的生产者发送消息确认,以便生产者获知待发送消息的发送状态,避免消息的漏发和多发。
作为一个示例,待发送消息可以针对每个发送给消费者的消息,均发送对应的消息确定给生产者。然而,本申请发明人在研究中发现,上述方式虽然可以保证消息发送的完整性,但会导致较多的网络通信,占用网络资源,影响消息发送的效率。为此,在一个例子中,可以仅由消息发送***中直接从生产者处接收到待发送消息的消息发送节点发送对应的消息确认给生产者,避免消息确定的重复发送。
在另一个例子中,还可以在保证消息发送完整性的基础上,进一步减少所发送的消息确定的数据,减少网络通信、节约网络资源,下面详细说明:
在本申请实施例一些可能的实现方式中,参见图7,在消息发送节点将所述重组队列中从所述期望消息编号开始消息编号连续的全部消息发送给消费者之后,还可以包括:
S701:消息发送节点查找发送的各个消息中来源为生产者的消息。
可以理解的是,消息发送节点收到的消息来源包括生产者和消息发送***中的其他消息发送节点,可以采用任意一种消息来源的确定方法来获知其所发送消息的消息来源,这里不再赘述。
S702:从查找出来源为生产者的消息中,确定消息编号最大的消息。
S703:根据确定出的消息编号最大的消息所携带的消息编号,回复消息确定给生产者。
在本申请实施例中,消息发送节点可以仅将其所发送的来源为生产者的消息中消息编号最大的消息所对应的消息确定给生产者,生产者则可以确定编号小于该最大消息编号的消息以全部发送给消费者,无需重新发送,减少了所发送的消息确定的数量,减少网络通信、节约网络资源。
继续以图5所示为例,假设消息a1和a3由生产者a发送给第一节点,消息a2由生产者a发送给第二节点,当第一节点向消费者发送了消息a1-a3时,由第一节点根据消息a3回复消息确定给生产者a,当第二节点向消费者发送了消息a1-a3时,由第一节点根据消息a2回复消息确定给生产者a,减少了消息a1所对应消息确定的发送。需要说明的是,消息发送***中每个消息发送节点根据将其发送的消息中来源为生产者的最大消息编号的消息确定发送给生产者,可以避免消息确定的漏发,保证消息发送的效率和效果。
实施例二:
基于上述实施例一提供的应用于消息发送***的消息发送方法,本申请实施例二还提供了一种应用于生产者的消息发送方法,用于经如图2所示的消息发送***向消费者发送消息。对该消息发送***的说明具体可以参见上面相关内容,这里不再赘述。
参见图8,该图为本申请实施例二提供的一种消息发送方法的流程示意图。
本申请实施例二提供的应用于生产者的消息发送方法,包括如下步骤:
S801:生产者预先与消息发送***中各个消息发送节点均建立通信连接。
在本申请实施例中,生产者可以是与消息发送***连接的任意一个生产者(如图2所示的生产者a或生产者b),可以产生待发送消息。在一个具体的例子中,生产者可以是订阅发送***中由消息的发布者(publisher)。生产者和消息发送***中每个消息发送节点均建立了通信连接,即可将其生产的消息发送至消息发送***中的任意一个消息发送节点,当消息发送***中部分消息发送节点故障时,生产者也可以通过向其余正常工作的消息发送节点发送待发送消息,以便消费者接收到该待发送消息,实现消息的发送,本申请对通信连接的形式及建立方式不进行限定。
S802:生产者将生产的待发送消息发送给消息发送***中任意一个消息发送节点,以使接收到待发送消息的消息发送节点将待发送消息同步至消息发送***中其他消息发送节点后,消息发送***中任意一个或多个消息发送节点将待发送消息发送至消费者。
在本申请实施例中,为了保证消息发送的可靠,消息发送节点在接收到生产者发送的待发送消息后,将待发送消息同步至消息发送***其他消息发送节点中。对消息发送节点的说明可以参照上述方法实施例一的相关内容,这里不再赘述。
在一些可能的实现方式中,为了保证通信质量,步骤S802具体可以包括:
生产者获取与消息发送***中每个消息发送节点建立的通信连接的服务质量;经服务质量超出预设阈值的通信连接发送待发送信息。
在一个例子中,生产者可以根据各个通信连接的响应速度等因素确定其服务质量。在另一个例子中,生产者可以向消息发送节点发送心跳请求报文,以使消息发送节点在收到所述心跳请求报文后,回复心跳应答报文至生产者。生产者再根据接收到的心跳应答报文,获取与该消息发送节点之间通信连接的服务质量。本申请实施例服务质量的具体判断方式不进行限定。生产者经服务质量最高的通信连接发送待发送消息,一方面可以提高消息发送的效率,另一方面还可以起到负载均衡的作用。
在本申请实施例中,生产者与消息发送***中每个消息发送节点均建立通信连接,可以向消息发送***中的任意一个消息发送节点发送待发送消息,消息发送节点在接收到生产者发送的待发送消息后,将待发送消息同步至消息发送***中其他消息发送节点,以保证消息发送的可靠性。消息发送***中各个消息发送节点身份平等,生产者可以向消息发送***中任意一个消息发送节点发送待发送消息,消费者也可以从消息发送***中的任意一个消息发送节点处得到待发送消息,即使消息发送***中一个或多个消息发送节点出现故障也不影响消息发送***的正常运行,避免了节点的主备切换操作对消息发送的影响,降低了消息发送服务中断的风险。
在本申请实施例一些可能的实现方式中,为了保证消息发送的顺序性和完整性,生产者所发送的待发送消息中可以携带有生产者标识和消息编号,以使消息发送节点将待发送消息放入与待发送消息携带的生产者标识对应的重组队列,并根据消息编号对重组队列中的消息进行排序(即消息重组)。对生产者标识和消息编号以及消息重组的说明可以参照上述实施例一的相关内容,这里不再赘述。
有鉴于待发送消息携带的生产者标识和消息序号,以及消息发送***中每个消息发送节点为各个生产者标识对应设置的有名重组队列和各个消息发送节点之间的消息同步,无论生产者将待发送消息发往消息发送***中的哪个消息发送节点,最终消息发送***中的每个消息发送节点总能收到该生产者的所有待发送消息,并且可以保证待发送消息的顺序和生产者生产和发送的顺序一致,保证了信息发送的一致性和可靠性。
由于消息发送节点已经根据待发送消息携带的生产者标识和消息编号进行了消息重组,消息发送节点也会按照待发送消息携带的生产者标识和消息编号将重组队列中的消息顺序发送给消费者。在具体实施时,为了保证消息发送的完整性,消息发送节点可以在将待发送消息发送给消费者后向对应的生产者发送消息确认,以便生产者获知待发送消息的发送状态,避免消息的漏发和多发。当出现对待发送消息的漏发时,生产者未接收到对应的消息确定,则可以重发该待发送消息给消息发送***中的任意一个消息发送节点。
在一个可能的实施例中,在步骤S802之后,还包括:
若生产者在预设超时时间内未接收到消息发送节点发送的与待发送消息对应的消息确认,则生产者再次将待发送消息发送给消息发送***中的任意一个消息发送节点。
在实际应用中,可以根据具体需要对预设超时时间进行设定,这里不进行限定。作为一个示例,预设超时时间可以根据待发送消息发送次数的增加而增加。在一个例子中,当生产者向消息发送***中的任意一个消息发送节点发送待发送消息后,若在第一时间间隔(即预设超时时间)内未接收到对待发送消息的消息确认,则再次向消息发送***中的任意一个消息发送节点发送待发送消息。然后,若在第二时间间隔(即增加后的预设超时时间)内仍未接收到对待发送消息的消息确认,则再次向消息发送***中的任意一个消息发送节点发送该待发送消息。第二时间间隔大于第一时间间隔。每次发送后等待消息确认的超时时间(即预设超时时间)随着超时次数的增加而增加,避免了因重发次数过多导致网络拥堵。本申请实施例对每次发送后等待的预设超时时间的具体时长不做任何限定,这里不再一一列举。
还需要说明的是,在一些可能的设计中,还可以在超时时间达到一定的阈值时,重置超时时间至初始的预设超时时间,生产者判断预设超时时间大于预设阈值时,可以重置预设超时时间,以免通信突然恢复时等待时间过长。
这里需要说明的是,生产者再次发送待发送消息时,可以继续将待发送消息发送给同一个消息发送节点,也可以发送给消息发送***中其余任意一个消息发送节点,本申请对此不作限定。可选的,生产者还可以再次获取当前时刻其与消息发送***中每个消息发送节点建立的通信连接的服务质量,并经服务质量最高的通信连接发送待发送信息,以提高消息发送的效率。
在本申请实施例中,生产者在等待超时时会向消息发送***中任意一个节点再次发送待发送消息,并随着待发送消息发送超时次数的增加,增加每次等待消息确认的超时时间,避免因消息重发造成网络拥堵。生产者在发送待发送消息时,还会为每个待发送消息编号并在待发送消息上携带该生产者的标识,以便消息发送***中的节点根据消息的编号的生产者的标识分别对每个生产者发送的待发送消息进行消息重组,保证消息发送的准确和可靠。
为了便于理解本申请实施例所提供的整体方案,下面结合图2所示的具体应用场景对本申请实施例提供的消息发送方法进行举例说明。为了简化说明,以下仅以消息发送***仅包括第一节点和第二节点、生产者a利用消息发送***进行消息发送为例说明,其他情况的实现方式与此类似,不再赘述。
首先,生产者a与第一节点和第二节点均建立通信连接。然后,生产者a将消息发送至消费者的具体步骤如下:
步骤1:生产者a根据发送时刻的服务质量,将消息a1和a3发送至第一节点,将消息a2发送至第二节点。
步骤2:受到网络状态等因素的影响,第一节点先接收到消息a1和a3,并将消息a1和a3同步至第二节点。
步骤3:第一节点将消息a1和a3放入生产者a对应的重组队列中排序,得到重组队列{a1,a3}。第二节点将消息a1和a3放入生产者a对应的重组队列中排序,得到重组队列{a1,a3}。
步骤4:由于初始期望消息编号为1,则第一节点和/或第二节点将消息a1发送给消费者,并将消息a1从重组队列中移出,得到重组队列{a3},期望消息编号更新为2。
步骤5:第一节点回复与消息a1对应的消息确定给生产者a。
步骤6:当第二节点接收到消息a2时,将消息a2同步至第一节点。
步骤7:第二节点将消息a2放入生产者a对应的重组队列中排序,得到队列{a2,a3}。第一节点将消息a2放入生产者a对应的重组队列中排序,得到队列{a2,a3}。
步骤8:由于期望消息编号为2,则第一节点和/或第二节点将消息a2和a3发送给消费者,并将消息a2和a3从重组队列中移出。
步骤9:第一节点发送消息a3对应的消息确认给生产者a。第二节点发送消息a2对应的消息确认给生产者a。
实施例三:
基于上述实施例提供的消息发送方法,本申请实施例还提供了一种消息发送节点。
参见图9,该图为本申请实施例三提供的消息发送节点的结构示意图。
本申请实施例提供的消息发送节点部署于如图2所示的消息发送***,该消息发送***还包括至少一个与消息发送节点对等的对等消息发送节点。可以理解的是,该消息转发节点与对等消息节点的身份平等、功能相同,即消息发送***包括多个身份平等、功能相同的消息发送节点。具体的,消息发送节点包括:接收模块901、同步模块902和发送模块903;
接收模块901,用于接收生产者发送的第一待发送消息;还用于接收任意一个对等消息发送节点发送的第二待发送消息;第二待发送消息由生产者发送给对等的消息发送节点;
同步模块902,用于将第一待发送消息发送至每个对等消息发送节点;
发送模块903,用于将第一待发送消息和/或第二待发送消息发送给消费者。
在本申请实施例一些可能的实现方式中,第一待发送消息和第二待发送消息携带有生产者标识和消息编号;则,消息发送节点,还可以包括:重组模块和排序模块;
重组模块,用于将第一待发送消息放入与第一待发送消息携带的生产者标识对应的重组队列,将第二待发送消息放入与第二待发送消息携带的生产者标识对应的重组队列;
排序模块,用于根据消息编号对重组队列中的消息进行排序。
在本申请实施例一些可能的实现方式中,消息发送节点还可以包括:判断模块和应答模块;
判断模块,用于待发送消息携带的消息编号是否为期望消息编号;
发送模块,具体用于当判断模块判断待发送消息携带的消息编号是期望消息编号时,将重组队列中从期望消息编号开始消息编号连续的全部消息发送给消费者,并更新期望消息编号;
其中,初始的期望消息编号为最小消息编号,更新后的期望消息编号为全部已发送的消息所携带的最大消息编号的下一个消息编号。
在本申请实施例一些可能的实现方式中,该消息发送节点还可以包括:移出模块;
移出模块,用于将重组队列中已发送的消息移出。
在本申请实施例一些可能的实现方式中,该消息发送节点还可以包括:查找模块、确定模块和应答模块;
查找模块,用于查找发送的各个消息中来源为生产者的消息;
确定模块,用于从查找模块查找出来源为生产者的消息中,确定消息编号最大的消息;
应答模块,用于根据确定模块确定出的消息编号最大的消息所携带的消息编号,回复消息确定给生产者。
在本申请实施例中,消息发送***包括的多个消息发送节点均可以接收由生产者发送的待发送消息,并在接收到生产者发送的待发送消息后同步至消息发送***中其他消息发送节点以保证消息发送的可靠性。消息发送***中各个消息发送节点身份平等,生产者可以向消息发送***中任意一个消息发送节点发送待发送消息,消费者也可以从消息发送***中的任意一个消息发送节点处得到待发送消息,即使消息发送***中一个或多个消息发送节点出现故障也不影响消息发送***的正常运行,避免了节点的主备切换操作对消息发送的影响,降低了消息发送服务中断的风险。
实施例四:
基于上述实施例提供的消息发送方法和节点,本申请实施例四还提供了一种消息发送装置。
参见图10,该图为本申请实施例四提供的一种消息发送装置的结构示意图。
本申请实施例四提供的消息发送装置,应用于消息发送***,该消息发送***包括至少两个消息发送节点,例如图2所示。该消息发送装置,包括:连接建立模块1001、消息生产模块1002和消息发送模块1003;
连接建立模块1001,用于与消息发送***中各个消息发送节点均建立通信连接;
消息生产模块1002,用于生产待发送消息;
消息发送模块1003,用于将待发送消息发送给消息发送***中任意一个消息发送节点,以使接收到待发送消息的消息发送节点将待发送消息同步至消息发送***中其他消息发送节点后,消息发送***中任意一个或多个消息发送节点将待发送消息发送至消费者。
在本申请实施例一些可能的实现方式中,待发送消息可以携带有生产者标识和消息编号,以使消息发送节点将待发送消息放入与待发送消息携带的生产者标识对应的重组队列,并根据消息编号对重组队列中的消息进行排序。
在本申请实施例一些可能的实现方式中,该消息发送装置还可以包括:应答等待模块;
应答等待模块,用于在预设超时时间内未接收到消息发送节点发送的与待发送消息对应的消息确认时,触发消息发送模块再次将待发送消息发送给消息发送***中的任意一个消息发送节点。
在一个例子中,预设超时时间根据待发送消息发送次数的增加而增加。
可选的,该消息发送装置还可以包括:时间重置模块;
时间重置模块,用于当预设超时时间大于预设阈值时,重置预设超时时间。
在本申请实施例一些可能的实现方式中,消息发送模块1003,具体可以包括:获取子模块、判断子模块和发送子模块;
获取子模块,用于获取与消息发送***中每个消息发送节点建立的通信连接的服务质量;
判断子模块,用于根据获取的服务质量,判断服务质量最高的通信连接;
发送子模块,用于经判断子模块判断的服务质量最高的通信连接发送待发送信息。
在本申请实施例一些可能的实现方式中,获取子模块,具体可以包括:第一子模块、第二子模块和第三子模块;
第一子模块,用于向消息发送节点发送心跳请求报文,以使消息发送节点在收到心跳请求报文后,回复心跳应答报文至生产者;
第二子模块,用于接收消息发送节点回复的心跳应答报文;
第三子模块,用于根据第二子模块接收到的心跳应答报文,获取与消息发送节点之间通信连接的服务质量。
在本申请实施例中,消息发送***包括的多个消息发送节点均可以接收由生产者发送的待发送消息,并在接收到生产者发送的待发送消息后同步至消息发送***中其他消息发送节点以保证消息发送的可靠性。消息发送***中各个消息发送节点身份平等,生产者可以向消息发送***中任意一个消息发送节点发送待发送消息,消费者也可以从消息发送***中的任意一个消息发送节点处得到待发送消息,即使消息发送***中一个或多个消息发送节点出现故障也不影响消息发送***的正常运行,避免了节点的主备切换操作对消息发送的影响,降低了消息发送服务中断的风险。
实施例五:
基于上述实施例提供的消息发送方法、节点和装置,本申请实施例五还提供了一种消息发送***,至少包括两个如上述实施例三所提供的消息发送节点。在本申请实施例一些可能的实现方式中,该***还可以包括如上述实施例四提供的消息发送装置,具体结构可以如图2或图5所示。
实施例六:
基于上述实施例提供的消息发送方法、节点和装置,本申请实施例六还提供了一种计算机存储介质,该计算机可读存储介质用于存储程序代码,该程序代码用于执行如上述实施例一和实施例二所提供的消息发送方法中的任意一种。
实施例七:
基于上述实施例提供的消息发送方法、节点和装置,本申请实施例七还提供了一种消息发送设备。该消息发送设备,包括:处理器以及存储器。
其中,存储器,用于存储程序代码,并将所述程序代码传输给所述处理器;
处理器,用于根据该程序代码中的指令执行如上述实施例一和实施例二所提供的消息发送方法中的任意一种。
需要说明的是,本说明书中各个实施例采用递进的方式描述,每个实施例重点说明的都是与其他实施例的不同之处,各个实施例之间相同相似部分互相参见即可。对于实施例公开的***或装置而言,由于其与实施例公开的方法相对应,所以描述比较简单,相关之处参见方法部分说明即可。
还需要说明的是,在本文中,诸如第一和第二等之类的关系术语仅仅用来将一个实体或者操作与另一个实体或操作区分开来,而不一定要求或者暗示这些实体或操作之间存在任何这种实际的关系或者顺序。而且,术语“包括”、“包含”或者其任何其他变体意在涵盖非排他性的包含,从而使得包括一系列要素的过程、方法、物品或者设备不仅包括那些要素,而且还包括没有明确列出的其他要素,或者是还包括为这种过程、方法、物品或者设备所固有的要素。在没有更多限制的情况下,由语句“包括一个……”限定的要素,并不排除在包括所述要素的过程、方法、物品或者设备中还存在另外的相同要素。
结合本文中所公开的实施例描述的方法或算法的步骤可以直接用硬件、处理器执行的软件模块,或者二者的结合来实施。软件模块可以置于随机存储器(RAM)、内存、只读存储器(ROM)、电可编程ROM、电可擦除可编程ROM、寄存器、硬盘、可移动磁盘、CD-ROM、或技术领域内所公知的任意其它形式的存储介质中。
以上所述,仅是本申请的较佳实施例而已,并非对本申请作任何形式上的限制。虽然本申请已以较佳实施例揭露如上,然而并非用以限定本申请。任何熟悉本领域的技术人员,在不脱离本申请技术方案范围情况下,都可利用上述揭示的方法和技术内容对本申请技术方案做出许多可能的变动和修饰,或修改为等同变化的等效实施例。因此,凡是未脱离本申请技术方案的内容,依据本申请的技术实质对以上实施例所做的任何简单修改、等同变化及修饰,均仍属于本申请技术方案保护的范围内。
Claims (24)
1.一种消息发送方法,其特征在于,应用于消息发送***,所述消息发送***包括至少两个消息发送节点;所述方法包括:
所述消息发送***中任意一个消息发送节点接收生产者发送的待发送消息;
所述任意一个消息发送节点将所述待发送消息同步至所述消息发送***中的其他消息发送节点,以便所述消息发送***中任意一个或多个消息发送节点将所述待发送消息发送至消费者;
所述待发送消息携带有生产者标识和消息编号;在所述消息发送节点接收到所述待发送消息之后,所述方法还包括:所述消息发送节点将所述待发送消息放入与所述待发送消息携带的生产者标识对应的重组队列;所述消息发送节点根据所述消息编号对所述重组队列中的消息进行排序。
2.根据权利要求1所述的方法,其特征在于,所述消息发送节点根据所述消息编号对所述重组队列中的消息进行排序,之后还包括:
所述消息发送节点判断所述待发送消息携带的消息编号是否为期望消息编号;
当所述待发送消息携带的消息编号是所述期望消息编号时,所述消息发送节点将所述重组队列中从所述期望消息编号开始消息编号连续的全部消息发送给消费者,并更新所述期望消息编号;
其中,初始的期望消息编号为最小消息编号,更新后的期望消息编号为全部已发送的消息所携带的最大消息编号的下一个消息编号。
3.根据权利要求2所述的方法,其特征在于,所述消息发送节点将所述重组队列中从所述期望消息编号开始消息编号连续的全部消息发送给消费者,之后还包括:
所述消息发送节点将所述重组队列中已发送的消息移出。
4.根据权利要求2或3所述的方法,其特征在于,所述消息发送节点将所述重组队列中从所述期望消息编号开始消息编号连续的全部消息发送给消费者,之后还包括:
所述消息发送节点查找发送的各个消息中来源为所述生产者的消息;
从查找出来源为所述生产者的消息中,确定消息编号最大的消息;
根据确定出的消息编号最大的消息所携带的消息编号,回复消息确定给所述生产者。
5.一种消息发送方法,其特征在于,应用于消息发送***,所述消息发送***包括至少两个消息发送节点;所述方法包括:
生产者预先与所述消息发送***中各个消息发送节点均建立通信连接;
所述生产者将生产的待发送消息发送给所述消息发送***中任意一个消息发送节点,以使接收到所述待发送消息的消息发送节点将所述待发送消息同步至所述消息发送***中其他消息发送节点后,所述消息发送***中任意一个或多个消息发送节点将所述待发送消息发送至消费者;
所述待发送消息携带有生产者标识和消息编号,以使所述消息发送节点将所述待发送消息放入与所述待发送消息携带的生产者标识对应的重组队列,并根据所述消息编号对所述重组队列中的消息进行排序。
6.根据权利要求5所述的方法,其特征在于,所述方法还包括:
若所述生产者在预设超时时间内未接收到所述消息发送节点发送的与所述待发送消息对应的消息确认,则所述生产者再次将所述待发送消息发送给所述消息发送***中的任意一个消息发送节点。
7.根据权利要求6所述的方法,其特征在于,
所述预设超时时间根据所述待发送消息发送次数的增加而增加。
8.根据权利要求7所述的方法,其特征在于,所述方法还包括:
当所述预设超时时间大于预设阈值时,生产者重置所述预设超时时间。
9.根据权利要求5至8任意一项所述的方法,其特征在于,所述生产者将生产的待发送消息发送给所述消息发送***中的任意一个节点,具体包括:
所述生产者获取与所述消息发送***中每个消息发送节点建立的通信连接的服务质量;
所述生产者经服务质量超出预设阈值的通信连接发送所述待发送信息。
10.根据权利要求9所述的方法,其特征在于,所述生产者获取与所述消息发送***中每个消息发送节点建立的通信连接的服务质量,具体包括:
所述生产者向所述消息发送节点发送心跳请求报文,以使所述消息发送节点在收到所述心跳请求报文后,回复心跳应答报文至所述生产者;
所述生产者根据接收到的心跳应答报文获取与所述消息发送节点之间通信连接的服务质量。
11.一种消息发送节点,其特征在于,所述消息发送节点部署于消息发送***,所述消息发送***还包括至少一个与所述消息发送节点对等的对等消息发送节点;所述消息发送节点包括:接收模块、同步模块和发送模块;
所述接收模块,用于接收生产者发送的第一待发送消息;还用于接收任意一个所述对等消息发送节点发送的第二待发送消息;所述第二待发送消息由所述生产者发送给所述对等消息发送节点;
所述同步模块,用于将所述第一待发送消息发送至每个所述对等消息发送节点;
所述发送模块,用于将所述第一待发送消息和/或所述第二待发送消息发送给消费者;
所述第一待发送消息和所述第二待发送消息携带有生产者标识和消息编号;所述消息发送节点还包括:重组模块和排序模块;所述重组模块,用于将所述第一待发送消息放入与所述第一待发送消息携带的生产者标识对应的重组队列,将所述第二待发送消息放入与所述第二待发送消息携带的生产者标识对应的重组队列;所述排序模块,用于根据所述消息编号对所述重组队列中的消息进行排序。
12.根据权利要求11所述的消息发送节点,其特征在于,所述消息发送节点还包括:判断模块和应答模块;
所述判断模块,用于所述待发送消息携带的消息编号是否为期望消息编号;
所述发送模块,具体用于当所述判断模块判断所述待发送消息携带的消息编号是所述期望消息编号时,将所述重组队列中从所述期望消息编号开始消息编号连续的全部消息发送给消费者,并更新所述期望消息编号;
其中,初始的期望消息编号为最小消息编号,更新后的期望消息编号为全部已发送的消息所携带的最大消息编号的下一个消息编号。
13.根据权利要求12所述的消息发送节点,其特征在于,还包括:移出模块;
所述移出模块,用于将所述重组队列中已发送的消息移出。
14.根据权利要求12或13所述的消息发送节点,其特征在于,还包括:查找模块、确定模块和应答模块;
所述查找模块,用于查找发送的各个消息中来源为所述生产者的消息;
所述确定模块,用于从所述查找模块查找出来源为所述生产者的消息中,确定消息编号最大的消息;
所述应答模块,用于根据所述确定模块确定出的消息编号最大的消息所携带的消息编号,回复消息确定给所述生产者。
15.一种消息发送装置,其特征在于,应用于消息发送***,所述消息发送***包括至少两个消息发送节点;所述装置包括:连接建立模块、消息生产模块和消息发送模块;
所述连接建立模块,用于与所述消息发送***中各个消息发送节点均建立通信连接;
所述消息生产模块,用于生产待发送消息;
所述消息发送模块,用于将所述待发送消息发送给所述消息发送***中任意一个消息发送节点,以使接收到所述待发送消息的消息发送节点将所述待发送消息同步至所述消息发送***中其他消息发送节点后,所述消息发送***中任意一个或多个消息发送节点将所述待发送消息发送至消费者;
所述待发送消息携带有生产者标识和消息编号,以使所述消息发送节点将所述待发送消息放入与所述待发送消息携带的生产者标识对应的重组队列,并根据所述消息编号对所述重组队列中的消息进行排序。
16.根据权利要求15所述的消息发送装置,其特征在于,还包括:应答等待模块;
所述应答等待模块,用于在预设超时时间内未接收到所述消息发送节点发送的与所述待发送消息对应的消息确认时,触发所述消息发送模块再次将所述待发送消息发送给所述消息发送***中的任意一个消息发送节点。
17.根据权利要求16所述的消息发送装置,其特征在于,
所述预设超时时间根据所述待发送消息发送次数的增加而增加。
18.根据权利要求17所述的消息发送装置,其特征在于,还包括:时间重置模块;
所述时间重置模块,用于当所述预设超时时间大于预设阈值时,重置所述预设超时时间。
19.根据权利要求15至18任意一项所述的消息发送装置,其特征在于,所述消息发送模块,具体包括:获取子模块、判断子模块和发送子模块;
所述获取子模块,用于获取与所述消息发送***中每个消息发送节点建立的通信连接的服务质量;
所述判断子模块,用于根据获取的服务质量,判断服务质量最高的通信连接;
所述发送子模块,用于经所述判断子模块判断的服务质量最高的通信连接发送所述待发送信息。
20.根据权利要求19所述的消息发送装置,其特征在于,所述获取子模块,具体包括:第一子模块、第二子模块和第三子模块;
所述第一子模块,用于向所述消息发送节点发送心跳请求报文,以使所述消息发送节点在收到所述心跳请求报文后,回复心跳应答报文至所述生产者;
所述第二子模块,用于接收所述消息发送节点回复的心跳应答报文;
所述第三子模块,用于根据所述第二子模块接收到的心跳应答报文,获取与所述消息发送节点之间通信连接的服务质量。
21.一种消息发送***,其特征在于,包括至少两个如权利要求11至14任意一项所述的消息发送节点。
22.根据权利要求21所述的***,其特征在于,还包括如权利要求15至20任意一项所述的消息发送装置。
23.一种计算机存储介质,其特征在于,所述计算机可读存储介质用于存储程序代码,所述程序代码用于执行权利要求1至10任意一项所述的消息发送方法。
24.一种消息发送设备,其特征在于,包括处理器以及存储器:
所述存储器,用于存储程序代码,并将所述程序代码传输给所述处理器;
所述处理器,用于根据所述程序代码中的指令执行权利要求1至10任意一项所述的消息发送方法。
Priority Applications (1)
Application Number | Priority Date | Filing Date | Title |
---|---|---|---|
CN201910538329.6A CN110225133B (zh) | 2019-06-20 | 2019-06-20 | 消息发送方法、节点、装置、***及相关设备 |
Applications Claiming Priority (1)
Application Number | Priority Date | Filing Date | Title |
---|---|---|---|
CN201910538329.6A CN110225133B (zh) | 2019-06-20 | 2019-06-20 | 消息发送方法、节点、装置、***及相关设备 |
Publications (2)
Publication Number | Publication Date |
---|---|
CN110225133A CN110225133A (zh) | 2019-09-10 |
CN110225133B true CN110225133B (zh) | 2022-01-21 |
Family
ID=67814127
Family Applications (1)
Application Number | Title | Priority Date | Filing Date |
---|---|---|---|
CN201910538329.6A Active CN110225133B (zh) | 2019-06-20 | 2019-06-20 | 消息发送方法、节点、装置、***及相关设备 |
Country Status (1)
Country | Link |
---|---|
CN (1) | CN110225133B (zh) |
Families Citing this family (3)
Publication number | Priority date | Publication date | Assignee | Title |
---|---|---|---|---|
CN112738264B (zh) * | 2020-12-31 | 2023-04-18 | 网络通信与安全紫金山实验室 | 消息中间件消息传输方法、装置、计算机设备和存储介质 |
CN112732493B (zh) * | 2021-03-30 | 2021-06-18 | 恒生电子股份有限公司 | 新增节点的方法及装置、分布式***的节点、存储介质 |
CN113316190B (zh) * | 2021-05-10 | 2023-08-01 | 上海仝心电子科技有限公司 | 一种智慧云盒及*** |
Citations (11)
Publication number | Priority date | Publication date | Assignee | Title |
---|---|---|---|---|
CN101470636A (zh) * | 2007-12-27 | 2009-07-01 | 北京东方通科技发展有限责任公司 | 一种消息的读写方法和装置 |
CN102857397A (zh) * | 2012-10-09 | 2013-01-02 | 南京国电南自电网自动化有限公司 | 一种多主异步双工差分总线及通讯方法 |
CN103064731A (zh) * | 2012-12-26 | 2013-04-24 | 人民搜索网络股份公司 | 一种提高消息队列***性能的装置及其方法 |
CN103761141A (zh) * | 2013-12-13 | 2014-04-30 | 北京奇虎科技有限公司 | 一种实现消息队列的方法及装置 |
CN104679907A (zh) * | 2015-03-24 | 2015-06-03 | 新余兴邦信息产业有限公司 | 高可用高性能数据库集群的实现方法及*** |
CN104754036A (zh) * | 2015-03-06 | 2015-07-01 | 合一信息技术(北京)有限公司 | 一种基于kafka的消息处理***及处理方法 |
CN104753817A (zh) * | 2013-12-25 | 2015-07-01 | ***通信集团公司 | 一种云计算消息队列服务本地模拟方法和*** |
CN104838374A (zh) * | 2012-12-06 | 2015-08-12 | 英派尔科技开发有限公司 | 分散hadoop集群 |
CN105930339A (zh) * | 2016-03-31 | 2016-09-07 | 北京奇虎科技有限公司 | 提高消息传输可靠性的方法和*** |
CN108984320A (zh) * | 2018-06-27 | 2018-12-11 | 郑州云海信息技术有限公司 | 一种消息队列集群防脑裂方法及装置 |
CN109657005A (zh) * | 2018-12-10 | 2019-04-19 | 浪潮(北京)电子信息产业有限公司 | 一种分布式集群***的数据缓存方法、装置及设备 |
-
2019
- 2019-06-20 CN CN201910538329.6A patent/CN110225133B/zh active Active
Patent Citations (11)
Publication number | Priority date | Publication date | Assignee | Title |
---|---|---|---|---|
CN101470636A (zh) * | 2007-12-27 | 2009-07-01 | 北京东方通科技发展有限责任公司 | 一种消息的读写方法和装置 |
CN102857397A (zh) * | 2012-10-09 | 2013-01-02 | 南京国电南自电网自动化有限公司 | 一种多主异步双工差分总线及通讯方法 |
CN104838374A (zh) * | 2012-12-06 | 2015-08-12 | 英派尔科技开发有限公司 | 分散hadoop集群 |
CN103064731A (zh) * | 2012-12-26 | 2013-04-24 | 人民搜索网络股份公司 | 一种提高消息队列***性能的装置及其方法 |
CN103761141A (zh) * | 2013-12-13 | 2014-04-30 | 北京奇虎科技有限公司 | 一种实现消息队列的方法及装置 |
CN104753817A (zh) * | 2013-12-25 | 2015-07-01 | ***通信集团公司 | 一种云计算消息队列服务本地模拟方法和*** |
CN104754036A (zh) * | 2015-03-06 | 2015-07-01 | 合一信息技术(北京)有限公司 | 一种基于kafka的消息处理***及处理方法 |
CN104679907A (zh) * | 2015-03-24 | 2015-06-03 | 新余兴邦信息产业有限公司 | 高可用高性能数据库集群的实现方法及*** |
CN105930339A (zh) * | 2016-03-31 | 2016-09-07 | 北京奇虎科技有限公司 | 提高消息传输可靠性的方法和*** |
CN108984320A (zh) * | 2018-06-27 | 2018-12-11 | 郑州云海信息技术有限公司 | 一种消息队列集群防脑裂方法及装置 |
CN109657005A (zh) * | 2018-12-10 | 2019-04-19 | 浪潮(北京)电子信息产业有限公司 | 一种分布式集群***的数据缓存方法、装置及设备 |
Also Published As
Publication number | Publication date |
---|---|
CN110225133A (zh) | 2019-09-10 |
Similar Documents
Publication | Publication Date | Title |
---|---|---|
CN110225133B (zh) | 消息发送方法、节点、装置、***及相关设备 | |
CN109039746B (zh) | 检测双向转发路径检测会话状态的方法及处理器 | |
US5167035A (en) | Transferring messages between nodes in a network | |
US9608912B2 (en) | Computing disjoint paths for reactive routing mesh networks | |
EP3547649A1 (en) | Method and system for sending request for acquiring data resource | |
US8130676B2 (en) | Method for on demand distributed hash table update | |
CN106612284B (zh) | 一种流数据的传输方法和装置 | |
CN110971698A (zh) | 一种数据转发***、方法及装置 | |
JP5884892B2 (ja) | ネットワークシステム、コントローラ、及び負荷分散方法 | |
JP2014504043A (ja) | 通信制御システム、制御装置、通信制御方法および通信制御プログラム | |
US20130148658A1 (en) | Systems and methods for scalable multicast communication using self-rooted forwarding trees | |
CN109379283B (zh) | 基于物联网异构设备的自组网通信方法、装置及自组网 | |
US10091288B2 (en) | Ordered execution of tasks | |
CN105763375B (zh) | 一种数据包发送方法、接收方法及微波站 | |
CN106921992B (zh) | 无线网络连接状态的确定方法、客户端及服务端 | |
US6064654A (en) | Internet facsimile timing technique | |
JP2015198423A (ja) | 通信端末及びパケット通信方法 | |
JP6117345B2 (ja) | 処理性能低下を回避するメッセージシステム | |
CN110808917A (zh) | 多链路聚合数据重传方法及发送设备 | |
CN112154689A (zh) | 通信方法 | |
CN112468363B (zh) | 一种链路连通性检测的方法及装置 | |
CN114095465A (zh) | 一种在分布式环境下高效的im消息时序性保障机制实现方法 | |
US9307509B1 (en) | Transmitting radio signals using simultaneous retransmission | |
JP3965202B1 (ja) | ネットワーク通信機器およびリング型ネットワーク用通信プログラム。 | |
CN109525496B (zh) | 一种链路状态信息的更新方法及装置 |
Legal Events
Date | Code | Title | Description |
---|---|---|---|
PB01 | Publication | ||
PB01 | Publication | ||
SE01 | Entry into force of request for substantive examination | ||
SE01 | Entry into force of request for substantive examination | ||
GR01 | Patent grant | ||
GR01 | Patent grant |