最近经历了好几次处理线上历史数据,处理的数据量基本都在百万以上,为了操作稳定和便于监控,我们采用的是Laravel5框架的定时任务。

正常单进程处理的写法大概是这样的:

//定时任务脚本
$schedule->command('history:deal')->everyMinute()->withoutOverlapping();
//数据筛选
DB::table('xxx')->where('handle',-1)->limit(200)->get()

大家看到上面这种方式处理,每分钟处理两百条数据,如果操作的慢,还会阻碍下一分钟的任务执行。

基于上面问题的,我们采用的是一个10倍提速方案:

//定时任务脚本
$schedule->command('history:deal 0')->everyMinute()->withoutOverlapping();
$schedule->command('history:deal 1')->everyMinute()->withoutOverlapping();
。。。。。。
$schedule->command('history:deal 8')->everyMinute()->withoutOverlapping();
$schedule->command('history:deal 9')->everyMinute()->withoutOverlapping();
//数据筛选
DB::table('xxx')->where('handle',-1)->whereRaw(\DB::raw('SUBSTRING(id,-1) = ' . $idNum))->limit(200)->get()

以上的改造很好理解,我们通过传参的方式,将要处理的数据id尾号传递到处理脚本中,在数据筛选过程时,按尾号筛选数据,这样就能每分钟处理2000条,处理速度提升了10倍。

当然如果还需要进一步扩大,也很容易改造上面的方法。

本文为 陈华 原创,欢迎转载,但请注明出处:http://www.ichenhua.cn/blog/post/21