集群服务器+定时任务(Quartz) 重复执行的问题

x

StackExchange.Redis

private readonly IDatabase _db;

string key = string.Concat("{自己命名的Redis前缀}", task.TaskDetailsId);
//获取本机服务器IP地址
string valIp = GetLocalIP();
//Redis缓存中的IP地址,
var valIpRedis = _db.StringGet(redisKey);

            /*
             * 方案1.每次都获取锁(redis.LockTake),而不去判断缓存中的值(valIpRedis)
             * 方案2.每次先判断缓存中的值(valIpRedis),没有缓存再去获取锁.
             * 目前采用的是方案2.
             *
             *      如果以后执行周期和缓存过期时间发生改变可能存在的风险:
             *      1.方案1风险:如果设置的过期时间比执行周期长,服务器都获取不到锁了,任务这次就不会执行,只能等到缓存清除之后才可以获取到锁.(例如:过期时间24H,执行周期1H,那么24H内,只会执行1次)
             *      2.方案2风险:服务器A刚获取完缓存的IP地址,就过期了,而服务器B此时也刚好获取到了锁.就会执行两次.(例如:过期时间1H,执行周期1H,那么1H内,可能会执行2次)
             */
            if (valIpRedis != null && valIpRedis == valIp)
            {
                isCanRun = true;
            }
            //如果Redis中没有缓存,去获取锁,获取成功,即可执行...
            else if (redis.LockTake(key, valIp, TimeSpan.FromMilliseconds(taskExpiry)))
            {
                isCanRun = true;
            }
            if (isCanRun)
       {

                    //记录日志{XX任务开始执行,服务器IP地址为xx.xx.xx.xx}
                    //开始执行各个定时任务{Quartz}
                    ((ITask)Activator.CreateInstance(Type.GetType("Your Class Type"))).Execute(task);

       }

传送门

C#通过Redis实现分布式锁

x

原文地址:https://www.cnblogs.com/love-zf/p/11260492.html

时间: 2024-10-11 05:11:46

集群服务器+定时任务(Quartz) 重复执行的问题的相关文章

集群服务器定时任务,只运行一个定时器的设计

(1)只在一台服务器上部署该定时任务代码. (2)在定时任务代码上加上某个特定的ip限制,仅某个ip的服务器能运行该定时任务. (3)利用数据库的共享锁事务管理机制来运行定时任务.  第一步:新建一张数据库表,表有三个字段:status(表当前定时器是否处于可运行状态).timestamp(时间戳).serverIP(正在运行定时器的服务器IP).  第二步:检查是否有机器正在运行定时任务.检查方法:update定时任务表的status字段为1(1为执行中,0为未执行).ip为自己的ip,如果u

集群服务器状态命令------rs.status()各个字段的含义

可根据rs.status() 查询集群服务器状态.字段解释: self 这个信息出现在执行rs.status()函数的成员信息中 stateStr用户描述服务器状态的字符串.有SECONDARY,PRIMARY,RECOVERING等 uptime 从成员可到达一直到现在经历的时间,单位是秒. optimeDate 每个成员oplog最后一次操作发生的时间,这个时间是心跳报上来的,因此可能会存在延迟 lastHeartbeat 当前服务器最后一次收到其他成员心跳的时间,如果网络故障等可能这个时间

使用概要管理工具创建定制概要文件,并在此节点上 创建集群以及在集群服务器中部署应用

使用概要管理工具创建定制概要文件,并在此节点上 创建集群以及在集群服务器中部署应用 上篇介绍了在Lnux上安装WebsphereV8.5,以及使用概要管理工具创建了Dmgr管理概要文件. Dmgr服务器不能运行应用程序,应用程序需要运行在特定的JavaEE服务器上,Dmgr管理服务器只负责管 理与它联合的节点.可以在新建的profile对应的节点上创建Websphere实例或者集群实例.并把此节点与 Dmgr服务器联合,交由Dmgr管理.此篇介绍使用概要管理工具创建定制概要文件,并在此节点上创建

Nginx搭建集群服务器过程详解

Nginx+Apache+PHP+MySQL搭建集群服务器过程详解 概念介绍在本文未能提及,请自助上网科普,直接进入过程详解: 集群架构图大致如下: 一.软件下载 序号 软件名称 软件版本 下载地址 1 操作系统 Windows Server 2008 Enterprise 64bit 2 Php php-5.6.19-Win32-VC11-x64 Thread Safe(由于HTTP服务器用的apache) http://windows.php.net/downloads/releases/p

集群服务器Session同步及一种基于Memcached的session同步

1 Session的集群管理 事实上,网站总是有状态的.每一个登录信息.用户信息常常被存储在session内部.而当一个网站被部署在不止一台服务器的时候,就会遇到session同步的问题.事实上即使一个很小的网站,也要至少有两台服务器互为备份,分单流量是必须得,更重要的是无缝切流量升级.为了保证服务的不间断又要进行网站的维护升级,切流量是最简单的.那么如何保证切流量的时候session也会跟着同步过去呢?在集群环境下,大致有以下几种手段 1.1 Session复制 这是一种在早期应用系统中使用较

ubuntu14.04 server 部署 zookeeper 集群服务器

zookeeper是什么? Apache ZooKeeper 是一个面向分布式应用程序的高性能协调服务器.它使用一个简单的接口暴露公共服务(比如命名和配置管理.同步和组服务),让用户不必从头开始编程.它为实现共识.组管理.领导者选举和到场协议(presence protocol)配备了现成的支持. 下面是我在ubuntu14.04 server中部署 zookeeper集群服务器的经验 zookeeper集群服务器的部署 1.安装jdk 之前安装jdk都是自己手动配置环境,这次为了偷懒就使用了a

SQL Server集群服务器的优缺点

由二台或更多物理上独立的服务器共同组成的“虚拟”服务器称之为集群服务器.一项称做MicroSoft集群服务(MSCS)的微软服务可对集群服务器进行管理.一个SQL Server集群是由二台或更多运行SQL Server的服务器(节点)组成的虚拟服务器.如果集群中的一个节点发生故障,集群中的另一个节点就承担这个故障节点的责任. 认为一个SQL Server集群能够给集群中的两个节点带来负载平衡,这是一种常见的误解.虽然这似乎很有用,但却是不正确的.这也意味着集束SQL Server不能真正提高性能

SqlServer+Topshelf+Quartznet做集群,定时任务分布式处理

接触Quartznet之前,老东家用的是总监自己写的分布式任务框架,好用但是配置麻烦,unity,一个微软容器,配置节点错一个,整个使用到unity文件的项目全部跑不起来,这后果真的受不了... 目前公司呢,没什么框架,全都是自己研究,自己找,合适的就用,独立自主,可是这样的方式真的好么,一个员工离职,或许他引进的东西别人要推翻重写,代价也不小..算了还是说下自己用到的东西吧.这里只是简单记录,有问题可以私信. 1.新建控制台项目,这里就叫DistributedService; 2.通过NuGe

Redis集群服务器-高可用调研随笔[转]

今天改了一天的Bug,本想下午开始专研Redis命令集,结果也泡汤了.只能在下班的路上考虑下Redis集群服务器的高可用方案.随笔而已,尚未成型,仅作记录. 当然,我说的可能比较片面,欢迎拍砖.斧正. 一.Redis与MySQL对比 相同点: Master-Slave架构,集群架构下无法很好的完成数据拷贝,确保数据一致性. 支持数据文件持久化存储,但数据文件过大时,宕机重启可能存在安全隐患. 不同点: Redis时效性能远比MySQL要高得多,支持复杂的数据类型,基本上都是内存操作,效率远胜于M