[0168] 本实施例中,索引节点号是通过预先设置的索引节点号计算函数,根据节点路径、控制器群组中的镜像对的主节号、在线节点的节点号计算得到,计算的结果显示在节点位图集合中,通过1<
[0169] 本实施例中,节点位图集合中,有一个节点位图中的某一位为1,该节点位图表示的节点号,即该待存储子数据对应的索引节点号。
[0170] 示例地,某32位位图的第5位为1,其余位数为0,则该待存储子数据对应的索引节点号为00001……0,一共32位,该索引节点号实际对应的接节点编号为5号节点。
[0171] S15:将每个所述待存储子数据发送至目标控制器节点中,所述目标控制器节点是所述索引节点号对应的控制器节点。
[0172] 本实施例中,目标控制器节点就是索引节点号对应的控制器节点,也就是对待存储子数据进行处理的控制器节点。
[0173] 本实施例中,在确定了待存储子数据对应的索引节点号之后,通过转发模块,将待存储子数据发送至索引节点号对应的目标控制器节点中。
[0174] 示例地,一个待存储数据拆分为4个待存储子数据,待存储子数据1由当前节点处理,待存储子数据2‑3分别转发至控制器节点2‑3中。
[0175] 本实施例中,预先对数据区域进行了划分,对跨区域的大块数据按照预先划分的数据区域进行拆分,在将拆分后的数据转发至各个控制器节点进行处理,提高了数据处理的效率,降低了数据传输时的“长尾效应”。
[0176] 参考图3,图3是本申请一实施例提出的数据转发流程示意图,其中包括了4个数据区域数据区域0、数据区域1、数据区域2、数据区域3(region0‑region3),原IO为跨数据区域IO,拆分为子IO1以及子IO2,分别发送至控制器节点0(node0)以及node1控制器节点1(node1)。IO1和IO2是单一区域数据,将IO1发送至控制器节点2(node2),将IO2发送至node3控制器节点3(node3)。
[0177] 参考图4,图4是本申请一实施例提出的数据发送系统结构示意图,如图4所示,上层IO进行随机下发,再对数据进行跨区域判断以及数据拆分,再进行IO换发、IO下发、故障处理、对子IO进行并行处理,这些模块构成了一个完整的数据发送系统。
[0178] 在本申请的另一个实施例中,在将待存储数据发送至控制器群组中任意一个控制器节点的数据转发层之前,所述方法还包括:
[0179] S21:在所述控制器群组中添加多个所述控制器节点。
[0180] 原有的控制器群组中一般是双控制器节点。
[0181] 本实施例中,在原有的控制器群组中添加多个控制器节点。
[0182] S22:通过循环镜像的方式,对多个所述控制器节点进行结对,得到多个控制器节点对。
[0183] 本实施例中,通过循环镜像的方式,对控制器群组中的多个控制器节点进行结对,得到多个控制器节点。
[0184] 示例地,控制器群组中有4个控制器节点,控制器节点1与控制器节点2结对,控制器节点2与控制器节点3结对,控制器节点3与控制器节点4结对,控制器节点4余控制器节点1结对。
[0185] S23:在每个所述控制器节点对中指定一个所述控制器节点为主控制器节点。
[0186] 本实施例中,主控制器节点是控制器节点对中处理数据的主节点,另一个节点起到辅助作用。
[0187] 本实施例中,在每个控制器节点对中指定一个控制器节点作为主控制器节点。
[0188] 示例地,主控制器节点可以根据实际情况自行设置,可以设置控制器节点对中的奇数编号节点为主控制器节点。
[0189] 本实施例中,将原本的双控制器节点扩展为多控制器节点,不同节点之间通过循环镜像方式实现结对,从而保留了原本双控的耦合结构,同时能够提高控制器节点对运行业务的高效并发性,基于这一基础架构,本实施例提出了单卷多控负载均衡架构,即一个存储卷的数据可以由多个控制器节点并行处理,使得上层下发的数据可以在多控制器节点之间负载均衡。
[0190] 在本申请的另一个实施例中,所述方法还包括:
[0191] S31:响应于所述存储卷为非运行状态,将所述待存储数据放入等待队列中。
[0192] 本实施例中,等待队列是待处理任务等待进行处理的队列。
[0193] 本实施例中,存储卷为非运行状态时,无法接收或发送数据,因此无法对待存储数据进行存储,此时将待存储数据放入等待队列中,等待存储卷原型之后再进行处理。
[0194] S32:响应于所述存储卷由所述非运行状态变更为所述运行状态,确定所述待存储数据对应的所述数据区域。
[0195] 本实施例中,当存储卷由非运行状态变更为运行状态时,确定待存储数据对应的数据区域。
[0196] 在本申请的另个一实施例中,所述方法还包括:
[0197] S41:响应于所述待存储数据对应的所述数据区域为单一数据区域,确定所述待存储数据对应的传输路径是否为快速路径。
[0198] 本实施例中,快速路径(fastpath)是不需要进行分析处理的数据包快速传递的路径,通过快速路径,可以将数据包直接发送至目标存储设备,不经过控制器节点。
[0199] 本实施例中,当待存储数据对应的数据区域为单一数据区域时,说明待存储数据的起始存储地址以及终止存储地址都落在了同一个数据区域内,此时根据该待存储数据的数据信息,确定该待存储数据对应的路径是否为快速路径。
[0200] S42:当所述待存储数据对应的传输路径为快速路径时,将所述待存储数据直接传输至所述待存储数据对应的存储设备。
[0201] 本实施例中,当待存储数据对应的传输路径为快速路径时,将待存储数据通过快速路径直接进行透传,传输至对应的存储设备。
[0202] 在本申请的另个一实施例中,所述方法还包括:
[0203] S43:当所述存储数据对应的所述传输路径不是所述快速路径时,确定所述待存储数据对应的存储卷是否为非运行状态。
[0204] S44:当所述存储卷为非运行状态时,将所述待存储数据放入等待队列中。
[0205] 本实施例中,在确定了待存储数据对对应的数据区域为单一数据区域,且当存储数据对应的传输路径不是快速路径时,再次确认存储数据对应的存储卷是否为非运行状态。当存储卷为非运行状态时,该存储卷无法接收或者发送数据,此时将待存储数据放入等待队列中。
[0206] 在本申请的另一个实施例中,在根据所述待存储数据对应的所述数据区域,对所述待存储数据进行数据拆分,得到多个待存储子数据之前,所述方法还包括:
[0207] S51:确定所述待存储数据对应的起始存储地址以及终止存储地址。
[0208] 本实施例中,待存储数据对应的起始存储地址为待存储数据在存储空间中的起始地址,终止存储地址为待存储数据在存储空间中的终止地址。
[0209] 本实施例中,在根据待存储数据对应的数据区域对待存储数据进行拆分之前,首先确定待存储数据对应的起始存储地址以及终止存储地址。
[0210] S52:根据所述起始存储地址与所述终止存储地址,确定所述待存储数据对应的所述数据区域是否为单一数据区域。
[0211] 本实施例中,根据起始存储地址与终止存储地址,确定待存储数据对应的数据区域是否为单一数据区域。
[0212] 本实施例中,所述根据所述起始存储地址与所述终止存储地址,确定所述待存储数据对应的所述数据区域是否为单一数据区域的具体步骤包括:
[0213] S52‑1:将所述起始存储地址与所述终止存储地址与每个所述数据区域的预设起始地址和预设终止地址进行对比。
[0214] 本实施例中,每个数据区域都有对应的预设起始地址与预设终止地址,将待存储数据的起始存储地址与每个数据区域的预设起始地址进行对比,将待存储数据的终止存储区地址与每个数据区域的预设终止地址进行对比。
[0215] S52‑2:当所述起始存储地址与所述终止存储地址位于同一个所述数据区域内时,确定所述待存储数据对应的所述数据区域为所述单一数据区域。
[0216] 本实施例中,当待存储数据的起始存储地址与终止存储地址位于同一个数据区域内时,确定待存储数据对应的数据区域是单一数据区域。
[0217] 示例地,待存储数据的起始存储地址为2,终止存储地址为5,某个数据区域的起始地址为0,终止地址为5,该待存储数据的起始存储地址与终止存储地址都落在了该数据区域内,则该待存储数据对应的数据区域为单一数据区域。
[0218] S52‑3:当所述起始存储地址与所述终止存储地址位于不同所述数据区域内时,确定所述待存储数据对应的所述数据区域为非单一数据区域。
[0219] 本实施例中,当待存储数据的起始存储地址与终止存储地址位于不同的数据区域内时,确定待存储数据对应的数据区域为非单一数据区域。
[0220] 示例地,当待存储数据的起始存储地址为2,终止存储地址为8,某个数据区域的起始地址为0,终止地址为5时,待存储数据的起始存储数据在该数据区域内,终止存储地址不在该数据区域内,则该待存储数据至少对应有两个数据区域,确定该待存储数据对应的数据区域为非单一数据区域。
[0221] 在判断待存储数据的数据区域是否为单一数据区域时,用到的判断语句如下:
[0222] if(startSeg != endSeg) retrun true;
[0223] startSeg = startLba_i/REGION_LBA_SIZE;
[0224] endSeg = endLba_i/REGION_LBA_SIZE;
[0225] 其中,当startSeg不等于endSeg时,确定该待存储数据对应的数据区域为非单一数据区域。
[0226] 在本申请的另一个实施例中,在根据每个所述待存储子数据对应的所述数据区域,确定每个所述待存储子数据对应的索引节点号之前,所述方法还包括:
[0227] S61:确定所述待存储子数据对应的所述数据区域中是否存在转发标志。
[0228] 本实施例中,转发标志存在于待存储子数据对应的数据区域中。
[0229] S62:当所述待存储子数据对应的所述数据区域中存在所述转发标志时,确定所述待存储子数据为所述待转发子数据。
[0230] 本实施例中,当待存储子数据对应的数据区域中存在带有FORWARD(转发标志位)的flag标记,就表示该待存储子数据需要转发到其他节点进行处理,当不存在转发标志时,就通过submit down(下层转发),直接交由本节点的下层进行处理。
[0231] 参考图5,图5是本申请一实施例提出的数据发送流程示意图,图中首先由数据转发层接收数据,检测卷是否在线,当卷在线时判断IO是否块区域,当IO块区域时,进行数据拆分,处理子IO,当IO不是跨区域数据时,判断IO是否需要进行直接转发,再看卷是否离线,确认卷在线之后,再确定当前节点上的IO是否需要转发,当IO不需要转发时,直接从当前节点处理后下发,当IO需要转发时,获取转发到节点的索引节点号(nodeindex),当索引节点码无效时或者节点不在线时,将IO放入等待队列中,当索引节点码有效且节点在线时,进行IO数据的转发。
[0232] 在本申请的另一个实施例中,所述方法还包括:
[0233] S71:响应于所述控制器节点发生故障事件,确定所述待存储子数据是否开始进行转发。
[0234] 本实施例中,参考图6,图6是本申请一实施例提出的IO异常处理机制流程图,如图6所示,当待存储数据所在的节点发生故障事件时,确定待存储子数据是否已经开始进行转发(transfer)。
[0235] S72:当所述待存储子数据未开始进行转发时,将所述待存储子数据对应的所述目标控制器节点设置为故障状态。
[0236] 本实施例中,当待存储子数据未开始进行转发时,将待存储子数据对应的目标控制器节点设置为故障状态(pend)。
[0237] S73:在所述控制器节点对应的节点位图上添加转发失败标记。
[0238] 本实施例中,在该控制器节点对应的节点位图上添加转发失败标记,转发失败标记用于标志该节点最近一次的数据转发失败。
[0239] S74:将所述待存储子数据放入等待队列。
[0240] 本实施例中,将待存储子数据放入等待队列中,等待重新进行转发。
[0241] S75:每隔一个预设时间段,对所述待存储子数据进行重试转发。
[0242] 本实施例中,每隔一个预设时间段,对待存储子数据进行重试转发,预设时间段可以自行设置。
[0243] S76:当所述待存储子数据正常转发时,删除所述转发失败标记。
[0244] 本实施例中,当待存储子数据正常转发时,删除转发失败标记,即清除该IO失败子位图。
[0245] 在本申请另一个实施例中,所述方法还包括:
[0246] S81:在与所述待存储子数据同属于一个所述待存储数据的后续待存储子数据中,设置故障标记。
[0247] 本实施例中,当第一个待存储子数据对应的节点出现故障事件时,同属于一个待存储数据的后续待存储子数据也会进行故障处理,如图6所示,在后续子IO,即后续待存储子数据中设置故障标记(特殊IO标记),该故障标记用于使后续待存储子数据执行失败处理流程后再进行数据转发,以保证目标控制器节点确定当前控制器节点出现故障。
[0248] S82:对所述控制器节点对应的所述节点位图添加所转发失败标记。
[0249] 本实施例中,在控制器节点对应的节点位图中添加转发失败标记。
[0250] S83:将所述后续待存储子数据的状态码设置为失败状态。
[0251] 本实施例中,将后续待存储子数据的状态码设置为失败状态,状态码用于标记数据的状态,标记为失败状态的数据需要进行重试转发。
[0252] S84:等待一个所述预设时间段后,清理所述故障标记。
[0253] 本实施例中,等待一个预设时间段,清理待存储子数据的故障标记,准备进行重试转发。
[0254] S85:将所述后续待存储子数据重新进行转发。
[0255] 本实施例中,将后续待存储子数据重新进行转发。
[0256] S86:当所述后续待存储子数据正常转发时,清除所述转发失败标记。
[0257] 本实施例中,当后续待存储子数据正常转发时,清除转发失败标记。
[0258] 在本申请的另一个实施例中,所述方法还包括:
[0259] S91:当所述待存储子数据已经开始转发时,将所述待存储子数据对应的所述目标控制器节点设置为故障状态。
[0260] 本实施例中,如图6所示,当待存储子数据已经开始转发时,将待存储子数据对应的目标控制器节点设置为故障状态,以终止数据的转发。
[0261] S92:在所述控制器节点对应的节点位图上添加所述转发失败标记。
[0262] 本实施例中,在该控制器节点对应的节点位图上添加转发失败标记。
[0263] S93:将所述待存储子数据的数据状态码设置为错误状态(DROP)。
[0264] 本实施例中,将所述存储子数据的数据状态码设置为错误状态,对于错误状态的数据,确定该存储子数据的转发失败。
[0265] S94:将所述待存储子数据放入所述等待队列。
[0266] 本实施例中,将待存储子数据放入等待队列中。
[0267] S95:每隔一个预设时间段,对所述待存储子数据进行重试转发。
[0268] 本实施例中,每隔一个预设时间段,对待存储子数据进行重试转发,但是由于该待存储子数据已经标记为错误状态,因此重试转发也不会成功。
[0269] S96:确定所述待存储子数据转发失败。
[0270] 本实施例中,当重试转发还不成功时,确定待存储子数据转发失败。
[0271] 在本申请的另一个实施例中,所述方法还包括:
[0272] S101:将与所述待存储子数据同属于一个所述待存储数据的后续待存储子数据的数据状态码设置为失败状态。
[0273] 本实施例中,如图6所示,当IO已将开始转发时,对待存储子数据的后续待存储的数据状态码设置为失败状态(FALLED)。
[0274] S102:确定所述后续待存储子数据转发失败。
[0275] 本实施例中,当后续待存储子数据的状态码设置为失败状态后,确定后续待存储子数据的转发为失败状态。
[0276] S103:结束对所述后续待存储子数据的转发流程。
[0277] 本实施例中,当后续待存储子数据的转发为失败状态后,结束对后续待存储子数据的转发流程。
[0278] S104:在所述后续待存储子数据对应的所述控制器节点对应的所述节点位图上添加所述转发失败标记。
[0279] 本实施例中,在后续待存储子数据对应的控制器节点对应的节点位图上添加转发失败标记。
[0280] 本实施例中,当待存储子数据已经开始转发时,需要停止转发流程,并且将当前的待存储子数据以及后续待存储子数据都标记为转发失败的状态,并且不再进行转发,直至完成整个流程之后,再从头开始执行转发流程,保证数据的完整性。
[0281] 本实施例中,对于节点故障,适配了相应的故障处理和重试机制,对于转发失败的数据进行失败标志,并通过resume函数发起重试流程,设置了对跨数据区域拆分数据的故障处理机制,保证前后子IO(待存储子数据)在发生节点故障事件时还能够按照正确的逻辑进行处理,如图3所示,针对已经开始转发的IO,设置其状态码为DROP(错误状态),后续子IO也进行失败处理。对于未开始转发的IO,都需要做重试处理,其中当前子IO放入重试队列等待重试,后续子IO通过子IO失败位图标记、特殊IO标记机制,进行一次失败处理后再重试正常的处理流程。
[0282] 本实施例中,将原本的双控制节点扩展为多控制节点群组,实现了对嗲存储数据下分的拆分、转发,对于转发节点的选择依赖与不同数据区域的归属节点,从而实现多个控制器节点的负载均衡,对待存储数据拆分后可以并行处理,并且提出了发生故障时的解决方法,保证了数据发送的正确性,提升了数据的处理效率。
[0283] 基于同一发明构思,本申请一实施例提供一种数据转发装置。参考图7,图7是本申请一实施例提出的数据转发装置700的示意图。如图7所示,该装置包括:
[0284] 待存储数据发送模块701,用于将待存储数据发送至控制器群组中任意一个控制器节点的数据转发层;
[0285] 数据区域确定模块702,用于响应于所述待存储数据对应的存储卷为运行状态,确定所述待存储数据对应的数据区域;
[0286] 数据拆分模块703,用于响应于所述待存储数据对应的所述数据区域为非单一数据区域,根据所述待存储数据对应的所述数据区域,对所述待存储数据进行数据拆分,得到多个待存储子数据;
[0287] 索引节点号确认模块704,用于响应于所述待存储子数据为待转发子数据,根据每个所述待存储子数据对应的所述数据区域,确定每个所述待存储子数据对应的索引节点号;
[0288] 待存储子数据发送模块705,用于将每个所述待存储子数据发送至目标控制器节点中,所述目标控制器节点是所述索引节点号对应的控制器节点。
[0289] 作为本申请的一个实施例,所述装置还包括:
[0290] 控制器节点添加模块,用于在所述控制器群组中添加多个所述控制器节点;
[0291] 控制器结对模块,用于通过循环镜像的方式,对多个所述控制器节点进行结对,得到多个控制器节点对;
[0292] 主控制器节点指定模块,用于在每个所述控制器节点对中指定一个所述控制器节点为主控制器节点。
[0293] 作为本申请的一个实施例,所述装置还包括:
[0294] 第一存储数据等待模块,用于响应于所述存储卷为非运行状态,将所述待存储数据放入等待队列中;
[0295] 存储数据状态变更模块,用于响应于所述存储卷由所述非运行状态变更为所述运行状态,确定所述待存储数据对应的所述数据区域。
[0296] 作为本申请的一个实施例,所述装置还包括:
[0297] 路径确认模块,用于响应于所述待存储数据对应的所述数据区域为单一数据区域,确定所述待存储数据对应的传输路径是否为快速路径;
[0298] 数据透传模块,用于当所述待存储数据对应的传输路径为快速路径时,将所述待存储数据直接传输至所述待存储数据对应的存储设备。
[0299] 作为本申请的一个实施例,所述装置还包括:
[0300] 存储卷运行状态确定模块,用于当所述存储数据对应的所述传输路径不是所述快速路径时,确定所述待存储数据对应的存储卷是否为非运行状态;
[0301] 第二存储数据等待模块,用于当所述存储卷为非运行状态时,将所述待存储数据放入等待队列中。
[0302] 作为本申请的一个实施例,所述装置还包括:
[0303] 地址确定模块,用于确定所述待存储数据对应的起始存储地址以及终止存储地址;
[0304] 数据区域判定模块,用于根据所述起始存储地址与所述终止存储地址,确定所述待存储数据对应的所述数据区域是否为单一数据区域。
[0305] 作为本申请的一个实施例地,所述数据区域判定模块包括:
[0306] 地址对比子模块,用于将所述起始存储地址与所述终止存储地址与每个所述数据区域的预设起始地址和预设终止地址进行对比;
[0307] 单一数据区域确定子模块,用于当所述起始存储地址与所述终止存储地址位于同一个所述数据区域内时,确定所述待存储数据对应的所述数据区域为所述单一数据区域;
[0308] 非单一数据区域确定子模块,用于当所述起始存储地址与所述终止存储地址位于不同所述数据区域内时,确定所述待存储数据对应的所述数据区域为非单一数据区域。
[0309] 作为本申请的一个实施例,所述数据拆分模块包括:
[0310] 地址获取子模块,用于获取所述待存储数据对应的每个所述数据区域的起始地址以及终止地址;
[0311] 数据拆分子模块,用于根据所述起始地址以及所述终止地址,将所述待存储数据拆分至每个所述数据区域中。
[0312] 作为本申请的一个实施例,所述装置还包括:
[0313] 转发标志确定模块,用于确定所述待存储子数据对应的所述数据区域中是否存在转发标志;
[0314] 待转发数据确定模块,用于当所述待存储子数据对应的所述数据区域中存在所述转发标志时,确定所述待存储子数据为所述待转发子数据。
[0315] 可选地,所述索引节点号确定模块包括:
[0316] 节点位图集合获取子模块,用于获取所述数据区域对应的节点位图集合;
[0317] 索引节点号确定子模块,用于从所述节点位图集合中,将数值为1的节点号作为所述待存储子数据对应的所述索引节点号。
[0318] 作为本申请的一个实施例,所述装置还包括:
[0319] 转发状态确定模块,用于响应于所述控制器节点发生故障事件,确定所述待存储子数据是否开始进行转发;
[0320] 第一标记模块,用于当所述待存储子数据未开始进行转发时,将所述待存储子数据对应的所述目标控制器节点设置为故障状态;
[0321] 第二标记模块,用于在所述控制器节点对应的节点位图上添加转发失败标记;
[0322] 第一放入等待队列模块,用于将所述待存储子数据放入等待队列;
[0323] 第一重试模块,用于每隔一个预设时间段,对所述待存储子数据进行重试转发;
[0324] 第一失败标记删除模块,用于当所述待存储子数据正常转发时,删除所述转发失败标记。
[0325] 作为本申请的一个实施例,所述装置还包括:
[0326] 第三标记模块,用于在与所述待存储子数据同属于一个所述待存储数据的后续待存储子数据中,设置故障标记;
[0327] 第四标记模块,用于对所述控制器节点对应的所述节点位图添加所转发失败标记;
[0328] 第一状态设置模块,用于将所述后续待存储子数据的状态码设置为失败状态;
[0329] 第一故障标记清除模块,用于等待一个所述预设时间段后,清理所述故障标记;
[0330] 第二重试模块,用于将所述后续待存储子数据重新进行转发;
[0331] 第二失败标记删除模块,用于当所述后续待存储子数据正常转发时,清除所述转发失败标记。
[0332] 作为本申请的一个实施例,所述装置还包括:
[0333] 第五标记模块,用于当所述待存储子数据已经开始转发时,将所述待存储子数据对应的所述目标控制器节点设置为故障状态;
[0334] 第六标记模块,用于在所述控制器节点对应的节点位图上添加所述转发失败标记;
[0335] 第二状态设置模块,用于将所述待存储子数据的数据状态码设置为错误状态;
[0336] 第二放入等待队列模块将所述待存储子数据放入所述等待队列;
[0337] 第三重试模块,用于每隔一个预设时间段,对所述待存储子数据进行重试转发;
[0338] 第一转发失败确定模块,用于确定所述待存储子数据转发失败。
[0339] 作为本申请的一个实施例,所述方法还包括:
[0340] 第七标记模块,用于将与所述待存储子数据同属于一个所述待存储数据的后续待存储子数据的数据状态码设置为失败状态;
[0341] 第二转发失败确定模块,用于确定所述后续待存储子数据转发失败;
[0342] 转发流程结束模块,用于结束对所述后续待存储子数据的转发流程;
[0343] 第八标记模块,用于在所述后续待存储子数据对应的所述控制器节点对应的所述节点位图上添加所述转发失败标记。
[0344] 基于同一发明构思,本申请另一实施例提供一种可读存储介质,其上存储有计算机程序,该程序被处理器执行时实现如本申请上述任一实施例所述的数据发送方法中的步骤。
[0345] 基于同一发明构思,本申请另一实施例提供一种电子设备,参考图8,图8是本申请一实施例提出的数据发送设备800的示意图,包括存储器801、处理器802及存储在存储器上并可在处理器上运行的计算机程序,所述处理器执行时实现本申请上述任一实施例所述的数据发送方法中的步骤。
[0346] 对于装置实施例而言,由于其与方法实施例基本相似,所以描述的比较简单,相关之处参见方法实施例的部分说明即可。
[0347] 本说明书中的各个实施例均采用递进的方式描述,每个实施例重点说明的都是与其他实施例的不同之处,各个实施例之间相同相似的部分互相参见即可。
[0348] 本领域内的技术人员应明白,本申请实施例可提供为方法、装置、或计算机程序产品。因此,本申请实施例可采用完全硬件实施例、完全软件实施例、或结合软件和硬件方面的实施例的形式。而且,本申请实施例可采用在一个或多个其中包含有计算机可用程序代码的计算机可用存储介质(包括但不限于磁盘存储器、CD‑ROM、光学存储器等)上实施的计算机程序产品的形式。
[0349] 本申请实施例是参照根据本申请实施例的方法、终端设备(系统)、和计算机程序产品的流程图和/或方框图来描述的。应理解可由计算机程序指令实现流程图和/或方框图中的每一流程和/或方框、以及流程图和/或方框图中的流程和/或方框的结合。可提供这些计算机程序指令到通用计算机、专用计算机、嵌入式处理机或其他可编程数据处理终端设备的处理器以产生一个机器,使得通过计算机或其他可编程数据处理终端设备的处理器执行的指令产生用于实现在流程图一个流程或多个流程和/或方框图一个方框或多个方框中指定的功能的装置。
[0350] 这些计算机程序指令也可存储在能引导计算机或其他可编程数据处理终端设备以特定方式工作的计算机可读存储器中,使得存储在该计算机可读存储器中的指令产生包括指令装置的制造品,该指令装置实现在流程图一个流程或多个流程和/或方框图一个方框或多个方框中指定的功能。
[0351] 这些计算机程序指令也可装载到计算机或其他可编程数据处理终端设备上,使得在计算机或其他可编程终端设备上执行一系列操作步骤以产生计算机实现的处理,从而在计算机或其他可编程终端设备上执行的指令提供用于实现在流程图一个流程或多个流程和/或方框图一个方框或多个方框中指定的功能的步骤。
[0352] 尽管已描述了本申请实施例的优选实施例,但本领域内的技术人员一旦得知了基本创造性概念,则可对这些实施例做出另外的变更和修改。所以,所附权利要求意欲解释为包括优选实施例以及落入本申请实施例范围的所有变更和修改。
[0353] 最后,还需要说明的是,在本文中,诸如第一和第二等之类的关系术语仅仅用来将一个实体或者操作与另一个实体或操作区分开来,而不一定要求或者暗示这些实体或操作之间存在任何这种实际的关系或者顺序。而且,术语“包括”、“包含”或者其任何其他变体意在涵盖非排他性的包含,从而使得包括一系列要素的过程、方法、物品或者终端设备不仅包括那些要素,而且还包括没有明确列出的其他要素,或者是还包括为这种过程、方法、物品或者终端设备所固有的要素。在没有更多限制的情况下,由语句“包括一个……”限定的要素,并不排除在包括所述要素的过程、方法、物品或者终端设备中还存在另外的相同要素。
[0354] 以上对本申请所提供的数据发送方法、装置、设备及存储介质,进行了详细介绍,本文中应用了具体个例对本申请的原理及实施方式进行了阐述,以上实施例的说明只是用于帮助理解本申请的方法及其核心思想;同时,对于本领域的一般技术人员,依据本申请的思想,在具体实施方式及应用范围上均会有改变之处,综上所述,本说明书内容不应理解为对本申请的限制。