Rumah  >  Artikel  >  Java  >  Menggunakan ZooKeeper untuk penyelarasan teragih dalam pembangunan API Java

Menggunakan ZooKeeper untuk penyelarasan teragih dalam pembangunan API Java

PHPz
PHPzasal
2023-06-17 22:37:441877semak imbas

Dengan peningkatan berterusan prestasi sistem komputer dan pengurangan berterusan kos perkakasan, sistem teragih menjadi semakin penting dalam bidang pengkomputeran moden. Seiring dengan ini, permintaan untuk pengkomputeran teragih terus berkembang, dan penyelarasan dan penyelesaian pengurusan untuk sistem teragih menjadi semakin penting.

Terdapat banyak penyelesaian untuk mencapai penyelarasan teragih, dan ZooKeeper ialah salah satu penyelesaian yang popular. ZooKeeper ialah salah satu sub-projek projek Apache Hadoop Ia menyediakan perkhidmatan penyelarasan teragih yang boleh dipercayai, memudahkan pembangun aplikasi untuk melaksanakan sistem teragih.

Menggunakan ZooKeeper untuk penyelarasan teragih dalam pembangunan Java API telah menjadi topik hangat Artikel ini akan meneroka beberapa konsep asas ZooKeeper dan memberikan contoh praktikal untuk menggambarkan cara menggunakan ZooKeeper untuk penyelarasan teragih di Java.

Pengenalan kepada ZooKeeper

ZooKeeper ialah perkhidmatan teragih yang direka untuk menyelaraskan aplikasi yang diedarkan. Matlamat utama ZooKeeper adalah untuk menyediakan pemaju perkhidmatan penyelarasan yang agak mudah supaya mereka boleh memberi tumpuan kepada menulis aplikasi.

ZooKeeper mempunyai ciri-ciri berikut:

  • ZooKeeper ialah perkhidmatan teragih yang boleh digunakan melalui berbilang nod untuk menyediakan ketersediaan yang tinggi.
  • ZooKeeper direka bentuk sebagai seni bina dengan satu nod induk dan berbilang nod hamba. Dalam struktur ini, nod induk bertanggungjawab untuk menyelaras dan mengurus nod hamba dan memastikan data disimpan dengan selamat.
  • ZooKeeper menjejaki status dan perubahan nod dengan menggunakan "ZooKeeper Temporary Ordered Nodes". Nod ini ialah jenis nod khas yang mewujudkan sambungan sekali antara penciptanya dan perkhidmatan ZooKeeper. Jika sambungan terputus, nod akan dipadamkan, sekali gus memastikan status nod dikemas kini tepat pada masanya.
  • ZooKeeper boleh menguruskan ketekalan dan integriti data dengan menggunakan fungsi kawalan versi. Apabila menggunakan kawalan versi, ZooKeeper akan menambah nombor versi setiap nod.

Operasi asas ZooKeeper

Apabila menggunakan ZooKeeper untuk penyelarasan teragih, operasi yang paling biasa digunakan ialah mencipta nod, membaca nod dan memantau status nod.

Buat Nod

Untuk mencipta nod, anda perlu menyediakan laluan nod dan data nod Nod akan ditambahkan pada perkhidmatan ZooKeeper sebagai subdirektori. Jika nod yang dibuat ialah nod fana, ia hanya boleh diakses selagi sambungan antara klien yang menciptanya dan perkhidmatan ZooKeeper adalah sah.

Berikut ialah contoh kod untuk mencipta nod menggunakan API ZooKeeper:

ZooKeeper zk = new ZooKeeper("localhost:2181", 3000, null);
String nodePath = "/testNode";
byte[] data = "nodeData".getBytes();
CreateMode createMode = CreateMode.EPHEMERAL;
zk.create(nodePath, data, ZooDefs.Ids.OPEN_ACL_UNSAFE, createMode);

Membaca Nod

Anda boleh membaca dan mendapatkan kandungan nod dengan menggunakan ZooKeeper API. Berikut ialah kod sampel untuk membaca nod menggunakan API Java:

ZooKeeper zk = new ZooKeeper("localhost:2181", 3000, null);
String nodePath = "/testNode";
byte[] data = zk.getData(nodePath, false, null);

Nod Pemantauan

Memantau nod membolehkan pelanggan dimaklumkan tentang perubahan nod, membenarkan klien mengemas kini nod status. Berikut ialah contoh kod untuk memantau nod menggunakan API ZooKeeper:

ZooKeeper zk = new ZooKeeper("localhost:2181", 3000, null);
String nodePath = "/testNode";
Watcher watcher = new Watcher() {
   public void process(WatchedEvent event) {
      // do something
   }
};
byte[] data = zk.getData(nodePath, watcher, null);

Contoh koordinasi teragih menggunakan ZooKeeper

Dalam contoh berikut, kami akan melaksanakan aplikasi teragih mudah menggunakan ZooKeeper API , aplikasi akan melaksanakan protokol pemilihan pemimpin yang mudah di mana pelbagai proses akan bersaing untuk menjadi pemimpin. Dalam kes ini, kami akan menggunakan nod fana ZooKeeper untuk melaksanakan fungsi pemilihan pemimpin.

Berikut ialah contoh kod:

import java.util.List;
import org.apache.zookeeper.CreateMode;
import org.apache.zookeeper.KeeperException;
import org.apache.zookeeper.WatchedEvent;
import org.apache.zookeeper.Watcher;
import org.apache.zookeeper.ZooDefs;
import org.apache.zookeeper.ZooKeeper;
import org.apache.zookeeper.KeeperException.NodeExistsException;
import org.apache.zookeeper.data.Stat;
 
public class LeaderElection implements Watcher {
    
   String znode = "/leader_election";    

   ZooKeeper zk;
   String serverId = Integer.toHexString((int)(Math.random() * 1000000));
    
   boolean isLeader = false;
    
   public void start() throws Exception{
       
      String serverPath = znode + "/" + serverId;
 
      zk = new ZooKeeper("localhost:2181", 3000, this); 

      while(zk.getState() == ZooKeeper.States.CONNECTING){
         
         Thread.sleep(500); 

      }
       
      while(true){
          
        try{
        
            // create the node with EPHEMERAL and SEQUENTIAL flags
            
            zk.create(serverPath, null, ZooDefs.Ids.OPEN_ACL_UNSAFE,
              CreateMode.EPHEMERAL);
          
            isLeader = true; 

            doLeaderAction();
            break;

         } catch (NodeExistsException e){
                
            isLeader = false;
            break; 

         } catch (InterruptedException e) {
             
             throw e;
             
         } catch (Exception e) {
             
             throw new RuntimeException(e); 
             
         }
      }
   }
    
   public void stop() throws Exception{
       
      zk.close(); 
       
   }
   
   void doLeaderAction() throws Exception {
       
      System.out.println("Becoming leader: " + serverId);
       
      try {            
               
         Thread.sleep(6000);
               
      } catch (InterruptedException e) {

         System.err.println("Interrupted while " +
               "sleeping during leadership.");
         
         Thread.currentThread().interrupt();
      } finally {

         try {               
            System.out.println("Ending leader: " + serverId);
         } catch (Exception e) {
            System.err.println("Error ending leadership."); 
         }
      }
   }
    
   public void process(WatchedEvent e){
       
      System.out.println(e.toString() + ", " + serverId);
      try {
        electLeader();
      } catch (Exception ex) {
        ex.printStackTrace();
      }   
   }
    
   void electLeader() throws Exception {
       
      Stat predecessorStat = null;
      String predecessor = null;
      
      List<String> children = zk.getChildren(znode, false); //(watcher not needed for this operation)
      
      int currentId = Integer.parseInt(serverId, 16); 
       
      for(String child : children){
          
        int childId = Integer.parseInt(child, 16);
        
        if(childId < currentId) {
            
            if(predecessorStat == null){
                
                predecessor = child; 
                predecessorStat = zk.exists(znode + "/" + child, true); 

            } else {
                
                Stat stat = zk.exists(znode + "/" + child, true);
              
                if(stat.getMzxid() < predecessorStat.getMzxid()){
                    
                    predecessor = child; 
                    predecessorStat = stat; 
                }               
            }
        }

      }
       
      if(predecessor == null){
           
        System.out.println("No active group members, " + serverId + " as leader.");
        //...provisional leader code here
           
      } else{ // watch the predecessor node waiting for it to go
                // ...down or to receive a message that it is was elected leader too.        
        System.out.println("Watching group member with higher ID: " + predecessor);
      }         
   }
   
   public static void main(String[] args) throws Exception {
          
      LeaderElection election = new LeaderElection();
      
      election.start();
       
   }
}

Dalam contoh kod di atas, kami mula-mula mencipta subdirektori znod yang memegang status penyertaan semua proses yang mengambil bahagian dalam pemilihan pemimpin. Seterusnya, kami mencipta nod ZooKeeper yang dipesan sementara yang mewakili pelakon tertentu. Seperti yang dinyatakan sebelum ini, ZooKeeper mewujudkan sambungan sekali antara pelanggan dan nilai Zk. Selepas kami mencipta nod sementara ini, jika sambungan klien hilang, nod akan dipadamkan. Oleh itu, jika proses mendapati bahawa nod dengan nama nod yang sama sudah wujud semasa menubuhkan nod, proses itu tidak akan menjadi ketua.

Jika klien berjaya mencipta nod sementara, klien akan menjadi ketua. Di sini kita boleh memanggil kaedah doLeaderAction() yang mewakili tindakan yang akan dilakukan oleh pemimpin. Dalam contoh ini, ketua akan melakukan operasi mudah 6 saat.

Jika sambungan pelanggan telah hilang atau sebarang ralat berlaku, proses itu mengesahkan nod di bawah direktori sedia ada untuk menentukan yang mana satu menjadi ketua baharu.

Kesimpulan

Penyelarasan dan pengurusan teragih ialah salah satu isu terpenting dalam bidang pengkomputeran moden, dan aplikasi sistem teragih menjadi semakin popular. ZooKeeper ialah penyelesaian popular yang memudahkan pembangun melaksanakan sistem teragih. Dalam pembangunan API Java, operasi utama menggunakan ZooKeeper untuk penyelarasan teragih termasuk mencipta nod, membaca nod dan memantau status nod. Melalui kod sampel dalam artikel ini, anda boleh melihat cara menggunakan ZooKeeper untuk melaksanakan protokol pemilihan pemimpin dan skim penyelarasan teragih lain di Jawa.

Atas ialah kandungan terperinci Menggunakan ZooKeeper untuk penyelarasan teragih dalam pembangunan API Java. Untuk maklumat lanjut, sila ikut artikel berkaitan lain di laman web China PHP!

Kenyataan:
Kandungan artikel ini disumbangkan secara sukarela oleh netizen, dan hak cipta adalah milik pengarang asal. Laman web ini tidak memikul tanggungjawab undang-undang yang sepadan. Jika anda menemui sebarang kandungan yang disyaki plagiarisme atau pelanggaran, sila hubungi admin@php.cn