一、什么是作业分片
前段时间学习分布式作业调度中间件常看到这样一个概念:「作业分片」 。最初看到这个概念时,脑海中立刻浮现出这样一些问题:什么是作业分片?作业分片分片的对象是什么?为什么要进行分片呢?如何进行作业分片呢?不要问我问题为什么这么多,问了就是因为菜。
菜就要勤学,不懂就要勤问。在请教完度娘之后,大致明白了以下几点:
- 作业分片切分的 「不是作业执行逻辑」 :
- 作业分片切分的是 「待处理的数据」 ;
- 作业分片的概念更多的是用在分布式框架中;
有了上面的概念之后我们再来看下什么是作业分片。作业分片实际上就是将作业切分成数个分片项,然后通过一定分配策略将分片项分配到数个机器中进行任务执行。
二、为什么要进行作业分片
在弄明白作业分片切分的是 「数据」 而不是 「逻辑」 之后,首先想到作业分片的第一个好处就是作业执行的效率更高了。举个例子,闲鱼有一块蛋糕,一个人吃需要5分钟,但是一位老爷爷梦中教会闲鱼分身术,闲鱼分身5人去吃一个同样大小的蛋糕,此时只需要1分钟,同时每个人需要吃的分量也减少了。上面例子中的蛋糕就是数据,当所有的数据交由一台机器处理时,由于机器性能问题,处理全部数据的效率必然会较低。但是将数据分成若干份,交由多台机器处理时,每台机器处理的压力就会降低,同时被切分的数据还可以被并行处理,整体执行效率就会得到大大提升。
作业分片的第二点优势是更适合分布式场景,或者说是更契合分布式理念。分布式的核心理念就是让多台服务器协作完成单台服务器无法完成的任务,尤其是高并发或者大数据量的任务。作业分片这一概念可谓是相当契合分布式的理念,这也是 Elastic-job
在性能上如此优越的重要原因。
三、如何进行作业分片
如何分片这个问题可以说是见仁见智。在 Elastic-job
中,框架的作者将分片的处理权交给了开发者,只在框架中提供了分片项的分配策略(很多博客中都写着作业分片策略,但是实际上那是分片项的分配策略,误导了闲鱼很久)。所以在实际使用作业分片执行这一功能时,开发者需要自行做好数据的切分,将其分成对应的分片项。
虽然没有明确标准的分片方案,但是闲鱼以为数据切分应该满足以下要求:
- 数据结构一致;
- 可以按照类型字段或者状态字段将数据进行切分;
- 由于每台机器的处理逻辑相同,被切分的数据应该互不影响,不会受执行情况的影响;
- 尽量保证切分的分片项数据量均衡(不保证也没关系);
四、总结
以上基本都是闲鱼基于阅读 Elastic-job-lite
作业分片部分的逻辑和网上诸多大佬博客之后的一点思考,如有谬误,轻喷~~