具体实施方式
现在将参考附图更全面地描述示例实施方式。然而,示例实施方式能够以多种形式实施,且不应被理解为限于在此阐述的范例;相反,提供这些示例实施方式使得本公开的描述将更加全面和完整,并将示例实施方式的构思全面地传达给本领域的技术人员。附图仅为本公开的示意性图解,并非一定是按比例绘制。图中相同的附图标记表示相同或类似的部分,因而将省略对它们的重复描述。
此外,所描述的特征、结构或特性可以以任何合适的方式结合在一个或更多示例实施方式中。在下面的描述中,提供许多具体细节从而给出对本公开的示例实施方式的充分理解。然而,本领域技术人员将意识到,可以实践本公开的技术方案而省略所述特定细节中的一个或更多,或者可以采用其它的方法、组元、步骤等。在其它情况下,不详细示出或描述公知结构、方法、实现或者操作以避免喧宾夺主而使得本公开的各方面变得模糊。
附图中所示的一些方框图是功能实体,不一定必须与物理或逻辑上独立的实体相对应。可以采用软件形式来实现这些功能实体,或在一个或多个硬件模块或集成电路中实现这些功能实体,或在不同网络和/或处理器装置和/或微控制器装置中实现这些功能实体。
本公开实施例提供了一种分布式存储系统的数据迁移方法,该分布式存储系统通常表现为一种物理上可以彼此分离、逻辑上协作统一的数据库,相对应的,本公开实施例的执行主体通常为用于管理数据库的数据库管理系统。
其中,数据库(Database),简而言之可视为电子化的文件柜——存储电子文件的处所,用户可以对文件中的数据进行新增、查询、更新、删除等操作。所谓“数据库”是以一定方式储存在一起、能与多个用户共享、具有尽可能小的冗余度、与应用程序彼此独立的数据集合。
数据库管理系统(英语:Database Management System,简称DBMS)是为管理数据库而设计的电脑软件系统,一般具有存储、截取、安全保障、备份等基础功能。数据库管理系统可以依据它所支持的数据库模型来作分类,例如关系式、XML(Extensible MarkupLanguage,即可扩展标记语言);或依据所支持的计算机类型来作分类,例如服务器群集、移动电话;或依据所用查询语言来作分类,例如SQL(结构化查询语言(Structured QueryLanguage)、XQuery;或依据性能冲量重点来作分类,例如最大规模、最高运行速度;亦或其他的分类方式。不论使用哪种分类方式,一些DBMS能够跨类别,例如,同时支持多种查询语言。
本公开实施例中,分布式存储系统包括分别用于存储数据的第一节点以及第二节点(第一节点以及第二节点只是示例性地展示该分布式存储系统中两个节点,并不代表该分布式存储系统中只有两个节点);分布式存储系统所存储的数据主要用于供请求端进行操作(例如:读操作、写操作),通过配置请求端通讯特定数据所在节点的路由,使得请求端通过所配置路由操作该特定数据。该分布式存储系统中的节点通常依赖于用于管理数据存储的服务器;请求端通常依赖于用于与用户终端进行交互的服务器。
其中,服务器可以是独立的物理服务器,也可以是多个物理服务器构成的服务器集群或者分布式系统,还可以是提供云计算服务的云服务器。终端可以是智能手机、平板电脑、笔记本电脑、台式计算机、智能音箱、智能手表等,但并不局限于此。终端以及服务器可以通过有线或无线通信方式进行直接或间接地连接,本公开在此不做限制。
由于分布式存储系统所存储的数据主要用于供请求端进行操作,而为使请求端能够正确操作该特定数据,需要将该请求端操作该特定数据的路由正确配置为通向该特定数据所在的节点。因此,本公开实施例中,数据迁移主要包括两部分:一、数据的拷贝;二、路由的切换。当拷贝与切换均完成后,数据迁移才视为完成。
例如:分布式存储系统包括分别用于存储数据的节点A与节点B。小明的照片数据存储在节点A中,用于定位该照片数据的路由配置为通向节点A,因此,请求端可以通过该路由访问节点A进而操作该照片数据。
若要将该照片数据从节点A迁移至节点B使得请求端以后通过访问节点B操作该照片数据,则至少需要将该照片数据拷贝至节点B,并将用于定位该照片数据的路由切换至节点B。如果路由未切换,即使将该照片数据拷贝至节点B,但该路由仍旧配置为通向节点A,则请求端仍然会通过访问节点A试图操作该照片数据,无法满足数据迁移的需求。因此,需要拷贝与切换均完成后,数据迁移才完成。
图1示出了本公开一实施例的分布式存储系统的数据迁移的架构示意图。
如图1所示,该实施例中,分布式存储系统包括分别用于存储数据的第一节点以及第二节点。用于控制该分布式存储系统中数据迁移的管理系统主要包括三部分:总控进程、接入进程以及API(Application Programming Interface,应用程序接口)。
其中,总控进程主要用于调度数据迁移的全局动作。
API设于请求端,主要用于向请求端提供与管理系统进行交互的接口,其中,请求端与管理系统之间的交互主要包括:向管理系统发送操作请求、接收管理系统所转发的分布式存储系统中数据。
接入进程设于总控进程与API之间,主要用于在总控进程的调度下,具体执行与API之间的交互。
该实施例所展示的数据迁移包括两个路径:一、主动迁移;二、被动迁移。
主动迁移指的是由第一节点发起的数据迁移。第一节点直接和第二节点建立数据通道,然后第一节点遍历其中数据并发送至第二节点,并完成相应的路由切换这一迁移路径。
被动迁移指的是由请求端API发起的数据迁移。API发起对数据的操作请求后,触发被动迁移:接入进程将API的操作请求队列缓存并暂时搁置;当第一节点处理完毕在被动迁移前所积累的操作请求后,接入进程将路由切换至第二节点并将缓存的操作请求队列释放至第二节点,从而实现数据从第一节点平滑地迁移至第二节点。
需要说明的是,该实施例只是示例性的说明,不应对本公开的功能和使用范围造成限制。
出于简要说明的目的,后续有关具体实施例的描述示例性地结合图1所示的体系架构进行,不应对本公开的功能和使用范围造成限制。
图2示出了本公开一实施例的分布式存储系统的数据迁移方法流程图。如图所示,该方法包括:
步骤S110、响应于请求端针对所述目标数据发送操作请求,触发数据迁移,并在切换所述路由之前缓存所述请求端所发送的操作请求队列;
步骤S120、当所述第一节点处理完毕数据迁移前所积累的针对所述目标数据的操作请求时,将所述路由从所述第一节点切换至所述第二节点,并释放所述操作请求队列至所述第二节点以使所述第二节点按照所述操作请求队列同步所述目标数据,实现所述目标数据从所述第一节点迁移至所述第二节点。
在一实施例中,目标数据原本位于第一节点,数据迁移的目标便是将目标数据迁移至第二节点,而该数据迁移则是由请求端来触发。
具体的,请求端API将针对目标数据的操作请求发送至接入进程,这一事件自动触发接入进程进行数据迁移。
从数据迁移触发的T1时刻起直至切换路由的T2时刻,接入进程缓存请求端API在(T1~T2)这段时间内针对目标数据所发送的操作请求队列。缓存起的操作请求队列暂时不给到第二节点。其中,T1可以等于T2,即,数据迁移一触发接入进程便直接切换路由。
当第一节点在T2时刻处理完毕T1时刻前所积累的针对目标数据的操作请求时,接入进程将路由从第一节点切换至第二节点,并将所缓存的操作请求队列释放至第二节点以使第二节点按照该操作请求队列同步目标数据,从而完成该数据迁移。
由此可见,本公开实施例中,数据迁移是响应于请求端的操作请求而触发的,请求端的操作请求仍然会继续被响应,避免了数据迁移过程中请求端无法接受服务的发生;而且通过操作请求队列的缓存与释放,保证了数据迁移前后数据的一致性。从而本公开实施例能够无服务中断且平滑地实现数据迁移。
在一实施例中,该方法还包括:
响应于该第一节点发起迁移请求,建立该第一节点与该第二节点之间的数据通道,以使该第一节点通过该数据通道将其中预设比例的数据迁移至该第二节点。
该实施例中,除了响应请求端API被动触发接入进程进行数据迁移外,还可以由第一节点主动触发数据迁移。具体的,第一节点主动发起迁移请求,接入进程响应该事件,在第一节点与第二节点之间建立如图3示出的数据通道,从而第一节点可以通过该数据通道将第一节点中预设比例的数据迁移至第二节点。
其中,被动迁移可以与主动迁移同时进行,还可以在主动迁移完成后继续进行。即,第一节点主动将其中数据迁移至第二节点的同时,接入进程可以被动地响应请求端API的操作请求对特定的目标数据进行迁移;第一节点将其中数据迁移至第二节点完成后,接入进程仍然可以继续被动地响应请求端API的操作请求对特定的目标数据进行迁移。
该实施例的优点在于,通过主动迁移与被动迁移的结合,主动迁移快速大批量地对大比例数据进行迁移,被动迁移则灵活地适应业务对易导致主动迁移不收敛的小比例数据进行迁移。即使处于易导致主动迁移不收敛的业务高峰时期,该实施例也能够高效率、不中断服务地完成数据迁移。
在一实施例中,在释放该操作请求队列至该第二节点之前,该方法还包括:
查询该第二节点中是否已存储有该目标数据;
若该第二节点未存储有该目标数据,则将该目标数据从该第一节点复制并拷贝该第二节点。
该实施例中,接入进程将所缓存的操作请求队列释放至第二节点,以使第二节点按照该操作请求队列同步目标数据之前,需要保证第二节点中已有目标数据。故接入进程查询第二节点中是否已存储有该目标数据:如果未存储有目标数据,则从第一节点复制目标数据,并拷贝至第二节点,进而接入进程将操作请求队列释放至第二节点后,第二节点能够按照该操作请求队列同步该目标数据;如果已存储有目标数据,则可以直接释放操作请求队列。
需要说明的是,该实施例只是示例性的说明,不应对本公开的功能和使用范围造成限制。
在一实施例中,该方法还包括:
在该操作请求队列存活期间,监测该操作请求队列的队列属性;
基于该队列属性对该操作请求队列进行修剪,得到满足预设属性条件的操作请求队列。
该实施例中,接入进程在操作请求队列存活期间,实时监测该操作请求队列的队列属性。其中,操作请求队列存活指的是操作请求队列中队列成员数大于0。操作请求队列从缓存开始存活,直到完全释放至第二节点结束存活。
进而接入进程基于该队列属性对该操作请求队列进行修剪,得到满足预设属性条件的操作请求队列。
该实施例的优点在于,通过基于监测到的队列属性对该操作请求队列进行修剪,避免该操作请求队列在特定属性表现上出现冗长。
在一实施例中,该队列属性包括该操作请求队列中各操作请求的存活时长,该方法包括:
监测该操作请求队列中各操作请求的存活时长;
将该操作请求队列中存活时长大于预设时长阈值的操作请求丢弃,并向该请求端返回所丢弃的操作请求对应的报错信息。
该实施例中,接入进程基于存活时长对操作请求队列进行修剪。其中,存活时长指的是对应的操作请求从被缓存开始所持续的时长。越早进入操作请求队列,位置越靠前,存活时长也便越长。
具体的,针对存活时长预先设置有时长阈值,存活时长大于该时长阈值则被视为超时。接入进程将超时的操作请求从操作请求队列中丢弃,并向请求端返回所丢弃的操作请求对应的报错信息。
在一实施例中,该队列属性包括该操作请求队列的队列成员数,该方法包括:
监测该操作请求队列的队列成员数;
将该队列成员数大于预设成员数阈值时,将该操作请求队列中至少最前一个的操作请求丢弃,并向该请求端返回所丢弃的操作请求对应的报错信息。
该实施例中,接入进程基于队列成员数对操作请求队列进行修剪。
具体的,预先设置有成员数阈值(例如:10),队列成员数大于该成员数阈值时,接入进程将至少最前一个的操作请求从操作请求队列中丢弃。优选的,队列成员数超出成员数阈值N(N为大于0的自然数),接入进程将最前N个的操作请求从操作请求队列中丢弃。
需要说明的是,该实施例只是示例性的说明,不应对本公开的功能和使用范围造成限制。
在一实施例中,该方法还包括:
在开始缓存该操作请求队列时,将附有色彩信息的染色数据包发送至该第一节点;
当接收到该第一节点针对该染色数据包发送的应答数据包时,确定该第一节点处理完毕缓存前所积累的针对该目标数据的操作请求。
该实施例中,接入进程通过染色标记的方式判断第一节点是否处理完毕数据迁移前所积累的针对目标数据的操作请求。
具体的,请求端API在T1时刻触发数据迁移。接入进程在T1时刻开始缓存操作请求队列,并在T1时刻将染色数据包发送至第一节点。染色数据包的发送,标记着数据迁移的开始,也标记着缓存的开始。
接入进程所发送的染色数据包,会排在第一节点在T1时刻前所积累的针对目标数据的操作请求后面。第一节点顺序处理各操作请求,处理完毕1时刻前所积累的针对目标数据的操作请求之后,第一节点再处理并应答染色数据包。
因此,接入进程接收到第一节点发送的应答数据包时(记接入进程接收到该应答数据包的时刻为T2),即可确定第一节点已处理完毕数据迁移前所积累的针对目标数据的操作请求,进而于T2时刻进行路由切换并释放操作请求队列。
该实施例的优点在于,通过染色数据包的发送与应答检测,使得第一节点只需被动地接收染色数据包并进行应答,接入进程即可实时检测到第一节点已处理完毕数据迁移前所积累的操作请求,无需对第一节点的处理逻辑进行额外控制。
需要说明的是,该实施例只是示例性的说明,不应对本公开的功能和使用范围造成限制。可以理解的,判断第一节点是否处理完毕数据迁移前所积累的针对目标数据的操作请求,还可以采用同步时间戳等方式进行。
通过上述描述可见,本公开实施例所提出的被动迁移主要由两部分控制逻辑组成:一、被动响应的控制逻辑;二、平滑切换的控制逻辑。下面参考图4以及图5分别对这两部分的交互过程进行单独说明。其中,图4以及图5中的序号用于标识处理过程的先后顺序。
需要说明的是,图4主要用于展示被动响应的过程,故其中基本不涉及平滑切换的部分;同理,图5主要用于展示平滑切换的过程。故图4以及图5的任一一个实施例均不能完全代表本公开实施例的整体。
图4示出了本公开一实施例的被动迁移中被动响应的交互示意图。
如图4所示,该实施例中,请求端API触发数据迁移后,接入进程接收请求端API发送的操作请求,并将路由从第一节点切换至第二节点。所有从请求端API发送的操作请求都会由接入进程路由至第二节点。
第二节点读取操作请求所针对的特定数据,如果该特定数据存在于第二节点,则第二节点按照操作请求对该特定数据进行操作,并返回给接入进程该操作请求对应的结果,进而接入进程再将该结果返回给请求端API。
第二节点读取操作请求所针对的特定数据,如果该特定数据不存在于第二节点,则接入进程暂时缓存起该操作请求。接着,第二节点到第一节点中读取该特定数据,第一节点将读取结果返回给第二节点。
如果读取结果指示该特定数据存在于第一节点,则按照第一节点中读取到的该特定数据,将该特定数据在第二节点中写入,然后第二节点按照操作请求对该特定数据进行操作,并返回给接入进程该操作请求对应的结果,进而接入进程再将该结果返回给请求端API。
如果读取结果指示该特定数据不存在于第一节点,则直接将该特定数据在第二节点中写入,然后第二节点按照操作请求对该特定数据进行操作,并返回给接入进程该操作请求对应的结果,进而接入进程再将该结果返回给请求端API。
图5示出了本公开一实施例的被动迁移中平滑切换的交互示意图。
如图5所示,该实施例中,总控进程进入路由切换状态后,通知所有相关的接入进程开始进行路由切换。其中,在总控进程进入路由切换状态之前,需要所有接入进程都向总控进程返回已经缓存成功的应答消息,总控进程才会尝试进入路由切换状态。如果有超时未返回缓存成功的应答消息,或者只有部分返回缓存成功的应答消息,则总控进程通知接入进程回滚缓存状态,以后再择机进入路由切换状态。
相关的接入进程收到总控进程的通知后,按照预设的缓存时长对路由切换进行预判:预判该缓存时长内是否能够完成切换。如果预判能够在该缓存时长内完成切换则继续进行路由切换。
接入进程开始缓存操作请求队列的同时,给参与切换的第一节点的数据通道发送染色数据包。直到接收到第一节点针对染色数据包的应答数据包,确保第一节点所积累的操作请求都处理完毕,然后接入进程释放所缓存的操作请求队列至第二节点,使得第二节点开始处理该操作请求队列。
在缓存操作请求队列的期间,接入进程监测操作请求队列。超时或者队列满员时,接入进程丢弃掉超时的操作请求或者超出队列的操作请求,并返回给请求端API报错信息(报错信息包括错误响应信息以及超时响应信息)。其中,当缓存时长设置合理、路由切换快、切换后第二节点处理操作请求队列及时的时候,接入进程无需丢弃操作请求队列中的任一个操作请求,从而实现无损的数据迁移。
图6示出了根据本公开一实施例的分布式存储系统的数据迁移装置,所述系统包括分别用于存储数据的第一节点以及第二节点,在数据迁移前,待迁移至所述第二节点的目标数据位于所述第一节点,供请求端操作所述目标数据的路由通向所述第一节点,所述装置包括:
缓存模块210,配置为响应于请求端针对所述目标数据发送操作请求,触发数据迁移,并在切换所述路由之前缓存所述请求端所发送的操作请求队列;
切换模块220,配置为当所述第一节点处理完毕数据迁移前所积累的针对所述目标数据的操作请求时,将所述路由从所述第一节点切换至所述第二节点,并释放所述操作请求队列至所述第二节点以使所述第二节点按照所述操作请求队列同步所述目标数据,实现所述目标数据从所述第一节点迁移至所述第二节点。
在本公开的一示例性实施例中,所述装置配置为:
在开始缓存所述操作请求队列时,将附有色彩信息的染色数据包发送至所述第一节点;
当接收到所述第一节点针对所述染色数据包发送的应答数据包时,确定所述第一节点处理完毕数据迁移前所积累的针对所述目标数据的操作请求。
在本公开的一示例性实施例中,所述装置配置为:
在所述操作请求队列存活期间,监测所述操作请求队列的队列属性;
基于所述队列属性对所述操作请求队列进行修剪,得到满足预设属性条件的操作请求队列。
在本公开的一示例性实施例中,所述装置配置为:
监测所述操作请求队列中各操作请求的存活时长;
将所述操作请求队列中所述存活时长大于预设时长阈值的操作请求丢弃,并向所述请求端返回所丢弃的操作请求对应的报错信息。
在本公开的一示例性实施例中,所述装置配置为:
监测所述操作请求队列的队列成员数;
将所述队列成员数大于预设成员数阈值时,将所述操作请求队列中至少最前一个的操作请求丢弃,并向所述请求端返回所丢弃的操作请求对应的报错信息。
在本公开的一示例性实施例中,所述装置配置为:
查询所述第二节点中是否已存储有所述目标数据;
若所述第二节点未存储有所述目标数据,则将所述目标数据从所述第一节点复制并拷贝至所述第二节点。
在本公开的一示例性实施例中,所述装置配置为:
响应于所述第一节点发起迁移请求,建立所述第一节点与所述第二节点之间的数据通道,以使所述第一节点通过所述数据通道将其中预设比例的数据迁移至所述第二节点。
下面参考图7来描述根据本公开实施例的分布式存储系统的数据迁移电子设备30。图7显示的电子设备30仅仅是一个示例,不应对本公开实施例的功能和使用范围带来任何限制。
如图7所示,电子设备30以通用计算设备的形式表现。电子设备30的组件可以包括但不限于:上述至少一个处理单元310、上述至少一个存储单元320、连接不同系统组件(包括存储单元320和处理单元310)的总线330。
其中,所述存储单元存储有程序代码,所述程序代码可以被所述处理单元310执行,使得所述处理单元310执行本说明书上述示例性方法的描述部分中描述的根据本发明各种示例性实施方式的步骤。例如,所述处理单元310可以执行如图2中所示的各个步骤。
存储单元320可以包括易失性存储单元形式的可读介质,例如随机存取存储单元(RAM)3201和/或高速缓存存储单元3202,还可以进一步包括只读存储单元(ROM)3203。
存储单元320还可以包括具有一组(至少一个)程序模块3205的程序/实用工具3204,这样的程序模块3205包括但不限于:操作系统、一个或者多个应用程序、其它程序模块以及程序数据,这些示例中的每一个或某种组合中可能包括网络环境的实现。
总线330可以为表示几类总线结构中的一种或多种,包括存储单元总线或者存储单元控制器、外围总线、图形加速端口、处理单元或者使用多种总线结构中的任意总线结构的局域总线。
电子设备30也可以与一个或多个外部设备400(例如键盘、指向设备、蓝牙设备等)通信,还可与一个或者多个使得用户能与该电子设备30交互的设备通信,和/或与使得该电子设备30能与一个或多个其它计算设备进行通信的任何设备(例如路由器、调制解调器等等)通信。这种通信可以通过输入/输出(I/O)接口350进行。输入/输出(I/O)接口350与显示单元340相连。并且,电子设备30还可以通过网络适配器360与一个或者多个网络(例如局域网(LAN),广域网(WAN)和/或公共网络,例如因特网)通信。如图所示,网络适配器360通过总线330与电子设备30的其它模块通信。应当明白,尽管图中未示出,可以结合电子设备30使用其它硬件和/或软件模块,包括但不限于:微代码、设备驱动器、冗余处理单元、外部磁盘驱动阵列、RAID系统、磁带驱动器以及数据备份存储系统等。
通过以上的实施方式的描述,本领域的技术人员易于理解,这里描述的示例实施方式可以通过软件实现,也可以通过软件结合必要的硬件的方式来实现。因此,根据本公开实施方式的技术方案可以以软件产品的形式体现出来,该软件产品可以存储在一个非易失性存储介质(可以是CD-ROM,U盘,移动硬盘等)中或网络上,包括若干指令以使得一台计算设备(可以是个人计算机、服务器、终端装置、或者网络设备等)执行根据本公开实施方式的方法。
在本公开的示例性实施例中,还提供了一种计算机可读存储介质,其上存储有计算机可读指令,当所述计算机可读指令被计算机的处理器执行时,使计算机执行上述方法实施例部分描述的方法。
根据本公开的一个实施例,还提供了一种用于实现上述方法实施例中的方法的程序产品,其可以采用便携式紧凑盘只读存储器(CD-ROM)并包括程序代码,并可以在终端设备,例如个人电脑上运行。然而,本发明的程序产品不限于此,在本文件中,可读存储介质可以是任何包含或存储程序的有形介质,该程序可以被指令执行系统、装置或者器件使用或者与其结合使用。
所述程序产品可以采用一个或多个可读介质的任意组合。可读介质可以是可读信号介质或者可读存储介质。可读存储介质例如可以为但不限于电、磁、光、电磁、红外线、或半导体的系统、装置或器件,或者任意以上的组合。可读存储介质的更具体的例子(非穷举的列表)包括:具有一个或多个导线的电连接、便携式盘、硬盘、随机存取存储器(RAM)、只读存储器(ROM)、可擦式可编程只读存储器(EPROM或闪存)、光纤、便携式紧凑盘只读存储器(CD-ROM)、光存储器件、磁存储器件、或者上述的任意合适的组合。
计算机可读信号介质可以包括在基带中或者作为载波一部分传播的数据信号,其中承载了可读程序代码。这种传播的数据信号可以采用多种形式,包括但不限于电磁信号、光信号或上述的任意合适的组合。可读信号介质还可以是可读存储介质以外的任何可读介质,该可读介质可以发送、传播或者传输用于由指令执行系统、装置或者器件使用或者与其结合使用的程序。
可读介质上包含的程序代码可以用任何适当的介质传输,包括但不限于无线、有线、光缆、RF等等,或者上述的任意合适的组合。
可以以一种或多种程序设计语言的任意组合来编写用于执行本发明操作的程序代码,所述程序设计语言包括面向对象的程序设计语言—诸如JAVA、C++等,还包括常规的过程式程序设计语言—诸如“C”语言或类似的程序设计语言。程序代码可以完全地在用户计算设备上执行、部分地在用户设备上执行、作为一个独立的软件包执行、部分在用户计算设备上部分在远程计算设备上执行、或者完全在远程计算设备或服务器上执行。在涉及远程计算设备的情形中,远程计算设备可以通过任意种类的网络,包括局域网(LAN)或广域网(WAN),连接到用户计算设备,或者,可以连接到外部计算设备(例如利用因特网服务提供商来通过因特网连接)。
应当注意,尽管在上文详细描述中提及了用于动作执行的设备的若干模块或者单元,但是这种划分并非强制性的。实际上,根据本公开的实施方式,上文描述的两个或更多模块或者单元的特征和功能可以在一个模块或者单元中具体化。反之,上文描述的一个模块或者单元的特征和功能可以进一步划分为由多个模块或者单元来具体化。
此外,尽管在附图中以特定顺序描述了本公开中方法的各个步骤,但是,这并非要求或者暗示必须按照该特定顺序来执行这些步骤,或是必须执行全部所示的步骤才能实现期望的结果。附加的或备选的,可以省略某些步骤,将多个步骤合并为一个步骤执行,以及/或者将一个步骤分解为多个步骤执行等。
通过以上的实施方式的描述,本领域的技术人员易于理解,这里描述的示例实施方式可以通过软件实现,也可以通过软件结合必要的硬件的方式来实现。因此,根据本公开实施方式的技术方案可以以软件产品的形式体现出来,该软件产品可以存储在一个非易失性存储介质(可以是CD-ROM,U盘,移动硬盘等)中或网络上,包括若干指令以使得一台计算设备(可以是个人计算机、服务器、移动终端、或者网络设备等)执行根据本公开实施方式的方法。
本领域技术人员在考虑说明书及实践这里公开的发明后,将容易想到本公开的其它实施方案。本申请旨在涵盖本公开的任何变型、用途或者适应性变化,这些变型、用途或者适应性变化遵循本公开的一般性原理并包括本公开未公开的本技术领域中的公知常识或惯用技术手段。说明书和实施例仅被视为示例性的,本公开的真正范围和精神由所附的权利要求指出。