1. 程式人生 > >關於多臺伺服器負載均衡時,只執行一個定時器的設計

關於多臺伺服器負載均衡時,只執行一個定時器的設計


http://blog.sina.com.cn/s/blog_61d8d9640101ajmz.html
最近公司的專案要在電信上線,遇到了一個問題:我們的應用部署在一臺伺服器上,但做了負載均衡。這樣就會有一個問題:我們的工程裡面本來就有兩個定時器會在指定的時間間隔內,執行相關程式,但負載均衡後的結果卻是:有可能會出現,在A服務機上的應用在跑定時器時,B也會同時跑定時器,這樣就很容易造成資料庫表的死鎖或者產生髒資料。這就是所謂的定時器雙機處理。為了實現在這種情況下,始終只有一個定時器在跑,專案組做了這樣的一個設計,個人感覺這個設計比較完美,就把它的一個大概思路在這裡記一下:    首先,我們先在資料庫建一個表:timerT,表裡面有三個欄位:status(表當前定時器是否處於可執行狀態)、timestamp(時間戳)、serverIP(正在執行定時器的伺服器IP)。    這裡其具體的用法是:當兩臺伺服器,都執行起來後,伺服器A開始執行定時器,這時,A會去讀取表timerT的status欄位,當為0時,則執行定時器的業務邏輯,此時A定時器,需要把status改為1,以便讓另一臺伺服器的定時器B不去執行業務邏輯並把當前伺服器的IP記錄到表中,同時修改啟動一個新的執行緒,在XXX長的時間間隔內不斷去修改timestamp的值,當A執行完業務邏輯時,就把status的值改為0,這樣B定時器就可以執行。這樣做可以解決一個問題,就是:當其中一個定時器A掛掉後,我們另一個定時器B,可以比對timestap的值與當前時間是否超過XXX時長,如果超過,則證明定時器A已經掛掉,這時B就會把status的值改成1,把serverIP改成B定時器所在的伺服器IP,並執行業務邏輯。