专利名称:一种发送消息的方法及其系统的制作方法
技术领域:
本申请涉及计算机分布式系统领域,尤其涉及一种分布式系统中发送消息的方法及其系统。
背景技术:
随着淘宝商城不断发展,其中的商家不断增加,用户也越来越多,为了更好实现对用户的服务或商家的服务,就需要将很多消息要发给商家或用户,如发送旺旺消息,淘宝站内的信,短消息及邮件等。一般情况下,上述信息都是通过分布式系统发送消息给用户或商家,而为了使消息能够高效的发送,分布式系统采用并发的方式发送消息。下面请参考图1,其为本申请实施例中分布式系统消息分发的结构示意图。消息发送系统提供对外接口,以接收来自发送者的消息并保存在消息队列中,再由消息发送进程分发给接收者。本申请发明人在实现本申请实施例中技术方案的过程中,发现上述现有技术至少存在如下技术问题:在读取消息队列的过程中,系统采用单线程读取多线程分发的模式,即每次只保证有一个进程在读取消息,然后再开始分发消息。因需保证只有一个进程在读取消息,系统引入了锁竞争,故而每次进程都需要判断是否可读。具体来说,系统通过加锁的方式保证只有一个进程在读取,由于数据库本身机制的原因,在多线程并发的情况下,可能会造成死锁。并发的线程越多,造成死锁的概率就越大。可见,在现有技术中,多进程读取消息使得系统在发送消息的过程中,非常容易造成死锁,从而降低系统发送消息的效率。
发明内容
本申请提供了一种发送消息的方法及其系统,以解决了因保证只有一个任务在读取消息时而造成的死锁的技术问题,消除了锁竞争,提高了消息发送效率。一方面,通过本申请的一个实施例,提供如下技术方案:一种发送消息的方法,应用在包括有数据库,与所述数据库连接的M个应用服务器和与所述数据库连接的至少N个消息任务服务器的系统中,其中,所述N个消息任务服务器中每个消息任务服务器包括有一个消息发送进程,M为大于或等于I的整数,N为大于或等于2的整数,所述方法包括:判断所述N个消息发送进程中每个消息发送进程的状态是否是有效状态;基于所述判断,从所述N个消息发送进程中确定K个消息发送进程的状为有效状态,其中K为大于I但小于N的整数;从所述K个消息发送进程中,确定一个消息发送进程作为主消息发送进程;
通过所述主消息发送进程去启动所述主消息发送进程所在消息任务服务器中的消息调度器;通过所述消息调度器,从所述数据库的消息队列中获得至少一个没有进程归属的待发送消息;从所述K个消息发送进程中,为所述至少一个没有进程归属的待发送消息中每个待发送消息分配一个消息发送进程;通过所述K个消息发送进程发送所述至少一个没有进程归属的待发送消息。另一方面,通过本申请的一个实施例,提供如下技术方案:一种发送消息的系统,包括:M个应用服务器,与至少一个发送端连接,用于接收所述至少一个发送端发送的待发送消息,其中,所述M个应用服务器中每个应用服务器包括一个消息发送接口,M为大于或等于I的整数;数据库,与所述M个应用服务器连接,用于通过每个应用服务器的所述消息发送,接收所述至少一个待发送消息,并将所述至少一个待发送消息放在一消息队列中;N个消息任务服务器,与所述数据库连接,所述N个消息任务服务器中每个消息任务服务器包括有一个消息发送进程;其中,所述N个消息发送进程中有K个消息发送进程的状态为有效状态,所述K个消息发送进程中有一个为主消息发送进程;其中,所述主消息发送进程对应的消息任务服务器用于:通过所述主消息发送进程启动所述主消息发送进程所在消息任务服务器中的消息调度器;通过所述消息调度器,从所述数据库的消息队列中获得至少一个没有进程归属的待发送消息;从所述K个消息发送进程中,为所述至少一个没有进程归属的待发送消息中每个待发送消息分配一个消息发送进程;通过所述K个消息发送进程发送所述至少一个没有进程归属的待发送消息。上述技术方案中的一个或多个技术方案具有如下优点或有益效果:一、通过采用在任务分发过程中进行消息调度的方法,解决了任务分发过程中任务竞争消息造成死锁的技术问题,从而避免了死锁,达到了高效发送消息的技术效果。二、由于在消息分发的过程中采用了心跳检测的技术手段,解决了消息发送过程中,检测各个任务的有效性,从而达到了及时更新任务状态的技术效果。三、通过采用消息调度算法和心跳检测的技术手段,解决了消息在发送过程中,因任务暂停而导致消息闲置等待处理的问题,从而达到了智能的将未发送完成的消息转移到可用任务的技术效果。
图1为现有技术中分布式系统消息分发的结构示意图;图2为本申请实施例一中消息发送的方法流程图;图3为本申请实施例中分配消息发送进程的流程图;图4为本申请实施例中发送待发送消息的流程图5为本申请实施例中消息分配的示例图;图6为本申请实施例中消息发送进程的总体流程图;图7为本申请实施例中主消息发送进程的调度流程图;图8为本申请实施例中分布式系统功能模块图。
具体实施例方式为了使本申请所属技术领域中的技术人员更清楚地理解本申请,下面结合附图,通过具体的实施例对本申请技术方案作详细描述。本申请实施例一提供了 一种消息发送方法,在本实施例中,所述方法应用在一个包括有数据库、应用服务器和消息任务服务器的系统中,所述应用服务器用于产生消息,t匕如产生淘宝站内信、短消息和发送邮件等等,所述数据库用于存放所述应用服务器产生的此类消息信息,当消息任务服务器需要从数据库中提取消息时,数据库就按照消息队列的顺序将存放的消息传给所述消息任务服务器。而所述消息任务服务器就对所述数据库存放的消息进行调度以及将上述消息进行发送。所述消息任务服务器在进行调度的时,由于采用多进程机制,因此消息任务服务器会为每个消息调度进程自动分配编号或者由技术人员根据实际情况具体设定。下面请参考图2,为本申请实施例一中消息发送的方法流程图;步骤200,判断所述N个消息发送进程中每个消息发送进程的状态是否是有效状态;在具体的实施过程中,应用服务器将创建的消息存放在数据库中,消息任务服务器将基于创建的消息,创建多个消息发送进程,以N作为参数表示所述多个消息发送进程,具体来讲,该步骤将从N个消息发送进程中,判断每个消息发送进程的状态是否是有效状态,可以是判断每个消息发送进程是否已经注册,若是注册的消息发送进程,其状态即为有效,反之,消息发送进程的状态则为无效。步骤210,基于所述判断,从所述N个消息发送进程中确定K个消息发送进程的状为有效状态;在具体的实施过程中,基于步骤200的判断,从所述N个消息发送进程中确定K个消息发送进程的状态为有效状态,所述K仅作为一个表示有效状态的消息发送进程的参数,因为有效状态的进程数量是小于等于消息发送进程的数量的,所以,K为大于I但小于等于N的整数。步骤220,从所述K个消息发送进程中,确定一个消息发送进程作为主消息发送进程;在具体的实施过程中,可首先检查K个消息发送该进程中每个消息发送进程是否注册,对于在所述K个消息发送该进程中已经注册的消息发送进程,通过心跳线程判断所述已经注册的消息发送进程中每个消息发送进程的状态是暂停还是有效;对于所述已经注册的消息发送进程中状态为暂停的消息发送进程,更新消息发送状态为有效;对于在所述K个消息发送进程中未注册的消息发送进程,先注册所述未注册的消息发送进程中每个消息发送进程,然后通过心跳线程判断注册的消息发送进程的状态是暂停还是有效状态;对于已经注册的消息发送进程中状态为暂停的消息发送进程,更新状态为有效;最后通过检查,从所述K个消息发送进程中确定一个状态为有效的消息发送进程为主消息发送进程。由于每个消息发送进程都具有一个唯一的数字ID,因此,可将进程ID最小的且没有停止的任务确定为主任务。步骤230,通过所述主消息发送进程启动所述主消息发送进程所在消息任务服务器中的消息调度器;步骤240,通过所述消息调度器,从所述数据库的消息队列中获得至少一个没有进程归属的待发送消息;在具体的实施过程中,通过步骤230启动的所述消息调度器,从所述数据库的消息队列中,按照消息队列的顺序获得至少一个没有进程归属的待发送消息。需要说明的是,所述至少一个没有进程归属的待发送消息可包括以下两种:一种是来自应用服务器新产生的待发送消息;另一种是归属于心跳停止的消息发送进程的待发送消息。步骤250,从所述K个消息发送进程中,为所述没有进程归属的待发送消息分配一个消息发送进程;为了更好的说明分配消息发送进程的过程,将步骤250进行拆分,并结合附图3,详细说明分配消息发送进程的过程。在具体的实施过程中,分配消息发送进程包括以下步骤:步骤300,计算有效的消息发送进程的数量;在具体的实施过程中,从所述K个消息发送进程中,获取至少一个状态为有效的消息发送进程,将所述至少一个状态为有效的消息发送进程的ID以数组的形式保存在所述消息任务服务器中,并根据数组中的内容,计算状态为有效的消息发送进程的数量,其中所述数组可以是在消息任务服务器中的内存中存放的临时数组,也可以是存放在数据库中的一个存储空间,本领域所属的技术人员可以根据实际的情况具体设定。步骤310,计算取模结果;在具体的实施过程中,将所述没有消息发送进程归属的的待发送消息,按照数组中的ID编号和所述待发送消息进程的数量进行取模,获得取模结果。步骤320,根据所述取模结果,为没有进程归属的待发送消息分配消息发送进程ID ;在具体的实施过程中,根据所述取模结果,为每个状态为有效的发送进程分配一个还没有进程归属的待发送消息ID。在步骤320步骤,根据所述取模结果,为没有进程归属的待发送消息分配消息发送进程ID之后,将所述没有消息发送进程归属的待发送消息的ID对应的待发送消息分配给对应的状态为有效的消息发送进程。另外,对于有些心跳停止的消息发送进程,还需进行进一步的处理。比如对于心跳停止的消息发送进程进行后续的处理,下面将继续描述后续心跳停止的消息发送进程的处理过程;
在所述从所述K个消息发送进程中,为所述至少一个没有进程归属的待发送消息中每个待发送消息分配一个消息发送进程之后,还包括:根据每个消息发送进程的心跳,确定是否有心跳停止的消息发送进程;在具体的实施过程中,心跳是用来检查进程是否为有效状态的一种进程,当被检测的进程停止时,心跳进程就会得到进程停止的通知。基于此心跳,就可以确定是否有心跳停止的消息发送进程。在有一个或多个心跳停止的消息发送进程时,为心跳停止的消息发送进程加锁,减少了消息调度时产生的锁竞争。另外,此处具体的加锁可以采用数据库的锁机制。由于分布式系统中,进程的心跳状态可能会由停止变为有效,比如系统的cpu由繁忙状态变为空闲状态,或者进程到达了可以执行的时间段时,所述停止的进程就会恢复成有效的状态,进而所述消息任务服务器会对后续恢复后可能启动的进程还将进行进一步的处理。由于在多进程并发的机制下,所述心跳停止的消息发送进程可以重新启动成为有效的进程,因此,需要判断所述心跳停止的消息发送进程中是否有消息发送进程已经启动成为状态为有效的消息发送进程;在所述心跳停止的消息发送进程中有已经启动成为状态为有效的消息发送进程时,为所述已经启动成为状态为有效的消息发送进程解锁;在所述心跳停止的消息发送进程中没有已经启动成为状态为有效的消息发送进程时,将获得所述没有启动成为状态为有效的消息发送进程中的待发送消息,并将获得的待发送消息重新分配一个消息状态为有效的消息发送进程。在上述过程中,对进程的加锁与解锁可以采用数据库的锁机制即,select forupdate实现,其他相同或相似加解锁方式亦属于本申请所保护的范围。在完成将待发送消息分配给消息发送进程后,进一步的,执行消息发送进程。具体来说,通过所述K个消息发送进程发送所述至少一个没有进程归属的待发送消息;所述参数K仅作为一个具体的实例来表示在具体的实施过程中存在的消息发送进程数量,进一步地,结合附图4,详细说明发送待发送消息的过程。通过所述K个消息发送进程发送所述至少一个没有进程归属的待发送消息包括以下步骤:步骤400,根据消息计划发送时间获取所属的消息;在具体的实施过程中,由于每个消息发送进程在存放在数据库的时候,都会存在一个计划的发送时间,基于此计划发送时间,当到达发送时间后,消息发送进程就将获得K个消息发送进程中每个有效消息发送进程的没有消息发送进程归属的待发送消息,具体的消息发送进程获得待发送消息的过程请参考图5中描述的方式;步骤410,更新消息状态为发送中,并更新发送开始时间;在具体的实施过程中,对于所述一个或多个没有消息发送进程归属的待发送消息中每个待发送消息,更新消息状态为发送中,更新发送开始时间;步骤420,提交到发送队列;在具体的实施过程中,提交每个待发送消息到发送队列,其中所述发送队列是由消息发送进程构按时间的先后顺序进行排列的一个顺序列;
步骤430,更新消息状态为发送成功,更新发送结束时间;在具体的实施过程中,发送所述每个待发送消息,并在发送成功后,更新消息状态为发送成功,更新发送结束时间。为了使审查员更好的理解本申请,下面将结合附图5,举例说明待发送消息的分配及发送过程。因为在分布式系统中,待发送的消息ID是数据的一个自增长序列,每新增一条待发送消息,应用服务器收到发送者的消息后,将消息插入数据库其序列值就增加1,同样,进程的ID也是第一次启动时,往数据库插入的一条进程记录,同样也是自增长序列,序列从I开始,每新增一个进程,序列值增加I。请参考图5,将所有待发送的消息和可用的进程进行编号,例如总共有7个待发送消息,4个进程,将所述7个进程和所述4个进程按照从小到大的顺序排列,下面即以待发送消息的编号分别为1001、1002、1003、...、1007,4个进程编号为进程O、1、2、3作为示例,详细描述消息和进程之间的分配过程。在具体的实施过程中,待发送消息的编号和消息发送进程的编号在创建的时候都已经分配好了,此处的编号仅作为一个具体的实例以供参考。将待发送消息的ID和进程数量进行取模,获得取模结果;如消息1001对4取模得1,1002对4取模得2,则消息1003到1007分别获得的结果分别为3、0、1、2、3 ;基于所述取模结果,将每个消息分配到对应数组下标的进程;将消息1001和1005分配给进程I ;将消息1002和1006分配给进程2 ;将消息1003和1007分配给进程3 ;将消息1004分配给进程0 ;上述分配好的消息正在发送中,若某进程突然停止了,比如进程I停止了,此时,可依照上述方式,根据数组下标重新分配没有消息发送进程归属的待发送消息;对于消息发送进程I中的待发送消息,也可依照上述方式分配给其他消息发送进程。例如,针对待发送消息的编号分别为1001、1002、1003.....1007,各个消息编号分
别对当前消息发送进程数量3取模后,重新分配如下:将消息1001、1003、1007分配给进程3 ;将消息1002和1006分配给进程2 ;将消息1004和1005分配给进程O。也可以只是将当前停止的消息发送进程I中的待发关的消息1001和1005重新分配,如,依据消息1001和1005的消息编号分别对当前消息发送进程数量3取模后,分别分配给消息发送进程3和消息发送进程O。以上步骤为本申请中,消息发送的过程,为了使审查员更好的理解本申请,下面将从进程的角度,详细说明进程发送的过程。请参考图6,为本申请实施例中消息发送进程的总体流程图;步骤600,检查消息发送进程是否注册;在具体的实施过程中,系统开始运行后,因为所述消息发送进程在创建时,是由多个消息应用服务器产生的,而在产生的这些进程之后,就需要检测这些新创建的进程是否是注册的进程,即验证这些进程是否为合法的进程。首先检查消息发送进程是否注册,从数据库中筛选出注册的消息发送进程,若发现没有注册的消息发送进程,进行步骤611,将所述没有注册的消息发送进程注册,同时对于已经注册的消息发送进程,进行步骤610 ;步骤610,启动心跳线程;在具体的实施过程中,心跳线程会每隔一段时间更新消息发送进程的更新时间,同时在心跳启动后,心跳线程会随着消息发送进程的运行而一直运行,随着消息发送进程的结束而停止。具体来讲,所述每隔一段时间可以是事先设定好的时间,例如,心跳线程通过每30秒更新一次消息发送进程的更新时间来保持消息发送进程心跳,需要注意的是,此处所采用的30秒仅仅是本申请实施例中的一种方式,本领域所属的技术人员可以根据实际情况采用其他的间隔时间,如15秒、20秒等等,其相同或相类似的间隔时间均落入本申请的保护范围之内。步骤620,检测消息发送进程的状态;在具体的实施过程中,基于所述步骤620的心跳线程,检测每个消息发送进程的状态,若发现消息发送进程状态为暂停,进行步骤631,将所述暂停的消息发送进程的状态更新为有效。步骤630,检查是否是主消息发送进程;在具体的实施过程中,若当前消息发送进程不是主消息发送进程,则直接进行步骤640,启动任务发送器,否则进行步骤641,启动消息调度器。步骤641,启动消息调度器;在具体的实施过程中,启动消息调度器首先确定是否有心跳停止的消息发送进程;在有心跳停止的消息发送进程时,为所述心跳停止消息发送进程中每个心跳停止的消息发送进程加锁。同时,判断所述心跳停止的消息发送进程中是否有启动成为状态为有效的消息发送进程;在所述心跳停止的消息发送进程中有已经启动成为状态为有效的进程时,为所述状态为有效的消息发送进程解锁;在所述心跳停止的消息发送进程中没有启动成为状态为有效的进程时,获得所述没有成为状态为有效的消息发送进程中的待发送消息;并将这些待发送消息重新分配一个状态为有效的消息发送进程;同时,为所述没有启动成为状态为有效的消息发送进程解锁。步骤640,启动任务发送器;在具体的实施过程中,执行消息发送进程即是发送待发送消息,同前述步骤240的过程一样,详细过程此处就不在赘述。另外,执行消息发送进程后,还需要将非主消息发送进程中的消息和经重新分配后的待发送消息发送。以上过程为从进程的角度说明进程的总体流程,对于其主消息发送进程的消息调度情况,下面将详细说明。下面请参考图7,为本申请实施例中主消息发送进程的消息调度的流程步骤700,查询所有有效的消息发送进程,并检查是否有心跳停止的进程;在具体的实施过程中,从消息发送进程队列中查询所有有效的消息发送进程,并检查是否有心跳停止的消息发送进程,其中,对于有效的消息发送进程,进行步骤701,否则进行步骤710。步骤701,更新心跳停止的消息发送进程为暂停状态;在具体的实施过程中,由于有效的消息发送进程可能包括心跳活跃和心跳停止消息发送进程,故此步骤是将心跳停止的进程标记为暂停状态,以便下次查询就不再查询到当前消息发送进程,并且将所属此暂停状态进程的消息也查出来,方便了后续步骤的进行是否需要重新给这些消息重新分配新的有效进程。所述更新心跳停止的消息发送进程为暂停状态具体包括:在完成步骤701之后,进行步骤711。步骤710,查询没有消息发送进程归属的待发送消息;在具体的实施过程中,查询没有消息发送进程归属的待发送消息具体包括两种:一种是来自应用服务器新产生的待发送消息;另一种为来自步骤711的待发送消息。步骤711,查询暂停的消息发送进程所属的消息;在具体的实施过程中,因该消息发送进程状态为暂停,故查询所述消息发送进程携带的消息,并将所述消息归入没有消息发送进程归属的待发送消息之中;获得了来自步骤711的待发送消息与应用服务器新产生的待发送消息后,进行步骤 720。步骤720,重新对消息分配消息分配进程;在具体的实施过程中,上述过程与步骤250 —致,此处不再赘述。步骤730,检测是否有心跳;通过心跳线程,检测每个消息发送进程的心跳状态。对于有心跳的消息发送进程,进行步骤740,同时对于心跳停止的消息发送进程,进行步骤731。步骤731,查询心跳停止的消息发送进程的状态,并加锁;基于步骤730对每个消息发送进程的心跳检测,确定是否有心跳停止的消息发送进程;在有一个或多个心跳停止的消息发送进程时,为所述一个或多个心跳停止消息发送进程中每个心跳停止的消息发送进程加锁。步骤740,更新消息所属消息发送进程;根据消息调度,更新消息所属的消息发送进程,其中,所述消息调度过程与步骤250分配消息发送进程的过程一致,此处不再赘述步骤741,判断是否启动;在具体的实施过程中,在有一个或多个心跳停止消息发送进程时,为所述一个或多个心跳停止消息发送进程中每个心跳停止的消息发送进程加锁之后,还包括:判断所述一个或多个心跳停止的消息发送进程中是否有消息发送进程已经启动成为状态为有效的消息发送进程;
若后续启动了该消息发送进程,则进行步骤742,否则进行750 ;步骤742,只更新待发送消息的所属消息发送进程,释放锁;在具体的实施过程中,在所述一个或多个心跳停止的消息发送进程中有已经启动成为状态为有效的消息发送进程时,为所述已经启动成为状态为有效的消息发送进程解锁;同时仅仅只更新新待发送消息所属消息发送进程。步骤750,更新消息所属消息发送进程,释放锁;在具体的实施过程中,启动所述消息发送进程时,为所述已经启动成为状态为有效的消息发送进程解锁;在所述一个或多个心跳停止的消息发送进程中没有已经启动成为状态为有效的消息发送进程时,获得所述没有启动成为状态为有效的消息发送进程中的待发送消息;给所述没有启动成为状态为有效的消息发送进程的待发送消息中每个待发送消息分配一个状态为有效的消息发送进程;为所述没有启动成为状态为有效的消息发送进程解锁。在完成步骤750和步骤742之后,进行步骤760。步骤760,发送待发送消息;在具体的实施过程中,发送待发送消息过程同步骤260 —致,此处不再赘述。下面将对本申请实施例中,消息任务服务器内部具体的功能结构做具体描述。请参考图8,为本申请实施例中发送消息系统的功能模块图;如图所示的发送消息的系统,包括:应用服务器,数据库和消息任务服务器,所述应用服务器与至少一个发送端连接,用于接收和创建待发送消息,所述数据库与所述应用服务器连接,用于存放所述应用服务器接收和创建的待发送消息,并将所述待发送消息以消息队列的形式保存,所述消息任务服务器与所述数据连接,用于存放所述消息任务服务器中创建的消息发送进程,在这些消息发送进程中,包括一个主消息发送进程,用于对所述消息发送进程和所述待发送消息进行调度。其中,所述主消息发送进程对应的消息任务服务器用于:通过所述主消息发送进程启动所述主消息发送进程所在消息任务服务器中的消息调度器;通过所述消息调度器,从所述数据库的消息队列中获得至少一个没有进程归属的待发送消息;从所述K个消息发送进程中,为所述至少一个没有进程归属的待发送消息中每个待发送消息分配一个消息发送进程;通过所述K个消息发送进程发送所述至少一个没有进程归属的待发送消息。所述消息任务服务器包括:检测模块,用于检查K个消息发送进程中每个消息发送进程是否注册;判断模块,用于对于在所述K个消息发送进程中已经注册的消息发送进程,通过心跳线程判断所述已经注册的消息发送进程中每个消息发送进程的状态是暂停还是有效;还用于对于在所述K个消息发送进程中未注册的消息发送进程,通过心跳线程判断已经注册的所述未注册的消息发送进程中每个消息发送进程的状态是暂停还是有效状态;更新模块,用于对于所述已经注册的消息发送进程中状态为暂停的消息发送进程,更新消息发送状态为有效,还用于对于所述已经注册的所述未注册的消息发送进程中状态为暂停的消息发送进程,更新状态为有效;注册模块,用于对于在所述K个消息发送进程中未注册的消息发送进程,先注册所述未注册的消息发送进程中每个消息发送进程;确定模块,用于通过检查,从所述K个消息发送进程中确定一个状态为有效的消息发送进程为主消息发送进程。在具体的实施过程中,所述至少一个没有进程归属的待发送消息,具体包括:新的待发送消息和/或归属于心跳停止的消息发送进程的待发送消息。所述消息任务服务器还包括:心跳确定模块,用于确定是否有心跳停止的消息发送进程;加锁模块,用于在有一个或多个心跳停止的消息发送进程时,为所述一个或多个心跳停止消息发送进程中每个心跳停止的消息发送进程加锁。所述消息任务服务器还包括:心跳判断模块,用于判断所述一个或多个心跳停止的消息发送进程中是否有消息发送进程已经启动成为状态为有效的消息发送进程;获得模块,用于在所述一个或多个心跳停止消息发送进程中没有已经启动成为有效消息发送进程时,获得所述没有启动成为有效消息发送进程的归属于心跳停止消息发送进程的待发送消息;解锁模块,用于在所述一个或多个心跳停止消息发送进程中有已经启动成为有效消息发送进程的消息发送进程时,为所述已经启动成为有效消息发送进程的消息发送进程解锁,还用于为所述没有启动成为有效消息发送进程的消息发送进程解锁;进程分配模块,用于给所述没有启动成为有效消息发送进程的消息发送进程的归属于心跳停止消息发送进程的待发送消息中,每个待发送消息分配一个有效消息发送进程。所述消息任务服务器还包括:消息调度器,用于从所述K个消息发送进程中,获取至少一个状态为有效的消息发送进程,将所述至少一个状态为有效的消息发送进程中每个消息发送进程的ID保存在数组中,并计算所述至少一个状态为有效的消息发送进程的数量;将所述至少一个没有消息发送进程归属的待发送消息中每个没有消息发送进程归属的待发送消息的ID和所述数量进行取模,获得取模结果;根据所述取模结果,获得所述至少一个状态为有效的消息发送进程中一个或多个状态为有效的消息发送进程中每个状态为有效的消息发送进程分配到的一个或多个没有消息发送进程归属的待发送消息的ID ;将所述一个或多个没有消息发送进程归属的待发送消息的ID对应的待发送消息分配给对应的状态为有效的消息发送进程。所述消息任务服务器器具体包括:消息发送器,用于基于消息计划发送时间,获得K个消息发送进程中每个有效消息发送进程的一个或多个没有消息发送进程归属的待发送消息;对于所述一个或多个没有消息发送进程归属的待发送消息中每个待发送消息,更新消息状态为发送中,更新发送开始时间;提交每个待发送消息到发送队列;发送所述每个待发送消息,并在发送成功后,更新消息状态为发送成功,更新发送结束时间。通过本申请上述的一个或多个实施例,可以实现如下技术效果:一、通过采用在消息调度器中调度处理发送消息,解决了现有技术中因消息间竞争而容易造成的死锁的技术问题,从而达到了降低消息发送进程竞争造成死锁的技术问题。二、由于在消息分发的过程中采用了心跳检测的技术手段,解决了消息发送过程中,检测各个消息发送进程的有效性,从而达到了及时更新消息发送进程状态的技术效果。三、通过采用消息调度器中的消息重分配方法,解决了未发送完成的消息等待处理的技术问题,达到了智能的将未发送完成的消息转移到可用的消息发送进程上。尽管已描述了本申请的优选实施例,但本领域内的技术人员一旦得知了基本创造性概念,则可对这些实施例作出另外的变更和修改。所以,所附权利要求意欲解释为包括优选实施例以及落入本申请范围的所有变更和修改。显然,本领域的技术人员可以对本申请进行各种改动和变型而不脱离本发明的精神和范围。这样,倘若本申请的这些修改和变型属于本申请权利要求及其等同技术的范围之内,则本申请也意图包含这些改动和变型在内。
权利要求
1.一种发送消息的方法,其特征在于,应用在包括有数据库,与所述数据库连接的M个应用服务器和与所述数据库连接的至少N个消息任务服务器的系统中,其中,所述N个消息任务服务器中每个消息任务服务器包括有一个消息发送进程,M为大于或等于I的整数,所述方法包括: 判断所述N个消息发送进程中每个消息发送进程的状态是否是有效状态; 基于所述判断,从所述N个消息发送进程中确定K个消息发送进程的状为有效状态,其中,K为大于I但小于等于N的整数; 从所述K个消息发送进程中,确定一个消息发送进程作为主消息发送进程; 通过所述主消息发送进程启动所述主消息发送进程所在消息任务服务器中的消息调度器; 通过所述消息调度器,从所述数据库的消息队列中获得至少一个没有进程归属的待发送消息; 从所述K个消息发送进程中,为所述至少一个没有进程归属的待发送消息中每个待发送消息分配一个消息发送进程; 通过所述K个消息发送进程发送所述至少一个没有进程归属的待发送消息。
2.如权利要求1所述的方法,其特征在于,所述从所述K个消息发送进程中,确定一个消息发送进程作为主消息发送进程,具体包括: 检查K个消息发送进程中每个消息发送进程是否注册; 对于在所述K个消息发送进程中已经注册的消息发送进程,通过心跳线程判断所述已经注册的消息发送进程中每个消息发送进程的状态是暂停还是有效; 对于所述已经注册的消息发送进程中状态为暂停的消息发送进程,更新消息发送状态为有效; 对于在所述K个消息发送进程中未注册的消息发送进程,先注册所述未注册的消息发送进程中每个消息发送进程,然后通过心跳线程判断已经注册的所述未注册的消息发送进程中每个消息发送进程的状态是暂停还是有效状态;对于所述已经注册的所述未注册的消息发送进程中状态为暂停的消息发送进程,更新状态为有效; 通过检查,从所述K个消息发送进程中确定一个状态为有效的消息发送进程为主消息发送进程。
3.如权利要求1或2所述的方法,其特征在于,所述至少一个没有进程归属的待发送消息,具体包括:新的待发送消息和/或归属于心跳停止的消息发送进程的待发送消息。
4.如权利要求1或2所述的方法,其特征在于,在所述从所述K个消息发送进程中,为所述至少一个没有进程归属的待发送消息中每个待发送消息分配一个消息发送进程之后,还包括: 确定是否有心跳停止的消息发送进程; 在有一个或多个心跳停止的消息发送进程时,为所述一个或多个心跳停止消息发送进程中每个心跳停止的消息发送进程加锁。
5.如权利要求4所述的方法,其特征在于,在有一个或多个心跳停止消息发送进程时,为所述一个或多个心跳停止消息发送进程中每个心跳停止的消息发送进程加锁之后,所述方法还包括:判断所述一个或多个心跳停止的消息发送进程中是否有消息发送进程已经启动成为状态为有效的消息发送进程; 在所述一个或多个心跳停止的消息发送进程中有已经启动成为状态为有效的消息发送进程时,为所述已经启动成为状态为有效的消息发送进程解锁; 在所述一个或多个心跳停止的消息发送进程中没有已经启动成为状态为有效的消息发送进程时,获得所述没有启动成为状态为有效的消息发送进程中的待发送消息; 给所述没有启动成为状态为有效的消息发送进程的待发送消息中每个待发送消息分配一个状态为有效的消息发送进程; 为所述没有启动成为状态为有效的消息发送进程解锁。
6.如权利要求1所述的方法,其特征在于,从所述K个消息发送进程中,为所述至少一个没有进程归属的待发送消息中每个待发送消息分配一个消息发送进程,具体包括: 从所述K个消息发送进程中,获取至少一个状态为有效的消息发送进程,将所述至少一个状态为有效的消息发送进程中每个消息发送进程的ID保存在数组中,并计算所述至少一个状态为有效的消息发送进程的数量; 将所述至少一个没有消息发送进程归属的待发送消息中每个没有消息发送进程归属的待发送消息的ID和所述数量进行取模,获得取模结果; 根据所述取模结果,获得所述至少一个状态为有效的消息发送进程中一个或多个状态为有效的消息发送进程中每个状态为有效的消息发送进程分配到的一个或多个没有消息发送进程归属的待发送消息的ID ; 将所述一个或多个没有消息发送进程归属的待发送消息的ID对应的待发送消息分配给对应的状态为有效的消息发送进程。
7.如权利要求1所述的方法,其特征在于,所述通过所述K个消息发送进程发送所述至少一个没有进程归属的待发送消息,具体包括: 基于消息计划发送时间,获得K个消息发送进程中每个有效消息发送进程的一个或多个没有消息发送进程归属的待发送消息; 对于所述一个或多个没有消息发送进程归属的待发送消息中每个待发送消息,更新消息状态为发送中,更新发送开始时间; 提交每个待发送消息到发送队列; 发送所述每个待发送消息,并在发送成功后,更新消息状态为发送成功,更新发送结束时间。
8.一种发送消息的系统,其特征在于,包括: M个应用服务器,与至少一个发送端连接,用于接收所述至少一个发送端发送的待发送消息,其中,所述M个应用服务器中每个应用服务器包括一个消息发送接口,M为大于或等于I的整数; 数据库,与所述M个应用服务器连接,用于通过每个应用服务器的所述消息发送,接收所述至少一个待发送消息,并将所述至少一个待发送消息放在一消息队列中; N个消息任务服务器,与所述数据库连接,所述N个消息任务服务器中每个消息任务服务器包括有一个消息发送进程;其中,所述N个消息发送进程中有K个消息发送进程的状态为有效状态,所述K个消息发送进程中有一个为主消息发送进程;其中,所述主消息发送进程对应的消息任务服务器用于: 通过所述主消息发送进程启动所述主消息发送进程所在消息任务服务器中的消息调度器; 通过所述消息调度器,从所述数据库的消息队列中获得至少一个没有进程归属的待发送消息; 从所述K个消息发送进程中,为所述至少一个没有进程归属的待发送消息中每个待发送消息分配一个消息发送进程; 通过所述K个消息发送进程发送所述至少一个没有进程归属的待发送消息。
9.如权利要求8所述的系统,其特征在于,所述消息任务服务器包括: 检测模块,用于检查K个消息发送进程中每个消息发送进程是否注册; 判断模块,用于对于在所述K个消息发送进程中已经注册的消息发送进程,通过心跳线程判断所述已经注册的消息发送进程中每个消息发送进程的状态是暂停还是有效;还用于对于在所述K个消息发送进程中未注册的消息发送进程,通过心跳线程判断已经注册的所述未注册的消息发送进程中每个消息发送进程的状态是暂停还是有效状态; 更新模块,用于对于所 述已经注册的消息发送进程中状态为暂停的消息发送进程,更新消息发送状态为有效,还用于对于所述已经注册的所述未注册的消息发送进程中状态为暂停的消息发送进程,更新状态为有效; 注册模块,用于对于在所述K个消息发送进程中未注册的消息发送进程,先注册所述未注册的消息发送进程中每个消息发送进程; 确定模块,用于通过检查,从所述K个消息发送进程中确定一个状态为有效的消息发送进程为主消息发送进程。
10.如权利要求8所述的系统,其特征在于,所述消息任务服务器还包括: 消息调度器,用于从所述K个消息发送进程中,获取至少一个状态为有效的消息发送进程,将所述至少一个状态为有效的消息发送进程中每个消息发送进程的ID保存在数组中,并计算所述至少一个状态为有效的消息发送进程的数量; 将所述至少一个没有消息发送进程归属的待发送消息中每个没有消息发送进程归属的待发送消息的ID和所述数量进行取模,获得取模结果; 根据所述取模结果,获得所述至少一个状态为有效的消息发送进程中一个或多个状态为有效的消息发送进程中每个状态为有效的消息发送进程分配到的一个或多个没有消息发送进程归属的待发送消息的ID ; 将所述一个或多个没有消息发送进程归属的待发送消息的ID对应的待发送消息分配给对应的状态为有效的消息发送进程。
全文摘要
本申请提供了一种发送消息的方法及其系统,包括判断N个消息发送进程中每个消息发送进程的状态是否是有效状态;基于所述判断,从N个消息发送进程中确定K个消息发送进程的状为有效状态,其中K为大于1但小于等于N的整数;从K个消息发送进程中,确定一个消息发送进程作为主消息发送进程;通过主消息发送进程去启动主消息发送进程所在消息任务服务器中的消息调度器;通过消息调度器,从数据库的消息队列中获得至少一个没有进程归属的待发送消息;从K个消息发送进程中,为至少一个没有进程归属的待发送消息中每个待发送消息分配一个消息发送进程;通过K个消息发送进程发送至少一个没有进程归属的待发送消息。
文档编号G06F9/46GK103207806SQ20121000902
公开日2013年7月17日 申请日期2012年1月12日 优先权日2012年1月12日
发明者韩翼 申请人:阿里巴巴集团控股有限公司