业务场景:
系统中需要利用到定时任务,用了spring的注解@Schedule注解实现。本地无问题,因为是单机。现实摆设时是集群摆设,有多个服务器,会同时实行定时任务,导致数据重复处置惩罚。
解决方案:
方案一 定时任务分离
将系统的定时任务单独抽离为一个项目,与业务后台服务同步在另一个单独的服务器上摆设。
方案二 通过ip控制
适用于已知每个服务器的ip且ip不为动态ip,即ip稳固。
方案三 利用数据库加锁
在数据库中写入一个变量,利用该变量控制每次只有一个服务器实例能实行该定时任务。好比只有读到变量为1时,才实行任务,而且读到后立马将变量置为0,用程序确保读写时都加锁,读写乐成后开释锁。
方案四 redis分布式锁
redis分布式锁的实现
关于redis分布式锁,可以具体看上面的技能文章。主要就是利用redis加锁解锁,从而保证多个实例每次只有一个能实行定时任务,算是方案三的升级版。如果redis也是集群摆设,上面的文章也提到了解决方案——redission。
方案五 分布式任务调度框架
关于分布式任务调度框架——定时任务摆设在多台服务器时如何避免重复实行,该篇文章的解决方案有较为具体的描述。框架的底层也基于分布式锁和数据库来进行控制和调度。
免责声明:如果侵犯了您的权益,请联系站长,我们会及时删除侵权内容,谢谢合作!更多信息从访问主页:qidao123.com:ToB企服之家,中国第一个企服评测及商务社交产业平台。 |