Rumah  >  Artikel  >  Java  >  Menggunakan ZooKeeper untuk pemprosesan kunci teragih dalam pembangunan API Java

Menggunakan ZooKeeper untuk pemprosesan kunci teragih dalam pembangunan API Java

王林
王林asal
2023-06-17 22:36:09894semak imbas

Memandangkan aplikasi moden terus berkembang dan keperluan untuk ketersediaan tinggi serta keselarasan berkembang, seni bina sistem teragih menjadi semakin biasa. Dalam sistem teragih, berbilang proses atau nod berjalan pada masa yang sama dan menyelesaikan tugas bersama-sama, dan penyegerakan antara proses menjadi sangat penting. Memandangkan banyak nod dalam persekitaran teragih boleh mengakses sumber yang dikongsi pada masa yang sama, cara menangani isu konkurensi dan penyegerakan telah menjadi tugas penting dalam sistem teragih. Dalam hal ini, ZooKeeper telah menjadi penyelesaian yang sangat popular.

ZooKeeper ialah perkhidmatan penyelarasan aplikasi teragih sumber terbuka yang boleh menyediakan beberapa perkhidmatan asas yang dikongsi, seperti penyelenggaraan konfigurasi, perkhidmatan penamaan, perkhidmatan penyegerakan, kunci teragih dan perkhidmatan kumpulan, dsb. Dalam artikel ini, kami akan membincangkan cara menggunakan ZooKeeper untuk melaksanakan pengendalian kunci teragih dalam pembangunan API Java.

Mekanisme kunci ZooKeeper
Idea utama untuk melaksanakan mekanisme kunci dalam ZooKeeper ialah menggunakan status nod. Dalam ZooKeeper, setiap nod mempunyai tiga keadaan: Dibuat, Wujud dan Dipadamkan. Kita boleh menggunakan keadaan ini untuk melaksanakan kunci teragih.

Apabila berbilang proses cuba memperoleh kunci pada masa yang sama, hanya satu proses boleh berjaya mencipta nod ZooKeeper. Proses lain akan melihat bahawa nod sudah wujud dan menunggu untuk dialih keluar. Setelah proses memegang kunci telah menyelesaikan kerjanya dan melepaskan kunci, nod yang sepadan akan dipadamkan. Pada ketika ini, proses menunggu kunci akan mempunyai peluang untuk berjaya mencipta nod dan memperoleh kunci.

Gunakan ZooKeeper untuk melaksanakan kunci dalam Java
Sangat mudah untuk menggunakan ZooKeeper untuk melaksanakan kunci yang diedarkan di Java. Berikut ialah langkah untuk melaksanakan kunci teragih menggunakan ZooKeeper dalam API Java:

  1. Buat sambungan pelanggan ZooKeeper. Sambungan ZooKeeper boleh dilaksanakan melalui kelas ZooKeeper.
  2. Buat nod ZooKeeper yang mewakili kunci teragih. Ini boleh dilakukan melalui kaedah create().
  3. Apabila proses perlu mendapatkan kunci, panggil kaedah create() dan lulus nama nod dan parameter jenis nod. Parameter jenis nod perlu ditetapkan kepada EPHEMERAL (ephemeral) dan SEQUENTIAL (sequential). Ini bermakna nod ZooKeeper akan ditandakan dengan pembilang, jadi setiap proses boleh mencipta nod unik.
  4. Dapatkan senarai semua nod kunci yang dibuat, kemudian isikannya mengikut nombor siri nod. Anda boleh mendapatkan senarai nod menggunakan kaedah getChildren().
  5. Semak sama ada proses semasa memiliki kunci yang diedarkan. Jika nod semasa ialah nod pertama, ia mempunyai kunci teragih.
  6. Jika proses tidak memiliki kunci yang diedarkan, tunggu sehingga kunci dilepaskan. Anda boleh melakukan ini menggunakan kaedah exists() dan getData().
  7. Selepas proses menyelesaikan tugasan yang diperlukan, lepaskan kunci. Ini boleh dilakukan dengan memadamkan nod, menggunakan kaedah delete().

Berikut ialah contoh kod Java ringkas yang menunjukkan cara melaksanakan pengendalian kunci teragih menggunakan ZooKeeper:

public class ZooKeeperLock {
    
    private final ZooKeeper zooKeeper;
    private final String nodePath;
    private String myNode;
    
    public ZooKeeperLock() {
        try {
            zooKeeper = new ZooKeeper("localhost:2181", 5000, null);
            nodePath = "/lock";
        } catch (Exception e) {
            throw new RuntimeException(e);
        }
    }
    
    public void lock() {
        while (true) {
            try {
                myNode = zooKeeper.create(nodePath + "/lock_", new byte[0], 
                        ZooDefs.Ids.OPEN_ACL_UNSAFE, CreateMode.EPHEMERAL_SEQUENTIAL);
                
                List<String> children = zooKeeper.getChildren(nodePath, false);
                Collections.sort(children);
                
                if (myNode.equals(nodePath + "/" + children.get(0))) {
                    return;
                }
                
                String myNodeSuffix = myNode.substring(myNode.lastIndexOf("/") + 1);
                String prevNodeSuffix = children.get(Collections.binarySearch(children, 
                        myNodeSuffix) - 1);
                String prevNode = nodePath + "/" + prevNodeSuffix;
                
                final CountDownLatch latch = new CountDownLatch(1);
                Stat prevStat = zooKeeper.exists(prevNode, new Watcher() {
                    public void process(WatchedEvent event) {
                        if (event.getType() == Event.EventType.NodeDeleted) {
                            latch.countDown();
                        }
                    }
                });
                
                if (prevStat != null) {
                    latch.await();
                }
            } catch (Exception e) {
                throw new RuntimeException(e);
            }
        }
    }
    
    public void unlock() {
        try {
            zooKeeper.delete(myNode, -1);
            zooKeeper.close();
        } catch (Exception e) {
            throw new RuntimeException(e);
        }
    }
}

Dalam contoh ini, kami mencipta kelas ZooKeeperLock yang melaksanakan The lock() dan kaedah buka kunci() disertakan. Kaedah lock() akan memperoleh kunci dan tunggu sehingga proses lain melepaskan kunci. Kaedah buka kunci() melepaskan kunci. Seperti yang anda lihat, proses melaksanakan kunci teragih di Java menggunakan ZooKeeper adalah sangat mudah.

Kesimpulan
ZooKeeper ialah perkhidmatan penyelarasan teragih yang sangat berkuasa yang boleh digunakan untuk menyelesaikan banyak masalah konkurensi dalam sistem teragih. Dalam artikel ini, kami membincangkan penggunaan ZooKeeper untuk melaksanakan pengendalian kunci teragih dalam pembangunan API Java. Dengan menggunakan ZooKeeper, kami boleh melaksanakan kunci teragih dan protokol penyegerakan lain dengan mudah tanpa perlu risau tentang berbilang proses yang mengakses sumber kongsi pada masa yang sama. Jika anda sedang membina sistem teragih dan perlu menangani isu penyegerakan dan konkurensi, pertimbangkan ZooKeeper.

Atas ialah kandungan terperinci Menggunakan ZooKeeper untuk pemprosesan kunci 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