ZooKeeper分散式任務排程中心

百聯達發表於2017-04-25
一: 背景

軟體系統中,定時任務往往不可或缺,大家可能會採用Spring quartz 建立定時任務模組。 當任務模組進行了分散式部署,通常會出現定時任務重複執行的情況。 怎麼避免這種情況呢,是否可以構建一個任務註冊中心,Quartz負責註冊任務,但不具體執行任務內的業務邏輯。

任務註冊中心解決任務重複註冊的問題,同時將任務分配給若干處理器進行具體的業務處理,保證在同一個時間內,一個任務只會被一個處理器進行處理。如下圖



二:任務註冊中心與排程中心

採用ZooKeeper的客戶端框架Curator,  利用ZooKeeper的Master選舉機制實現。 註冊任務就相當於在ZooKeeper中建立或更新一個節點。通過更新節點的內容,來記錄任務的執行狀態。

三:程式碼模擬


點選(此處)摺疊或開啟

  1. public class ZookeeperDemo5 {

  2.     private static String PATH = "/zkbk2";
  3.     private static String FINISH_FLAG="finish";

  4.     private static CuratorFramework client = CuratorFrameworkFactory.builder()
  5.             .connectString("10.243.3.18:2181,10.243.3.17:2181,10.243.3.27:2181").sessionTimeoutMs(5000)
  6.             .retryPolicy(new ExponentialBackoffRetry(100, 3)).build();

  7.     public static void main(String[] args) throws Exception {
  8.         client.start();
  9.         PathChildrenCache cache = new PathChildrenCache(client, PATH, true);
  10.         cache.start(StartMode.POST_INITIALIZED_EVENT);

  11.         cache.getListenable().addListener(new PathChildrenCacheListener() {

  12.             @Override
  13.             public void childEvent(CuratorFramework client, PathChildrenCacheEvent event) {
  14.                 switch (event.getType()) {
  15.                     case CHILD_ADDED:
  16.                         System.out.println("CHILD_ADDED," + event.getData().getPath());
  17.                         deal(event);
  18.                         break;
  19.                     case CHILD_UPDATED:
  20.                         System.out.println("CHILD_UPDATED," + event.getData().getPath());
  21.                         deal(event);
  22.                         break;
  23.                     case CHILD_REMOVED:
  24.                         System.out.println("CHILD_REMOVED," + event.getData().getPath());
  25.                         break;
  26.                     default:
  27.                         break;
  28.                 }
  29.             }
  30.         });

  31.        Thread.sleep(Integer.MAX_VALUE);
  32.     }
  33.     
  34.     
  35.     
  36.     
  37.     private static void deal( PathChildrenCacheEvent event)
  38.     {
  39.         final LeaderLatch latch = new LeaderLatch(client, event.getData().getPath());

  40.         latch.addListener(new LeaderLatchListener() {

  41.             @Override
  42.             public void notLeader() {
  43.             }

  44.             @Override
  45.             public void isLeader() {
  46.                 try {
  47.                     System.out.println("======begin deal==========" + event.getData().getPath());

  48.                     String data = new String(client.getData().forPath(event.getData().getPath()));
  49.                    

  50.                     if (!data.contains("finish")) {
  51.                         Thread.sleep(10000L);
  52.                         System.out.println("");
  53.                         System.out.println("");
  54.                         System.out.println("**************************************");
  55.                         System.out.println("**************************************");
  56.                         System.out.println("**************************************");
  57.                         System.out.println("**************************************");
  58.                         System.out.println("");
  59.                         System.out.println("");
  60.                         client.setData().forPath(event.getData().getPath(), FINISH_FLAG.getBytes());
  61.                     }
  62.                     System.out.println("======finish deal==========" + event.getData().getPath());
  63.                     latch.close();
  64.                 }
  65.                 catch (Exception e) {
  66.                     e.printStackTrace();
  67.                 }
  68.             }
  69.         });
  70.         try {
  71.             latch.start();
  72.         }
  73.         catch (Exception e) {
  74.             e.printStackTrace();
  75.         }
  76.     }
  77. }


來自 “ ITPUB部落格 ” ,連結:http://blog.itpub.net/28624388/viewspace-2137933/,如需轉載,請註明出處,否則將追究法律責任。

相關文章