具体实施方式
下面将结合本发明实施例中的附图,对本发明实施例中的技术方案进行清楚、完整地描述,显然,所描述的实施例仅仅是本发明一部分实施例,而不是全部的实施例。基于本发明中的实施例,本领域普通技术人员在没有做出创造性劳动前提下所获得的所有其他实施例,都属于本发明保护的范围。
本发明实施例中提供了一种方法、系统和设备,用于降低了接入设备的复杂度和负担。以下分别进行详细说明。
下面将结合本发明实施例中的附图,对本发明实施例中的技术方案进行清楚、完整地描述,显然,所描述的实施例仅仅是本发明一部分实施例,而不是全部的实施例。基于本发明中的实施例,本领域普通技术人员在没有作出创造性劳动前提下所获得的所有其他实施例,都属于本发明保护的范围。
本发明实施例提供的一种分布式队列消息读取方法及设备、系统,能够避免客户端从分布式队列中读取到相同的消息,降低消息重复处理的风险。以下分别进行详细说明。
请参阅图1,图1为本发明实施例提供的一种分布式队列消息读取方法的流程示意图。如图1所示,该方法可以包括以下步骤:
101、接收客户端发送的获取消息请求。
一个实施例中,可以由去重复代理服务器来接收客户端发送的获取消息请求。一般地,客户端发送的获取消息请求中都会携带有指示信息(例如消息自身标识),该指示信息用于指示客户端希望获取到的消息,这是本领域技术人员公知的常识,本发明实施例不作详细介绍。
102、从分布式队列中获取与上述获取消息请求对应的消息,其中,该消息中携带有内部标识ID;
一个实施例中,从分布式队列中获取与上述获取消息请求对应的消息具体可以为:
去重复代理服务器将客户端发送的获取消息请求转发至分布式队列,并且接收分布式队列发送的与上述获取消息请求对应的消息。
其中,分布式队列可以根据客户端发送的获取消息请求中携带的指示信息(例如消息自身标识),将与上述获取消息请求对应的消息发送给去重复代理服务器。
103、提取上述消息的内部标识ID,并且判断分布式数据库中是否存储有该内部标识ID;若是,则执行步骤104;若否,则执行步骤105。
一个实施例中,去重复代理服务器提取上述消息的内部标识ID之后,可以将提取的内部标识ID和分布式数据库中存储的内部标识ID进行比对,如果发现分布式数据库中存储有上述消息携带的内部标识ID(即所提取的内部标识ID与分布式数据库中存储的某一个内部标识ID相同),则说明当前从分布式队列中获取的与上述获取消息请求对应的消息还没有被客户端读取过,进而可以执行步骤104;反之,如果发现分布式数据库中没有存储上述消息携带的内部标识ID(即提取的内部标识ID与分布式数据库中存储的内部标识ID均不相同),则说明当前从分布式队列中获取的与上述获取消息请求对应的消息已经被客户端读取过,进而可以执行步骤105。
104、删除分布式数据库中存储的上述消息携带的内部标识ID,以及从获取的上述消息中删除上述内部标识ID,并将删除了上述内部标识ID的消息发送给客户端。
一个实施例中,如果发现从上述消息中提取的内部标识ID与分布式数据库中存储的某一个内部标识ID相同,则说明当前从分布式队列中获取的与上述获取消息请求对应的消息还没有被客户端读取过,此时去重复代理服务器可以删除分布式数据库中存储的上述消息携带的内部标识ID。这样即使分布式队列中还存在相同的消息(即消息的副本),也会因为分布式数据库中已删除了该消息中携带的内部标识ID,而不会发送给客户端进行处理,从而可以防止客户端从分布式队列中读取到相同的消息,降低消息重复处理的风险。
另外,去重复代理服务器删除分布式数据库中存储的上述消息携带的内部标识ID之后,可以将上述消息携带的内部标识ID删除,并将已删除内部标识ID的消息发送给客户端,使客户端可以对该消息进行业务处理。
105、发送错误响应给客户端。
一个实施例中,如果发现从上述消息中提取的内部标识ID与分布式数据库中存储的内部标识ID均不相同,则说明当前从分布式队列中获取的与上述获取消息请求对应的消息已经被客户端读取过,去重复代理服务器可以发送错误响应null给客户端,防止客户端从分布式队列中读取到相同的消息进行重复处理。
一个实施例中,本发明实施例提供的上述方法还可以包括以下步骤:
分布式队列发送与上述获取消息请求对应的消息给去重复代理服务器之后,分布式队列可以删除上述获取消息请求对应的消息的所有副本,从而可以尽量地避免客户端从分布式队列中读取到相同的消息进行重复处理,也使得分布式队列保持尽可能多的空闲空间,用于存储其他的消息及其副本。
一个实施例中,对应于上述读取过程,本发明实施例提供的上述方法在上述步骤101之前还可以包括消息的存储过程,该存储过程可以包括以下步骤:
A、去重复代理服务器接收客户端的输入消息。
B、去重复代理服务器为客户端输入消息生成内部标识ID,并将所述内部标识ID加入客户端输入消息。
一个实施例中,去重复代理服务器可以采用随机生成方式或哈希HASH算法为客户端输入消息生成内部标识ID,其中,去重复代理服务器为每一个客户端输入消息生成的内部标识ID互不相同。
C、去重复代理服务器将加入内部标识ID后的消息存储到分布式队列;其中,分布式队列还存储至少一个加入内部标识ID后的消息的副本。
D、去重复代理服务器将为客户端输入消息生成的内部标识ID存储到分布式数据库。
其中,通过上述步骤A~B,去重复代理服务器可以为客户端输入消息生成内部标识ID,并加入客户端输入消息,以及将加入内部标识ID后的消息存储到分布式队列,以及将为客户端输入消息生成的内部标识ID存储到分布式数据库,使得去重复代理服务器可以根据图1所示的方法进行分布式队列消息读取,避免客户端从分布式队列中读取到相同的消息,降低消息重复处理的风险。
其中,上述步骤C、步骤D之间的顺序可以调换,或者上述步骤C、步骤D可以同时进行,本发明实施例不作限定。
本发明实施例中,分布式队列存储的消息中携带有内部标识ID,当接收到客户端发送的获取消息请求后,可以从分布式队列中获取与该获取消息请求对应的消息,并判断分布式数据库中是否存储有该内部标识ID,如果有(即提取的内部标识ID与分布式数据库中存储的某一个内部标识ID相同),则可以删除分布式数据中存储的上述消息携带的内部标识ID,以及删除上述消息携带的内部标识ID,以及将删除了内部标识ID的消息发送给客户端。基于上述技术方案,即使分布式队列中存在相同的消息(即消息的副本),也会因为分布式数据库中已删除了该消息中携带的内部标识ID,而不会发送给客户端进行处理,从而可以防止客户端从分布式队列中读取到相同的消息,降低消息重复处理的风险。
请参阅图2,图2为图1所示方法包含的分布式队列消息存储方法的流程示意图。如图2所示,该分布式队列消息存储方法包括以下步骤:
201、去重复代理服务器接收客户端输入的消息M。
202、去重复代理服务器采用HASH算法为消息M生成内部标识ID,并将生成的内部标识ID加入消息M。
203、去重复代理服务器将为消息M生成的内部标识ID存储到分布式数据库。
204、去重复代理服务器接收分布式数据库返回的存储确认消息OK。
205、去重复代理服务器将加入内部标识ID后的消息M存储到分布式队列;其中,分布式队列还存储至少一个加入内部标识ID后的消息M的副本。
在图2所示方法中,也可以先执行上述步骤205,然后再执行步骤203和步骤204,本发明实施例不作限定。
在图2所示方法的基础上,去重复代理服务器可以根据图1所示的方法进行分布式队列消息读取,避免客户端从分布式队列中读取到相同的消息,降低消息重复处理的风险。
请参阅图3,图3为图2所示的分布式队列消息存储方法的模块化示意图。如图3所示,该分布式队列消息存储方法的过程如下:
(1)、客户端A发送消息给去重复代理服务器;
(2)、去重复代理服务器为客户端A发送的消息生成一个内部标识ID,并将该内部标识ID存入分布式数据库;
(3)、去重复代理服务器将加入内部标识ID后的客户端A发送的消息发送到分布式队列存储;其中,分布式队列还存储至少一个加入内部标识ID后的客户端A发送的消息的副本。
在图3所示模块图的基础上,去重复代理服务器可以根据图1所示的方法进行分布式队列消息读取,避免客户端从分布式队列中读取到相同的消息,降低消息重复处理的风险。
请参阅图4,图4为本发明实施例提供的另一种分布式队列消息读取方法的流程示意图。如图4所示,该分布式队列消息读取方法包括以下步骤:
401、去重复代理服务器接收客户端发送的获取消息请求Get。
402、去重复代理服务器将客户端发送的获取消息请求Get转发至分布式队列。
403、去重复代理服务器接收分布式队列发送的与上述获取消息请求Get对应的消息M,其中,该消息M中携带有内部标识ID。
404、去重复代理服务器提取上述消息M的内部标识ID。
405、去重复代理服务器基于提取的内部标识ID,判断出分布式数据库中没有存储有该内部标识ID(即提取的内部标识ID与分布式数据中存储的内部标识ID均不相同)。
406、去重复代理服务器发送错误响应null给客户端。
在图4所示的方法中,去重复代理服务器判断出分布式数据库中没有存储有该内部标识ID(即提取的内部标识ID与分布式数据中存储的内部标识ID均不相同),说明当前分布式队列发送的与上述获取消息请求Get对应的消息M已经被客户端读取过,去重复代理服务器可以发送错误响应null给客户端,避免客户端从分布式队列中读取到相同的消息进行重复处理。
请参阅图5,图5为本发明实施例提供的又一种分布式队列消息读取方法的流程示意图。如图5所示,该分布式队列消息读取方法包括以下步骤:
501、去重复代理服务器接收客户端发送的获取消息请求Get。
502、去重复代理服务器将客户端发送的获取消息请求Get转发至分布式队列。
503、去重复代理服务器接收分布式队列发送的与上述获取消息请求Get对应的消息M,其中,该消息M中携带有内部标识ID。
其中,分布式队列将与上述获取消息请求Get对应的消息M发送给去重复代理服务器之后,可以删除分布式队列中存储的消息M的所有副本。
504、去重复代理服务器提取上述消息M的内部标识ID。
505、去重复代理服务器基于提取的内部标识ID,判断出分布式数据库中存储有该内部标识ID(即提取的内部标识ID与分布式数据中存储的某一个内部标识ID相同)。
506、去重复代理服务器删除分布式数据库中存储的上述消息携带的内部标识ID。
507、去重复代理服务器将上述消息携带的内部标识ID删除,并将删除了内部标识ID的消息发送给客户端。
在图5所示的方法中,即使分布式队列中存在相同的消息(即消息的副本),也会因为分布式数据库中已删除了该消息中携带的内部标识ID,而不会发送给客户端进行处理,从而可以避免客户端从分布式队列中读取到相同的消息,降低消息重复处理的风险。
一个实施例中,分布式队列可能存在大量客户端并发访问,在这种情况下,应用本发明实施例提供的上述方法,可以避免客户端从分布式队列中读取到相同的消息,降低消息重复处理的风险。以下通过具体实施例进行详细说明。
请参阅图6,图6为本发明实施例提供的另一种分布式队列消息读取方法的模块化示意图。如图6所示,客户端A、B、C分别通过各自对应的去重复代理服务器并发访问分布式队列,即客户端A通过其对应的去重复代理服务器发送获取消息请求至分布式队列;客户端B通过其对应的去重复代理服务器发送获取消息请求至分布式队列;客户端C通过其对应的去重复代理服务器发送获取消息请求至分布式队列,从而构成对分布式队列的并发访问。
假设客户端A、B、C均需要读取分布式队列存储的消息M,则分布式队列在接收到客户端A、B、C通过各自对应的去重复代理服务器发送的获取消息请求之后,会对客户端A、B、C发送的获取消息请求逐一进行处理。例如,分布式队列可以根据预设策略或根据随机方式选取出客户端A发送的获取消息请求进行处理,即分布式队列可以根据客户端A发送的获取消息请求中携带的指示信息(例如消息自身标识),将与客户端A发送的获取消息请求对应的消息M发送给客户端A对应的去重复代理服务器;客户端A对应的去重复代理服务器接收到分布式队列发送的与客户端A发送的获取消息请求对应的消息M后,可以提取该消息M的内部标识ID,并且判断分布式数据库中是否存储有该内部标识ID,如果有,则删除分布式数据库中存储的该消息M携带的内部标识ID,以及将该消息M携带的内部标识ID删除,以及将删除了内部标识ID的消息发送给客户端A。
其中,分布式队列将与客户端A发送的获取消息请求对应的消息M发送给客户端A对应的去重复代理服务器之后,分布式队列可以启动删除消息M的所有副本操作。由于分布式队列删除消息M的所有副本是需要一段时间的,而在这段时间内分布式队列还会继续对客户端B、C的获取消息请求进行处理,因此在分布式队列删除完毕消息M的所有副本之前,分布式队列仍有可能将消息M的副本发送给客户端B或客户端C对应的去重复代理服务器。进一步地,假设分布式队列将消息M的副本发送给客户端B对应的去重复代理服务器,那么客户端B对应的去重复代理服务器接收到分布式队列发送的与客户端B发送的获取消息请求对应的M消息(即副本)后,可以提取该消息M的内部标识ID,并且判断分布式数据库中没有存储有该内部标识ID(已被客户端A对应的去重复代理服务器删除),则客户端B对应的去重复代理服务器发送错误响应null给客户端B,从而可以避免客户端B从分布式队列中读取到相同的消息M进行重复处理。
由此可见,本发明实施例提供的上述方法即使在分布式队列存在大量客户端并发访问的情况下,也可以避免客户端从分布式队列中读取到相同的消息,降低消息重复处理的风险。
本发明实施例中,在不损失分布式优势的情况下,去重复代理服务器对客户端是透明的,客户端还是像现有技术一样使用分布式队列,分布式队列不需要处理客户端读取重复的情况,降低了客户端使用分布式队列的难度,而且简化了使用分布式队列的分布式软件的设计与开发。
请参阅图7,图7为本发明实施例提供的一种分布式队列消息读取设备的结构示意图。如图7所示,该设备可以包括:
接收单元701,用于接收客户端发送的获取消息请求;
获取单元702,用于从分布式队列中获取与上述获取消息请求对应的消息,该消息中携带有内部标识ID;
判断单元703,用于基于提取的内部标识ID,判断分布式行数据库705中是否存储有该内部标识ID;
控制单元704,用于在判断单元703的判断结果为是时,删除分布式数据库705中存储的上述消息携带的内部标识ID,以及从获取的上述消息中删除上述内部标识ID,并将删除了上述内部标识ID的消息发送给客户端;或者用于在判断单元703的判断结果为否时,发送错误响应给客户端;
分布式数据库705,用于存储上述消息的内部标识ID;
请参阅图8,图8为本发明实施例提供的另一种分布式队列消息读取设备的结构示意图。如图8所示,该设备在图7所示设备的基础上,进一步还包括生成单元706、存储单元707。在图8所示的设备中,接收单元701还用于接收客户端输入消息,相应地,生成单元706用于为客户端输入消息生成内部标识ID,并加入客户端输入消息;存储单元707用于将加入内部标识ID后的客户端输入消息存储到分布式队列;其中,该分布式队列还存储至少一个加入内部标识ID后的客户端输入消息的副本;以及将为客户端输入消息生成的内部标识ID存储到分布式数据库705。
作为一个可选的实施方式,图8所示的设备中生成单元706具体用于采用随机生成方式或哈希HASH算法为客户端输入消息生成内部标识ID,并加入客户端输入消息;其中,为每一个客户端输入消息生成的内部标识ID互不相同。
作为一个可选的实施方式,图7、图8所示的设备中,获取单元702具体用于将客户端发送的获取消息请求转发至分布式队列,以及接收分布式队列发送的与上述获取消息请求对应的消息,该消息中携带有内部标识ID。
一个实施例中,分布式队列发送与上述获取消息请求对应的消息给获取单元702之后,分布式队列还用于该消息的所有副本。
本发明实施例中,分布式队列存储的消息中携带有内部标识ID,当接收单元701接收到客户端发送的获取消息请求后,获取单元702可以从分布式队列中获取与该获取消息请求对应的消息,判断单元703基于提取的内部标识ID,可以判断分布式数据库中是否存储有该内部标识ID,如果有,则控制单元704删除分布式数据库705中存储的上述消息携带的内部标识ID,以及将上述消息携带的内部标识ID删除,以及将删除了内部标识ID的消息发送给客户端。基于上述技术方案,即使分布式队列中存在相同的消息(即消息的副本),也会因为分布式数据库中已删除了该消息携带的内部标识ID,而不会发送给客户端进行处理,从而可以防止客户端从分布式队列中读取到相同的消息,降低消息重复处理的风险。
请参阅图9,图9为本发明实施例提供的一种分布式队列消息读取系统的结构示意图。如图9所示,该系统可以包括客户端901以及分布式队列消息读取设备902;其中,分布式队列消息读取设备902的结构、功能均与图7或图8所示的分布式队列消息读取设备相同,本发明实施例不作复述。
其中,客户端901用于发送获取消息请求给分布式队列消息读取设备902,以及接收分布式队列消息读取设备902发送的与获取消息请求对应的消息进行业务处理。
本发明实施例提供的分布式队列消息读取系统可以避免客户端901从分布式队列中读取到相同的消息,降低消息重复处理的风险。
在上述实施例描述的方法、设备和系统中,为客户端输入消息生成的内部标识ID是存储在分布式数据库中的,进而可以避免客户端从分布式队列中读取到相同的消息,降低消息重复处理的风险。作为另一种可选的实施方式,为客户端输入消息生成的内部标识ID也可以存储在分布式行级锁中,同样可以避免客户端从分布式队列中读取到相同的消息,降低消息重复处理的风险。以下分别进行详细说明。
请参阅图10,图10为本发明实施例提供的另一种分布式队列消息读取方法的流程示意图。如图10所示,该方法可以包括以下步骤:
其中,步骤1001、1002分别与上述实施例中的步骤101、102相同,本发明实施例此处不作复述。
1003、提取上述消息的内部标识ID,并根据该内部标识ID确定出对应的分布式行级锁。
本发明实施例中,每一个分布式行级锁中均存储一个关键值key-Value值对,如果某一个分布式行级锁中存储的关键值key=上述内部标识ID,则可以确定出对应的分布式行级锁。本发明实施例后续将对分布式行级锁进行详细介绍。
1004、判断确定出的分布式行级锁中存储的Value值是否表示可读,如果是,则执行步骤1005;如果否,则执行步骤1006。
一个实施例中,Value值=上述内部标识ID时,可以表示可读,而Value值为其他数值时表示不可读;或者,Value值为非零值时表示可读,而Value值为零时表示不可读,本发明实施例不作限定。
一个实施例中,去重复代理服务器提取上述消息的内部标识ID之后,可以根据该内部标识ID确定出对应的分布式行级锁,如果发现分布式行级锁中存储的Value值表示可读,则说明当前从分布式队列中获取的与上述获取消息请求对应的消息还没有被客户端读取过,进而可以执行步骤1005;反之,如果发现分布式行级锁中存储的Value值表示不可读,则说明当前从分布式队列中获取的与上述获取消息请求对应的消息已经被客户端读取过,进而可以执行步骤1006。
1005、将Value值置为表示不可读,以及从获取的上述消息中删除上述内部标识ID,并将删除了上述内部标识ID的消息发送给客户端。
一个实施例中,如果发现分布式行级锁中存储的Value值表示可读,则说明当前从分布式队列中获取的与上述获取消息请求对应的消息还没有被客户端读取过,此时去重复代理服务器可以将分布式行级锁中存储的Value值置为表示不可读,这样即使分布式队列中还存在相同的消息(即消息的副本),也会因为分布式行级锁中存储的Value值表示不可读,而不会发送给客户端进行处理,从而可以避免客户端从分布式队列中读取到相同的消息,降低消息重复处理的风险。
另外,去重复代理服务器将分布式行级锁中存储的Value值设为表示不可读之后,可以删除上述消息携带的内部标识ID,并将已删除内部标识ID的消息发送给客户端,使得客户端可以对该消息进行业务处理。
1006、发送错误响应给客户端。
一个实施例中,如果发现分布式行级锁中存储的Value值表示不可读,则说明当前从分布式队列中获取的与上述获取消息请求对应的消息已经被客户端读取过,去重复代理服务器可以发送错误响应null给客户端,避免客户端从分布式队列中读取到相同的消息进行重复处理。
一个实施例中,图10所示的方法还可以包括以下步骤:
分布式队列发送与上述获取消息请求对应的消息给去重复代理服务器之后,分布式队列可以删除上述获取消息请求对应的消息的所有副本,从而可以尽量地避免客户端从分布式队列中读取到相同的消息进行重复处理,也使得分布式队列保持尽可能多的空闲空间,用于存储其他的消息及其副本。
一个实施例中,对应于上述读取过程,图10所示的方法在上述步骤1001之前还可以包括消息的存储过程,该存储过程可以包括以下步骤:
A、去重复代理服务器接收客户端的输入消息。
B、去重复代理服务器为客户端输入消息生成内部标识ID,并将该内部标识ID加入客户端输入消息。
一个实施例中,去重复代理服务器可以采用随机生成方式或哈希HASH算法为客户端输入消息生成内部标识ID,其中,去重复代理服务器为每一个客户端输入消息生成的内部标识ID互不相同。
C、去重复代理服务器将加入内部标识ID后的消息存储到分布式队列;其中,分布式队列还存储至少一个加入内部标识ID后的消息的副本。
D、将为客户端输入消息生成的内部标识ID作为关键值key存储到分布式行级锁中,该关键值key与一个Value值匹配(即分布式行级锁中存储一个key-Value值对),Value值表示可读。
其中,通过上述步骤A~B,去重复代理服务器可以为客户端输入消息生成内部标识ID,并加入客户端输入消息,以及将加入内部标识ID后的消息存储到分布式队列,以及将为客户端输入消息生成的内部标识ID存储到分布式行级锁,使得去重复代理服务器可以根据图10所示的方法进行分布式队列消息读取,避免客户端从分布式队列中读取到相同的消息,降低消息重复处理的风险。
其中,上述步骤C、步骤D之间的顺序可以调换,或者上述步骤C、步骤D可以同时进行,本发明实施例不作限定。
图10所示的方法中,当接收到客户端发送的获取消息请求后,去重复代理服务器可以从分布式队列中获取与该获取消息请求对应的消息并提取该消息携带的内部标识ID,以及根据该消息携带的内部标识ID确定出分布式行级锁后,识别分布式行级锁中存储的Value值是否表示可读,若可读,则将该Value值置为表示不可读,以及将该消息携带的内部标识ID删除,以及将删除内部标识ID的消息发送给客户端。基于该技术方案,即使分布式队列中存在相同的消息(即消息的副本),也会因为分布式行级锁中的Value值表示不可读,而不会发送给客户端进行处理,从而可以避免客户端从分布式队列中读取到相同的消息,降低消息重复处理的风险。
请参阅图11,图11为图10所示方法包含的分布式队列消息存储方法的流程示意图。如图11所示,该分布式队列消息存储方法包括以下步骤:
1101、去重复代理服务器接收客户端输入的消息M。
1102、去重复代理服务器采用HASH算法为消息M生成内部标识ID,并将生成的内部标识ID加入消息M。
1103、去重复代理服务器将为消息M生成的内部标识ID,将该内部标识ID作为关键值key存储到分布式行级锁中,该关键值key与一个Value值匹配(即分布式行级锁中存储一个key-Value值对),该Value值表示可读。
1104、去重复代理服务器接收分布式行级锁返回的存储确认消息OK。
1105、去重复代理服务器将加入内部标识ID后的消息M存储到分布式队列;其中,分布式队列还存储至少一个加入内部标识ID后的消息M的副本。
在图11所示方法中,也可以先执行上述步骤1105,然后再执行步骤1103和步骤1104,本发明实施例不作限定。
在图11所示方法的基础上,去重复代理服务器可以根据图10所示的方法进行分布式队列消息读取,避免客户端从分布式队列中读取到相同的消息,降低消息重复处理的风险。
请参阅图12,图12为图11所示的分布式队列消息存储方法的模块化示意图。如图12所示,该分布式队列消息存储方法的过程如下:
(1)、客户端A发送消息给去重复代理服务器;
(2)、去重复代理服务器为客户端A发送的消息生成一个内部标识ID,并将该内部标识ID作为关键值key存储到分布式行级锁中,该关键值key与一个Value值匹配(即分布式行级锁中存储一个key-Value值对),Value值表示可读;
(3)、去重复代理服务器将加入内部标识ID后的客户端A发送的消息发送到分布式队列存储;其中,分布式队列还存储至少一个加入内部标识ID后的客户端A发送的消息的副本。
在图12所示模块图的基础上,去重复代理服务器可以根据图10所示的方法进行分布式队列消息读取,避免客户端从分布式队列中读取到相同的消息,降低消息重复处理的风险。
请参阅图13,图13为本发明实施例提供的另一种分布式队列消息读取方法的流程示意图。如图13所示,该分布式队列消息读取方法包括以下步骤:
1301、去重复代理服务器接收客户端发送的获取消息请求Get。
1302、去重复代理服务器将客户端发送的获取消息请求Get转发至分布式队列。
1303、去重复代理服务器接收从分布式队列中获取与上述获取消息请求Get对应的消息M,其中,该消息M中携带有内部标识ID。
1304、去重复代理服务器提取上述消息M的内部标识ID。
1305、去重复代理服务器根据该内部标识ID确定出对应的分布式行级锁,以及判断出该分布式行级锁中存储的Value值表示不可读;
1306、去重复代理服务器发送错误响应null给客户端。
在图13所示的方法中,去重复代理服务器判断出该分布式行级锁中存储的Value值表示不可读时,说明当前从分布式队列中获取的与上述获取消息请求Get对应的消息M已经被客户端读取过,去重复代理服务器可以发送错误响应null给客户端,避免客户端从分布式队列中读取到相同的消息进行重复处理。
请参阅图14,图14为本发明实施例提供的又一种分布式队列消息读取方法的流程示意图。如图14所示,该分布式队列消息读取方法包括以下步骤:
1401、去重复代理服务器接收客户端发送的获取消息请求Get。
1402、去重复代理服务器将客户端发送的获取消息请求Get转发至分布式队列。
1403、去重复代理服务器接收分布式队列发送的与上述获取消息请求Get对应的消息M,其中,该消息M中携带有内部标识ID。
其中,分布式队列将与上述获取消息请求Get对应的消息M发送给去重复代理服务器之后,可以删除分布式队列中存储的消息M的所有副本。
1404、去重复代理服务器提取上述消息M的内部标识ID。
1405、去重复代理服务器根据该内部标识ID确定出对应的分布式行级锁,以及判断出该分布式行级锁中存储的Value值表示可读。
1406、去重复代理服务器将该分布式行级锁中存储的Value值置为表示不可读。
1407、去重复代理服务器将上述消息携带的内部标识ID删除,以及将删除内部标识ID的消息发送给客户端。
在图14所示的方法中,即使分布式队列中存在相同的消息(即消息的副本),也会因为分布式行级锁中存储的Value值表示不可读,而不会发送给客户端进行处理,从而可以避免客户端从分布式队列中读取到相同的消息,降低消息重复处理的风险。
本发明实施例提供的上述方法即使在分布式队列存在大量客户端并发访问的情况下,也可以防止客户端从分布式队列中读取到相同的消息,降低消息重复处理的风险。
本发明实施例中,上述的分布式行级锁的设计思路可以如下:
1、由于客户端发送的消息携带有自身标识(属于现有技术),因此,可以以消息携带的自身标识为基础,并通过Hash算法生成一个内部标识ID(因为Hash算法的原理,不同的消息就会对应到不同的内部标识ID)。
2、将生成的内部标识ID作为Key存储到分布式行级锁中,构成一个key-Value值对,Value值可以为任意非空的数值(例如Key=内部标识ID,value=内部标识ID),表示可读。
3、上述存储key-Value值对的分布式行级锁可以看作是采用分布式哈希表(DistributedHashTable,DHT)算法实现的一个KV存储引擎。其中,KV存储引擎存放数据的原理是先把存放数据的空间固定并形成0~2^32环形(如图15所示的DHT原理图),然后将存放数据的主机标识通过Hash算法生成一个值,这个值在数据空间上形成一个主机节点,然后在存放Key-Value值对时,KV存储引擎会将Key通过Hash算法得到一个Hash值,该Hash值在存储空间环上表示为一个值节点,如果该值节点没有落在一个主机节点上,那么KV存储引擎会沿着存储空间环顺时针找到第一个(或者N个,如果需要N个备份)主机节点即存储该键值对主机。
4、当去重复代理服务器根据提取的内部标识ID确定出对应的分布式行级锁(即KV存储引擎),并判断确定出的分布式行级锁(即KV存储引擎)中存储的内部标识ID(即Key)对应的Value值是否表示可读时,这一过程又被称为获取锁过程;若Value值表示可读,则说明当前从分布式队列中获取的与上述获取消息请求对应的消息还没有被客户端读取过,客户端可以读取。其中,客户端能够读到消息就表示获取了锁。
5、当去代理服务器将上述消息携带的内部标识ID删除并发送给客户端后,可以将分布式行级锁(即KV存储引擎)存储的Value值置为表示不可读(例如Value值置空,或为零),以使其他客户端无法再去读这个消息,这一过程又被称为加锁过程。
上述步骤3描述了KV存储引擎的DHT实现原理,其中,Key-Value值对会均匀的分布在某个主机(或某几个主机)上,在整个分布式对外服务的过程中,对分布式行级锁的访问也会均匀的分布到不同的主机上,不会产生对一台主机的海量访问,避免分布式行级锁成为新的性能瓶颈。
请参阅图16,图16为本发明实施例提供的另一种分布式队列消息读取设备的结构示意图。如图16所示,该设备可以包括:
第二接收单元1601,用于接收客户端发送的获取消息请求;
第二获取单元1602,用于从分布式队列中获取与上述获取消息请求对应的消息,该消息中携带有内部标识ID;
提取单元1603,用于提取上述消息的内部标识ID,并根据该内部标识ID确定出对应的分布式行级锁1606;
识别单元1604,用于识别上述分布式行级锁1606中存储的Value值是否表示可读;
第二控制单元1605,用于在上述分布式行级锁1606中存储的Value值表示可读时,将Value值置为表示不可读,以及从获取的上述消息中删除上述内部标识ID,并将删除了上述内部标识ID的消息发送给客户端。
请参阅图17,图17为本发明实施例提供的另一种分布式队列消息读取设备的结构示意图。如图17所示,该设备在图16所示设备的基础上,还进一步包括第二生成单元1607、第二存储单元1608。在图17所示的设备中,第二接收单元1601还用于接收客户端输入消息;相应地,第二生成单元1607用于为客户端输入消息生成内部标识ID,并加入客户端输入消息;第二存储单元1608用于将加入内部标识ID后的客户端输入消息存储到分布式队列;其中,该分布式队列还存储至少一个加入内部标识ID后的客户端输入消息的副本;以及第二存储单元1608将为客户端输入消息生成的内部标识ID作为关键值key存储到分布式行级锁1606中,该关键值key与一个Value值匹配,该Value值表示可读。
一个实施例中,当提取单元1603提取的分布式行级锁存储的关键值key=上述内部标识ID时,就可以确定出对应的分布式行级锁1606。
请参阅图18,图18为本发明实施例提供的一种分布式队列消息读取系统的结构示意图。如图18所示,该系统可以包括客户端1801以及分布式队列消息读取设备1802;其中,分布式队列消息读取设备1802的结构、功能均与图16或图17所示的分布式队列消息读取设备相同,本发明实施例不作复述。
其中,客户端1801用于发送获取消息请求给分布式队列消息读取设备1802,以及接收分布式队列消息读取设备1802发送的与获取消息请求对应的消息进行业务处理。
基于上述技术方案,即使分布式队列中存在相同的消息(即消息的副本),也会因为分布式行级锁中的Value值表示不可读,而不会发送给客户端进行处理,从而可以避免客户端从分布式队列中读取到相同的消息,降低消息重复处理的风险。
本领域普通技术人员可以理解:实现上述方法实施例的全部或部分步骤可以通过程序指令相关的硬件来完成,前述的程序可以存储于一计算机可读取存储介质中,该程序在执行时,执行包括上述方法实施例的步骤;而前述的存储介质包括:只读存储器(Read-OnlyMemory,ROM)、随机存取存储器(RandomAccessMemory,RAM)、磁碟或者光盘等各种可以存储程序代码的介质。
以上对本发明实施例所提供的一种分布式队列消息读取方法及设备、系统进行了详细介绍,本文中应用了具体个例对本发明的原理及实施方式进行了阐述,以上实施例的说明只是用于帮助理解本发明的方法及其核心思想;同时,对于本领域的一般技术人员,依据本发明的思想,在具体实施方式及应用范围上均会有改变之处,综上所述,本说明书内容不应理解为对本发明的限制。