以前为部门内部开发过一个定时器程序,这个定时器很简单,就是配置quartz,来实现定时调用配置的url功能。最近为了防止定时器所在的服务器由于特殊原因挂掉,需要对定时器做多机部署。那么如果按照原来的方式进行部署,就会遇到 在一定的间隔时间内,可能出现多次重复调用的问题。为了解决这个问题,我就借助了redis的分布式锁功能。
redis分布式锁参考 : http://www.jeffkit.info/2011/07/1000/
具体原理如下:
定时器到时间被触发,程序开始先争取一个redis锁。
如果获得锁,就设置锁的超时时间为到下次定时器触发的时间。
然后执行定时器任务。后来的定时器也来尝试获得redis锁,当然,这个锁已不能获取了,而且超时时间在未来,所以就放弃这次任务调用。
定时器到时间再次被触发,然后尝试获得锁,由于锁的超时时间为定时任务的时间间隔,当前时间正好大于或等于超时时间,所以,程序可以顺利的获得锁,并重置超时时间。
。。。。。。。不断的循环调用,判断
在此之间测试循环间隔时间最小单位为1s最好,如果小于1s的调用,由于使用redis会有10几毫秒的运算耗费,因此不能保证在1s以下的时间间隔比较均匀.
为了能保证定时触发时,能获得redis锁,可以设置锁的超时时间为间隔时间-10ms。这样就判断超时时间 now > timeoutTime = true。
补充:
只要多个服务器时间差别不大,基本不会有重复的问题。唯一担心的就是redis,这个挂了,就全挂了。
因此,如果要考虑更全面,需要对redis点单再做集群。就看是否有必要了。
目前定时器的任务都是通过配置文件写好,以后我还要考虑动态更新任务。
目前代码还在整理中,想做一个开源的项目。
踩我的请告诉我,哪里不对。如果大家有更好的方案,请告诉我,我需要改进
相关推荐
分布式定时任务库 distributed-cron
SwooleDistributed 是swoole分布式系统的实现,他提供了一套基于swoole扩展的分布式通讯框架。结构图:SwooleDistributed 不仅提供了分布式搭建的必要设施,还提供了4大组件帮助你提高编写代码的效率,你既可以部署...
8. 一万个人抢100个红包,如何实现(不用队列),如何保证2个人不能抢到同一个红包,可用分布式锁 9. java内存模型,垃圾回收机制,不可达算法 10. 两个Integer的引用对象传给一个swap方法在方法内部交换引用,返回...
+ 熔断机制 + eureka + 单元测试(controller、service、mapper层) + redis集群集成练习 + redis操作练习 + fastDFS集成练习 + 全局拦截器 + 定时器配置 + 定时器任务设计[线程池+分布式锁] +关闭挂钩 + 单例应用 + ...
主要模块: 封装Redis LuaScript对象,方便在项目中直接定义lua脚本,并根据需要同步到需要使用的redis实例...基于Redis实现的毫米级定时器,使用生产者消费者模型,支持分布式部署; 开发计划: 模块 进度 上下文(Co
4、本资源作为“参考资料”如果需要实现其他功能,需要能看懂代码,并且热爱钻研,自行调试。 #### 涉及技术 Java、Springboot、MyBatis、Redis、MySQL、Dubbo、RocketMQ 等。 #### 设计技术 1. 采用 Dubbo 的...
基于springboot 2.0.6.RELEASE版本实现的代码演示集合,欢迎使用star / fork 新子项目列表 介绍Springboot2【自动化单元测试】的用法: 如何编写测试案例,具体使用有哪些 单元测试场景:多种业务场景,例如如何进行...
Gateway服务和Worker服务可以分开部署在不同的服务器上,实现分布式集群。 GatewayWorker提供非常方便的API,可以全局广播数据、可以向某个群体广播数据、也可以向某个特定客户端推送数据。配合Workerman的定时器,...
缓存框架:J2cache、Redis 日志管理:LogBack 工具类:Apache Commons、HuTools 视图框架:Spring MVC 定时器:Quartz 数据库连接池:Druid 日志管理:logback 页面交互:layui 下拉框:bootstrap-select 文件上传:...
Spring定时器 单点登录 Sentinel熔断降级限流 分布式唯一ID(雪花算法) 持续补充... V2 spring-cloud-alibaba 前端: vue vuex vue-router axios vant-ui 持续补充... 计划 环境搭建的文档(Java、MySQL、Redis、...
缓存框架:Redis、EhCache 日志管理:LogBack 工具类:Apache Commons、HuTools 视图框架:Spring MVC 定时器:Quartz 数据库连接池:Druid 日志管理:logback 页面交互:基于hplus和inspinia 下拉框:bootstrap-...
iNet 是跨平台服务器开发组件,包括:网络库、消息队列、定时器、RPC、协程库。 地址:https://github.com/IronsDu/accumulation-dev 请参阅测试代码:examples。 特点:跨平台,效率非常高,安全,可复用,...
Task-Schedule基于Hyperf开发的任务调度系统基于 Hyperf...(redis 驱动)Nsq 1.2.0TODO分布式支持案例1.投递任务use App\Model\Task;use App\Job\SimpleJob;use App\Kernel\Nsq\Queue;class Example{ /** * @desc 测试jo
典型相关分析matlab实现代码 Cpp-opensource-lib C++ 开源库列表 Libevent libev是一个开源的事件驱动库,基于epoll,kqueue等OS提供的基础设施。其以高效出名,它可以将IO事件,定时器,和信号统一起来,统一放在...
Mineboat是一个前一级分离的框架,目的是实现一个非分布式的简单框架。 Mineboat根据这样一个需求:当需要建造一个简单的网站的时候,希望能够快速上线,不需要过多的配置和框架的建造。 Mineboat的初步基于...
util实现Java图片水印添加功能,有添加图片水印和文字水印,可以设置水印位置,透明度、设置对线段锯齿状边缘处理、水印图片的路径,水印一般格式是gif,png,这种图片可以设置透明度、水印旋转等,可以参考代码...
Java数组倒置 简单 Java图片加水印,支持旋转和透明度设置 摘要:Java源码,文件操作,图片水印 util实现Java图片水印添加功能,有添加图片水印和文字水印,可以设置水印位置,透明度、设置对线段锯齿状边缘处理、水印...
小巧,相较其他解释型编程语言实现本系列功能,本独立中间件效率更高、系统资源占用小,受环境依赖基本无(windows系统运行即可,无需任何依赖); 劣势: 因为本中间件通过http通信,而这必然有一个网络传输的过程...
- 支持分布式部署,session存储在redis中 - 友好的代码结构及注释,便于阅读及二次开发 - 引入quartz定时任务,可动态完成任务的添加、修改、删除、暂停、恢复及日志查看等功能 - 页面交互使用Vue2.x,极大的提高了...