消息存储、读取方法及装置、服务器、存储介质转让专利

申请号 : CN201811014981.X

文献号 : CN109271106B

文献日 :

基本信息:

PDF:

法律信息:

相似专利:

发明人 : 彭伟

申请人 : 华为技术有限公司

摘要 :

本申请公开了一种消息存储、读取方法及装置、服务器、存储介质,属于通信技术领域。该方法包括:消息存储方法,该方法应用于卡夫卡Kafka集群;该方法包括:接收在该Kafka集群存储消息的第一消息存储请求,该第一消息存储请求指定在虚拟存储地址存储该第一消息存储请求指定的消息,该虚拟存储地址包括虚拟话题topic的标识和虚拟分区的标识;基于虚拟存储地址与第一真实存储地址的对应关系,确定与该虚拟存储地址对应的第一真实存储地址,该第一真实存储地址包括第一真实topic的标识和第一真实分区的标识;在该第一真实存储地址指定的该第一真实topic中的该第一真实分区,存储该第一消息存储请求指定的消息。本申请实现了消息的存储。

权利要求 :

1.一种消息存储方法,其特征在于,所述方法应用于卡夫卡Kafka集群;所述方法包括:接收在所述Kafka集群存储消息的第一消息存储请求,所述第一消息存储请求指定在虚拟存储地址存储所述第一消息存储请求指定的消息,所述虚拟存储地址包括虚拟话题topic的标识和虚拟分区的标识;

基于所述虚拟存储地址与第一真实存储地址的对应关系,确定与所述虚拟存储地址对应的所述第一真实存储地址,所述第一真实存储地址包括第一真实topic的标识和第一真实分区的标识;

在所述第一真实存储地址指定的所述第一真实topic中的所述第一真实分区,存储所述第一消息存储请求指定的消息。

2.根据权利要求1所述的方法,其特征在于,所述方法还包括:

接收在所述Kafka集群存储消息的第二消息存储请求,所述第二消息存储请求指定在所述虚拟存储地址存储所述第二消息存储请求指定的消息;

基于所述虚拟存储地址与第二真实存储地址的对应关系,确定与所述虚拟存储地址对应的所述第二真实存储地址,所述第二真实存储地址包括第二真实topic的标识和第二真实分区的标识;

在所述第二真实存储地址指定的所述第二真实topic中的所述第二真实分区,存储所述第二消息存储请求指定的消息。

3.根据权利要求2所述的方法,其特征在于,所述第一真实分区与所述第二真实分区部署在所述Kafka集群中的不同存储节点上。

4.根据权利要求2或3所述的方法,其特征在于,所述第二消息存储请求的接收时间晚于所述第一消息存储请求的接收时间。

5.根据权利要求4所述的方法,其特征在于,所述方法还包括:

在接收所述第二消息存储请求之前,预估在预设时间段内接收的所述第二消息存储请求所指定的消息的预存数据量;

当所述预存数据量大于第一阈值时,建立所述虚拟存储地址与所述第二真实存储地址的对应关系。

6.根据权利要求4所述的方法,其特征在于,所述方法包括:

在接收所述第二消息存储请求之前,预估在预设时间段内待在所述第一真实分区所在的第一真实topic中存储的消息的预存数据量;

当所述预存数据量大于第二阈值时,建立所述虚拟存储地址与所述第二真实存储地址的对应关系。

7.根据权利要求5或6所述的方法,其特征在于,所述建立所述虚拟存储地址与所述第二真实存储地址的对应关系,包括:对于与所述第一真实topic存在对应关系的多个目标虚拟topic,基于所述目标虚拟topic的第三数据量,查找可用数据量大于所述第三数据量的真实topic,所述可用数据量为所述真实topic的数据量额度与所述预存数据量的差值;

当确定存在可用数据量大于所述第三数据量的真实topic时,将所述可用数据量大于所述第三数据量的真实topic确定为第二真实topic;

当确定不存在可用数据量大于所述第三数据量的真实topic时,在所述消息存储系统中创建第二真实topic;

将与所述目标虚拟topic对应的虚拟存储地址与真实存储地址的对应关系,修改为所述虚拟存储地址与包括所述第二真实topic的第二真实存储地址对应。

8.根据权利要求5至6任一所述的方法,其特征在于,所述建立所述虚拟存储地址与所述第二真实存储地址的对应关系,还包括:确定第一消息在所述第二真实topic中的消息偏移量,所述第一消息为基于所述虚拟存储地址与所述第二真实存储地址的对应关系,存储在所述第二真实topic中的第一个消息;

将所述第一消息的消息偏移量,及所述虚拟存储地址与所述第二真实存储地址的对应关系,存储在目标虚拟topic对应的索引文件中。

9.根据权利要求1至3任一所述的方法,其特征在于,每个真实存储地址与多个虚拟存储地址存在对应关系。

10.一种消息读取方法,其特征在于,所述方法应用于卡夫卡Kafka集群;所述方法包括:接收在所述Kafka集群读取消息的消息读取请求,所述消息读取请求指定从虚拟存储地址读取消息,所述虚拟存储地址包括虚拟topic的标识和虚拟分区的标识;

基于所述虚拟存储地址与真实存储地址的对应关系,确定与所述虚拟存储地址对应的目标真实存储地址,所述目标真实存储地址包括目标真实topic的标识和目标真实分区的标识;

在所述目标真实存储地址指定的目标真实分区读取所述消息读取请求所指定的消息。

11.根据权利要求10所述的方法,其特征在于,所述消息读取请求中携带有待读取消息的目标偏移量,所述确定与所述虚拟存储地址对应的目标真实存储地址,包括:获取目标索引文件中记载的第一消息的消息偏移量,所述第一消息为基于所述虚拟存储地址与真实存储地址的当前对应关系,存储在所述当前对应关系指定的真实topic中的第一个消息,所述目标索引文件为所述虚拟存储地址指定的虚拟topic对应的索引文件;

当所述目标偏移量大于或等于所述消息偏移量时,将所述当前对应关系中记载的真实存储地址确定为所述目标真实存储地址;

当所述目标偏移量小于所述消息偏移量时,将所述虚拟存储地址与真实存储地址的历史对应关系中记载的真实存储地址确定为所述目标真实存储地址,所述当前对应关系中记载的真实存储地址与所述历史对应关系中记载的真实存储地址不同。

12.一种消息存储装置,其特征在于,所述装置包括:

接收模块,用于接收在Kafka集群存储消息的第一消息存储请求,所述第一消息存储请求指定在虚拟存储地址存储所述第一消息存储请求指定的消息,所述虚拟存储地址包括虚拟话题topic的标识和虚拟分区的标识;

确定模块,用于基于所述虚拟存储地址与第一真实存储地址的对应关系,确定与所述虚拟存储地址对应的所述第一真实存储地址,所述第一真实存储地址包括第一真实topic的标识和第一真实分区的标识;

存储模块,用于在所述第一真实存储地址指定的所述第一真实topic中的所述第一真实分区,存储所述第一消息存储请求指定的消息。

13.根据权利要求12所述的装置,其特征在于,

所述接收模块,用于接收在所述Kafka集群存储消息的第二消息存储请求,所述第二消息存储请求指定在所述虚拟存储地址存储所述第二消息存储请求指定的消息;

所述确定模块,用于基于所述虚拟存储地址与第二真实存储地址的对应关系,确定与所述虚拟存储地址对应的所述第二真实存储地址,所述第二真实存储地址包括第二真实topic的标识和第二真实分区的标识;

所述存储模块,用于在所述第二真实存储地址指定的所述第二真实topic中的所述第二真实分区,存储所述第二消息存储请求指定的消息。

14.根据权利要求13所述的装置,其特征在于,所述第一真实分区与所述第二真实分区部署在所述Kafka集群中的不同存储节点上。

15.根据权利要求13或14所述的装置,其特征在于,所述第二消息存储请求的接收时间晚于所述第一消息存储请求的接收时间。

16.根据权利要求15所述的装置,其特征在于,所述装置还包括:预估模块,用于预估在预设时间段内接收的所述第二消息存储请求所指定的消息的预存数据量;

建立模块,用于当所述预存数据量大于第一阈值时,建立所述虚拟存储地址与所述第二真实存储地址的对应关系。

17.根据权利要求15所述的装置,其特征在于,所述装置包括:

预估模块,用于预估在预设时间段内待在所述第一真实分区所在的第一真实topic中存储的消息的预存数据量;

建立模块,用于当所述预存数据量大于第二阈值时,建立所述虚拟存储地址与所述第二真实存储地址的对应关系。

18.根据权利要求16或17所述的装置,所述建立模块,包括:

查找子模块,用于对于与所述第一真实topic存在对应关系的多个目标虚拟topic,基于所述目标虚拟topic的第三数据量,查找可用数据量大于所述第三数据量的真实topic,所述可用数据量为所述真实topic的数据量额度与所述预存数据量的差值;

确定子模块,用于当确定存在可用数据量大于所述第三数据量的真实topic时,将所述可用数据量大于所述第三数据量的真实topic确定为第二真实topic;

所述确定子模块,用于当确定不存在可用数据量大于所述第三数据量的真实topic时,在所述消息存储系统中创建第二真实topic;

修改子模块,用于将与所述目标虚拟topic对应的虚拟存储地址与真实存储地址的对应关系,修改为所述虚拟存储地址与包括所述第二真实topic的第二真实存储地址对应。

19.根据权利要求16至17任一所述的装置,其特征在于,所述建立模块,还用于:确定第一消息在所述第二真实topic中的消息偏移量,所述第一消息为基于所述虚拟存储地址与所述第二真实存储地址的对应关系,存储在所述第二真实topic中的第一个消息;

将所述第一消息的消息偏移量,及所述虚拟存储地址与所述第二真实存储地址的对应关系,存储在目标虚拟topic对应的索引文件中。

20.根据权利要求12至14任一所述的装置,其特征在于,每个真实存储地址与多个虚拟存储地址存在对应关系。

21.一种消息读取装置,其特征在于,所述装置包括:

接收模块,用于接收在Kafka集群读取消息的消息读取请求,所述消息读取请求指定从虚拟存储地址读取消息,所述虚拟存储地址包括虚拟topic的标识和虚拟分区的标识;

确定模块,用于基于所述虚拟存储地址与真实存储地址的对应关系,确定与所述虚拟存储地址对应的目标真实存储地址,所述目标真实存储地址包括目标真实topic的标识和目标真实分区的标识;

读取模块,用于在所述目标真实存储地址指定的目标真实分区读取所述消息读取请求所指定的消息。

22.根据权利要求21所述的装置,其特征在于,所述消息读取请求中携带有待读取消息的目标偏移量,所述确定模块,用于:获取目标索引文件中记载的第一消息的消息偏移量,所述第一消息为基于所述虚拟存储地址与真实存储地址的当前对应关系,存储在所述当前对应关系指定的真实topic中的第一个消息,所述目标索引文件为所述虚拟存储地址指定的虚拟topic对应的索引文件;

当所述目标偏移量大于或等于所述消息偏移量时,将所述当前对应关系中记载的真实存储地址确定为所述目标真实存储地址;

当所述目标偏移量小于所述消息偏移量时,将所述虚拟存储地址与真实存储地址的历史对应关系中记载的真实存储地址确定为所述目标真实存储地址,所述当前对应关系中记载的真实存储地址与所述历史对应关系中记载的真实存储地址不同。

23.一种服务器,其特征在于,包括处理器和存储器;

在所述处理器执行所述存储器存储的计算机程序时,所述服务器执行权利要求1至6任一所述的消息存储方法。

24.一种服务器,其特征在于,包括处理器和存储器;

在所述处理器执行所述存储器存储的计算机程序时,所述服务器执行权利要求10或11所述的消息读取方法。

25.一种存储介质,其特征在于,所述存储介质内存储有计算机程序,所述计算机程序指示服务器执行权利要求1至6任一所述的消息存储方法。

26.一种存储介质,其特征在于,所述存储介质内存储有计算机程序,所述计算机程序指示服务器执行权利要求10或11所述的消息读取方法。

说明书 :

消息存储、读取方法及装置、服务器、存储介质

技术领域

[0001] 本申请实施例涉及数据处理技术领域,特别涉及一种消息存储、读取方法及装置、服务器、存储介质。

背景技术

[0002] 卡夫卡(简称:Kafka)系统是一种具有高吞吐量的分布式发送订阅消息系统。该Kafka系统可存储多类消息,每类消息称为一个话题(英文:topic),每个topic具有多个分区,每个topic的所有分区分担存储属于该topic的消息。
[0003] Kafka集群用于部署Kafka系统;Kafka集群具有多个存储节点;该存储节点可以是服务器或者其它具有计算能力的设备;例如Kafka集群中的多个存储节点可以是跨数据中心。Kafka系统中的每个topic可以部署在Kafka集群中的一个或多个存储节点上;如果topic是存储在多个存储节点上,则该topic具有的多个分区可以分布式地部署在该多个存储节点上;如果topic是存储在一个存储节点上,则该topic具有的多个分区均部署在该个存储节点上。
[0004] 相关技术中,当客户端请求向Kafka集群存储消息时,该客户端可以指定用于存储消息的topic和分区。该存储请求会被发送至目标存储节点(部署有该topic的该分区的存储节点),目标存储节点部署有该topic的该分区的服务端。当该服务端接收到该存储请求时,该目标存储节点(具体是其上部署的该服务端)将该消息存储至该topic的该分区中。这种存储消息的方法,可能存在部分topic的部分分区工作负载过重的问题,尤其是在大量客户端集中指定向同一topic的同一分区存储消息的场景。

发明内容

[0005] 本申请实施例提供了一种消息存储、读取方法及装置、服务器、存储介质,可以解决相关技术中可能存在部分topic的部分分区工作负载过重的问题的问题。所述技术方案包括:
[0006] 根据本申请的第一方面,提供了一种消息存储方法,该方法应用于卡夫卡Kafka集群;该方法包括:接收在该Kafka集群存储消息的第一消息存储请求,该第一消息存储请求指定在虚拟存储地址存储该第一消息存储请求指定的消息,该虚拟存储地址包括虚拟话题topic的标识和虚拟分区的标识;基于虚拟存储地址与第一真实存储地址的对应关系,确定与该虚拟存储地址对应的第一真实存储地址,该第一真实存储地址包括第一真实topic的标识和第一真实分区的标识;在该第一真实存储地址指定的该第一真实topic中的该第一真实分区,存储该第一消息存储请求指定的消息。
[0007] 本申请实施例提供的消息存储方法,在接收在Kafka集群存储消息的消息存储请求后,通过根据虚拟存储地址与真实存储地址的对应关系,确定用于存储消息的真实存储地址,并将消息存储在该真实存储地址指定的真实分区中,实现了消息的存储。
[0008] 可选地,该方法还包括:接收在该Kafka集群存储消息的第二消息存储请求,该第二消息存储请求指定在该虚拟存储地址存储该第二消息存储请求指定的消息;基于虚拟存储地址与第二真实存储地址的对应关系,确定与该虚拟存储地址对应的第二真实存储地址,该第二真实存储地址包括第二真实topic的标识和第二真实分区的标识;在该第二真实存储地址指定的该第二真实topic中的该第二真实分区,存储该第二消息存储请求指定的消息。
[0009] 在虚拟存储地址与第二真实存储地址对应时,当接收到在该Kafka集群存储消息的第二消息存储请求,可以将指定存储在虚拟存储地址中的消息存储在第二真实存储地址中,能够将指定存储在相同虚拟存储地址中的消息存储在不同的真实存储地址中,能够将虚拟存储地址指定的虚拟topic的工作负载(流量或数据量)分摊到不同的存储节点上,能够减小同一存储节点中多个topic的工作负载不均衡程度,降低多个topic在某一存储节点中出现占用资源不均衡的几率。
[0010] 其中,第一真实分区与第二真实分区可以部署在所述Kafka集群中的不同存储节点上。
[0011] 并且,该第二消息存储请求的接收时间可以晚于该第一消息存储请求的接收时间。相应地,该方法还包括:在接收该第二消息存储请求之前,预估在预设时间段内接收的该第二消息存储请求所指定的消息的预存数据量;当该预存数据量大于第一阈值时,建立该虚拟存储地址与该第二真实存储地址的对应关系。
[0012] 当预存数据量为预估的在预设时间段内接收的第二消息存储请求所指定的消息的数据量时,若该预存数据量大于第一阈值,表示该第二消息存储请求所指定的消息具有较大的存储需求,此时,可以将虚拟存储地址与真实存储地址的对应关系修改为虚拟存储地址与第二真实存储地址对应,以将该第二消息存储请求多指定的消息存储在更有能力支撑该存储需求的真实分区中,进而提高消息存储系统的存储性能。
[0013] 作为一种可实现方式,该预估在预设时间段内接收的该第二消息存储请求所指定的消息的预存数据量的实现过程,可以包括:对于与该第一真实topic存在对应关系的多个虚拟topic中的至少一个目标虚拟topic,获取在每个目标虚拟topic中存储的消息的第二数据量;获取在该第一真实topic中存储的消息的第一数据量;基于该第一数据量和每个目标虚拟topic的第二数据量,预估该预存数据量。
[0014] 可选地,该预估预存数据量的实现过程,可以包括:采用预估模型预估该预存数据量;其中,该预估模型的输入参数和输出参数均包括:至少一组参数,该至少一组参数与至少一个目标虚拟topic一一对应,对于每个目标虚拟topic:该输入参数包括:该第一真实topic的标识和该第一数据量,该目标虚拟topic的标识,该目标虚拟topic的第二数据量与该第一数据量的比值;该输出参数包括:该预存数据量,该目标虚拟topic的标识,该目标虚拟topic的第三数据量与该第一数据量的比值。
[0015] 或者,该输入参数包括:该第一真实topic的标识和该第一数据量,该目标虚拟topic的标识和该目标虚拟topic的第二数据量;该输出参数包括:该预存数据量,该目标虚拟topic的标识和该目标虚拟topic的第三数据量。
[0016] 当该第二消息存储请求的接收时间晚于该第一消息存储请求的接收时间时,该方法还可以包括:在接收该第二消息存储请求之前,预估在预设时间段内待在该第一真实分区所在的第一真实topic中存储的消息的预存数据量;当该预存数据量大于第二阈值时,建立该虚拟存储地址与该第二真实存储地址的对应关系。
[0017] 当预存数据量为预估的在预设时间段内待在第一真实分区所在的第一真实topic中存储的消息的数据量时,若该预存数据量大于第二阈值,表示该第一真实分区可能无法支撑该预设时间段内的消息存储需求,此时,为了有效存储该待存储的消息,以及保证该第一真实分区的存储性能,可以将虚拟存储地址与真实存储地址的对应关系修改为虚拟存储地址与第二真实存储地址对应,以将待存储在该第一真实分区所在的第一真实topic中的消息存储在第二真实存储地址中,进而提高消息存储系统的存储性能。其中,该第一阈值和该第二阈值可以根据实际需要确定,且该第一阈值和该第二阈值可以相等或不等,本申请实施例对次不做具体限定。
[0018] 作为一种可实现方式,该预估在预设时间段内待在该第一真实分区所在的第一真实topic中存储的消息的预存数据量的实现过程,可以包括:对于与该第一真实topic存在对应关系的多个虚拟topic中的至少一个目标虚拟topic,获取在每个目标虚拟topic中存储的消息的第二数据量;获取在该第一真实topic中存储的消息的第一数据量;基于该第一数据量和每个目标虚拟topic的第二数据量,预估该预存数据量。
[0019] 可选地,该预估该预存数据量的实现过程,可以包括:采用预估模型预估该预存数据量;其中,该预估模型的输入参数和输出参数均包括:至少一组参数,该至少一组参数与至少一个目标虚拟topic一一对应,对于每个目标虚拟topic:该输入参数包括:该第一真实topic的标识和该第一数据量,该目标虚拟topic的标识,该目标虚拟topic的第二数据量与该第一数据量的比值;该输出参数包括:该第一真实topic的标识和该预存数据量,该目标虚拟topic的标识,该目标虚拟topic的第三数据量与该第一数据量的比值。
[0020] 或者,该输入参数包括:该第一真实topic的标识和该第一数据量,该目标虚拟topic的标识和该目标虚拟topic的第二数据量;该输出参数包括:该第一真实topic的标识和该预存数据量,该目标虚拟topic的标识和该目标虚拟topic的第三数据量。
[0021] 其中,至少一个目标虚拟topic包括:多个虚拟topic中的所有虚拟topic,或者,多个虚拟topic中存储的数据量由大到小的前至少一个虚拟topic。
[0022] 进一步地,该建立该虚拟存储地址与该第二真实存储地址的对应关系的实现过程,可以包括:
[0023] 基于每个目标虚拟topic的第三数据量,查找可用数据量大于该第三数据量的真实topic,该可用数据量为该真实topic的数据量额度与该预存数据量的差值;当确定存在可用数据量大于该第三数据量的真实topic时,将该可用数据量大于该第三数据量的真实topic确定为该第二真实topic;当确定不存在可用数据量大于该第三数据量的真实topic时,在该消息存储系统中创建该第二真实topic;将与该目标虚拟topic对应的虚拟存储地址与真实存储地址的对应关系,修改为该虚拟存储地址与包括该第二真实topic的第二真实存储地址对应。
[0024] 通过修改虚拟存储地址与真实存储地址的对应关系,使得指定存储至虚拟存储地址中的消息能够存储在不同的真实存储地址中,能够在各个逻辑topic的数据量(或流量)不均衡时,减小各个逻辑topic占用的资源不均衡的几率。并且,通过修改该对应关系,使得无需对修改之前根据虚拟存储地址存储在第一真实存储地址中的消息进行迁移,使得在出现资源占用不均衡时,能够及时地将消息存储在第二真实存储地址中,并缩短对数据进行迁移所耗费的时长,可以解决相关技术中迁移时间过长和迁移不及时的问题,进而减小对磁盘的占用率,并提高了消息存储系统的吞吐率。同时,通过对数据量(或流量)进行预估,并根据预估结果修改该对应关系,能够根据该预估结果提前为消息预留资源,避免因迁移不及时造成的存储节点的崩溃。
[0025] 其中,当确定存在多个可用数据量大于该第三数据量的真实topic时,可以将最大可用数据量对应的真实topic确定为该第二真实topic。
[0026] 并且,该建立该虚拟存储地址与该第二真实存储地址的对应关系,可以包括:对于与该第一真实topic存在对应关系的至少一个目标虚拟topic,按照至少一个目标虚拟topic的第二数据量由大到小的顺序,依次建立每个目标虚拟topic对应的虚拟存储地址与该第二真实存储地址的对应关系。
[0027] 进一步的,该建立该虚拟存储地址与该第二真实存储地址的对应关系,还可以包括:确定第一消息在该第二真实topic中的消息偏移量,该第一消息为基于该虚拟存储地址与该第二真实存储地址的对应关系,存储在该第二真实topic中的第一个消息;将该第一消息的消息偏移量,及该虚拟存储地址与该第二真实存储地址的对应关系,存储在该目标虚拟topic对应的索引文件中。
[0028] 可选地,每个真实存储地址与多个虚拟存储地址存在对应关系。
[0029] 本申请实施例提供的消息存储方法,在接收在Kafka集群存储消息的消息存储请求后,通过根据虚拟存储地址与真实存储地址的对应关系,确定用于存储消息的真实存储地址,并将消息存储在该真实存储地址指定的真实分区中,实现了消息的存储。
[0030] 并且,通过对消息存储请求所指定的待存储消息进行预估,根据预估的数据量修改虚拟存储地址与真实存储地址的对应关系,使得指定存储至虚拟存储地址中的消息能够存储在不同的真实存储地址中,相较于相关技术,减小了真实topic中真实分区工作负载过重的几率,提高了消息存储系统的吞吐率。
[0031] 根据本申请的第二方面,提供了一种消息存储方法,该方法可以应用于卡夫卡Kafka集群;该方法包括:接收在该Kafka集群存储消息的消息存储请求,该消息存储请求指定在虚拟topic存储该消息;基于该虚拟topic与第一真实topic的对应关系,确定与该虚拟topic对应的该真实topic;在该真实topic的真实分区中存储该消息存储请求指定的消息。
[0032] 本申请实施例提供的消息存储方法,在接收在Kafka集群存储消息的消息存储请求后,通过根据虚拟topic与真实topic的对应关系,可以确定用于存储消息的真实topic,并将消息存储在该真实topic指定的真实分区中,实现了消息的存储。
[0033] 可选地,该方法还可以包括:建立虚拟topic与真实topic的对应关系。
[0034] 根据本申请的第三方面,提供了一种消息读取方法,该方法应用于卡夫卡Kafka集群;该方法包括:接收在该Kafka集群读取消息的消息读取请求,该消息读取请求指定从虚拟存储地址读取消息,该虚拟存储地址包括虚拟话题topic的标识和虚拟分区的标识;基于该虚拟存储地址与真实存储地址的对应关系,确定与该虚拟存储地址对应的目标真实存储地址,该目标真实存储地址包括目标真实topic的标识和目标真实分区的标识;在该目标真实存储地址指定的目标真实分区读取该消息读取请求所指定的消息。
[0035] 本申请实施例提供的消息读取方法,在接收在Kafka集群存储消息的消息存储请求后,通过虚拟存储地址与真实存储地址的对应关系,确定与虚拟存储地址对应的目标真实存储地址,并在目标真实存储地址指定的目标真实分区读取消息读取请求所指定的消息,实现了消息的读取。
[0036] 可选地,该消息读取请求中携带有待读取消息的目标偏移量,该基于该虚拟存储地址与真实存储地址的对应关系,确定与该虚拟存储地址对应的目标真实存储地址,包括:获取目标索引文件中记载的第一消息的消息偏移量,该第一消息为基于虚拟存储地址与真实存储地址的当前对应关系,存储在当前对应关系指定的真实topic中的第一个消息,该目标索引文件为该虚拟存储地址指定的虚拟topic对应的索引文件;当该目标偏移量大于或等于该消息偏移量时,将当前对应关系中记载的真实存储地址确定为目标真实存储地址;
当目标偏移量小于消息偏移量时,将虚拟存储地址与真实存储地址的历史对应关系中记载的真实存储地址确定为目标真实存储地址。该当前对应关系为在消息存储系统的使用过程中,对该虚拟存储地址与真实存储地址的对应关系修改后的对应关系。对虚拟存储地址与真实存储地址的对应关系修改前的对应关系为历史对应关系,该历史对应关系中记载的真实存储地址与当前对应关系中记载的真实存储地址不同。且该基于当前对应关系存储的消息的偏移量大于基于历史对应关系存储的消息的偏移量。
[0037] 由于基于当前对应关系存储的消息,存储在该当前对应关系所指定的真实存储地址中。基于历史对应关系存储的消息,存储在该历史对应关系所指定的真实存储地址中。因此,在确定目标真实存储地址前,需要先获取该第一消息的消息偏移量,并将该第一消息的消息偏移量与目标偏移量进行比较,以确定该目标真实存储地址为历史对应关系所指定的真实存储地址,还是当前对应关系所指定的真实存储地址,进而保证能够有效地读取消息。
[0038] 根据本申请的第四方面,提供了一种消息存储装置,该装置包括:接收模块,用于接收在Kafka集群存储消息的第一消息存储请求,该第一消息存储请求指定在虚拟存储地址存储该第一消息存储请求指定的消息,该虚拟存储地址包括虚拟话题topic的标识和虚拟分区的标识;确定模块,用于基于虚拟存储地址与第一真实存储地址的对应关系,确定与该虚拟存储地址对应的第一真实存储地址,该第一真实存储地址包括第一真实topic的标识和第一真实分区的标识;存储模块,用于在该第一真实存储地址指定的该第一真实topic中的该第一真实分区,存储该第一消息存储请求指定的消息。
[0039] 可选地,该接收模块,用于接收在该Kafka集群存储消息的第二消息存储请求,该第二消息存储请求指定在该虚拟存储地址存储该第二消息存储请求指定的消息;该确定模块,用于基于虚拟存储地址与第二真实存储地址的对应关系,确定与该虚拟存储地址对应的第二真实存储地址,该第二真实存储地址包括第二真实topic的标识和第二真实分区的标识;该存储模块,用于在该第二真实存储地址指定的该第二真实topic中的该第二真实分区,存储该第二消息存储请求指定的消息。
[0040] 可选地,第一真实分区与第二真实分区部署在Kafka集群中的不同存储节点上。
[0041] 可选地,该第二消息存储请求的接收时间晚于该第一消息存储请求的接收时间。
[0042] 可选地,该装置还包括:预估模块,用于预估在预设时间段内接收的该第二消息存储请求所指定的消息的预存数据量;建立模块,用于当该预存数据量大于第一阈值时,建立该虚拟存储地址与该第二真实存储地址的对应关系。
[0043] 可选地,该预估模块,包括:获取子模块,用于对于与该第一真实topic存在对应关系的多个虚拟topic中的至少一个目标虚拟topic,获取在每个目标虚拟topic中存储的消息的第二数据量,该;该获取子模块,用于获取在该第一真实topic中存储的消息的第一数据量;预估子模块,用于基于该第一数据量和每个目标虚拟topic的第二数据量,预估该预存数据量。
[0044] 可选地,该预估子模块,用于:采用预估模型预估该预存数据量;其中,该预估模型的输入参数和输出参数均包括:至少一组参数,该至少一组参数与至少一个目标虚拟topic一一对应,对于每个目标虚拟topic:该输入参数包括:该第一真实topic的标识和该第一数据量,该目标虚拟topic的标识,该目标虚拟topic的第二数据量与该第一数据量的比值;该输出参数包括:该预存数据量,该目标虚拟topic的标识,该目标虚拟topic的第三数据量与该第一数据量的比值。
[0045] 或者,该输入参数包括:该第一真实topic的标识和该第一数据量,该目标虚拟topic的标识和该目标虚拟topic的第二数据量;该输出参数包括:该预存数据量,该目标虚拟topic的标识和该目标虚拟topic的第三数据量。
[0046] 可选地,该装置包括:预估模块,用于预估在预设时间段内待在该第一真实分区所在的第一真实topic中存储的消息的预存数据量;建立模块,用于当该预存数据量大于第二阈值时,建立该虚拟存储地址与该第二真实存储地址的对应关系。
[0047] 可选地,该预估模块,包括:获取子模块,用于对于与该第一真实topic存在对应关系的多个虚拟topic中的至少一个目标虚拟topic,获取在每个目标虚拟topic中存储的消息的第二数据量,该;该获取子模块,用于获取在该第一真实topic中存储的消息的第一数据量;预估子模块,用于基于该第一数据量和每个目标虚拟topic的第二数据量,预估该预存数据量。
[0048] 可选地,该预估子模块,用于:采用预估模型预估该预存数据量;其中,该预估模型的输入参数和输出参数均包括:至少一组参数,该至少一组参数与至少一个目标虚拟topic一一对应,对于每个目标虚拟topic:该输入参数包括:该第一真实topic的标识和该第一数据量,该目标虚拟topic的标识,该目标虚拟topic的第二数据量与该第一数据量的比值;该输出参数包括:该第一真实topic的标识和该预存数据量,该目标虚拟topic的标识,该目标虚拟topic的第三数据量与该第一数据量的比值。
[0049] 或者,该输入参数包括:该第一真实topic的标识和该第一数据量,该目标虚拟topic的标识和该目标虚拟topic的第二数据量;该输出参数包括:该第一真实topic的标识和该预存数据量,该目标虚拟topic的标识和该目标虚拟topic的第三数据量。
[0050] 可选地,至少一个目标虚拟topic包括:多个虚拟topic中的所有虚拟topic,或者,多个虚拟topic中存储的数据量由大到小的前至少一个虚拟topic。
[0051] 可选地,该建立模块,包括:查找子模块,用于基于每个目标虚拟topic的第三数据量,查找可用数据量大于第三数据量的真实topic,可用数据量为真实topic的数据量额度与预存数据量的差值;确定子模块,用于当确定存在可用数据量大于第三数据量的真实topic时,将可用数据量大于第三数据量的真实topic确定为第二真实topic;确定子模块,用于当确定不存在可用数据量大于第三数据量的真实topic时,在消息存储系统中创建第二真实topic;修改子模块,用于将与该目标虚拟topic对应的虚拟存储地址与真实存储地址的对应关系,修改为该虚拟存储地址与包括该第二真实topic的第二真实存储地址对应。
[0052] 可选地,该确定子模块,还用于:当确定存在多个可用数据量大于该第三数据量的真实topic时,将最大可用数据量对应的真实topic确定为该第二真实topic。
[0053] 可选地,该建立模块,还用于:对于与该第一真实topic存在对应关系的至少一个目标虚拟topic,按照至少一个目标虚拟topic的第二数据量由大到小的顺序,依次建立每个目标虚拟topic对应的虚拟存储地址与该第二真实存储地址的对应关系。
[0054] 可选地,该建立模块,还用于:确定第一消息在该第二真实topic中的消息偏移量,该第一消息为基于该虚拟存储地址与该第二真实存储地址的对应关系,存储在该第二真实topic中的第一个消息;将该第一消息的消息偏移量,及该虚拟存储地址与该第二真实存储地址的对应关系,存储在该目标虚拟topic对应的索引文件中。
[0055] 可选地,每个真实存储地址与多个虚拟存储地址存在对应关系。
[0056] 根据本申请的第五方面,提供了一种消息读取装置,该装置包括:接收模块,用于接收在Kafka集群读取消息的消息读取请求,该消息读取请求指定从虚拟存储地址读取消息,该虚拟存储地址包括虚拟topic的标识和虚拟分区的标识;确定模块,用于基于该虚拟存储地址与真实存储地址的对应关系,确定与该虚拟存储地址对应的目标真实存储地址,该目标真实存储地址包括目标真实topic的标识和目标真实分区的标识;读取模块,用于在该目标真实存储地址指定的目标真实分区读取该消息读取请求所指定的消息。
[0057] 可选地,该消息读取请求中携带有待读取消息的目标偏移量,该确定模块,用于:获取目标索引文件中记载的第一消息的消息偏移量,第一消息为基于虚拟存储地址与真实存储地址的当前对应关系,存储在当前对应关系指定的真实topic中的第一个消息,目标索引文件为虚拟存储地址指定的虚拟topic对应的索引文件;当目标偏移量大于或等于消息偏移量时,将当前对应关系中记载的真实存储地址确定为目标真实存储地址;当目标偏移量小于消息偏移量时,将虚拟存储地址与真实存储地址的历史对应关系中记载的真实存储地址确定为目标真实存储地址,当前对应关系中记载的真实存储地址与历史对应关系中记载的真实存储地址不同。
[0058] 根据本申请的第六方面,提供了一种服务器,包括处理器和存储器;在该处理器执行该存储器存储的计算机程序时,该服务器执行第一方面任一所述的消息存储方法。
[0059] 根据本申请的第七方面,提供了一种服务器,包括处理器和存储器;在该处理器执行该存储器存储的计算机程序时,该服务器执行第二方面任一所述的消息读取方法。
[0060] 根据本申请的第八方面,提供了一种存储介质,该存储介质内存储有计算机程序,该计算机程序指示服务器执行第一方面任一所述的消息存储方法。
[0061] 根据本申请的第九方面,提供了一种存储介质,该存储介质内存储有计算机程序,该计算机程序指示服务器执行第二方面任一所述的消息读取方法。

附图说明

[0062] 为了更清楚地说明本申请实施例中的技术方案,下面将对实施例描述中所需要使用的附图作简单地介绍,显而易见地,下面描述中的附图仅仅是本申请的一些实施例,对于本领域普通技术人员来讲,在不付出创造性劳动的前提下,还可以根据这些附图获得其他的附图。
[0063] 图1是本申请实施例提供的一种相关技术中基于kafka集群的消息存储系统的示意图;
[0064] 图2是本申请实施例提供的一种消息存储系统的结构示意图;
[0065] 图3是本申请实施例提供的一种消息存储方法的流程图;
[0066] 图4是本申请实施例提供的一种数据存储结构示意图;
[0067] 图5是本申请实施例提供的一种预估在预设时间段内待存储消息的预存数据量的方法流程图;
[0068] 图6是本申请实施例提供的一种LSTM神经网络的结构示意图;
[0069] 图7是本申请实施例提供的一种建立虚拟存储地址与第二真实存储地址的对应关系的方法流程图;
[0070] 图8是本申请实施例提供的一种确定第二真实topic的方法流程图;
[0071] 图9是本申请实施例提供的一种消息读取方法的流程图;
[0072] 图10是本申请实施例提供的一种确定与虚拟存储地址对应的目标真实存储地址的方法流程图;
[0073] 图11是本申请实施例提供的一种消息存储装置的结构示意图;
[0074] 图12是本申请实施例提供的另一种消息存储装置的结构示意图;
[0075] 图13是本申请实施例提供的一种预估模块的结构示意图;
[0076] 图14是本申请实施例提供的一种建立模块的结构示意图;
[0077] 图15是本申请实施例提供的一种消息读取装置的结构示意图;
[0078] 图16是本申请实施例提供的一种服务器的结构框图;
[0079] 图17是本申请实施例提供的另一种服务器的结构框图。

具体实施方式

[0080] 为使本发明的目的、技术方案和优点更加清楚,下面将结合附图对本发明实施方式作进一步地详细描述。
[0081] 通常,云消息服务需要支持多个租户,每个租户可以在kafka集群中创建自己的多个topic,每个topic用于存储属于同一类别的云消息。相关技术中,消息服务系统主要为:基于kafka集群的消息存储系统的消息服务。该基于kafka集群的消息存储系统可以接收消息生产者(producer)发送的消息,并将该消息存储在该消息所属的topic中,以供消息消费者(consumer)从该topic请求该消息。
[0082] 如图1所示,在基于kafka集群的消息存储系统中,每个topic由至少一个分区(partition)组成,每个分区由至少一个存储段(Segment)组成,每个存储段中成对存储有索引文件和数据文件。数据文件用于存储消息生产者发送的消息,索引文件用于记载消息在对应数据文件中的索引信息(如偏移地址)。在消费者读取数据时,可以根据该索引文件中记载的待读取消息的索引信息,在数据文件中该索引信息所指示的位置处获取该消息。并且,该基于kafka集群的消息存储系统还可以包括多个存储节点,当存储节点接收到对应消息时,可将消息立即存储在该系统中,进而增加系统持久化存储和处理消息堆积的能力。
[0083] 但是,在该基于kafka集群的消息存储系统中,该存储消息的存储粒度较粗,导致无法对存储空间进行有效利用。并且,由于在该系统中,每个分区中仅能存储一个topic的消息,导致每个存储节点所能支持的topic数量有限,例如:虚拟机规格为8U16G的存储节点(用于部署topic)所能支持的topic数量通常小于100,否则存储节点的性能会急剧下降。同时,由于每个存储节点所能支持的topic数量有限,导致该kafka集群中需要部署大量的存储节点,以及基于该kafka集群消息存储系统的成本较高。以及,由于各个topic可能存在流量不均衡的问题,导致各个topic占用的资源不均衡,需要对topic的数据进行迁移。且当topic数据量较大时,该数据迁移过程存在迁移时间过长和迁移不及时的问题。
[0084] 为此,本发明实施例提供了一种消息存储方法,该消息存储方法可以解决以上问题。图2为该消息存储方法所涉及的消息存储系统的结构示意图。如图2所示,该消息存储系统10可以包括:多个存储节点101。该多个存储节点101之间可以通过有线网络或无线网络建立连接。可选地,该消息存储系统可以为基于kafka集群的消息存储系统。其中,Kafka集群用于部署Kafka系统。Kafka集群具有多个存储节点。该存储节点可以是服务器或者其它具有计算能力的设备。Kafka系统中的每个topic可以部署在Kafka集群中的一个或多个存储节点上。
[0085] 在该消息存储系统中,每个存储节点101中配置有多个虚拟topic、多个真实topic和与每个虚拟topic对应的索引文件。其中,每个真实分区中配置有多个索引文件和多个数据文件。该数据文件用于存储消息。该索引文件用于存储消息的索引信息。每个虚拟topic包括多个虚拟分区,虚拟topic的标识与该虚拟topic包括的一个虚拟分区的标识可以组成一个虚拟存储地址。每个真实topic包括多个真实分区,真实topic的标识与该真实topic包括的一个真实分区的标识可以组成一个真实存储地址。且一个虚拟存储地址可以与一个真实存储地址对应。当虚拟存储地址与真实存储地址对应时,可以将消息存储至指定的虚拟存储地址所对应的真实存储地址中,并将用于指示该消息的索引信息存储在与该虚拟topic对应的索引文件中。其中,该真实topic、真实分区、虚拟topic、虚拟分区、索引文件和数据文件之间的对应关系可以在消息存储系统建立时确定。
[0086] 可选地,每个真实存储地址可以与多个虚拟存储地址存在对应关系。此时,对于与多个虚拟存储地址对应的一个真实存储地址,指定存储至该多个虚拟存储地址中的消息可以均存储在该真实存储地址中。由于虚拟存储地址用于指示虚拟topic和虚拟分区,真实存储地址用于指示真实topic和真实分区,因此,每个真实分区中可以存储指定存储至多个虚拟topic的数据,即指定存储至该多个虚拟topic中的消息可以共享该真实topic中真实分区的存储空间,使得真实分区能够支持多个虚拟topic,进而使部署有真实分区的存储节点能够支持多个虚拟topic,增加了每个存储节点所能支持的虚拟topic数量,同时也降低系统成本。
[0087] 并且,该消息存储系统10还可以包括:多个数据生产节点(producer)和多个数据消费节点(Consumer)。数据生产节点和存储节点101之间,以及,数据消费节点和存储节点101之间,均可以通过有线网络或无线网络建立连接。该数据生产节点用于向存储节点101发送消息,使存储节点101对该消息进行存储。该数据消费节点用于从存储节点101中读取消息。
[0088] 下面为对本申请实施例提供的消息存储方法的说明。该消息存储方法可应用于kafka集群。下面以该消息存储方法应用于kafka集群中的第一存储节点为例,对该消息存储方法进行说明。如图3所示,该消息存储方法可以包括以下步骤:
[0089] 步骤201、接收在Kafka集群存储消息的第一消息存储请求。
[0090] 当客户端需要向Kafka集群存储消息时,该客户端可以向第一存储节点发送第一消息存储请求。该第一消息存储请求中可以携带有指定的待存储消息和用于存储该消息的虚拟存储地址。该虚拟存储地址包括虚拟话题topic的标识和虚拟分区的标识。也即是,该第一消息存储请求可以指定在虚拟存储地址存储该第一消息存储请求指定的消息。
[0091] 在该实现方式中,该虚拟存储地址作为Kafka集群存储消息的对外接口,使得客户端可以指定将消息存储在虚拟存储地址中。并且,由于当虚拟存储地址与真实存储地址对应时,可以将消息存储至第一消息存储请求指定的虚拟存储地址所对应的真实存储地址中,进而实现了在真实存储地址中的消息存储。
[0092] 步骤202、基于虚拟存储地址与第一真实存储地址的对应关系,确定与虚拟存储地址对应的第一真实存储地址。
[0093] 在消息存储系统中存储有虚拟存储地址与第一真实存储地址的对应关系,且在任一时刻,一个虚拟存储地址仅与一个真实存储地址对应,也即是,指定存储至该虚拟存储地址的消息仅能存储至对应的一个真实存储地址中。因此,在接收第一消息存储请求后,可以根据该第一消息存储请求中指定的虚拟存储地址,查询该对应关系,确定与该虚拟存储地址对应的第一真实存储地址,以便于将该第一消息存储请求中指定的消息存储至该第一真实存储地址中。其中,该第一真实存储地址包括第一真实topic的标识和第一真实分区的标识。
[0094] 并且,在该消息存储系统中,每个真实存储地址可以与多个虚拟存储地址存在对应关系。此时,对于与多个虚拟存储地址对应的一个真实存储地址,指定存储至该多个虚拟存储地址中的消息可以均存储在该真实存储地址中。由于虚拟存储地址用于指示虚拟topic和虚拟分区,真实存储地址用于指示真实topic和真实分区,因此,每个真实分区中可以存储指定存储至多个虚拟topic的数据,即指定存储至该多个虚拟topic中的消息可以共享该真实topic中真实分区的存储空间,使得真实分区能够支持多个虚拟topic,进而使部署有真实分区的存储节点能够支持多个虚拟topic,增加了每个存储节点所能支持的虚拟topic数量,同时也降低系统成本。
[0095] 示例地,在基于kafka集群的消息存储系统中,当每个真实存储地址与多个虚拟存储地址存在对应关系时,每个真实分区中可以存储基于多个虚拟topic存储的数据,如图4所示的真实分区2001中存储的消息的示意图,虚拟话题×(×用于标识数字)用于标识不同的虚拟topic,虚拟话题×-消息×用于标识基于不同的虚拟topic存储在该真实分区中的消息,例如:虚拟话题1(Index1)、虚拟话题2(Index2)和虚拟话题3(Index3)分别标识不同的虚拟topic,虚拟话题1-消息1(Index1-Msg1)用于标识基于虚拟topic1存储在该真实分区中的消息1,虚拟话题2-消息1(Index2-Msg1)用于标识基于虚拟topic2存储在该真实分区中的消息1。
[0096] 步骤203、在第一真实存储地址指定的第一真实topic中的第一真实分区,存储第一消息存储请求指定的消息。
[0097] 在确定与虚拟存储地址对应的第一真实存储地址后,可以在该第一真实存储地址指示的真实topic的真实分区中存储该消息。并且,由于真实分区中配置有多个数据文件,在存储该消息时,可以根据该真实分区中的消息存储情况,在该真实分区中的多个数据文件中确定用于存储该消息的数据文件,然后将该消息存储在对应的数据文件中。
[0098] 示例地,在基于kafka集群的消息存储系统中,假设第一存储节点中虚拟topic、虚拟分区、真实topic、真实分区、数据文件的和索引文件的对应关系如表1所示,当第一消息存储请求请求在虚拟topic1的虚拟分区1中存储消息时,根据该表1所示的虚拟存储地址与真实存储地址的对应关系可知:与该虚拟topic1的虚拟分区1对应的第一真实存储地址指示在真实topic1的真实分区1中存储消息。此时,可以根据该虚拟topic1的虚拟分区1中的数据情况,确定可将第一消息存储请求指定的消息存储在数据文件3中,则可在该虚拟topic1的虚拟分区1的数据文件3中存储该消息。
[0099] 表1
[0100]
[0101] 步骤204、根据第一消息存储请求指定的消息的存储位置生成索引信息,并将该索引信息存储在虚拟存储地址所指示的虚拟topic对应的索引文件中。
[0102] 消息的索引信息用于指示消息在第一真实存储地址中的存储位置。在将消息存储在第一真实存储地址后,可以根据该消息在第一真实存储地址中的存储位置,生成索引信息,并将该索引信息存储在与该虚拟topic对应的索引文件中,以便在消息读取过程中根据该索引信息获取该消息。其中,与该虚拟topic对应的索引文件可以存储在配置有该虚拟topic的存储节点中。例如,当该虚拟topic配置在第一存储节点中时,该与该虚拟topic对应的索引文件可以存储在该第一存储节点中。
[0103] 需要说明的是,索引文件可以在消息存储系统的建立过程中建立。例如,在系统建立过程中,可以根据存储节点中部署的每个虚拟topic的名称,在存储节点中建立索引目录,该索引目录中存储有索引文件。在将消息存储在包括有虚拟topic标识的虚拟存储地址对应的真实存储地址后,可以根据该虚拟topic标识确定该索引目录,并将该索引信息存储在该索引目录中的索引文件中。
[0104] 其中,索引文件可以包括:数据记录索引和映射记录索引。该数据记录索引用于指示消息在真实分区中的偏移量。该映射记录索引用于指示虚拟存储地址与真实存储地址的对应关系。数据记录索引可以包括多个数据索引项。映射记录索引也可以包括多个映射索引项。例如:如图4所示,数据记录索引(Index)2可以包括数据索引项(Entry)1和数据索引项2,该数据索引项1用于指示索引2对应的消息1在真实分区中的偏移量,该数据索引项2用于指示索引2对应的消息2在真实分区中的偏移量。数据记录索引1:2002可以包括数据索引项3和数据索引项4,该数据索引项3用于指示索引1对应的消息1在真实分区中的偏移量,该数据索引项4用于指示索引1对应的消息2和消息3在真实分区中的偏移量。映射记录索引2可以包括映射索引项(MateEntry)1和映射索引项2,以及,映射记录索引1:2003可以包括映射索引项3和映射索引项4。并且,该多个数据索引项的大小可以相等或不等,该多个映射索引项的大小也可以相等或不等。
[0105] 该数据索引项和该映射索引项中可以均记载有多个字段,下面以多个数据索引项的大小相等,以及,多个映射索引项的大小相等,分别对该数据索引项和该映射索引项中记载的字段进行举例说明:
[0106] 请参考图4,数据记录索引可以包括多个数据索引项,每个数据索引项可以记载以下一个或多个字段:虚拟存储地址偏移量字段(consumerQueueOffset)、消息序号字段(startPartitionOffset)、文件偏移量字段(physicalPostion)、消息长度字段(size)、消息总数字段(msgNum)和存储时间戳字段(timestamp)。各个字段的含义分别如下:
[0107] 虚拟存储地址偏移量字段携带的内容为该数据索引项中记载的数据在所有存储在该虚拟存储地址中的数据中的消息偏移量。该虚拟存储地址偏移量字段的长度可以为4字节或8字节。例如,假设在真实topic1的真实分区2中存储有100个消息,其中,存储在虚拟topic1的虚拟分区1中的消息有20个,该数据索引项中记载的索引信息对应的消息为在该20个消息中的的第5个,则该虚拟存储地址偏移量字段中携带的消息偏移量为5。
[0108] 一般地,可以使用8位长整型数值表示该消息偏移量。但是,由于索引目录的文件名均会记录存储在对应虚拟topic中的第一个消息的偏移量(也称基准偏移量baseOffset),因此,为了节省存储空间,该虚拟存储地址偏移量字段携带的内容可以为当前消息与该第一个消息的相对位置。在读取该当前消息的偏移量时,可将该当前消息对应的相对位置与该第一个消息的偏移量相加,以得到该当前消息的偏移量,此时,该虚拟存储地址偏移量字段的长度可以为4字节。
[0109] 消息序号字段携带的内容为该数据索引项中第一个消息在对应真实分区中存储的多个消息中的消息偏移量。该消息序号字段的长度可以为8字节。例如,假设在该真实分区中存储有100个消息,该数据索引项中第一个消息为在真实topic1中存储的第60个消息,则该消息序号字段携带的消息偏移量为60。
[0110] 可选地,每个数据索引项中可以记载有多个消息在真实分区中的消息偏移量,该数据索引项中第一个消息即为该多个消息中的第一个消息。例如:在图4中,在数据记录索引Index2的数据索引项Entry1中记载有消息Msg1在真实分区中的消息偏移量,此时,数据索引项中第一个消息为消息Msg1。在数据记录索引Index1:2002的数据索引项Entry2中记载有消息Msg2和消息Msg3在真实分区中的偏移量,此时,数据索引项中第一个消息为消息Msg2。
[0111] 文件偏移量字段携带的内容为该数据索引项中记载的第一个消息在真实分区的数据文件中的文件偏移量。该文件偏移量字段的长度可以为4字节。例如,假设该数据索引项中记载的第一个消息存储在真实分区中的第三个数据文件中,且该第三个数据文件中存储有三个消息,该第三个数据文件中存储的第一个消息和第二个消息的大小均为1千字节(KB),则该数据索引项中记载的第一个消息的文件偏移量为2KB,即该文件偏移量字段携带的内容为2KB。
[0112] 消息长度字段携带的内容为用于存储该数据索引项的消息块的长度。该消息长度字段的长度可以为4字节。
[0113] 消息总数字段携带的内容为消息块中记载的消息的总数。该消息总数字段的长度可以为4字节。
[0114] 存储时间戳字段携带的内容为写入该数据索引项的时间戳。该存储时间戳字段的长度可以为8字节。
[0115] 请参考图4,映射记录索引可以包括多个映射索引项,映射索引项可以记载以下一个或多个字段:消息逻辑序号字段(startLogicaloffset)、真实分区标识长度字段(topicNameSize)和真实分区标识字段(topicName)。各个字段的含义分别如下:
[0116] 消息逻辑序号字段携带的内容为虚拟存储地址与真实存储地址对应时,基于该对应关系存储在真实topic中的第一个消息在存储在该虚拟存储地址中的多个消息中的消息序号。该消息逻辑序号字段的长度为8字节。例如,假设虚拟存储地址指示的虚拟topic1中的虚拟分区1中存储了200个消息,根据虚拟存储地址与真实存储地址的对应关系,存储在该真实存储地址中的第一个消息为该200个消息中的第101个,则该消息逻辑序号字段携带的内容为101。
[0117] 真实分区标识长度字段携带的内容为与虚拟存储地址对应的真实topic中真实分区的标识的长度。该真实分区标识长度字段的长度为4字节。例如,当虚拟topic1中的虚拟分区1与真实topic1中的真实分区2对应时,该真实分区标识长度字段携带的内容为该真实分区2的标识的长度。
[0118] 真实分区标识字段携带的内容为与虚拟存储地址对应的真实topic中真实分区的标识。该真实分区标识字段的长度可以根据实际需要进行设置。例如,当虚拟topic1中的虚拟分区1与真实topic1中的真实分区2对应时,该真实分区标识字段携带的内容为该真实分区2的标识。
[0119] 需要说明的是,上述数据索引项和映射索引项中所包括的各个字段携带的内容和长度仅为示例性的说明,不用于限定本申请。该数据索引项和映射索引项中所包括的各个字段携带的内容和长度均可以根据实际需要进行设置。
[0120] 根据上述存储数据的过程,以及对数据索引项和映射索引项的说明可以看出:对数据进行存储时,均是将数据连续地存储在真实分区的数据文件中的,且每个索引项中记录的内容均为连续存储的数据对应的索引信息,因此,在读取数据时,可以根据同一个索引项中连续存储的索引信息,批量地读取该索引项所对应的数据文件中的数据,进而避免离散地读取数据。
[0121] 步骤205、预估在预设时间段内待存储消息的预存数据量。
[0122] 预估在预设时间段内待存储消息的预存数据量可以包括:预估在预设时间段内接收的第二消息存储请求所指定的消息的预存数据量,也即是,预估在预设时间段内待在该虚拟存储地址中存储的消息的预存数据量。或者,预估在预设时间段内待在第一真实分区所在的第一真实topic中存储的消息的预存数据量,也即是,预估在预设时间段内待在第一真实存储地址中存储的消息的预存数据量。通过对该预存数据量进行预估,可以在该预存数据量较大时,更改虚拟存储地址与真实存储地址的对应关系,以避免该预存数据量较大导致的存储性能下降。
[0123] 在一种可实现方式中,可以根据真实topic和虚拟topic的数据量对该预存数据量进行预估。如图5,该步骤205的实现方式可以包括:
[0124] 步骤2051、对于与第一真实topic存在对应关系的多个虚拟topic中的至少一个目标虚拟topic,获取在每个目标虚拟topic中存储的消息的第二数据量,并获取在第一真实topic中存储的消息的第一数据量。
[0125] 其中,该,该至少一个目标虚拟topic可以包括:多个虚拟topic中的所有虚拟topic,或者,多个虚拟topic中存储的数据量由大到小的前至少一个虚拟topic。例如,需要获取N个目标虚拟topic中存储的消息的第二数据量时,该N个目标虚拟topic可以为多个虚拟topic中存储的数据量由大到小的前N个虚拟topic,该N为正整数。且该至少一个目标虚拟topic可以根据实际需要确定。例如,可以在获取每个虚拟topic的第二数据量后,根据该虚拟topic的第二数据量的大小,确定是否需要将该虚拟topic确定为目标虚拟topic。该预设时间段也可以根据实际需要进行设置,例如:该预设时间段可以为当前时刻后的四小时、十小时或二十四小时等。
[0126] 可选的,消息存储系统中可以部署有数据量采集模块,或者,可以在该消息存储系统可以创建流量收集进程,以通过该流量收集模块或该流量收集进程获取虚拟topic的第二数据量。并且,该消息存储系统中还可以部署有用于存储数据量信息的队列(例如数据量topic),在获取每个虚拟topic的第二数据量后,可以将该第二数据量保存在该队列中。其中,可以周期性地或者实时地获取虚拟topic的第二数据量,本申请实施例对其不做具体限定。
[0127] 获取第一真实topic的第一数据量的实现方式,可以相应参考获取虚拟topic的第二数据量的实现方式。或者,由于存储在第一真实topic中的数据均需存储在与其存在对应关系的虚拟topic中,因此,与该第一真实topic对应的所有虚拟topic的第二数据量的总和即为该第一真实topic的第一数据量。所以,可以获取与该第一真实topic对应的所有虚拟topic的第二数据量,并将该所有虚拟topic的第二数据量的总和确定为该第一数据量。
[0128] 步骤2052、基于第一数据量和每个目标虚拟topic的第二数据量,预估预存数据量。
[0129] 可选地,可以采用预估模型预估预存数据量。其中,该预估模型可以为卡尔曼滤波预估模型、回归预估模型或神经网络预估模型等。该预估模型的输入参数和输出参数均可以包括:至少一组参数,该至少一组参数与至少一个目标虚拟topic一一对应。
[0130] 对于每个目标虚拟topic,该对应组的输入参数可以包括:第一真实topic的标识,第一真实topic的第一数据量,目标虚拟topic的标识,及目标虚拟topic的第二数据量与第一数据量的比值。该对应组的输出参数可以包括:预存数据量,目标虚拟topic的标识,及目标虚拟topic的第三数据量与第一数据量的比值。需要说明的是,在预估在预设时间段内待在第一真实分区所在的第一真实topic中存储的消息的预存数据量时,该输出参数中还可以包括第一真实topic的标识。其中,该第一真实topic的标识用于在该消息存储系统中唯一地标识该真实topic,该目标虚拟topic的标识用于在该消息存储系统中唯一地标识该目标虚拟topic,且真实topic的标识和虚拟topic的标识可以均在系统建立过程中确定。
[0131] 示例地,当基于N个目标虚拟topic的第二数据量预估预存数据量时,该输入参数的格式可以为{{第一真实topic的标识,第一真实topic的第一数据量,第一个目标虚拟topic的标识,第一个目标虚拟topic的第二数据量与第一数据量的比值},......,{第一真实topic的标识,第一真实topic的第一数据量,第N个目标虚拟topic的标识,第N个目标虚拟topic的第二数据量与第一数据量的比值}}。该输出参数的格式可以为{{预存数据量,第一个目标虚拟topic的标识,第一个目标虚拟topic的第三数据量与第一数据量的比值},......,{预存数据量,第N个目标虚拟topic的标识,第N个目标虚拟topic的第三数据量与第一数据量的比值}}。或者,在预估在预设时间段内待在第一真实分区所在的第一真实topic中存储的消息的预存数据量时,该输出参数的格式可以为{{第一真实topic的标识,预存数据量,第一个目标虚拟topic的标识,第一个目标虚拟topic的第三数据量与第一数据量的比值},......,{第一真实topic的标识,预存数据量,第N个目标虚拟topic的标识,第N个目标虚拟topic的第三数据量与第一数据量的比值}}。
[0132] 或者,对于每个目标虚拟topic,该对应组的输入参数可以包括:第一真实topic的标识,第一真实topic的第一数据量,目标虚拟topic的标识,及目标虚拟topic的第二数据量。该对应组的输出参数可以包括:预存数据量,目标虚拟topic的标识,及目标虚拟topic的第三数据量。需要说明的是,在预估在预设时间段内待在第一真实分区所在的第一真实topic中存储的消息的预存数据量时,该输出参数中还可以包括第一真实topic的标识。
[0133] 在另一种可实现方式中,可以根据真实topic和虚拟topic的流量对该预存数据量进行预估。该步骤205的实现方式可以包括:
[0134] 在根据流量对预存数据量进行预估时,可以根据与第一真实topic存在对应关系的多个虚拟topic中的至少一个目标虚拟topic对应的第二流量,及第一真实topic对应的第一流量,对该预存数据量对应的流量进行预估,然后将该预估流量与预设时间段时长的乘积确定为该预存数据量。其中,该至少一个目标虚拟topic包括:与该第一真实topic对应的多个虚拟topic中的所有虚拟topic,或者,与该第一真实topic对应的多个虚拟topic中,流量占比由大到小的前至少一个虚拟topic。该流量占比为对应虚拟topic的第二流量与第一真实topic的第一流量的比值。
[0135] 可选地,可以采用数据存储系统中部署的流量收集(Metric Collector)模块,或者,在该数据存储系统创建的流量收集进程,获取虚拟topic对应的第二流量。同时,也可以采用该流量收集模块或该流量收集进程获取第一真实topic对应的第一流量。或者,由于存储在第一真实topic中的数据均需存储在与其存在对应关系的虚拟topic中,因此,与该第一真实topic对应的所有虚拟topic的第二流量的总和即为该第一真实topic的第一流量,所以,可将所有虚拟topic的第二数据量的总和确定为该第一数据量。
[0136] 并且,也可以采用预估模型根据第二流量和第一流量对该预存数据量对应的流量进行预估。且该预估模型的输入参数和输出参数均可以包括:至少一组参数,该至少一组参数与至少一个目标虚拟topic一一对应。
[0137] 对于每个目标虚拟topic,该对应组的输入参数可以包括:该第一真实topic的标识,该第一真实topic的第一流量,该目标虚拟topic的标识,及该目标虚拟topic的第二流量与第一流量的比值。该对应组的输出参数可以包括:预估流量,该目标虚拟topic的标识,及该目标虚拟topic的第三流量与预估流量的比值。需要说明的是,在预估在预设时间段内待在第一真实分区所在的第一真实topic中存储的消息的预存数据量对应的预估流量时,该输出参数中还可以包括第一真实topic的标识。
[0138] 示例地,当基于N个目标虚拟topic的第二流量预估预存数据量时,该输入参数的格式可以为{{第一真实topic的标识,第一真实topic的第一流量,第一个目标虚拟topic的标识,第一个目标虚拟topic的第二流量与第一流量的比值},......,{第一真实topic的标识,第一真实topic的第一流量,第N个目标虚拟topic的标识,第N个目标虚拟topic的第二流量与第一流量的比值}}。该输出参数的格式可以为{{预估流量,第一个目标虚拟topic的标识,第一个目标虚拟topic的第三流量与预估流量的比值},......,{预估流量,第N个目标虚拟topic的标识,第N个目标虚拟topic的第三流量与预估流量的比值}}。或者,在预估在预设时间段内待在第一真实分区所在的第一真实topic中存储的消息的预存数据量对应的预估流量时,该输出参数的格式可以为{{第一真实topic的标识,对应的预估流量,第一个目标虚拟topic的标识,第一个目标虚拟topic的第三流量与对应的预估流量的比值},......,{第一真实topic的标识,对应的预估流量,第N个目标虚拟topic的标识,第N个目标虚拟topic的第三流量与对应的预估流量的比值}}。
[0139] 或者,对于每个目标虚拟topic,该对应组的输入参数可以包括:该第一真实topic的标识,该第一真实topic的第一流量,该目标虚拟topic的标识,及该目标虚拟topic的第二流量。该对应组的输出参数可以包括:预估流量,该目标虚拟topic的标识,及该目标虚拟topic的第三流量。需要说明的是,在预估在预设时间段内待在第一真实分区所在的第一真实topic中存储的消息的预存数据量对应的预估流量时,该输出参数中还可以包括第一真实topic的标识。
[0140] 需要说明的是,由于消息存储系统中存储的数据量非常大,当至少一个目标虚拟topic包括与该第一真实topic对应的所有虚拟topic时,需要在每次预估过程中均对所有虚拟topic进行预估,导致预估过程的预估速度较慢。且需要使用大量的样本对预估模型进行训练,导致该训练过程的训练时长较长。因此,当目标虚拟topic包括与该第一真实topic对应的流量占比(或数据量占比)由大到小的前至少一个虚拟topic时,在每次预估过程中,仅需要对该流量占比(或数据量占比)由大到小的前至少一个虚拟topic进行预估,能够减少预估过程中需要处理的数据量,进而加快预估速度。且能够相应地减少对预估模型进行训练时所用的样本数,进而缩短训练时长。
[0141] 在一种可实现方式中,由于长短记忆(Long Short-Term Memory,LSTM)神经网络在预估方面表现出较大的优势,因此,本申请实施例中可以使用该LSTM神经网络实现上述预估功能。下面以该预估模型为LSTM神经网络为例,对该预估过程进行说明:
[0142] LSTM神经网络的结构请参考图6,其中,X(t-1)、X(t)和X(t+1)分别为LSTM神经网络在t-1、t和t+1时刻的输入,即分别为t-1、t和t+1时刻输入的输入参数。h(t-1)、h(t)和h(t+1)分别为该LSTM神经网络的隐含层在t-1、t和t+1时刻的输出。C(t-1)、C(t)和C(t+1)分别为从t-1、t和t+1时刻传递至下一时刻的细胞状态。
[0143] 请继续参考图6,该LSTM神经网络的功能主要通过三个门实现,即遗忘门(Forget gate)、输入门(Input gate)和输出门(Output gate)。
[0144] 遗忘门用于决定从细胞状态中丢弃哪些信息,门限δ1用于控制通过该遗忘门的数据量,δ1的取值范围为[0,1],δ1=0表示“完全的保留”,δ1=1表示“完全的丢弃”,其中,输入门的计算公式为:ft=δ1×(Wf×[ht-1,xt]+bf)。其中[ht-1,xt]表示上一时刻输出状态ht-1与当前输入状态xt的向量拼接,Wf是遗忘门的权重矩阵,Bf是遗忘门的偏置项。该Wf和该Bf的取值可以根据实际需要进行设置。
[0145] 输入门用于决定输入信息中有多少信息需要保留在当前时刻的细胞状态中,其功能主要通过输入门限层(δ2)和tanh1层实现。该输入门限层(δ2)用于决定更新哪些值,该输入门限层使用上一个输出状态ht-1与当前输入xt的拼接作为输入,即输入门限层的计算公式为:it=δ2×(Wi×[ht-1,xt]+bi),该Wi是输入门限层的权重矩阵,该bi是输入门限层的偏置项。tanh1层用于创建新的候选向量,并将其加入到细胞状态中,其计算公式为:Ct1=tanh1×(Wc×[ht-1,xt]+bc),该Wc是tanh1层的权重矩阵,bc是tanh1层的偏置项。根据该输入门限层和该tanh1层的输出,可以得到当前时刻的细胞状态为:上一时刻的单元状态C(t-1)按元素乘以遗忘门ft的第一乘积,与当前输入的单元状态Ct1按元素乘以输入门it的第二乘积的和,即当前时刻的细胞状态Ct=ft×C(t-1)+it×Ct1,LSTM通过该方式实现了对当前的记忆Ct1和长期的记忆C(t-1)的组合,进而实现了根据当前时刻之前的流量对当前时刻之后的流量的预估。
[0146] 输出门用于决定细胞状态中有多少信息需要输出到输出状态中,其功能通过输出门限层(δ3)和tanh2层实现。输出门限层(δ3)决定细胞转态哪些部分需要输出,该输出门限层使用上一个输出状态ht-1与当前输入xt的拼接作为输入,即输出门限层的输入Ot=δ3×(Wo×[ht-1,xt]+bo),该Wo是输出门限层的权重矩阵,bo是输出门限层的偏置项。tanh2层用于对细胞状态进行处理,并输出范围为[-1,1]的数值。该输出门的输出为输出门限层(δ3)的输出与tanh2层的输出的乘积,即输出门的输出ht=Ot×tanh2(Ct)。
[0147] 可选地,上述门限δ1、门限δ2和门限δ3的取值均可以根据实际需要进行设置。
[0148] 步骤206、当预存数据量大于数据量阈值时,建立虚拟存储地址与第二真实存储地址的对应关系。
[0149] 当预存数据量为预估的在预设时间段内接收的第二消息存储请求所指定的消息的数据量时,若该预存数据量大于第一阈值,表示该第二消息存储请求所指定的消息具有较大的存储需求,此时,可以将虚拟存储地址与真实存储地址的对应关系修改为虚拟存储地址与第二真实存储地址对应,以将该第二消息存储请求多指定的消息存储在更有能力支撑该存储需求的真实分区中,进而提高消息存储系统的存储性能。
[0150] 当预存数据量为预估的在预设时间段内待在第一真实分区所在的第一真实topic中存储的消息的数据量时,若该预存数据量大于第二阈值,表示该第一真实分区可能无法支撑该预设时间段内的消息存储需求,此时,为了有效存储该待存储的消息,以及保证该第一真实分区的存储性能,可以将虚拟存储地址与真实存储地址的对应关系修改为虚拟存储地址与第二真实存储地址对应,以将待存储在该第一真实分区所在的第一真实topic中的消息存储在第二真实存储地址中,进而提高消息存储系统的存储性能。其中,该第一阈值和该第二阈值可以根据实际需要确定,且该第一阈值和该第二阈值可以相等或不等,本申请实施例对次不做具体限定。
[0151] 该步骤206为对更改目标虚拟topic对应的虚拟存储地址与真实存储地址的对应关系的实现过程的说明。并且,在对该过程进行说明时,是以至少一个目标虚拟topic中的一个目标虚拟topic为例对其进行说明的,更改该至少一个目标虚拟topic中的其他目标虚拟topic对应的虚拟存储地址与真实存储地址的对应关系的实现过程,请相应参考该实现过程。其中,请参考图7,该步骤206的实现过程可以包括:
[0152] 步骤2061、基于目标虚拟topic的第三数据量,确定第二真实topic。
[0153] 可选地,如图8所示,该步骤2061的实现过程可以包括:
[0154] 步骤2061a、基于目标虚拟topic的第三数据量,查找可用数据量大于第三数据量的真实topic。
[0155] 其中,可用数据量为真实topic的数据量额度与步骤205中预估的预存数据量的差值。该真实topic的数据量额度为对该真实topic执行读写操作时,该真实topic能够承受的最大数据量。
[0156] 当真实topic的可用数据量大于目标虚拟topic的第三数据量时,说明该真实topic能够承受该目标虚拟topic的第三数据量,因此,可将该真实topic确定为第二真实topic,即执行步骤2061b。当真实topic的可用数据量不大于目标虚拟topic的第三数据量时,说明该真实topic无法承受该目标虚拟topic的第三数据量,此时,可以在消息存储系统中创建一个可用数据量大于该第三数据量的第二真实topic,即执行步骤2061c。
[0157] 需要说明的是,由于数据量为流量与时长的乘积,因此,也可以根据流量确定第二真实topic。例如,可以基于目标虚拟topic的第三流量,查找可用流量大于该第三流量的真实topic,并在确定存在可用流量大于第三流量的真实topic时,将可用流量大于第三流量的真实topic确定为第二真实topic,或者,在确定不存在可用流量大于第三流量的真实topic时,在消息存储系统中创建第二真实topic。
[0158] 示例地,假设目标虚拟topic的第三流量为56兆比特每秒(MB/S),消息存储系统中配置有五个真实topic,分别为真实topic1、真实topic2、真实topic3、真实topic4和真实topic5,该五个真实topic的可用流量分别为50MB/S、70MB/S、40MB/S、55MB/S和30MB/S,此时,真实topic2的可用流量大于该目标虚拟topic的第三流量,则可将该真实topic2确定为第二真实topic,即执行步骤2061b。
[0159] 步骤2061b、当确定存在可用数据量大于第三数据量的真实topic时,将可用数据量大于第三数据量的真实topic确定为第二真实topic。
[0160] 其中,在查找可用数据量大于第三数据量的真实topic的过程中,可能查找到消息存储系统中存在多个可用数据量大于第三数据量的真实topic,此时,可以将对应可用数据量最大的真实topic确定为该第二真实topic,以保证能够对真实topic进行有效利用,并减小由于真实topic的可用数据量较小导致的再次修改对应关系的几率。
[0161] 步骤2061c、当确定不存在可用数据量大于第三数据量的真实topic时,在消息存储系统中创建第二真实topic。
[0162] 当确定不存在可用数据量大于第三数据量的真实topic时,可以在消息存储系统中创建一个可用数据量大于第三数据量的真实topic,并将该创建的真实topic确定为该第二真实topic,以便于建立虚拟存储地址与包括该第二真实topic的第二真实存储地址的对应关系。
[0163] 需要说明的是,由于每个真实topic通常包括多个真实分区,因此,在确定第二真实topic后,还需要在该第二真实topic中确定第二真实分区,以便建立虚拟存储地址与第二真实存储地址的对应关系。且在确定第二真实分区的过程中,还需要确定该第二真实分区的可用数据量大于该虚拟存储地址指定的虚拟分区的预存数据量。其中,该确定第二真实分区的过程可以相应参考确定第二真实topic的过程。
[0164] 可选地,第一真实分区与该第二真实分区可部署在Kafka集群中的相同存储节点或不同存储节点上,本申请实施例对其不做具体限定。当第一真实分区与该第二真实分区部署在Kafka集群中的不同存储节点上时,能够将虚拟存储地址指定的虚拟topic的工作负载(流量或数据量)分摊到不同的存储节点上,以减小同一存储节点中多个topic的工作负载不均衡程度,降低多个topic在某一存储节点中出现占用资源不均衡的几率。并且,为了简化根据修改后的对应关系进行消息存储和消息读取的过程,当在步骤2061b中确定的真实分区包括第一存储节点中的真实分区和其他存储节点中的真实分区时,可以优先选择将该第一存储节点中的真实分区确定为第二真实分区。
[0165] 步骤2062、将与目标虚拟topic对应的虚拟存储地址与真实存储地址的对应关系,修改为虚拟存储地址与包括第二真实topic的第二真实存储地址对应,并将修改后的关联关系存储在目标虚拟topic对应的索引文件中。
[0166] 当修改目标虚拟topic对应的虚拟存储地址与真实存储地址的对应关系后,可将指定存储至该目标虚拟topic中的消息存储至该第二真实topic的第二真实分区数据文件中,进而实现将指定存储至该虚拟存储地址中的消息存储在第二真实存储地址中。
[0167] 并且,在修改该对应关系后,还可将修改后的对应关系存储在该目标虚拟topic对应的索引文件中,以便于能够根据该修改后的对应关系对消息进行存储和查找。例如:可以将该修改后的对应关系存储在该目标虚拟topic对应的映射记录索引中,当该映射记录索引的映射索引项中记载有真实分区标识长度字段和真实分区标识字段时,可以将该第二真实topic中第二真实分区的标识记载在该真实分区标识长度字段中,将该第二真实topic的标识长度记载在该真实分区标识字段中,以便于根据其确定与该目标虚拟topic对应的真实topic。并且,当该消息存储系统为基于kafka集群的消息存储系统时,该修改后的对应关系还可以保存在zookeeper(一种分布式应用程序协调服务)上,以便后续使用。
[0168] 步骤2063、确定第一消息在第二真实topic中的消息偏移量,并将该消息偏移量存储在目标虚拟topic对应的索引文件中。
[0169] 其中,第一消息为基于虚拟存储地址与第二真实存储地址的对应关系,存储在第二真实topic中的第一个消息。在修改对应关系之后,指定存储至该虚拟存储地址中的消息均存储在该第二真实topic中。而在修改该对应关系之前,由于指定存储至该虚拟存储地址中的消息均存储在第一真实topic中。因此,在修改该对应关系后,需要确定根据该修改后的对应关系,指定存储在该虚拟存储地址中的第一个消息的消息偏移量,以便于在后续存储和查找消息的过程中基于该消息偏移量对消息进行存储和查找。
[0170] 并且,在确定该消息偏移量后,还可以将该消息偏移量存储在该目标虚拟topic对应的索引文件中,以便于根据该消息偏移量,在指定存储在该虚拟存储地址的消息中,区分存储在第一真实topic中的消息和该第二真实topic中的消息。可选地,可以将消息偏移量存储在该目标虚拟topic对应的映射记录索引中,当该映射记录索引的映射索引项中记载有消息逻辑序号字段时,可以将该消息偏移量记载在该消息逻辑序号字段中。
[0171] 同时,为了便于后续对目标虚拟topic的数据量(或流量)进行预估,在完成该对应关系的修改过程后,还需要对该第一真实topic和该第二真实topic对应的预估模型进行重新训练以更新模型参数,例如重置LSTM参数。以及,若该第二真实topic为创建的真实topic,还需要对该创建的真实topic创建预估模型,以便于对该真实topic的流量进行预估。
[0172] 需要说明的是,对于与第一真实topic存在对应关系的至少一个目标虚拟topic,在修改对应关系时,可以按照至少一个目标虚拟topic的第二数据量(或第二流量)由大到小的顺序,依次修改每个目标虚拟topic的对应关系。此时,由于在确定目标虚拟topic对应的第二真实topic时,需要根据真实topic的可用数据量(或可用流量)进行选择,当按照第二数据量(或第二流量)由大到小的顺序依次修改至少一个目标虚拟topic的对应关系时,能够将具有较大可用数据量(或可用流量)的真实topic,确定为具有较大第二数据量(或第二流量)的目标虚拟topic对应的第二真实topic,使得消息存储系统中的真实topic能够被有效利用,并减小对目标虚拟topic的对应关系进行二次修改的几率。
[0173] 并且,在该消息存储系统中,可以部署有流量收集(Metric Collector)模块、流量topic(Flow Metric topic)、流量汇总(Flow Summary)模块、深度学习预估(Deep learning prediction)模块和话题迁移(topic migrate)模块。其中,该流量收集模块用于周期性地或者实时地获取系统中所有虚拟topic和真实topic的流量,并将其保存在流量topic中,即可以采用该流量收集模块执行上述步骤2051。该流量汇总模块可以定期从流量topic中读取流量信息,并将topic和虚拟topic当前时刻的流量输入至深度学习预估模块。该深度学习预估模块可以采用LSTM神经网络预估真实topic和虚拟topic在预设时间段的流量,即可以采用该深度学习预估模块执行上述步骤2052。话题迁移模块可以根据深度学习预估模块预估的流量,将修改虚拟topic的对应关系,即可以采用该话题迁移模块执行上述步骤206。
[0174] 通过修改虚拟存储地址与真实存储地址的对应关系,使得指定存储至虚拟存储地址中的消息能够存储在不同的真实存储地址中,能够在各个逻辑topic的数据量(或流量)不均衡时,减小各个逻辑topic占用的资源不均衡的几率。并且,通过修改该对应关系,使得无需对修改之前根据虚拟存储地址存储在第一真实存储地址中的消息进行迁移,使得在出现资源占用不均衡时,能够及时地将消息存储在第二真实存储地址中,并缩短对数据进行迁移所耗费的时长,可以解决相关技术中迁移时间过长和迁移不及时的问题,进而减小对磁盘的占用率,并提高了消息存储系统的吞吐率。同时,通过对数据量(或流量)进行预估,并根据预估结果修改该对应关系,能够根据该预估结果提前为消息预留资源,避免因迁移不及时造成的存储节点的崩溃。
[0175] 步骤207、接收在Kafka集群存储消息的第二消息存储请求,该第二消息存储请求指定在虚拟存储地址存储第二消息存储请求指定的消息。
[0176] 其中,第二消息存储请求的接收时间晚于第一消息存储请求的接收时间。该步骤207的实现过程请相应参考步骤201的实现过程。
[0177] 步骤208、基于虚拟存储地址与第二真实存储地址的对应关系,确定与虚拟存储地址对应的第二真实存储地址。
[0178] 由于第二消息存储请求的接收时间晚于第一消息存储请求的接收时间,在接收到该第二消息存储请求后,虚拟存储地址与真实存储地址的对应关系已修改为虚拟存储地址与第二真实存储地址对应,因此,可以根据该对应关系确定与虚拟存储地址对应的真实存储地址为第二真实存储地址。其中,第二真实存储地址包括第二真实topic的标识和第二真实分区的标识。并且,该步骤208的实现过程请相应参考步骤202的实现过程。
[0179] 步骤209、在第二真实存储地址指定的第二真实topic中的第二真实分区,存储第二消息存储请求指定的消息。
[0180] 由于虚拟存储地址与第二真实存储地址的对应关系为修改后的对应关系,且由于该第二真实存储地址指示的第二真实topic中的第二真实分区与虚拟存储地址指示的虚拟topic中的虚拟分区可能部署在相同的存储节点中,也可能部署在不同的存储节点中。因此,在存储该消息之前,需要确定该第二真实topic中的第二真实分区与虚拟topic中的虚拟分区是否部署在相同的存储节点中。并且,当第二真实topic中的第二真实分区与虚拟topic中的虚拟分区部署在相同的存储节点中时,可以直接将该消息存储在该第二真实存储地址中。当第二真实topic中的第二真实分区与虚拟topic中的虚拟分区部署在不同的存储节点中时,需要将该消息发送至该其他存储节点,以供该其他存储节点将该消息存储在该其他存储节点的第二真实存储地址中。其中,该存储消息的过程可以相应参考步骤203的实现过程,此处不再赘述。
[0181] 步骤210、根据第二消息存储请求指定的消息的存储位置生成索引信息,并将该索引信息存储在虚拟存储地址所指示的虚拟topic对应的索引文件中。
[0182] 可选地,当第二真实topic中的第二真实分区与虚拟topic中的虚拟分区部署在相同的存储节点中时,该步骤210的实现过程请相应参考步骤204的实现过程。当第二真实topic中的第二真实分区与虚拟topic中的虚拟分区部署在不同的存储节点中时,在其他存储节点将消息存储在该其他存储节点中后,可以由消息存储系统中的后台线程获取该索引信息,并将该索引信息发送至该第一存储节点,以在该第一存储节点中存储该索引信息。其中,该后台线程向第一存储节点发送索引信息的动作,可以是该后台线程主动执行的,也可以是该后台线程被动执行的。例如:在将消息存储在其他存储节点中后,可以自动触发后台线程,使该后台线程获取该索引信息,然后该后台线程主动地将该索引信息推送至该第一存储节点,使该第一存储节点对该索引信息进行存储。或者,该第一存储节点可以向该后台线程发送索引信息拉取请求,后台线程在接收该索引信息拉取请求后,可以获取该索引信息并向该第一存储节点发送该索引信息。
[0183] 在该通过后台线程发送该索引信息的实现方式中,由于无需第一存储节点主动地获取该第一存储位置信息,相较于相关技术中第一存储节点在写入数据后,需要再根据该数据的存储位置信息获取索引信息的实现方式,可以节省对该第一存储节点的资源占用,进而减少磁盘的占用率。
[0184] 并且,当第二真实topic中的第二真实分区与虚拟topic中的虚拟分区部署在不同的存储节点中时,通过将消息存储在其他存储节点上,将索引信息存储在第一存储节点上,可以实现消息与索引信息的分离存储,进而解耦真实存储地址与虚拟存储地址的关系,可以将虚拟存储地址指示的虚拟topic的工作负载(流量或数据量)分摊到不同的存储节点上,能够减小同一存储节点中多个topic的工作负载不均衡程度,降低多个topic在某一存储节点中出现占用资源不均衡的几率。
[0185] 需要说明的是,在本申请实施例中,虚拟存储地址与真实存储地址的对应关系也可以表示为虚拟topic与真实topic的对应关系。此时,也可以根据该虚拟topic与真实topic的对应关系执行消息存储的过程。例如,该消息存储方法可以包括:接收在该Kafka集群存储消息的第一消息存储请求,该第一消息存储请求指定在虚拟话题topic存储该消息;基于该虚拟topic与第一真实topic的对应关系,确定与该虚拟topic对应的第一真实topic;在该第一真实topic的真实分区中存储该第一消息存储请求指定的消息。其中,根据该虚拟topic与真实topic的对应关系执行消息存储的实现过程可以相应参考上述步骤201至步骤210,此处不再赘述。
[0186] 综上所述,本申请实施例提供的消息存储方法,在接收在Kafka集群存储消息的消息存储请求后,通过根据虚拟存储地址与真实存储地址的对应关系,确定用于存储消息的真实存储地址,并将消息存储在该真实存储地址指定的真实分区中,实现了消息的存储。
[0187] 并且,通过对消息存储请求所指定的待存储消息进行预估,根据预估的数据量修改虚拟存储地址与真实存储地址的对应关系,使得指定存储至虚拟存储地址中的消息能够存储在不同的真实存储地址中,相较于相关技术,减小了真实topic中真实分区工作负载过重的几率,提高了消息存储系统的吞吐率。
[0188] 本申请实施例还提供了一种消息读取方法,如图9所示,该消息读取方法可以包括:
[0189] 步骤601、接收在Kafka集群读取消息的消息读取请求。
[0190] 当客户端需要从Kafka集群读取消息时,该客户端可以向第一存储节点发送消息读取请求。该消息读取请求指定从虚拟存储地址读取消息,该虚拟存储地址包括虚拟话题topic的标识和虚拟分区的标识。
[0191] 步骤602、基于虚拟存储地址与真实存储地址的对应关系,确定与虚拟存储地址对应的目标真实存储地址。
[0192] 消息读取请求中通常携带有待读取消息的目标偏移量,相应的,如图10所示,该步骤602的实现过程可以包括:
[0193] 步骤6021、基于目标偏移量,获取待读取消息的目标索引文件。
[0194] 在接收到消息读取请求后,可以基于该消息读取请求中的目标偏移量,采用二分法在存储节点中查找该待读取消息的目标索引文件。其中,该目标索引文件可以包括:目标数据记录索引和目标映射记录索引。该目标数据记录索引用于指示该待读取消息在真实分区中的偏移量。该目标映射记录索引用于指示用于存储该待读取消息的虚拟存储地址与真实存储地址的对应关系。
[0195] 步骤6022、获取目标索引文件中记载的第一消息的消息偏移量。
[0196] 其中,第一消息为存储在当前对应关系指定的真实topic中的第一个消息。目标索引文件为虚拟存储地址指定的虚拟topic对应的索引文件。可选地,当目标索引文件包括目标数据记录索引和目标映射记录索引时,可以在目标映射记录索引中获取该第一消息的消息偏移量。该当前对应关系为在消息存储系统的使用过程中,对该虚拟存储地址与真实存储地址的对应关系修改后的对应关系。对虚拟存储地址与真实存储地址的对应关系修改前的对应关系为历史对应关系,该历史对应关系中记载的真实存储地址与当前对应关系中记载的真实存储地址不同。且该基于当前对应关系存储的消息的偏移量大于基于历史对应关系存储的消息的偏移量。
[0197] 由于基于当前对应关系存储的消息,存储在该当前对应关系所指定的真实存储地址中。基于历史对应关系存储的消息,存储在该历史对应关系所指定的真实存储地址中。因此,在确定目标真实存储地址前,需要先获取该第一消息的消息偏移量,并将该第一消息的消息偏移量与目标偏移量进行比较,以确定该目标真实存储地址为历史对应关系所指定的真实存储地址,还是当前对应关系所指定的真实存储地址,进而保证能够有效地读取消息。且在目标偏移量小于消息偏移量时,确定该目标真实存储地址为历史对应关系所指定的真实存储地址,此时执行步骤6024。在目标偏移量大于或等于消息偏移量时,确定该真实存储地址为当前对应关系所指定的真实存储地址,此时执行步骤6023。
[0198] 示例地,假设目标映射索引文件中记载的第一消息的消息偏移量为101,且目标偏移量offset为77,由于该目标偏移量小于消息偏移量,则可以确定该真实存储地址为历史对应关系所指定的真实存储地址,此时可以确定执行步骤6024。
[0199] 步骤6023、当目标偏移量大于或等于消息偏移量时,将当前对应关系中记载的真实存储地址确定为目标真实存储地址。
[0200] 当目标偏移量大于或等于消息偏移量时,可以确定该真实存储地址为当前对应关系所指定的真实存储地址,此时,可以将该当前对应关系中记载的真实存储地址确定为该目标真实存储地址,且该目标真实存储地址包括目标真实topic的标识和目标真实分区的标识。
[0201] 步骤6024、当目标偏移量小于消息偏移量时,将历史对应关系中记载的真实存储地址确定为目标真实存储地址。
[0202] 当目标偏移量小于消息偏移量时,可以确定该真实存储地址为历史对应关系所指定的真实存储地址,此时可以查询该历史对应关系,并将历史对应关系中记载的真实存储地址确定为该目标真实存储地址。
[0203] 步骤603、在目标真实存储地址指定的目标真实分区读取消息读取请求所指定的消息。
[0204] 在确定目标真实存储地址后,可以根据目标数据记录索引记载的该待读取消息在真实分区中的偏移量,在该目标真实存储地址指定的目标真实分区中读取该待读取的消息。
[0205] 可选地,根据消息和索引信息的不同存储方式,该步骤603的实现方式存在一定的差异,下面从以下两个方面进行说明:
[0206] 在第一方面,当目标真实存储地址指定的目标真实分区位于第一存储节点中时,即索引信息与待读取消息存储在同一存储节点中,此时,可以在该目标真实分区中读取该待读取消息。
[0207] 在第二方面中,当目标真实存储地址指定的目标真实分区位于其他存储节点中时,即索引信息与待读取消息存储在不同存储节点中,此时,第一存储节点可以向该其他存储节点发送目标索引信息,以供该其他存储节点基于该目标索引信息获取该待读取消息,并向该第一存储节点发送携带有该待读取消息的第二消息读取响应。该第一存储节点在接收该第二消息读取响应后,可根据该第二消息读取响应获取该待读取消息。其中,该其他存储节点为真实分区所属的存储节点。该目标索引信息中记载有目标真实存储地址所指定的目标真实分区的信息。
[0208] 步骤604、发送携带有待读取消息的第一消息读取响应。
[0209] 第一存储节点在获取该待读取消息后,可向发送消息读取请求的客户端发送该第一消息读取响应,以便于该客户端获取该第一消息读取响应中携带的待读取消息。
[0210] 并且,由于在本申请实施例中,由于消息均是连续地存储在真实分区的消息文件中的,且每个索引项中记录的内容均为连续存储的消息对应的索引信息,因此,在读取消息时,可以根据同一个索引项中连续存储的索引信息,批量地读取该索引项所对应的消息文件中的消息,进而避免离散地读取消息。
[0211] 需要说明的是,在修改目标虚拟topic对应的虚拟存储地址与真实存储地址的对应关系后,若第二真实topic中的第二真实分区属于其他存储节点,在读取消息时需要先在索引信息所在的第一存储节点中读取索引信息,然后根据该索引信息在其他存储节点中读取消息。此时,为了避免读取消息需要一直跨两个存储节点,可以为基于修改前的对应关系存储的数据设置消息老化机制,即当该消息在第一存储节点中的存储时长达到预设时间段时,将该消息进行删除。并且,在删除该消息后,还可以在该其他节点上重建索引,使得索引信息与消息存储在同一个节点,进而保证消息的读取效率。
[0212] 还需要说明的是,在本申请实施例中,虚拟存储地址与真实存储地址的对应关系也可以表示为虚拟topic与真实topic的对应关系。此时,也可以根据该虚拟topic与真实topic的对应关系执行消息读取的过程。其中,根据该虚拟topic与真实topic的对应关系执行消息读取的实现过程可以相应参考上述步骤601至步骤604,此处不再赘述。
[0213] 综上所述,本申请实施例提供的消息读取方法,在接收在Kafka集群存储消息的消息存储请求后,通过虚拟存储地址与真实存储地址的对应关系,确定与虚拟存储地址对应的目标真实存储地址,并在目标真实存储地址指定的目标真实分区读取消息读取请求所指定的消息,实现了消息的读取。
[0214] 本申请实施例提供了一种消息存储装置,如图11所示,该装置700可以包括:
[0215] 接收模块701,用于接收在Kafka集群存储消息的第一消息存储请求,第一消息存储请求指定在虚拟存储地址存储第一消息存储请求指定的消息,虚拟存储地址可以包括虚拟话题topic的标识和虚拟分区的标识。
[0216] 确定模块702,用于基于虚拟存储地址与第一真实存储地址的对应关系,确定与虚拟存储地址对应的第一真实存储地址,第一真实存储地址可以包括第一真实topic的标识和第一真实分区的标识。
[0217] 存储模块703,用于在第一真实存储地址指定的第一真实topic中的第一真实分区,存储第一消息存储请求指定的消息。
[0218] 可选地,接收模块701,还用于接收在Kafka集群存储消息的第二消息存储请求,第二消息存储请求指定在虚拟存储地址存储第二消息存储请求指定的消息。
[0219] 确定模块702,还用于基于虚拟存储地址与第二真实存储地址的对应关系,确定与虚拟存储地址对应的第二真实存储地址,第二真实存储地址可以包括第二真实topic的标识和第二真实分区的标识。
[0220] 存储模块703,还用于在第二真实存储地址指定的第二真实topic中的第二真实分区,存储第二消息存储请求指定的消息。
[0221] 可选地,第一真实分区与第二真实分区部署在Kafka集群中的不同存储节点上。
[0222] 可选地,第二消息存储请求的接收时间晚于第一消息存储请求的接收时间。
[0223] 可选地,如图12所示,该装置700还可以包括:
[0224] 预估模块704,用于预估在预设时间段内接收的第二消息存储请求所指定的消息的预存数据量。
[0225] 建立模块705,用于当预存数据量大于第一阈值时,建立虚拟存储地址与第二真实存储地址的对应关系。
[0226] 可选地,如图13所示,预估模块704,可以包括:
[0227] 获取子模块7041,用于对于与第一真实topic存在对应关系的多个虚拟topic中的至少一个目标虚拟topic,获取在每个目标虚拟topic中存储的消息的第二数据量。
[0228] 获取子模块7041,还用于获取在第一真实topic中存储的消息的第一数据量。
[0229] 预估子模块7042,用于基于第一数据量和每个目标虚拟topic的第二数据量,预估预存数据量。
[0230] 可选地,预估子模块7042,用于:采用预估模型预估预存数据量。
[0231] 其中,预估模型的输入参数和输出参数均可以包括:至少一组参数,至少一组参数与至少一个目标虚拟topic一一对应,对于每个目标虚拟topic:
[0232] 输入参数可以包括:第一真实topic的标识和第一数据量,目标虚拟topic的标识,目标虚拟topic的第二数据量与第一数据量的比值。
[0233] 输出参数可以包括:预存数据量,目标虚拟topic的标识,目标虚拟topic的第三数据量与第一数据量的比值。
[0234] 或者,输入参数可以包括:第一真实topic的标识和第一数据量,目标虚拟topic的标识和目标虚拟topic的第二数据量。
[0235] 输出参数可以包括:预存数据量,目标虚拟topic的标识和目标虚拟topic的第三数据量。
[0236] 可选地,预估模块704,还用于预估在预设时间段内待在第一真实分区所在的第一真实topic中存储的消息的预存数据量。
[0237] 建立模块705,还用于当预存数据量大于第二阈值时,建立虚拟存储地址与第二真实存储地址的对应关系。
[0238] 可选地,如图13所示,预估模块704,可以包括:
[0239] 获取子模块7041,用于对于与第一真实topic存在对应关系的多个虚拟topic中的至少一个目标虚拟topic,获取在每个目标虚拟topic中存储的消息的第二数据量。
[0240] 获取子模块7041,还用于获取在第一真实topic中存储的消息的第一数据量。
[0241] 预估子模块7042,用于基于第一数据量和每个目标虚拟topic的第二数据量,预估预存数据量。
[0242] 可选地,预估子模块7042,用于:采用预估模型预估预存数据量。其中,预估模型的输入参数和输出参数均可以包括:至少一组参数,至少一组参数与至少一个目标虚拟topic一一对应,对于每个目标虚拟topic:
[0243] 输入参数可以包括:第一真实topic的标识和第一数据量,目标虚拟topic的标识,目标虚拟topic的第二数据量与第一数据量的比值。
[0244] 输出参数可以包括:第一真实topic的标识和预存数据量,目标虚拟topic的标识,目标虚拟topic的第三数据量与第一数据量的比值。
[0245] 或者,输入参数可以包括:第一真实topic的标识和第一数据量,目标虚拟topic的标识和目标虚拟topic的第二数据量。
[0246] 输出参数可以包括:第一真实topic的标识和预存数据量,目标虚拟topic的标识和目标虚拟topic的第三数据量。
[0247] 可选地,至少一个目标虚拟topic可以包括:多个虚拟topic中的所有虚拟topic,或者,多个虚拟topic中存储的数据量由大到小的前至少一个虚拟topic。
[0248] 可选地,如图14所示,建立模块705,可以包括:
[0249] 查找子模块7051,用于基于每个目标虚拟topic的第三数据量,查找可用数据量大于第三数据量的真实topic,可用数据量为真实topic的数据量额度与预存数据量的差值。
[0250] 确定子模块7052,用于当确定存在可用数据量大于第三数据量的真实topic时,将可用数据量大于第三数据量的真实topic确定为第二真实topic。
[0251] 确定子模块7052,用于当确定不存在可用数据量大于第三数据量的真实topic时,在消息存储系统中创建第二真实topic。
[0252] 修改子模块7053,用于将与目标虚拟topic对应的虚拟存储地址与真实存储地址的对应关系,修改为虚拟存储地址与可以包括第二真实topic的第二真实存储地址对应。
[0253] 可选地,确定子模块7052,用于:当确定存在多个可用数据量大于第三数据量的真实topic时,将最大可用数据量对应的真实topic确定为第二真实topic。
[0254] 可选地,建立模块705,用于:对于与第一真实topic存在对应关系的至少一个目标虚拟topic,按照至少一个目标虚拟topic的第二数据量由大到小的顺序,依次建立每个目标虚拟topic对应的虚拟存储地址与第二真实存储地址的对应关系。
[0255] 可选地,建立模块705,还用于:
[0256] 确定第一消息在第二真实topic中的消息偏移量,第一消息为基于虚拟存储地址与第二真实存储地址的对应关系,存储在第二真实topic中的第一个消息。
[0257] 将第一消息的消息偏移量和虚拟存储地址与第二真实存储地址的对应关系,存储在目标虚拟topic对应的索引文件中。
[0258] 可选地,每个真实存储地址与多个虚拟存储地址存在对应关系。
[0259] 综上所述,本申请实施例提供的消息存储装置,接收模块在接收在Kafka集群存储消息的消息存储请求后,确定模块根据虚拟存储地址与真实存储地址的对应关系,确定用于存储消息的真实存储地址,存储模块将消息存储在该真实存储地址指定的真实分区中,实现了消息的存储。
[0260] 并且,通过对消息存储请求所指定的待存储消息进行预估,根据预估的数据量修改虚拟存储地址与真实存储地址的对应关系,使得指定存储至虚拟存储地址中的消息能够存储在不同的真实存储地址中,相较于相关技术,减小了真实topic中真实分区工作负载过重的几率,提高了消息存储系统的吞吐率。
[0261] 本申请实施例提供了一种消息读取装置,如图15所示,该装置800可以包括:
[0262] 接收模块801,用于接收在Kafka集群读取消息的消息读取请求,消息读取请求指定从虚拟存储地址读取消息,虚拟存储地址可以包括虚拟话题topic的标识和虚拟分区的标识。
[0263] 确定模块802,用于基于虚拟存储地址与真实存储地址的对应关系,确定与虚拟存储地址对应的目标真实存储地址,目标真实存储地址可以包括目标真实topic的标识和目标真实分区的标识。
[0264] 读取模块803,用于在目标真实存储地址指定的目标真实分区读取消息读取请求所指定的消息。
[0265] 可选地,消息读取请求中携带有待读取消息的目标偏移量,确定模块802,用于:
[0266] 获取目标索引文件中记载的第一消息的消息偏移量,第一消息为基于虚拟存储地址与真实存储地址的当前对应关系,存储在当前对应关系指定的真实topic中的第一个消息,目标索引文件为虚拟存储地址指定的虚拟topic对应的索引文件。
[0267] 当目标偏移量大于或等于消息偏移量时,将当前对应关系中记载的真实存储地址确定为目标真实存储地址。
[0268] 当目标偏移量小于消息偏移量时,将虚拟存储地址与真实存储地址的历史对应关系中记载的真实存储地址确定为目标真实存储地址,当前对应关系中记载的真实存储地址与历史对应关系中记载的真实存储地址不同。
[0269] 综上所述,本申请实施例提供的消息读取装置,在接收模块接收在Kafka集群存储消息的消息存储请求后,确定模块虚拟存储地址与真实存储地址的对应关系,确定与虚拟存储地址对应的目标真实存储地址,读取模块在目标真实存储地址指定的目标真实分区读取消息读取请求所指定的消息,实现了消息的读取。
[0270] 本申请实施例还提供了一种服务器,该服务器可以包括处理器和存储器。在处理器执行存储器存储的计算机程序时,服务器执行本申请实施例提供的消息存储方法。
[0271] 具体地,请参考图16,该服务器20可以包括:处理器22和信号接口24。
[0272] 处理器22包括一个或者一个以上处理核心。处理器22通过运行软件程序以及模块,从而执行各种功能应用以及数据处理。处理器22可以包括中央处理单元、数字信号处理器、微处理器、微控制器或人工智能处理器中的一种或多种,还可以进一步选择性地包括执行运算所需的硬件加速器,如各种逻辑运算电路。
[0273] 信号接口24可以为多个,该信号接口24用于与其它装置或模块建立连接,例如:可以通过该信号接口24与收发机进行连接。因此,可选地,该服务器20还可包括收发机(图中未示出)。该收发机具体执行信号收发。当处理器22需要执行信号收发操作的时候可以调用或驱动收发机执行相应收发操作。因此,当服务器20进行信号收发的时候,处理器22用于决定或发起收发操作,相当于发起者,而收发机用于具体收发执行,相当于执行者。该收发机也可以是收发电路、射频电路或射频单元,本实施例对此不限定。
[0274] 可选的,服务器20还包括存储器26、总线28等部件。其中,存储器26与信号接口24分别通过总线28与处理器22相连。
[0275] 存储器26可用于存储软件程序以及模块。具体的,存储器26可存储至少一个功能所需的程序模块262,该程序可以是应用程序或驱动程序。
[0276] 其中,该程序模块262可以包括:
[0277] 接收单元2621,具有与接收模块701相同或相似的功能。
[0278] 确定单元2622,具有与确定模块702相同或相似的功能。
[0279] 存储单元2623,具有与存储模块703相同或相似的功能。
[0280] 本发明实施例还提供了一种存储介质,该存储介质可以为非易失性计算机可读存储介质,存储介质内存储有计算机程序,计算机程序指示服务器执行本发明实施例提供的消息存储方法。
[0281] 本发明实施例还提供了一种包含指令的计算机程序产品,当计算机程序产品在计算机上运行时,使得计算机执行本发明实施例提供的消息存储方法。
[0282] 本申请实施例还提供了一种服务器,该服务器可以包括处理器和存储器。在处理器执行存储器存储的计算机程序时,服务器执行本申请实施例提供的消息读取方法。
[0283] 具体地,请参考图17,该服务器40可以包括:处理器42和信号接口44。
[0284] 处理器42包括一个或者一个以上处理核心。处理器42通过运行软件程序以及模块,从而执行各种功能应用以及数据处理。处理器42可以包括中央处理单元、数字信号处理器、微处理器、微控制器或人工智能处理器中的一种或多种,还可以进一步选择性地包括执行运算所需的硬件加速器,如各种逻辑运算电路。
[0285] 信号接口44可以为多个,该信号接口44用于与其它装置或模块建立连接,例如:可以通过该信号接口44与收发机进行连接。因此,可选地,该服务器40还可包括收发机(图中未示出)。该收发机具体执行信号收发。当处理器42需要执行信号收发操作的时候可以调用或驱动收发机执行相应收发操作。因此,当服务器40进行信号收发的时候,处理器42用于决定或发起收发操作,相当于发起者,而收发机用于具体收发执行,相当于执行者。该收发机也可以是收发电路、射频电路或射频单元,本实施例对此不限定。
[0286] 可选的,服务器40还包括存储器46、总线48等部件。其中,存储器46与信号接口44分别通过总线48与处理器42相连。
[0287] 存储器46可用于存储软件程序以及模块。具体的,存储器46可存储至少一个功能所需的程序模块462,该程序可以是应用程序或驱动程序。
[0288] 其中,该程序模块462可以包括:
[0289] 接收单元4621,具有与接收模块801相同或相似的功能。
[0290] 确定单元4622,具有与确定模块802相同或相似的功能。
[0291] 读取单元4623,具有与读取模块803相同或相似的功能。
[0292] 本发明实施例还提供了一种存储介质,该存储介质可以为非易失性计算机可读存储介质,存储介质内存储有计算机程序,计算机程序指示服务器执行本发明实施例提供的消息读取方法。
[0293] 本发明实施例还提供了一种包含指令的计算机程序产品,当计算机程序产品在计算机上运行时,使得计算机执行本发明实施例提供的消息读取方法。
[0294] 本领域普通技术人员可以理解实现上述实施例的全部或部分步骤可以通过硬件来完成,也可以通过程序来指令相关的硬件完成,所述的程序可以存储于一种计算机可读存储介质中,上述提到的存储介质可以是只读存储器,磁盘或光盘等。
[0295] 以上所述仅为本发明的较佳实施例,并不用以限制本发明,凡在本发明的精神和原则之内,所作的任何修改、等同替换、改进等,均应包含在本发明的保护范围之内。