目前項目採用nginx+tomcat來作負載均衡,缺乏一個分佈式任務調度配置。任務調度在整個系統中是單點故障。爲了解決這個問題,研究了一下zookeeper和redis。你們一致的解決方案是用分佈式鎖。經過zookeeper或者redis來構建一個鎖實現。全部系統節點都能獲取到這個鎖的狀態,做爲一個共享鎖,爲系統調度提供分佈式部署。nginx
由於個人系統架構是spring架構。爲了減小代碼對系統的侵入,擴展spring的任務調度。將分佈式任務調度機制寫入自定義任務調度中。redis
<task:scheduled-tasks scheduler="zkScheduleManager"> <task:scheduled ref="taskObj" method="print" fixed-rate="5000"/> </task:scheduled-tasks>
zkScheduleManager繼承spring的 org.springframework.scheduling.concurrent.ThreadPoolTaskScheduler;
在各個調度方法中寫入分佈式任務調度機制。spring
代碼量比較大,下邊說一下思路,後續把代碼補上。tomcat
zookeeper維護server task兩個文件夾。server存放鏈接的節點,task存放註冊的任務服務器
爲了防止羊羣效應每一個服務器上維護一個EPHEMERAL_SEQUENTIAL類型節點。選取序列號最小的節點爲主節點。架構
task節點按照任務名稱/主節點id 形式註冊到zookeeper負載均衡
任務調度時利用反射機制構建任務,並獲取task節點中的主節點id與當前節點id比對,是當前服務器進行相關任務調度。
分佈式