quartz(6)--集群
?Quartz應用能被集群,是水平集群還是垂直集群取決于你自己的需要。集群提供以下好處:
· 伸縮性
· 高可用性
· 負載均衡
目前,Quartz只能借助關系數據庫和JDBC作業存儲支持集群。
quartz集群架構
?
?
quartz的分布式架構如上圖,可以看到數據庫是各節點上調度器的樞紐.各個節點并不感知其他節點的存在,只是通過數據庫來進行間接的溝通。
實際上,quartz的分布式策略就是一種以數據庫作為邊界資源的并發策略.每個節點都遵守相同的操作規范,使得對數據庫的操作可以串行執行.而不同名稱的調度器又可以互不影響的并行運行。
集群配置
通過設置"org.quartz.jobStore.isClustered"屬性為"true"來激活集群特性。
在集群中的每一個實例都必須有一 個唯一的"instance id" ("org.quartz.scheduler.instanceId" 屬性), 但是應該有相同的"scheduler instance name" ("org.quartz.scheduler.instanceName"),也就是說集群中的每一個實例都必須使用相同的 quartz.properties 配置文件。
鎖機制
quartz通過數據庫鎖機制來實現集群,QRTZ_LOCKS就是Quartz集群實現同步機制的行鎖表
表結構
?
表記錄
關于行鎖的機制:
1、mysql >? SET autocommit=0;??? //先把mysql設置為不自動提交。
2、SELECT * FROM es_locks WHERE lock_name = 'TRIGGER_ACCESS' FOR UPDATE ;???? //線程一通過FOR UPDATE 可以把這行鎖住
3、SELECT * FROM es_locks WHERE lock_name = 'TRIGGER_ACCESS' FOR UPDATE ;???? //線程二通過FOR UPDATE 無法獲得鎖,線程等待。
4、COMMIT;??????? //線程一通過COMMIT 釋放鎖
5、 //線程二可以訪問到數據,線程不再等待。
所以,通過這個機制,一次只能有一個線程來操作 加鎖 -? 操作 - 釋放鎖。? 如果 操作 的時間過長的話,會帶來集群間的主線程等待。
數據庫行鎖是一種悲觀鎖,鎖表時其它線程無法查詢。
CALENDAR_ACCESS
JOB_ACCESS
MISFIRE_ACCESS
STATE_ACCESS
TRIGGER_ACCESS
QRTZ_LOCKS中有5條記錄,代表5把鎖,分別用于實現多個Quartz Node對Job、TRIGGER、Calendar訪問的同步控制。目前代碼中行鎖只用到了STATE_ACCESS 和TRIGGER_ACCESS 這兩種。
?
轉載于:https://www.cnblogs.com/qin-derella/p/6530661.html
總結
以上是生活随笔為你收集整理的quartz(6)--集群的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 基于Asp.Net Core Mvc和E
- 下一篇: 修改IIS7并发连接数目限制