elasticjob:如何分片
elasticjob
elasticjob可以执行我们编写的各种job,通常我们会创建一张定时任务表,然后保存一条Job记录,由相关的Job类去执行
分片
假设一台服务器运行着A应用,
- 不分片,那么A应用的JobA就会处理所有的job记录。
- 如果分片了,一般都是有多台服务器部署A做集群的情况下。比如说3台服务器,那么分3片,每台服务器各执行一片,代码层面通常以id % #{totalCount} = #{shardingItem}来分担数据,由此每台服务器各处理1/3的数据
注意事项
- 只要配置好 shardingTotalCount 和 shardingItemParameters就行了,具体哪些服务器负责哪个分片不归我们管,由elasticjob来调度
- shardingItemParameters的索引号不能大于等于shardingTotalCount
- 分片数量最好 >= 服务器数量,更好是 分片数量和服务器数量是倍数关系。
- ShardingContext可以拿到分片项和分配参数,如果单纯是job分担数据,分片项可以用。如果有特殊要求,比如不同服务器处理不同地区的数据,那就得用分片参数
- 既然分片了,就一定要对业务代码进行改造。比如说你分3片,原来的业务代码根本没变,没有用到分片项和分配参数,就会导致3台服务器执行了一样的数据,数据量翻三倍,业务也错乱
- 一台服务器一个分片 处理 A,B,C数据 和 一台服务器3个分片处理A,B,C数据是不一样的。前者只有一个线程来处理,后者是可能为多线程处理
- 分片识别是根据ip的,也就是说同一台电脑,跑两个程序没用,两个程序都会全部执行,还是会重复