具体实施方式
下面将结合本发明实施例中的附图,对本发明实施例中的技术方案进行清 楚、 完整地描述, 显然, 所描述的实施例仅仅是本发明一部分实施例, 而不是 全部的实施例。基于本发明中的实施例, 本领域普通技术人员在没有作出创造 性劳动前提下所获得的所有其他实施例, 都属于本发明保护的范围。
本发明实施例提供的一种分布式队列消息读取方法及设备、 系统, 能够避 免客户端从分布式队列中读取到相同的消息, 降低消息重复处理的风险。 以下 分别进行详细说明。
请参阅图 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所示的方法进行分布式队列消息 读取,避免客户端从分布式队列中读取到相同的消息, 降低消息重复处理的风 险。
其中, 上述步骤( 、 步骤 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存储到分布式队 歹1 J; 其中, 分布式队列还存储至少一个加入内部标识 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发送的获取消息请求对应 的消息 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所示的方法进行分布式队列消 息读取,避免客户端从分布式队列中读取到相同的消息, 降低消息重复处理的 风险。
其中, 上述步骤( 、 步骤 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存储到分布式队 歹l ; 其中, 分布式队列还存储至少一个加入内部标识 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 , 其中, 该消息 Μ中携带有内部标识 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值对的分布式行级锁可以看作是采用分布式哈希表 ( Distributed Hash Table, 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-Only Memory, ROM )、随机存取存储器 ( Random Access Memory, RAM ), 磁碟或者光盘等各种可以存储程序代码的介质。
以上对本发明实施例所提供的一种分布式队列消息读取方法及设备、系统 述, 以上实施例的说明只是用于帮助理解本发明的方法及其核心思想; 同时, 对于本领域的一般技术人员,依据本发明的思想,在具体实施方式及应用范围 上均会有改变之处, 综上所述, 本说明书内容不应理解为对本发明的限制。