- 1、本文档共6页,可阅读全部内容。
- 2、原创力文档(book118)网站文档一经付费(服务费),不意味着购买了该文档的版权,仅供个人/单位学习、研究之用,不得用于商业用途,未经授权,严禁复制、发行、汇编、翻译或者网络传播等,侵权必究。
- 3、本站所有内容均由合作方或网友上传,本站不对文档的完整性、权威性及其观点立场正确性做任何保证或承诺!文档内容仅供研究参考,付费前请自行鉴别。如您付费,意味着您自己接受本站规则且自行承担风险,本站不退款、不进行额外附加服务;查看《如何避免下载的几个坑》。如果您已付费下载过本站文档,您可以点击 这里二次下载。
- 4、如文档侵犯商业秘密、侵犯著作权、侵犯人身权等,请点击“版权申诉”(推荐),也可以打举报电话:400-050-0827(电话支持时间:9:00-18:30)。
?
?
大型数据场景中定时任务系统研究
?
?
尹隆波
摘要:大型数据运用场景中存在数据进行关联或更新操作的需求,在实际应用中通过单独部署定时任务系统周期性去统计或更新数据。由于庞大而复杂的数据,定时任务系统中的任务运行起来耗时很长而且会过多地消耗系统的资源,对系统的性能造成很大的影响。另外,复杂的定时任务系统中出现问题很难去排查并进行分析。基于以上问题,论文通过合理的利用多线程技术、采用增量更新数据、合理設置不同子定时任务的运行时间和周期来提高系统处理速度,并且采用扩展ThreadPoolExecutor统计线程运行情况、给每个线程设置有意义的名称以方便系统中的问题排查分析。
关键词:高并发;定时任务;线程池;负载均衡;JAVA
:TP311:A:1009-3044(2018)33-0025-03
大型数据运用场景中,通常需要展示一个对象关联的其他类型对象的数量,并且其关联的其他类型数据出于不断地动态地增加中。通常巨量的对象数据存储在如Solr、ElaticSearch等非关系型数据库中。非关系型数据中,多个表之间没有提供直接的关联操作。运行单独的定时统计任务来计算对象关联的其他类型对象数量以及动态增加新关联的对象,是处理上述问题的一种实用解决方案。一方面,定时任务能够及时统计或更新关联数据满足客户的展示需要;另一方面,利用定时任务进行统计,能够大幅度减少页面过程中后台程序复杂计算的时间,使得页面加载的时长控制在用户接受范围内。
基于Java开发的Web系统,可以采用JDK提供的Shedular框架运行定时任务,使用简单并且高效。为了提高定时任务的运行效率、以及方便问题定位分析,论文将根据实际应用中的解决办法从这两个目标进行阐述。
1提高系统处理速度
大型数据运用场景中,通常定时任务系统需要处理的数据量巨大,为了提高定时任务系统的处理速度,可以从以下三方面考虑。一是利用多线程技术进行并发处理;二是采用增量更新数据的策略;三是合理地设置定时任务数量,以及合理安排多个子定时任务的运行时间和运行周期。
1.1多线程并发处理
为了提高系统数据处理的速度,在多CPU的服务器上,可以采用多线程技术充分利用多个CPU的计算能力。通常开发者可以将一个定时任务,拆分成可以独立运行的若干个细小子任务,然后为每一个子任务单独创建个线程运行。如果拆分的子定时任务数量过多,系统中运行的线程数量也会过多,由于每个线程的创建需要一定的系统资源和时间开销,大量的线程会降低系统的响应速度和性能。因此,需要合理地设置系统中运行的线程数量。简单来说,Java并发有两种类型:计算密集型并发和IO密集型并发。
1)计算密集型并发
计算密集型,从名称的定义上来看,就是一个应用需要数量庞大的CPU资源进行数据计算操作。进入21世纪后,信息技术步入了多核CPU服务器时代,让每一个CPU核心都参与数据计算,将多核CPU的性能充分利用起来,这样才能最高效率地使用服务器硬件资源。在装载成百上千CPU的服务器配置上运行单线程任务,是对宝贵的硬件资源的最大浪费。对于计算密集型的应用,主要是靠CPU的运算能力来工作,消耗CPU资源,大部分时间用来运行计算、逻辑判断等CPU动作,比如计算圆周率、对视频进行高清解码等,通常这些应用访问I/O设备频率较低。为了发挥CPU密集并发应用的性能优势,需要尽量避免过多的线程频繁地进行上下文切换,一种比较比合理的方案是:线程数量=CPU核数+1。
另外一种较为理想的方法是:线程数量=CPU核数*2。除了考虑CPU的内核数量,另外还要参考JDK的使用版本,以及CPU的硬件配置(现在部分服务器的CPU支持超线程机制)。JDK1.8后,JAVA默认支持并行计算,因此,基于JDK1.8或更高的JAVA版本,计算密集型应用的合理方案是:线程数=CPU核数*2。可以通过JDK提供的接口从运行的JVM环境中获取服务器的CPU数量。
2)IO密集型并发
顾名思义,IO密集型的应用,大部分的时间在等待IO读写操作上,而CPU占用率并不高。目前大部分软件项目都是Web应用,一方面涉及大量而频繁的网络信息传输,另一方面,程序应用与数据库系统、与缓存间的数据交互也需要大量的IO读写。一旦发生IO读写操作,线程会一直等待IO操作的运行,直到IO操作完成、数据准备好后,线程才会继续执行后续步骤。通常IO读写操作时间较长(主要受到磁盘读写速度和网络传输带宽的限制),这时线程处于等待状态,而CPU处于空闲状态,此时可以运行其他非等待状态的线程,处理其他的工作,从而提高系统的并发量。因此对于IO密集型的应用,应该将同时运行的线程数量设置大些。
但同时运行的线程数量也不能设置过大,线程数量应当每个子任务处于阻塞状态的时间比例相关。假设
文档评论(0)