2015-01-18 6 views
10

मैं जुकीपर पर नेतृत्व चुनाव करने के लिए अपाचे क्यूरेटर लाइब्रेरी का उपयोग कर रहा हूं। मेरे पास विभिन्न मशीनों में अपना आवेदन कोड तैनात किया गया है और मुझे केवल एक मशीन से अपना कोड निष्पादित करने की आवश्यकता है, इसलिए मैं ज़ूकीपर पर नेतृत्व चुनाव कर रहा हूं ताकि मैं जांच सकूं कि मैं नेता हूं या नहीं, फिर इस कोड को निष्पादित करें। , मैं उपयोग कर रहा हूँज़ूकीपर के लिए क्यूरेटर का उपयोग करके लीडर चयन नुस्खा का कुशलतापूर्वक उपयोग कैसे करें?

// can this class be improved in any ways? 
public class ZookeeperClient { 

    private CuratorFramework client; 
    private String latchPath; 
    private String id; 
    private LeaderLatch leaderLatch; 

    public ZookeeperClient(String connString, String latchPath, String id) { 
     client = CuratorFrameworkFactory.newClient(connString, new ExponentialBackoffRetry(1000, Integer.MAX_VALUE)); 
     this.id = id; 
     this.latchPath = latchPath; 
    } 

    public void start() throws Exception { 
     client.start(); 
     leaderLatch = new LeaderLatch(client, latchPath, id); 
     leaderLatch.start(); 
    } 

    public boolean isLeader() { 
     return leaderLatch.hasLeadership(); 
    } 

    public Participant currentLeader() throws Exception { 
     return leaderLatch.getLeader(); 
    } 

    public void close() throws IOException { 
     leaderLatch.close(); 
     client.close(); 
    } 

    public CuratorFramework getClient() { 
     return client; 
    } 

    public String getLatchPath() { 
     return latchPath; 
    } 

    public String getId() { 
     return id; 
    } 

    public LeaderLatch getLeaderLatch() { 
     return leaderLatch; 
    } 
} 
अब अपने आवेदन में

-

नीचे मेरी LeaderElectionExecutor वर्ग जो यकीन है कि मैं आवेदन प्रति एक क्यूरेटर उदाहरण हो रहा है

public class LeaderElectionExecutor { 

    private ZookeeperClient zookClient; 

    private static final String LEADER_NODE = "/testleader"; 

    private static class Holder { 
     static final LeaderElectionExecutor INSTANCE = new LeaderElectionExecutor(); 
    } 

    public static LeaderElectionExecutor getInstance() { 
     return Holder.INSTANCE; 
    } 

    private LeaderElectionExecutor() { 
     try { 
      String hostname = Utils.getHostName(); 

      String nodes = "host1:2181,host2:2181; 

      zookClient = new ZookeeperClient(nodes, LEADER_NODE, hostname); 
      zookClient.start(); 

      // added sleep specifically for the leader to get selected 
      // since I cannot call isLeader method immediately after starting the latch 
      TimeUnit.MINUTES.sleep(1); 
     } catch (Exception ex) { 
      // logging error 
      System.exit(1); 
     } 
    } 

    public ZookeeperClient getZookClient() { 
     return zookClient; 
    } 
} 

और नीचे मेरी ZookeeperClient कोड है बनाता है इस तरह कोड -

public void method01() { 
    ZookeeperClient zookClient = LeaderElectionExecutor.getInstance().getZookClient(); 
    if (zookClient.isLeader()) { 
     // do something 
    } 
} 

public void method02() { 
    ZookeeperClient zookClient = LeaderElectionExecutor.getInstance().getZookClient(); 
    if (zookClient.isLeader()) { 
     // do something 
    } 
} 

समस्या वक्तव्य: -

क्यूरेटर पुस्तकालय में - कुंडी काम नहीं करेगा शुरू करने के बाद तुरंत isLeader() कॉलिंग। नेता को चुनने में समय लगता है। और इस कारण से, मैंने अपने LeaderElectionExecutor कोड में 1 मिनट की नींद जोड़ दी है जो ठीक काम करता है लेकिन मुझे लगता है कि ऐसा करने का सही तरीका नहीं है।

क्या ऐसा करने का कोई बेहतर तरीका है? इसे ध्यान में रखते हुए, मुझे यह जांचने का एक तरीका चाहिए कि मैं नेता हूं या नहीं, फिर कोड के इस टुकड़े को निष्पादित करें। मैं एक ही विधि में सब कुछ नहीं कर सकता, इसलिए मुझे अलग-अलग वर्गों और विधियों से isLeader विधि को कॉल करने की आवश्यकता है ताकि यह जांच सके कि मैं नेता हूं या नहीं, फिर केवल कोड के इस टुकड़े को निष्पादित करें।

मैं जुकीपर 3.4.5 और क्यूरेटर 1.7.1 संस्करण का उपयोग कर रहा हूं।

उत्तर

-1

मैंने ज़ूकीपर या क्यूरेटर के साथ पहले काम नहीं किया है, इसलिए नमक के अनाज के साथ मेरा जवाब लें।

ध्वज सेट करें।

बूलियन isLeaderSelected = false;

लच की शुरुआत में, ध्वज को झूठी पर सेट करें। जब नेता का चयन किया गया है, तो ध्वज को सही पर सेट करें।

isLeader() फ़ंक्शन में:

isLeader(){ 
while(!isLeaderSelected){} //waits until leader is selected 

//do the rest of the function 
} 

यह भी एक अपेक्षाकृत hacky समाधान नहीं है, लेकिन यह isLeader विधि जैसे ही यह कर सकते हैं निष्पादित करने के लिए अनुमति चाहिए। यदि वे अलग-अलग वर्गों में हैं, तो एक गेटर को लेडर से चुनने में सक्षम होना चाहिए।

1

एक बार जब मैंने आपकी समस्या को हल किया। मैंने इस तरह से इसे किया।

सबसे पहले, मैंने अपनी वस्तुओं को वसंत द्वारा प्रबंधित किया था। तो, मेरे पास एक लीडरलैच था जो कंटेनर के माध्यम से इंजेक्शन योग्य था। LeaderLatch का उपयोग करने वाले घटकों में से एक LeadershipWatcher था, जो रननेबल इंटरफ़ेस का कार्यान्वयन था जो नेतृत्व घटकों को अन्य घटकों को प्रेषित करेगा। ये अंतिम घटक एक इंटरफ़ेस के कार्यान्वयन थे जिन्हें मैंने LeadershipObserver नाम दिया था।

@Component 
public class LeadershipWatcher implements Runnable { 
    private final LeaderLatch leaderLatch; 
    private final Collection<LeadershipObserver> leadershipObservers; 

    /* constructor with @Inject */ 

    @Override 
    public void run() { 
    try { 
     leaderLatch.await(); 

     for (LeadershipObserver observer : leadershipObservers) { 
     observer.granted(); 
     } 
    } catch (InterruptedException e) { 
     for (LeadershipObserver observer : leadershipObservers) { 
     observer.interrupted(); 
     } 
    } 
    } 
} 

इस के रूप में, सिर्फ एक संक्षिप्त वर्णन-अप है मैं शायद पर्यवेक्षकों बुला, या यहाँ तक प्रस्तुत करने के लिए आदेश पैटर्न को लागू करने, तो आप इस कोड को बढ़ाने के लिए सलाह देते हैं: LeadershipWatcher के कार्यान्वयन ज्यादातर निम्न कोड की तरह था थ्रेड पूल के पर्यवेक्षक, यदि उनका काम अवरुद्ध हो रहा है या लंबे समय से चल रहे CPU गहन कार्य हैं।

0
leaderLatch = new LeaderLatch(curatorClient, zkPath, String.valueOf(new Random().nextInt())); 
leaderLatch.start(); 
Participant participant; 
while(true) { 
    participant = leaderLatch.getLeader(); 
    // Leader election happens asynchronously after calling start, this is a hack to wait until election happens 
    if (!(participant.getId().isEmpty() || participant.getId().equalsIgnoreCase(""))) { 
    break; 
    } 
} 
if(leaderLatch.hasLeadership()) { 
... 
} 

ध्यान दें कि getLeader आईडी के साथ एक डमी प्रतिभागी लौटाता है जब तक यह एक नेता का चयन नहीं करता है।

0
यहाँ

एक पुराने सवाल को पुनर्जीवित करने के लिए है ...

इस उत्तर SRAV दिया के समान है, लेकिन मुझे लगता है, क्योंकि यह एक का इस्तेमाल करता है कि कोड का उपयोग कर व्यस्त प्रतीक्षा करें और कुछ कॉलबैक कि में जारी किए जाते हैं पैदा कर सकता है के खिलाफ चेतावनी देते हैं संभवतः हमेशा के लिए अवरुद्ध, कभी नहीं कहा जा सकता है। इसके अलावा, यदि वास्तविक मुद्दे हैं तो यह हमेशा के लिए पुनः प्रयास कर सकता है।

यह मेरा समाधान था, जो आवश्यक होने पर नेतृत्व चुनाव की प्रतीक्षा करने के लिए क्यूरेटर क्लाइंट की पुनः प्रयास नीति का उपयोग करता है।

RetryPolicy retryPolicy = _client.getZookeeperClient().getRetryPolicy(); 
    RetrySleeper awaitLeadership = _leaderLatch::await; 

    final long start = System.currentTimeMillis(); 
    int count = 0; 

    do { 
     try { 
      // curator will return a dummy leader in the case when a leader has 
      // not yet actually been elected. This dummy leader will have isLeader 
      // set to false, so we need to check that we got a true leader 
      if (_leaderLatch.getLeader().isLeader()) { 
       return; 
      } 
     } catch (KeeperException.NoNodeException e) { 
      // this is the case when the leader node has not yet been created 
      // by any client - this is fine because we are still waiting for 
      // the algorithm to start up so we ignore the error 
     } 
    } while (retryPolicy.allowRetry(count++, System.currentTimeMillis() - start, awaitLeadership)); 

    // we have exhausted the retry policy and still have not elected a leader 
    throw new IOException("No leader was elected within the specified retry policy!"); 

हालांकि अपने CuratorFramework प्रारंभ पर एक नज़र मैं Integer.MAX_VALUE उपयोग करने के खिलाफ चेतावनी देते हैं चाहते हैं जब फिर से प्रयास करें नीति को निर्दिष्ट लेने ...

मुझे आशा है कि इस मदद करता है!

संबंधित मुद्दे