需求背景:
业务一:
1解析几g的json格式的元数据,多线程,存储db的方式,效率太低 ;
2解决方案:文件读取解析都放到hdfs上,借助大数据的能力,快速完成数据处理;
业务二:
每天定时执行特定业务,虽然从db层面可以支持幂等性,但从实际执行上,并不需要多机器执行;
2解决方案:增加shedlock,底层是在mysql中有一个表,增加锁支持。保证同一时刻只有一个任务在执行;
业务三:
从db中捞取待处理的任务,多个机器之间,希望可以分别获取一部分任务,达到并行执行的目的。避免数据的重复获取,执行。
问题:没有特定的关系可以将机器和任务之间做映射关系。
解决方案:将db的待处理表的主键id做取余数操作,同时每台机器都有记录一个对应的index索引值,和当前的机器数目,从而在各自机器拉取db数据时增加此条件限制,达到过滤目的;
不足之处:需要依赖于各台机器的配置文件,如果增删节点,则要相应的修改配置文件的 machine.no,machine.index的值,如果机器较多的话,间接影响了弹性扩容。
改进方案:目前考虑使用elastic-job 这里分布式任务调度的技术方案。 同样需要对数据正确分片
以上谈及到的避免任务重复执行的技术方案:分布式锁
实现方式:数据库,redis,zookeeper