一个简单的基于数据库实现的多机任务抢占调度

一般的协调工作,让zookeeper来做那是最好的,问题是你得部署zookeeper。如果没有能否模拟一个协调者呢?这是本篇文章需要介绍的内容。

背景

有合同约定,如果总消费额达到一定的额度,需要启动折扣,达到另一个更高的额度后,会启动另一个折扣。用户的消费记录都是小额的,如1毛一笔,折扣需要详细到每一笔交易。现在已经有了很大批量的这种数据,需要计算总价。应用部署了3台机器,如何让3台机器都可以参与处理,并且一个合同的消费数据只能由一台机器处理,并且,如果这台机器处理了合同的部分数据死掉后,需要有其他的机器继续处理?

在这里,使用数据库作为协调器,协调各机器间的状态,详细介绍如下:

1、约定心跳时间为1分钟

2、创建调度任务表


字段


说明


任务类型


这里对应批价合同ID,唯一ID


最近更新时间


版本号


或者时间戳,一个意思

3、每台机器启动一个心跳线程,线程找到一条最近1分钟(心跳时间单位)内没有更新过的任务记录(更新时间与当前时间差大于1分钟)

4、更新这条记录,执行sql:update 任务表 set 最近更新时间=系统时间,版本号=Step3查询出来的版本号+1 where 任务类型=查询出来的任务类型 and 版本号=Step3查询出来的版本号

5、判断执行结果,如果更新成功(sql影响行数=1)则意味着该机器可以开始执行该任务,否则就意味着该任务被其他的机器抢占了。

进一步优化:

Step4中只执行了一个心跳既认可任务处理权,可以多几个心跳时间,如3个,10个等成功更新后,再确认拥有处理权,再开始处理。

分析思路:

1、部署的3台机器之间没有联系,因此要实现相互协调,必须有一个中间协调器。

2、协调2钟,主动和被动,①三台服务器被动接受协调器的协调结果,目前没有;②三台服务器主动询问某共享资源,这里用的是数据库。

3、借鉴了数据库并发处理的特征,就是那个版本号,这个非常重要。

时间: 2024-09-30 19:37:51

一个简单的基于数据库实现的多机任务抢占调度的相关文章

一个简单的全备数据库的脚本以及系统数据库是否需要备份

一个简单的全备数据库的脚本,@path部分需要替换路径 1 DECLARE @name VARCHAR(50) -- database name 2 DECLARE @path VARCHAR(256) -- path for backup files 3 DECLARE @fileName VARCHAR(256) -- filename for backup 4 DECLARE @fileDate VARCHAR(20) -- used for file name 5 6 -- specif

C#做一个简单的进行串口通信的上位机

C#做一个简单的进行串口通信的上位机 1.上位机与下位机 上位机相当于一个软件系统,可以用于接收数据.控制数据.即可以对接收到的数据直接发送操控命令来操作数据.上位机可以接收下位机的信号.下位机是一个控制器,是直接控制设备获取设备状况的计算机.上位机发出的命令首先给下位机,下位机再根据此命令解释成相应时序信号直接控制相应设备.下位机不时读取设备状态数据(一般为模拟量),转换成数字信号反馈给上位机.上位机不可以单独使用,而下位机可以单独使用. 2.串口通信 串口相当于硬件类型的接口.比如无线传感节

初识Winform 与C#----一个简单涉及SQL数据库的通讯录 (Contact3)

一.  关于Winform 启动程序和显示窗体--------------------------------[Program.cs]------------------用来启动程序,显示最基础的窗体 Winfom(窗体)中的许多控件------------------------[form1.cs]---------------------用来定义控件窗体,及其中的对象, ------[form1.Designer.cs]----------定义窗体及其中的对象的行为,即函数,或者方法. 控件

一个简单的基于HTTP协议的屏幕共享应用

HTTP协议可以能是应用层协议里使用最广泛并且用途最多样的一个了.我们一般使用HTTP协议来浏览网页,但是HTTP协议还用来做很多其它用途.对开发人员来讲很常见的一种就是用HTTP协议作为各种版本控制系统和发布系统的一种底层协议,比如SVN/GIT/WebDav等等都有HTTP的支持.甚至一些数据库用HTTP作为链接的底层协议.HTTP的特点是简单,基于文本(可读),容易扩展(各种头部随便加),支持代理(让很多没有外网连接的主机可以通过HTTP代理访问外部主机,实际上HTTP Proxy Tun

一个简单的基于内容的推荐算法

最近闲下来又开始继续折腾推荐系统了,声明一下,本文只是介绍一下最基础的基于内容的推荐系统(Content-based recommender system)的工作原理,其实基于内容的推荐系统也分三六九等Orz,这里只是简单的较少一下最原始的.最基本的工作流程. 基于内容的推荐算法思路很简单,它的原理大概分为3步: 1.为每个物品(Item)构建一个物品的属性资料(Item Profile) 2.为每个用户(User)构建一个用户的喜好资料(User Profile) 3.计算用户喜好资料与物品属

一个简单的基于Tornado二手房信息统计项目的开发实现

Purpose 最近因为要买房子,扫过了各种信息,貌似lianjia上的数据还是靠点谱的(最起码房源图片没有太大的出入),心血来潮想着做几个图表来显示下房屋的数据信息,顺便练练手. 需求分析 1从lianjia的网站上获取关键的房屋信息数据,然后按照自己的需求通过图表显示出来. 2每天从lianjia的网站上获取一次数据 3以上海地区为主(本人在上海) 4最终生成图表有:房屋交易总量,二手房均价,在售房源,近90天成交量,昨日带看次数 分析获取网站数据 1 数据源 数据的获取主要是从两个地方:

一个简单的基于用户的推荐系统

DataModel model=new FileDataModel(new File("intro.csv")); //.csv是逗号文件 UserSimilarity similarity=new PearsonCorrelationSimilarity(model); UserNeighborhood neighborhood=new nearestNUserNeighborhood(2,similarity,model); Recommender recommender=new

springMVC用法 以及一个简单的基于springMVC hibernate spring的配置

替代struts 1  web.xml中配置springmvc中央控制器 <?xml version="1.0" encoding="UTF-8"?> <web-app xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns="http://java.sun.com/xml/ns/javaee" xsi:schemaLocation="

一个简单的MySQL数据库同步脚本

Talk is cheap,show you code. 1 mysqldump -h[remoteHost] -u[username] -p[password] -P[port] --databases [databasename1] [databasename2] > [D:\mysqlsync\temp.sql] 2 echo "备份完成"; 3 mysql -u[root] -p[123456] -h[localhost] < [D:\mysqlsync\temp.