您好,登錄后才能下訂單哦!
怎么分析ZooKeeper分布式任務調度中心,相信很多沒有經驗的人對此束手無策,為此本文總結了問題出現的原因和解決方法,通過這篇文章希望你能解決這個問題。
一: 背景
軟件系統中,定時任務往往不可或缺,大家可能會采用Spring quartz 建立定時任務模塊。 當任務模塊進行了分布式部署,通常會出現定時任務重復執行的情況。 怎么避免這種情況呢,是否可以構建一個任務注冊中心,Quartz負責注冊任務,但不具體執行任務內的業務邏輯。
任務注冊中心解決任務重復注冊的問題,同時將任務分配給若干處理器進行具體的業務處理,保證在同一個時間內,一個任務只會被一個處理器進行處理。如下圖
二:任務注冊中心與調度中心
采用ZooKeeper的客戶端框架Curator, 利用ZooKeeper的Master選舉機制實現。 注冊任務就相當于在ZooKeeper中創建或更新一個節點。通過更新節點的內容,來記錄任務的執行狀態。
三:代碼模擬
public class ZookeeperDemo5 {
private static String PATH = "/zkbk2";
private static String FINISH_FLAG="finish";
private static CuratorFramework client = CuratorFrameworkFactory.builder()
.connectString("10.243.3.18:2181,10.243.3.17:2181,10.243.3.27:2181").sessionTimeoutMs(5000)
.retryPolicy(new ExponentialBackoffRetry(100, 3)).build();
public static void main(String[] args) throws Exception {
client.start();
PathChildrenCache cache = new PathChildrenCache(client, PATH, true);
cache.start(StartMode.POST_INITIALIZED_EVENT);
cache.getListenable().addListener(new PathChildrenCacheListener() {
@Override
public void childEvent(CuratorFramework client, PathChildrenCacheEvent event) {
switch (event.getType()) {
case CHILD_ADDED:
System.out.println("CHILD_ADDED," + event.getData().getPath());
deal(event);
break;
case CHILD_UPDATED:
System.out.println("CHILD_UPDATED," + event.getData().getPath());
deal(event);
break;
case CHILD_REMOVED:
System.out.println("CHILD_REMOVED," + event.getData().getPath());
break;
default:
break;
}
}
});
Thread.sleep(Integer.MAX_VALUE);
}
private static void deal( PathChildrenCacheEvent event)
{
final LeaderLatch latch = new LeaderLatch(client, event.getData().getPath());
latch.addListener(new LeaderLatchListener() {
@Override
public void notLeader() {
}
@Override
public void isLeader() {
try {
System.out.println("======begin deal==========" + event.getData().getPath());
String data = new String(client.getData().forPath(event.getData().getPath()));
if (!data.contains("finish")) {
Thread.sleep(10000L);
System.out.println("");
System.out.println("");
System.out.println("**************************************");
System.out.println("**************************************");
System.out.println("**************************************");
System.out.println("**************************************");
System.out.println("");
System.out.println("");
client.setData().forPath(event.getData().getPath(), FINISH_FLAG.getBytes());
}
System.out.println("======finish deal==========" + event.getData().getPath());
latch.close();
}
catch (Exception e) {
e.printStackTrace();
}
}
});
try {
latch.start();
}
catch (Exception e) {
e.printStackTrace();
}
}
}
看完上述內容,你們掌握怎么分析ZooKeeper分布式任務調度中心的方法了嗎?如果還想學到更多技能或想了解更多相關內容,歡迎關注億速云行業資訊頻道,感謝各位的閱讀!
免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。