JavaRush /Blog Java /Random-VI /Người giữ vườn thú hay cuộc sống của một người làm vườn t...
Viacheslav
Mức độ

Người giữ vườn thú hay cuộc sống của một người làm vườn thú như thế nào

Xuất bản trong nhóm
Người giữ vườn thú hay cách sống của một nhân viên sở thú - 1

Giới thiệu

Các ứng dụng Java thường có cấu hình khác nhau. Ví dụ: địa chỉ và cổng kết nối. Ví dụ: nó có thể trông như thế này nếu chúng ta sử dụng lớp Properties :
public static void main(String []args) {
	Properties props = new Properties();
	props.setProperty("host", "www.tutorialspoint.com");
	System.out.println("Hello, " + props.getProperty("host"));
}
Và điều này dường như là đủ, bởi vì... chúng ta có thể lấy Thuộc tính từ tệp. Và mọi thứ dường như đều ổn với chúng tôi trên một chiếc máy. Nhưng hãy tưởng tượng rằng hệ thống của chúng ta bắt đầu bao gồm các hệ thống khác nhau tách biệt với nhau? Hệ thống như vậy còn được gọi là hệ thống phân tán. Trên Wikipedia bạn có thể tìm thấy định nghĩa sau: Hệ thống phân tán là hệ thống có các thành phần nằm trên các máy tính mạng khác nhau giao tiếp với nhau và phối hợp hành động của chúng bằng cách trao đổi tin nhắn với nhau. Bạn có thể nhìn vào sơ đồ sau:
Người trông vườn thú hay cách sống của một nhân viên sở thú - 2
Với cách tiếp cận này, một hệ thống duy nhất được chia thành các thành phần. Cấu hình là một thành phần chung riêng biệt. Mỗi thành phần khác hoạt động như một máy khách cho thành phần cấu hình. Trường hợp này được gọi là " Cấu hình phân tán ". Có nhiều cách triển khai khác nhau của cấu hình phân tán. Và trong bài đánh giá hôm nay, tôi đề xuất làm quen với một trong số họ, có tên là Zookeeper.
Người giữ vườn thú hay cách sống của một nhân viên sở thú - 3

Người giữ vườn thú

Con đường làm quen với Zookeeper bắt đầu từ trang web chính thức của họ: Zookeeper.apache.org Trên trang web chính thức, bạn cần vào phần " Tải xuống " . Trong phần này, hãy tải xuống kho lưu trữ ở định dạng .tar.gz, ví dụ: “zookeeper-3.4.13.tar.gz”. tar là một định dạng lưu trữ truyền thống cho các hệ thống Đơn vị. gz - có nghĩa là gzip được sử dụng để nén kho lưu trữ. Nếu chúng tôi làm việc trên máy Windows thì điều này sẽ không làm phiền chúng tôi. Hầu hết các trình lưu trữ hiện đại (ví dụ: 7-zip ) có thể hoạt động hoàn hảo với chúng trên Windows. Hãy trích xuất nội dung vào một số thư mục. Đồng thời, chúng ta sẽ thấy sự khác biệt - trên đĩa ở trạng thái trích xuất, nó sẽ chiếm khoảng 60 megabyte và chúng tôi đã tải xuống một kho lưu trữ có kích thước khoảng 35 megabyte. Như bạn có thể thấy, việc nén thực sự có tác dụng. Bây giờ bạn cần khởi chạy Zookeeper. Nói chung, Zookeeper là một loại máy chủ. Zookeeper có thể chạy ở một trong hai chế độ: Standalone hoặc Replicated . Hãy xem xét tùy chọn đơn giản nhất, còn được gọi là tùy chọn đầu tiên - Chế độ độc lập. Để Zookeper chạy, nó cần có tệp cấu hình. Vì vậy, hãy tạo nó ở đây: [КаталогРаспаковкиZookeeper]/conf/zoo.cfg. Đối với Windows, chúng tôi sẽ sử dụng đề xuất từ ​​Medium: “ Cài đặt Apache ZooKeeper trên Windows ”. Nội dung của tệp cấu hình sẽ giống như thế này:
tickTime=2000
dataDir=C:/zookeeper-3.4.13/data
clientPort=2181
Hãy thêm biến môi trường ZOOKEEPER_HOME chứa đường dẫn đến thư mục gốc của Zookeper (như trong hướng dẫn trên phương tiện), đồng thời thêm đoạn sau vào biến môi trường PATH: ;%ZOOKEEPER_HOME%\bin; Ngoài ra, thư mục được chỉ định trong dataDir phải tồn tại, nếu không Zookeeper sẽ không tồn tại có thể khởi động máy chủ. Bây giờ chúng ta có thể khởi động máy chủ một cách an toàn bằng lệnh: zkServer. Nhờ thư mục Zookeeper đã được thêm vào biến môi trường đường dẫn nên chúng ta có thể gọi các lệnh Zookeper từ bất cứ đâu chứ không chỉ từ thư mục bin.
Người giữ vườn thú hay cách sống của một nhân viên sở thú - 4

nút Z

Như đã nêu trong phần " Tổng quan về Zookeeper ", dữ liệu trong Zookeper được biểu diễn dưới dạng ZNodes (nút) được tổ chức thành cấu trúc cây. Nghĩa là, mỗi ZNode có thể chứa dữ liệu và có các ZNode con. Thông tin thêm về tổ chức ZNode có thể được tìm thấy trong tài liệu của Zookeeper: " Data model and the hierarchical namespace ". Để làm việc với Zookeeper và ZNode, chúng tôi sẽ sử dụng Zookeeper CLI (Giao diện dòng lệnh). Trước đây, chúng tôi khởi động máy chủ bằng lệnh zkServer. Bây giờ, để kết nối, hãy thực hiện. zkCli.cmd -server 127.0.0.1:2181 Nếu thành công, một phiên kết nối với Zookeeper sẽ được tạo và chúng ta sẽ thấy kết quả đầu ra như sau:
Người giữ vườn thú hay cách sống của một nhân viên sở thú - 5
Điều thú vị là ngay sau khi cài đặt, Zookeeper đã có ZNode. Nó có đường dẫn sau:/zookeeper/quota
Người giữ vườn thú hay cách sống của một nhân viên sở thú - 6
Đây là cái gọi là " hạn ngạch ". Như đã nêu trong " Apache ZooKeeper Essentials ", mỗi ZNode có thể có một hạn ngạch liên quan đến nó, giới hạn dữ liệu mà nó có thể lưu trữ. Có thể chỉ định giới hạn về số lượng znode và lượng dữ liệu được lưu trữ. Hơn nữa, nếu vượt quá giới hạn này thì hoạt động với ZNode sẽ không bị hủy nhưng sẽ nhận được cảnh báo về việc vượt quá giới hạn. Bạn nên đọc về ZNode trong " Hướng dẫn dành cho lập trình viên ZooKeeper: ZNodes ". Một vài ví dụ về cách bạn có thể làm việc với ZNode:
Người giữ vườn thú hay cách sống của một nhân viên sở thú - 7
Tôi cũng muốn lưu ý rằng ZNodes thì khác. ZNodes thông thường (trừ khi bạn chỉ định các cờ bổ sung) thuộc loại " Persistent ". Có một ZNode thuộc loại " Nút phù du ". Các ZNode như vậy chỉ tồn tại trong suốt phiên kết nối Zookeeper mà chúng được tạo. Có một ZNode thuộc loại " Nút tuần tự ". Các ZNo này được thêm vào một số từ chuỗi để đảm bảo tính duy nhất. Nút trình tự có thể tồn tại lâu dài hoặc tạm thời. Một chút thông tin cơ bản về ZNode cũng được đề xuất ở đây: “ Zookeeper ZNodes – Đặc điểm & Ví dụ ”.
Người giữ vườn thú hay cách sống của một nhân viên sở thú - 8

Trình theo dõi ZNode

Tôi cũng muốn nói về những người quan sát. Thông tin chi tiết về chúng được viết trong tài liệu của Zookeeper: " Đồng hồ ZooKeeper ". Nói tóm lại, người theo dõi là trình kích hoạt một lần được kích hoạt bởi một sự kiện nào đó. Bằng cách truy xuất dữ liệu bằng cách thực hiện các thao tác getData(), getChildren() hoặc tồn tại(), chúng ta có thể tạo trình kích hoạt dưới dạng hành động bổ sung. Zookeeper đảm bảo thứ tự xử lý sự kiện. Ngoài ra, tài liệu nói rằng trước khi chúng ta có thể thấy giá trị ZNode mới, chúng ta sẽ thấy một sự kiện về việc thay đổi giá trị cũ thành giá trị mới. Bạn có thể đọc thêm về Người theo dõi tại đây: “ Đồng hồ ZooKeeper - Tính năng & Đảm bảo ”. Để thử điều này, hãy sử dụng lại CLI : Giả sử chúng ta có một số ZNode có giá trị mà chúng ta lưu trữ trạng thái của một số dịch vụ:
[zk: 127.0.0.1:2181(CONNECTED) 0] create /services/service1/status stopped
Created /services/service1/status
[zk: 127.0.0.1:2181(CONNECTED) 1] get /services/service1/status [watch]
stopped
Bây giờ, nếu dữ liệu /services/service1/statusthay đổi, trình kích hoạt một lần của chúng tôi sẽ kích hoạt:
Người giữ vườn thú hay cách sống của một nhân viên sở thú - 9
Điều thú vị là khi kết nối với Zookeeper, chúng ta còn thấy được cách hoạt động của watcher:
WATCHER::
WatchedEvent state:SyncConnected type:None path:null
SyncConnected là một trong những sự kiện Zookeper có thể xảy ra. Bạn có thể tìm thêm thông tin chi tiết về nó trong phần mô tả API.
Người giữ vườn thú hay cách sống của một nhân viên sở thú - 10

Người quản lý vườn thú và Java

Bây giờ chúng ta đã có một số hiểu biết cơ bản về những gì Zookeeper có thể làm. Bây giờ chúng ta hãy làm việc với nó thông qua Java chứ không phải thông qua CLI. Và để làm được điều này, chúng ta sẽ cần một ứng dụng Java, trong đó chúng ta sẽ xem cách làm việc với Zookeeper. Để tạo ứng dụng, chúng ta sẽ sử dụng hệ thống xây dựng dự án Gradle . Sử dụng " gradle Build init plugin " chúng ta sẽ tạo dự án. Để thực hiện việc này, hãy chạy lệnh: gradle init --type java-application Nếu Gradle yêu cầu chúng ta làm rõ các câu hỏi thì chúng ta sẽ để các giá trị mặc định (chỉ cần nhấn Enter). Bây giờ hãy mở tập lệnh xây dựng, tức là. tập tin build.gradle. Nó chứa mô tả về dự án của chúng tôi được tạo ra từ đâu và nó phụ thuộc vào thành phần nào (thư viện, khung công tác). Bởi vì chúng ta muốn sử dụng Zookeeper thì chúng ta cần thêm nó vào. Do đó, hãy thêm một phần phụ thuộc trên Zookeeper vào khối phụ thuộc:
dependencies {
    implementation 'org.apache.zookeeper:zookeeper:3.4.13'
Bạn có thể đọc thêm về Gradle trong bài đánh giá: " Giới thiệu tóm tắt về Gradle ". Vì vậy, chúng tôi có một dự án Java, chúng tôi đã kết nối thư viện Zookeeper với nó. Hãy viết một cái gì đó ngay bây giờ. Như chúng ta nhớ, bằng cách sử dụng CLI, chúng ta đã kết nối một thứ như thế này: zkCli.cmd -server 127.0.0.1:2181 Hãy khai báo thuộc tính “server” trong lớp Ứng dụng trong phương thức chính:
String server = "127.0.0.1:2181";
Kết nối không phải là một hành động ngay lập tức. Bằng cách nào đó, chúng ta sẽ phải đợi trong luồng chính của quá trình thực thi chương trình để kết nối xảy ra. Vì vậy, chúng ta cần một ổ khóa. Hãy khai báo nó dưới đây:
Object lock = new Object();
Bây giờ chúng ta cần ai đó nói rằng kết nối đã được thiết lập. Như chúng tôi nhớ, khi chúng tôi thực hiện việc này thông qua CLI, người theo dõi đã làm việc cho chúng tôi. Vì vậy, trong mã Java mọi thứ đều giống hệt nhau. Trình theo dõi của chúng tôi sẽ hiển thị thông báo về việc hoàn thành thành công và thông báo cho mọi người đang chờ thông qua khóa. Hãy viết một người theo dõi:
Watcher connectionWatcher = new Watcher() {
	public void process(WatchedEvent we) {
		if (we.getState() == Event.KeeperState.SyncConnected) {
			System.out.println("Connected to Zookeeper in " + Thread.currentThread().getName());
			synchronized (lock) {
            	lock.notifyAll();
            }
		}
	}
};
Bây giờ hãy thêm kết nối đến máy chủ ZooKeeper:
int sessionTimeout = 2000;
ZooKeeper zooKeeper = null;
synchronized (lock) {
	zooKeeper = new ZooKeeper(server, sessionTimeout, connectionWatcher);
	lock.wait();
}
Mọi thứ đều đơn giản ở đây. Khi thực thi phương thức chính trong luồng chính của chương trình, chúng tôi lấy khóa và yêu cầu kết nối với người quản lý vườn thú. Đồng thời, chúng tôi mở khóa và đợi cho đến khi người khác lấy khóa và thông báo rằng chúng tôi có thể tiếp tục. Khi kết nối được thiết lập, trình theo dõi sẽ hoạt động. Anh ta sẽ kiểm tra xem sự kiện SyncConnected đã đến chưa (như chúng tôi nhớ, đây là điều mà người xem đã nắm bắt được thông qua CLI), rồi viết một tin nhắn. Tiếp theo, chúng tôi lấy khóa (vì luồng chính đã phát hành nó trước đó) và thông báo cho tất cả các luồng đang chờ khóa mà chúng tôi có thể tiếp tục. Chuỗi xử lý sự kiện thoát khỏi khối được đồng bộ hóa, do đó giải phóng khóa. Luồng chính đã nhận được thông báo và sau khi chờ khóa được giải phóng, nó sẽ tiếp tục thực thi, bởi vì cho đến khi nhận được khóa, nó sẽ không thể thoát khỏi khối được đồng bộ hóa và tiếp tục làm việc. Do đó, bằng cách sử dụng đa luồng và API Zookeeper, chúng ta có thể thực hiện nhiều hành động khác nhau. API Zookeeper rộng hơn nhiều so với những gì CLI cho phép. Ví dụ:
// Creation нового узла
String znodePath = "/zookeepernode2";
List<ACL> acls = ZooDefs.Ids.OPEN_ACL_UNSAFE;
if (zooKeeper.exists(znodePath, false) == null) {
	zooKeeper.create(znodePath, "data".getBytes(), acls, CreateMode.PERSISTENT);
}

// Получение данных из узла
byte[] data = zooKeeper.getData(znodePath, null, null);
System.out.println("Result: " + new String(data, "UTF-8"));
Như bạn có thể thấy, khi tạo nút, chúng ta có thể định cấu hình ACL. Đây là một tính năng quan trọng khác. ACL là các quyền áp dụng cho các hành động với ZNode. Có rất nhiều cài đặt, vì vậy tôi khuyên bạn nên tham khảo tài liệu chính thức để biết chi tiết: “ Quyền ACL của Zookeeper ”.
Người giữ vườn thú hay cách sống của một nhân viên sở thú - 11

Phần kết luận

Tại sao chúng ta đọc được điều này? Bởi vì Zookeeper được sử dụng trong các công nghệ phổ biến khác. Ví dụ: Apache Kafka yêu cầu Zookeeper, bạn có thể đọc về điều này trong " Hướng dẫn bắt đầu nhanh Kafka ". Nó cũng được sử dụng trong cơ sở dữ liệu HBase của NOSQL mà bạn có thể đọc thêm trong " Hướng dẫn khởi động nhanh HBase " của họ. Trên thực tế, nhiều dự án khác cũng sử dụng Zookeeper. Một số trong số chúng được liệt kê trong " Sử dụng Zookeeper trong thế giới thực ". Tôi hy vọng tôi đã trả lời được câu hỏi “tại sao”. Câu hỏi quan trọng nhất bây giờ là: “Tiếp theo là gì?” Trước tiên, bạn có thể đọc những cuốn sách sau về chủ đề Apache Zookeeper: Thứ hai, có những video báo cáo xuất sắc về Zookeeper. Khuyến nghị xem: Thứ ba, có một số bài viết hữu ích sẽ bổ sung cho bức tranh thế giới: Đây là một bài đánh giá rất ngắn, nhưng như một lời giới thiệu, tôi hy vọng nó sẽ hữu ích. #Viacheslav
Bình luận
TO VIEW ALL COMMENTS OR TO MAKE A COMMENT,
GO TO FULL VERSION