乙個簡單的基於資料庫實現的多機任務搶占排程

2022-08-24 09:51:14 字數 934 閱讀 1421

一般的協調工作,讓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、借鑑了資料庫併發處理的特徵,就是那個版本號,這個非常重要。

實現乙個簡單的資料庫

所有應用軟體之中,資料庫可能是最複雜的。mysql的手冊有3000多頁,postgresql的手冊有2000多頁,oracle的手冊更是比它們相加還要厚。但是,自己寫乙個最簡單的資料庫,做起來並不難。reddit上面有乙個帖子,只用了幾百個字,就把原理講清楚了。下面是我根據這個帖子整理的內容。第一步...

自己實現乙個最簡單的資料庫

所有應用軟體之中,資料庫可能是最複雜的。mysql的手冊有3000多頁,postgresql的手冊有2000多頁,oracle的手冊更是比它們相加還要厚。但是,自己寫乙個最簡單的資料庫,做起來並不難。reddit上面有乙個帖子,只用了幾百個字,就把原理講清楚了。下面是我根據這個帖子整理的內容。第一步...

SpringBoot基於資料庫實現簡單的分布式鎖

分布式鎖的方式有很多種,通常方案有 資料庫表是由jpa自動生成的,實體如下 entity table name lock uniqueconstraints name tag uidx public class lock repository層只新增了兩個簡單的方法,根據tag刪除鎖和更新鎖 鎖過期...