分布式转码***、方法及其装置
技术领域
本发明涉及分布式转码***、方法及其装置。
背景技术
目前有一些为企业提供视频托管服务的业务,其中有一项服务便是将企业提供的高清视频转码为适合互联网进行传播的视频流,在这个过程当中就涉及到用户在平台上传的视频进行转码的操作,由于涉及到的用户和用户视频会非常的多,我们不可能使用单台机器进行转码,必须使用分布式的方式对用户上传的视频进行转码。
一般的框架设计,通常会有一个任务中央任务调配***,配多个任务处理机器来进行转码作业,这种设计完全依赖中央任务调配***,这个***可能会被过渡设计,除了任务分配的调度,还需要实时对所有的工作机器进行监控来判断是否分配任务到该工作机;并且这个调度***是非常重要,必须保证其高可用以确保该调度***没有单点故障风险;而当该中央调度***作集群,本身就需要多台机器部署,从而增加机器成本。
发明内容
为了克服现有技术的不足,本发明的目的在于提供分布式转码***、方法及其装置,其能实现转码机器自身自行调度的分布式转码。
本发明的目的采用以下技术方案实现:
分布式转码***,包括转码模块、数据库、共享文件***和传输组件;
传输组件用于接收需要进行转码的源文件和任务数据包,并将源文件存储至共享文件***中的源文件模块中,以及将任务数据包存储至数据库的任务池中;转码模块用于从数据库中获取任务数据包,以及根据任务数据包从共享文件***中获取对应的源文件,并对源文件进行转码;将转码后的转码文件存储至共享文件***中。
分布式转码方法,应用于分布式转码***,包括如下步骤:
S1、传输组件接收外部的请求端发送来的需要进行转码的源文件和任务数据包,并将源文件存储至共享文件***中,以及将任务数据包存储至数据库中;
S2、转码模块的守护线程从数据库中获取任务数据包,并在转码模块的工作池中创建一个转码进程;工作池根据任务数据包中的转码源文件路径从共享文件夹***中获取对应的源文件;
S3、工作池对源文件进行转码,将转码成功的转码文件存储至共享文件***中。
作为优选,工作池包括心跳单元和转码单元;
S2具体为:守护线程从数据库中获取任务数据包,并在工作池中创建一个转码进程;心跳单元定时发送心跳数据至数据库中的任务数据包中,以使任务数据包中的心跳时间更新为接收到该心跳数据的时间;转码单元根据转码源文件路径从共享文件夹***中获取对应的源文件。
作为优选,S2中的守护线程从数据库中获取待转码的任务数据包;以及从数据库中获取运行中且心跳时间距离当前时间超过预定时间的任务数据包。
作为优选,守护线程还用于检测工作池中的容量,并在工作池的容量有盈余时,守护线程再次从数据库中获取任务数据包,并在工作池中创建另一个转码进程。
作为优选,S2还包括:工作池将获取到的源文件存储至缓存目录中。
作为优选,S3还包括:守护线程在转码单元转码成功后,发送转码成功信号至对应的任务数据包中,并更新该任务数据包的状态信息为完成。
作为优选,守护线程还用于在转码单元转码失败后,发送转码失败信号至对应的任务数据包中,更新该任务数据包的状态信息为失败。
作为优选,S3中,工作池根据任务数据包中的转码需求对源文件进行转码。
分布式转码装置,应用于分布式转码***,包括:
第一存储模块,应用于共享文件***,用于接收源文件并存储;第二存储模块,应用于数据库,用于接收任务数据包并存储;
创建模块,应用于转码模块的守护线程,用于从数据库中获取任务数据包,并在转码模块的工作池中创建一个转码进程;
获取模块,应用于工作池,用于根据任务数据包中的转码源文件路径从共享文件夹***中获取对应的源文件;
运行模块,应用于工作池,对源文件进行转码,将转码成功的转码文件存储至共享文件***中。
相比现有技术,本发明的有益效果在于:将中央任务调配***去除,由各个转码机器本身来实现自行调度,从而减少了发生故障的风险,节省机器成本的投入,降低后期维护的难度。
附图说明
图1为本发明的分布式转码***的模块连接图;
图2为本发明的分布式转码方法的流程图;
图3为本发明的分布式转码装置的模块连接图。
具体实施方式
下面,结合附图以及具体实施方式,对本发明做进一步描述:
分布式转码***,如图1所示,包括转码机器、数据库、共享文件***和传输组件;
传输组件用于接收需要进行转码的源文件和任务数据包,并将源文件存储至共享文件***中的源文件模块中,以及将任务数据包存储至数据库的任务池中。每个任务数据包括了任务ID、转码源文件路径、状态信息(初始为“待转码”)、心跳时间、转码目标文件路径、转码需求、转码工作机等信息。
转码机器中设有转码模块,转码模块从数据库中的任务池中获取的任务数据包,并发送心跳数据至任务池中对应的任务数据包中更新心跳时间,以及根据任务数据包的转码源文件路径从共享文件***中的源文件模块中获取对应的源文件。每个转码机器中设有多个转码模块。
转码模块根据任务数据包和源文件进行转码,同时将源文件存储至转码机器的缓存目录中。转码模块将转码成功的转码文件存储至共享文件***中的转码文件模块中,并发送转码成功信号至数据库中的任务池中对应的任务数据包中,更新该任务数据包的状态信息为完成。
有些情况下,例如源文件的格式不支持,或者源文件损坏等原因,转码模块无法将该源文件转码,那么转码就会失败,此时转码模块会将任务标识为失败,并且不作任何的文件拷贝动作。
分布式转码方法,应用于分布式转码***,如图2所示,包括如下步骤:
步骤100、传输组件接收外部的请求端发送来的需要进行转码的源文件和任务数据包,并将源文件存储至共享文件***中,以及将任务数据包存储至数据库中;
具体的,将源文件存储之共享文件***中的源文件模块中;以及将任务数据包存储至数据库的任务池中;每个任务数据包包括任务ID、转码源文件路径、状态信息、心跳时间、转码目标文件路径、转码需求和转码工作机;状态信息包括:待转码、运行中、完成和失败。
步骤101、转码模块从数据库中获取任务数据包,并创建一个转码进程,转码模块定时发送心跳数据至任务池中对应的任务数据包中,以及根据转码源文件路径从共享文件夹***中获取对应的源文件。
转码模块包括守护线程和工作池;工作池包括心跳单元和转码单元。具体的,转码模块的守护线程从任务池中获取任务数据包,并在工作池中创建一个转码进程,工作池的心跳单元定时发送心跳数据至任务池中对应的任务数据包中,以及转码单元根据转码源文件路径从共享文件夹***中获取对应的源文件。
转码源文件路径和共享文件夹***中源文件模块相对应,转码模块可以根据转码源文件路径从共享文件夹***的源文件模块中获取对应的源文件。
转码模块发送心跳数据具体为:转码模块定时发送一个心跳数据至任务数据包,心跳时间更新为接收到心跳数据的时间。例如,转码模块每隔30s发送一个心跳数据至任务数据包,转码模块在06:00:20第一次发送一次心跳数据至任务数据包,心跳时间更新为06:00:20;转码模块在06:00:50第二次发送心跳数据包至任务数据包,心跳时间更新为06:00:50。
进一步地,转码模块从任务池中获取任务数据包;该任务数据包的状态信息为待转码,或状态信息为运行中且心跳时间距离当前时间超过预定时间。例如,预定时间是3分钟,当前时间为06:05:00,而某一任务数据包的心跳时间为06:01:20;此时心跳时间距离当前时间超过三分钟,故转码模块从任务池中获取该任务数据包。
进一步地,守护线程还用于检测工作池中的容量,如果工作池中的容量有盈余,守护线程会从数据库中再次获取任务数据包,在工作池中创建另一个转码进程。例如,每个工作池的容量为可以创建10个转码进程,而此时工作池中有7个转码进程,则守护线程可以再次从数据库中获取任务数据包,再次创建转码进程。
步骤102、转码模块对源文件进行转码,将转码成功的转码文件存储至共享文件***中。
具体的,转码单元根据任务数据包中的转码需求对源文件进行转码;例如,任务需求是将源文件转码成格式为高清的rmvb格式的文件,或者格式为超清的mp4格式的文件。
进一步地,转码单元还将源文件存储至转码模块所在的转码机器的缓存目录中;将转码成功的转码文件存储至共享文件***的转码文件模块中。
进一步地,守护线程在转码单元转码成功后,发送转码成功信号至任务池中对应的任务数据包中,更新该任务数据包的状态信息为完成。
进一步地,转码模块还用于将转码失败后发送转码失败信号至任务池中对应的任务数据包中,更新该任务数据包的状态信息为失败。
以下将对各个模块进行详细的解释:
共享文件***(Sharing File System),该***提供接口,传输组件和所有转码模块都依赖该接口来存取文件。在本实施例中,共享文件***使用的是亦云公司提供的XNODE共享文件存储***。
数据库(Data Base),用于存储任务数据包,该***提供接口,传输组件和所有转码模块都依赖该***的接口来保存和查询相关的任务数据包。在本实施例中,数据库使用的是开源的MySQL服务。
传输组件(Transcode Request Server),这个组件是接收转码请求的组件,该组件的主要职责是将需要转码的源文件写入到共享目录当中,同时在数据库中创建一条任务数据包,并将状态信息设为“待转码”,由于工作内容简单,在实际的应用过程当中,这部分的逻辑甚至不需要有一个单独的进程处理。在本实施例中,该组件集成到了处理客户请求的WebApp Server当中。
转码模块(Transcode Worker),是转码工作实际执行的组件,转码模块的设计为无状态组件,可以随意伸缩,这个取决于当前数据库中的任务队列数量和组件的空转情况。
任务池(Task Pool),存在于数据库中的一个工作表,任务池包括多个任务数据包,记录了需要转码的任务数据包,每个任务数据包括了任务ID、转码源文件路径、状态信息(初始为“待转码”)、任务心跳、转码目标文件路径、转码工作机等信息。其中,任务心跳包要求当前的转码工作机定时更新(通常为30s),如果任务心跳包最后更新的时间距离当前时间超过3分钟,则该任务数据包异常,该任务会被其他转码模块获取,并从新开始转码。
源文件模块(Origin File),设于共享文件***中,用于存放需要转码的源文件目录。
任务心跳包(Transcoded File),设于共享文件***中,用于存放转码完成的目标文件目录。
守护线程(Daemon Thread),该线程会定时扫描数据库中任务池里的任务数据包,并把该任务放入本机的工作池当中。
工作池(Working Pool),用于存放正在工作的转码任务,每个转码模块的工作池的大小会依据当前转码机器的空闲CPU核数来确定。一个双核CPU机器完全用来转码的话,那么工作池就是2,表示当前的工作节点能同时进行2个转码任务。
Task Thread:进行转码工作的线程,包含2个子模块,一个是转码模块,核心的业务模块,用来将一种视频格式转码为另一种视频格式。另一个模块是Heartbeat(心跳)模块,只要工作进程正常运行,心跳线程就会不断的更新数据库中该条任务的心跳时间。
分布式转码装置,如图3所示,应用于分布式转码***,包括:
第一存储模块,应用于共享文件***,用于接收源文件并存储;第二存储模块,应用于数据库,用于接收任务数据包并存储;
创建模块,应用于转码模块的守护线程,用于从数据库中获取任务数据包,并在转码模块的工作池中创建一个转码进程;
获取模块,应用于工作池,用于根据任务数据包中的转码源文件路径从共享文件夹***中获取对应的源文件;
运行模块,应用于工作池,对源文件进行转码,将转码成功的转码文件存储至共享文件***中。
对本领域的技术人员来说,可根据以上描述的技术方案以及构思,做出其它各种相应的改变以及形变,而所有的这些改变以及形变都应该属于本发明权利要求的保护范围之内。