发明内容
本发明实施例提供了一种网站的静态化处理***,以优化现有的网站静态化处理技术,提高静态网页的生成效率。
本发明实施例提供了一种网站的静态化生成***,包括:业务模块、记录队列、分解工厂、分解接口、优先级队列、队列调度模块、生成队列以及生成线程管理模块,其中:
所述业务模块,用于将待静态化处理的网站内容生成记录数据存储于所述记录队列中,并发布与所述记录数据匹配的订阅通知;
所述分解工厂,用于在接收到所述订阅通知时,从所述记录队列中获取所述记录数据,并调用所述分解接口对所述记录数据进行处理,并将所述分解接口返回的分解结果集作为缓存数据存储于所述优先级队列中设定优先级的优先级子队列中;
所述分解接口,存储有至少两个分解插件,用于选取与接收的记录数据匹配的分解插件对所述记录数据进行分解,并向所述分解工厂反馈分解结果集;
所述优先级队列,包括至少两个不同优先级的优先级子队列,不同优先级子队列中存储有不同优先级的缓存数据;
所述队列调度模块,用于按照优先级顺序,以轮询的方式获取所述优先级队列中存储的缓存数据发送至生成队列中,所述生成队列中存储有设定数量的生成子队列;
所述生成线程管理模块,用于在接收到所述订阅通知时,生成与所述生成子队列的数量相匹配的生成线程,并通过所述生成线程从所述生成子队列对应获取缓存数据进行静态化处理。
进一步地,所述业务模块具体用于:调用GenerateRecordService将待静态化处理的网站内容生成所述记录数据。
进一步地,所述记录队列具体为Redis队列。
进一步地,所述分解工厂具体用于:
在接收到所述订阅通知时,使用线程池构建缓存分解线程;通过所述缓存分解线程依据所述记录队列中的键名识别匹配的记录子队列;从所述记录子队列中获取所述记录数据,并调用所述分解接口对所述记录数据进行处理。
进一步地,所述优先级队列中具体包括:高优先级队列、中优先级队列以及低优先级队列。
进一步地,所述队列调度模块具体用于:
构建Handler轮循线程;通过所述Handler轮循线程按照优先级顺序从所述优先级队列中获取缓存数据;检测所述生成队列中各生成子队列;根据所述生成队列中各生成子队列中存储的数据量,将获取的所述缓存数据发送至对应的生成子队列中。
进一步地,所述队列调度模块具体还用于:
如果检测得到的所述生成队列中当前的各生成子队列全部处于数据存储饱和状态,且所述生成队列中当前的生成子队列的数量未超过预设的数量阈值,则开启一个新的生成子队列存储所述缓存数据。
进一步地,所述队列调度模块具体还用于:
如果检测得到的所述生成队列中当前的各生成子队列全部处于数据存储饱和状态,且所述生成队列中当前的生成子队列的数量达到预设的数量阈值,则增加所述Handler轮循线程的额外睡眠时间。
进一步地,所述生成线程管理模块,具体用于:
构建Controller类初始化线程池;在接收到所述订阅通知时,调用所述线程池生成与所述生成子队列的数量相匹配的生成线程对所述缓存数据进行处理;通过所述生成线程将处理完成的缓存数据对应的处理状态信息反馈至所述记录队列;
其中,所述处理状态信息包括:生成状态信息,和/或报错信息。
进一步地,所述处理状态信息还包括:分页信息;
所述生成线程管理模块,具体用于:如果确定所述生成线程得到的处理状态信息为分页信息,则使用回调方法将与所述分页信息匹配的分页缓存重新发送至所述优先级队列中。
本发明实施例通过业务模块将待静态化处理的网站内容生成记录数据存储于记录队列中;分解工厂从记录队列中获取记录数据,并调用分解接口对记录数据进行处理,并将分解接口返回的分解结果集作为缓存数据存储于优先级队列中优先级的优先级子队列中;生成线程管理模块,生成与生成子队列的数量相匹配的生成线程,并通过生成线程从生成子队列对应获取缓存数据进行静态化处理的技术手段,解决了在大量数据需要生成的时候会频繁请求数据库,造成***性能方面的瓶颈,生成效率低下,导致管理端发布的数据在前端迟迟无法展现,实时性差的问题,优化了现有的网站静态化处理技术,提高了静态网页的生成效率,并降低了数据库压力。
具体实施方式
下面结合附图和实施例对本发明作进一步的详细说明。可以理解的是,此处所描述的具体实施例仅仅用于解释本发明,而非对本发明的限定。另外还需要说明的是,为了便于描述,附图中仅示出了与本发明相关的部分而非全部结构。
实施例一
图1为本发明实施例一提供的一种网站的静态化生成***的结构示意图,本实施例可适应于对网站中的动态元素进行静态化处理的情形。本发明实施例的***具体包括:业务模块110、记录队列120、分解工厂130、分解接口140、优先级队列150、队列调度模块160、生成队列170以及生成线程管理模块180,其中:
所述业务模块110,用于将待静态化处理的网站内容生成记录数据存储于所述记录队列120中,并发布与所述记录数据匹配的订阅通知。
首先,需要说明的是,本发明实施例的技术方案基于Redis数据库实现。Redis数据库是一个开源的使用ANSIC语言编写、支持网络、可基于内存亦可持久化的日志型、Key-Value(键值对)数据库,是一个先进高效的缓存数据库。在本实施例中,所述业务模块110具体可以用于:调用GenerateRecordService将待静态化处理的网站内容生成所述记录数据(也可称为record)。
具体的,所述记录队列120具体可以为Redis队列。进一步的,所述记录队列120还可以进一步包括至少两个优先级的记录子队列,例如:manual operation队列(高优先级队列)、normal队列(中优先级队列)以及task队列(低优先级队列)。
相应的,所述业务模块110可以根据记录数据的数据类型(例如:PublishMode)将该记录数据存储于对应的记录子队列中。
所述分解工厂130,用于在接收到所述订阅通知时,从所述记录队列120中获取所述记录数据,并调用所述分解接口140对所述记录数据进行处理,并将所述分解接口140返回的分解结果集作为缓存数据存储于所述优先级队列150中设定优先级的优先级子队列中。
典型的,所述分解工厂130可以按照优先级顺序从所述记录队列120获取相应的记录数据。
相应的,所述分解工厂具体可以用于:在接收到所述订阅通知时,使用线程池构建缓存分解线程;通过所述缓存分解线程依据所述记录队列中的键名识别匹配的记录子队列;从所述记录子队列中获取所述记录数据,并调用所述分解接口对所述记录数据进行处理。
所述分解接口140,存储有至少两个分解插件,用于选取与接收的记录数据匹配的分解插件对所述记录数据进行分解,并向所述分解工厂反馈分解结果集。
典型的,所述分解工厂130被调用后,根据接收到的记录数据的数据类型,选取对应的分解插件对该记录数据进行分解,得到所述分解结果集,在该分解结果集中存储有与所述记录数据对应的一个或者多个分解结果。
所述优先级队列150,包括至少两个不同优先级的优先级子队列,不同优先级子队列中存储有不同优先级的缓存数据。
所述队列调度模块160,用于按照优先级顺序,以轮询的方式获取所述优先级队列150中存储的缓存数据发送至生成队列170中,所述生成队列170中存储有设定数量的生成子队列。
在本实施例中,所述队列调度模块具体可以用于:构建Handler轮循线程;通过所述Handler轮循线程按照优先级顺序从所述优先级队列中获取缓存数据;检测所述生成队列中各生成子队列;根据所述生成队列中各生成子队列中存储的数据量,将获取的所述缓存数据发送至对应的生成子队列中。
在本实施例中,所述队列调度模块具体还用于:如果检测得到的所述生成队列中当前的各生成子队列全部处于数据存储饱和状态,且所述生成队列中当前的生成子队列的数量未超过预设的数量阈值(例如,10),则开启一个新的生成子队列存储所述缓存数据。
典型的,所述数量阈值可以根据实际情况进行设置,例如通过更改GenerateQueueElementNum进行配置。
进一步的,如果检测得到的所述生成队列中当前的各生成子队列未全部处于数据存储饱和状态,则根据各个生成队列中存储的数据量大小,将所述缓存数据发送至对应的生成子队列中。例如,目前生成队列中共开启两个生成子队列,生成子队列A以及生成子队列B,生成子队列A中存储的数据量到达生成子队列A存储数据总量的80%,生成子队列B中存储的数据量到达生成子队列B存储数据总量的40%,则将所述缓存数据发送至生成子队列B中。
相应的,所述队列调度模块具体还可以用于:如果检测得到的所述生成队列中当前的各生成子队列全部处于数据存储饱和状态,且所述生成队列中当前的生成子队列的数量达到预设的数量阈值,则增加所述Handler轮循线程的额外睡眠时间。
也即,在当前的各生成子队列全部处于数据存储饱和状态,且无法在开启新的生成子队列时,则会增加所述Handler轮循线程的额外睡眠时间,以延长所述队列调度模块向生成队列发送缓存数据的速度。相应的,当后续检测到所述生成队列中存储的数据量明显减少时(例如,减少到数据总量的80%或者70%等),可以相应减少所述Handler轮循线程的额外睡眠时间。
所述生成线程管理模块180,用于在接收到所述订阅通知时,生成与所述生成子队列的数量相匹配的生成线程,并通过所述生成线程从所述生成子队列对应获取缓存数据进行静态化处理。
在本实施例中,所述队列调度模块具体可以用于:构建Controller类初始化线程池;在接收到所述订阅通知时,调用所述线程池生成与所述生成子队列的数量相匹配的生成线程对所述缓存数据进行处理;通过所述生成线程将处理完成的缓存数据对应的处理状态信息反馈至所述记录队列;其中,所述处理状态信息包括:生成状态信息,和/或报错信息。
进一步的,所述处理状态信息还可以包括:分页信息;
相应的,所述生成线程管理模块,具体用于:如果确定所诉生成线程得到的处理状态信息为分页信息,则使用回调方法将与所述分页信息匹配的分页缓存重新发送至所述优先级队列中。
本发明实施例通过业务模块将待静态化处理的网站内容生成记录数据存储于记录队列中;分解工厂从记录队列中获取记录数据,并调用分解接口对记录数据进行处理,并将分解接口返回的分解结果集作为缓存数据存储于优先级队列中优先级的优先级子队列中;生成线程管理模块,生成与生成子队列的数量相匹配的生成线程,并通过生成线程从生成子队列对应获取缓存数据进行静态化处理的技术手段,解决了在大量数据需要生成的时候会频繁请求数据库,造成***性能方面的瓶颈,生成效率低下,导致管理端发布的数据在前端迟迟无法展现,实时性差的问题,优化了现有的网站静态化处理技术,提高了静态网页的生成效率,并降低了数据库压力。
实施例二
图2为本发明实施例一提供的一种网站的静态化生成***的结构示意图。
如图2所示,首先,业务***(也即:图2中的业务应用)调用Service产生指令信息:该业务***调用GenerateRecordService创建生成记录(record,也可称为指令信息),将记录分别存储到redis队列(也即:GenerateRecord)中的manual operation队列、normal队列以及task队列中,并通过redis订阅通知(也即,订阅服务信息)通知订阅者;
之后,Cache工厂(也即,EpointCacheFactory)获取记录并分解调度:EpointCacheFactory在接收到redis发布的订阅服务信息之后,通过EpointCacheFactory的ThreadPool构建Cache分解线程,由Cache分解线程通过队列key值识别所述redis队列中匹配的cache队列(所述redis队列中包括一个或者多个cache队列),从匹配的cache队列中获取cache单元对象(也即:指令信息)后调用Cache分解接口对指令信息进行处理,在获取Cache分解接口分解之后的Cache(指令信息)时,根据该Cache的PublishMode类型,将Cache压入对应的调度队列(也即:图2中所示的Redis模式)中。此时,将调度队列中存储的Cache称之为指令单元对象。
之后,Handler指令处理器(生成队列调度者)为该Cache分派生成队列:生成队列调度者构建Handler轮循线程,以优先级分别从调度队列中的manual operation队列、normal队列或者task队列中获取所属当前服务器的指令单元对象。将指令单元对象push到生成队列中,生成通道以GenerateQueueElement Num(默认为10)个单元为上限,不同生成通道对应不同的生成队列。
若一个生成队列满了,则开启下一条生成通道生成新的生成队列,根据配置参数获取核心通道数,通道总个数;每次push指令单元对象到生成队列之前,首先检查各个生成队列的大小,在根据实际情况将该指令单元对象push到相应的生成队列中;如果当前所有生成队列全部饱和,则在Handler线程中增加额外睡眠时间。
最后,Controller(生成线程管理者)构建线程调用生成接口:生成线程管理者构建Controller类初始化线程池ThreadPool(实现线程ThreadFactory),通过redis的发布订阅服务得到的通知检查静态channelList,根据List中的值来调用ThreadPool生成线程,线程与生成队列中的队列(队列1、队列2、…、队列n)一一对应。获取生成队列中的指令单元对象后,将该指令单元对象通过框架提供的反序列化Util反序列化,将反序列化结果传入线程的生成接口使用,生成线程生成完一个Cache后将反馈生成状态或报错信息;如果是分页,调用回调方法将分页Cache在push到调度队列中等待生成。
本发明实施例使用了静态化业务插件式管理,自动扩充线程,redis信号量管理等技术手段构建网站的静态化生成***,提高了生成效率,降低了数据库压力。
注意,上述仅为本发明的较佳实施例及所运用技术原理。本领域技术人员会理解,本发明不限于这里所述的特定实施例,对本领域技术人员来说能够进行各种明显的变化、重新调整和替代而不会脱离本发明的保护范围。因此,虽然通过以上实施例对本发明进行了较为详细的说明,但是本发明不仅仅限于以上实施例,在不脱离本发明构思的情况下,还可以包括更多其他等效实施例,而本发明的范围由所附的权利要求范围决定。