JavaRush /مدونة جافا /Random-AR /حارس حديقة الحيوان أو ما هي الحياة بالنسبة لحارس حديقة ال...
Viacheslav
مستوى

حارس حديقة الحيوان أو ما هي الحياة بالنسبة لحارس حديقة الحيوان

نشرت في المجموعة
حارس حديقة الحيوان أو كيف يعيش عامل حديقة الحيوان - 1

مقدمة

غالبًا ما يكون لتطبيقات Java تكوينات مختلفة. على سبيل المثال، العنوان ومنفذ الاتصال. على سبيل المثال، قد يبدو الأمر هكذا إذا استخدمنا فئة Properties :
public static void main(String []args) {
	Properties props = new Properties();
	props.setProperty("host", "www.tutorialspoint.com");
	System.out.println("Hello, " + props.getProperty("host"));
}
ويبدو أن هذا كافٍ، لأن... يمكننا الحصول على خصائص من الملف. ويبدو أن كل شيء يتماشى جيدًا معنا على جهاز واحد. لكن تخيل أن نظامنا يبدأ يتكون من أنظمة مختلفة منفصلة عن بعضها البعض؟ ويسمى هذا النظام أيضًا بالأنظمة الموزعة. يمكنك العثور في ويكيبيديا على التعريف التالي: الأنظمة الموزعة هي أنظمة توجد مكوناتها على أجهزة كمبيوتر شبكية مختلفة تتواصل مع بعضها البعض وتنسق أعمالها من خلال تبادل الرسائل مع بعضها البعض. يمكنك إلقاء نظرة على الرسم البياني التالي:
حارس حديقة الحيوان أو كيف يعيش عامل حديقة الحيوان - 2
وبهذا النهج، يتم تقسيم النظام الواحد إلى مكونات. التكوين هو مكون مشترك منفصل. يعمل كل مكون من المكونات الأخرى كعميل لمكون التكوين. تسمى هذه الحالة " التكوين الموزع ". هناك العديد من التطبيقات المختلفة للتكوين الموزع. وفي مراجعة اليوم أقترح التعرف على واحد منهم، يسمى Zookeeper.
حارس حديقة الحيوان أو كيف يعيش عامل حديقة الحيوان - 3

حارس حديقة الحيوان

يبدأ الطريق للتعرف على Zookeeper من موقعه الرسمي على الويب: Zookeeper.apache.org على الموقع الرسمي، يجب عليك الانتقال إلى قسم " تنزيل " . في هذا القسم، قم بتنزيل الأرشيف بتنسيق .tar.gz، على سبيل المثال "zookeeper-3.4.13.tar.gz". tar هو تنسيق أرشيف تقليدي لأنظمة الوحدات. gz - يعني أنه يتم استخدام gzip لضغط الأرشيف. إذا كنا نعمل على جهاز يعمل بنظام Windows، فلا ينبغي أن يزعجنا هذا. يمكن لمعظم أدوات الأرشيف الحديثة (على سبيل المثال، 7-zip ) أن تعمل بشكل مثالي معها على نظام التشغيل Windows. دعونا نستخرج المحتويات إلى بعض الدليل. في الوقت نفسه، سنرى الفرق - على القرص في الحالة المستخرجة، سيشغل حوالي 60 ميغابايت، وقمنا بتنزيل أرشيف يبلغ حجمه حوالي 35 ميغابايت. كما ترون، الضغط يعمل حقا. أنت الآن بحاجة إلى تشغيل Zookeeper. بشكل عام، Zookeeper هو نوع من الخادم. يمكن تشغيل Zookeeper في أحد الوضعين: مستقل أو منسوخ . لنفكر في الخيار الأبسط، المعروف أيضًا بالخيار الأول - الوضع المستقل. لتشغيل Zookeper، فإنه يحتاج إلى ملف تكوين. لذلك، دعونا نقوم بإنشائه هنا: [КаталогРаспаковкиZookeeper]/conf/zoo.cfg. بالنسبة لنظام التشغيل Windows، سنستخدم التوصية من Medium: " تثبيت Apache ZooKeeper على نظام التشغيل Windows ". ستكون محتويات ملف التكوين شيئًا مثل هذا:
tickTime=2000
dataDir=C:/zookeeper-3.4.13/data
clientPort=2181
دعونا نضيف متغير البيئة ZOOKEEPER_HOME الذي يحتوي على المسار إلى دليل جذر Zookeper (كما في التعليمات الموجودة على الوسيط)، ونضيف أيضًا الجزء التالي إلى متغير بيئة PATH: ;%ZOOKEEPER_HOME%\bin; أيضًا، يجب أن يكون الدليل المحدد في dataDir موجودًا، وإلا فلن يكون Zookeeper موجودًا. قادرة على بدء الخادم. يمكننا الآن تشغيل الخادم بأمان باستخدام الأمر: zkServer. بفضل حقيقة إضافة دليل Zookeeper إلى متغير بيئة المسار، يمكننا استدعاء أوامر Zookeper من أي مكان، وليس فقط من دليل bin.
حارس حديقة الحيوان أو كيف يعيش عامل حديقة الحيوان - 4

ZNode

كما هو مذكور في " نظرة عامة على Zookeeper "، يتم تمثيل البيانات الموجودة في Zookeper كعقد Z (عقد) منظمة في بنية شجرة. أي أن كل ZNode يمكن أن تحتوي على بيانات ولها عقد Z فرعية. يمكنك قراءة المزيد عن مؤسسة ZNode في وثائق Zookeeper: " نموذج البيانات ومساحة الاسم الهرمية ". للعمل مع Zookeeper وZNode، سنستخدم Zookeeper CLI (واجهة سطر الأوامر). في السابق، قمنا بتشغيل الخادم باستخدام أمر zkServer. الآن، لننفذ الاتصال، zkCli.cmd -server 127.0.0.1:2181 إذا نجح الأمر، سيتم إنشاء جلسة اتصال بـ Zookeeper وسنرى المخرجات التالية تقريبًا:
حارس حديقة الحيوان أو كيف يعيش عامل حديقة الحيوان - 5
ومن المثير للاهتمام، حتى بعد التثبيت مباشرة، أن Zookeeper لديه بالفعل ZNode. وله المسار التالي:/zookeeper/quota
حارس حديقة الحيوان أو كيف يعيش عامل حديقة الحيوان - 6
هذه هي ما يسمى " الحصص ". كما هو مذكور في " Apache ZooKeeper Essentials "، يمكن أن يكون لكل ZNode حصة مرتبطة بها، مما يحد من البيانات التي يمكنها تخزينها. قد يتم تحديد حد لعدد العقد وكمية البيانات المخزنة. علاوة على ذلك، إذا تم تجاوز هذا الحد، فلن يتم إلغاء العملية مع ZNode، ولكن سيتم تلقي تحذير بشأن تجاوز الحد. من المستحسن أن تقرأ عن ZNode في " دليل مبرمج ZooKeeper: ZNodes ". بعض الأمثلة من هناك لكيفية العمل مع ZNode:
حارس حديقة الحيوان أو كيف يعيش عامل حديقة الحيوان - 7
أود أيضًا أن أشير إلى أن ZNodes مختلفة. عقد Z العادية (ما لم تحدد إشارات إضافية) هي من النوع " المستمر ". توجد عقدة Z من النوع " عقدة مؤقتة ". توجد ZNodes هذه فقط طوال مدة جلسة اتصال Zookeeper التي تم إنشاؤها خلالها. توجد ZNode من النوع " Sequence Node ". يتم إلحاق ZNodes برقم من التسلسل لضمان التفرد. يمكن أن تكون عقدة التسلسل ثابتة أو سريعة الزوال. يوصى أيضًا بالحصول على معلومات أساسية بسيطة حول ZNode هنا: " Zookeeper ZNodes - الخصائص والأمثلة ".
حارس حديقة الحيوان أو كيف يعيش عامل حديقة الحيوان - 8

مراقب ZNode

أود أيضًا أن أتحدث عن المراقبين. التفاصيل المتعلقة بهم مكتوبة في وثائق Zookeeper: " ZooKeeper Watches ". باختصار، المراقب هو محفز لمرة واحدة يتم تشغيله بواسطة حدث ما. من خلال استرداد البيانات عن طريق تنفيذ عمليات getData() أو getChildren() أو موجود()، يمكننا إنشاء مشغل كإجراء إضافي. يضمن Zookeeper الترتيب الذي تتم به معالجة الحدث. بالإضافة إلى ذلك، تنص الوثائق على أنه قبل أن نتمكن من رؤية قيمة ZNode الجديدة، سنرى حدثًا حول تغيير القيمة القديمة إلى القيمة الجديدة. يمكنك قراءة المزيد عن المراقبين هنا: " ساعات ZooKeeper - الميزات والضمانات ". من أجل تجربة ذلك، دعنا نستخدم واجهة سطر الأوامر (CLI) مرة أخرى : لنفترض أن لدينا بعض ZNode ذات قيمة حيث نقوم بتخزين حالة بعض الخدمات:
[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
الآن، إذا تغيرت البيانات /services/service1/status، فسيتم تشغيل المشغل لمرة واحدة:
حارس حديقة الحيوان أو كيف يعيش عامل حديقة الحيوان - 9
ومن المثير للاهتمام أنه عند الاتصال بـ Zookeeper، نرى أيضًا كيف يعمل المراقب:
WATCHER::
WatchedEvent state:SyncConnected type:None path:null
يعد SyncConnected أحد أحداث Zookeper المحتملة. يمكن العثور على مزيد من التفاصيل حول هذا الموضوع في وصف واجهة برمجة التطبيقات (API).
حارس حديقة الحيوان أو كيف يعيش عامل حديقة الحيوان - 10

Zookeeper وجافا

لدينا الآن بعض الفهم الأساسي لما يمكن أن يفعله Zookeeper. دعونا الآن نعمل معها من خلال Java، وليس من خلال CLI. ولهذا سنحتاج إلى تطبيق Java، حيث سنرى كيفية العمل مع Zookeeper. لإنشاء التطبيق، سنستخدم نظام بناء مشروع Gradle . باستخدام " المكون الإضافي Gradle Build Init " سنقوم بإنشاء المشروع. للقيام بذلك، لنقم بتشغيل الأمر: gradle init --type java-application إذا طلب منا Gradle توضيح الأسئلة، فسنترك القيم الافتراضية (فقط اضغط على Enter). الآن دعونا نفتح البرنامج النصي للبناء، أي. ملف build.gradle. يحتوي على وصف لما يتكون منه مشروعنا وما هي القطع الأثرية (المكتبات والأطر) التي يعتمد عليها. لأن نريد استخدام Zookeeper، ثم نحتاج إلى إضافته. لذلك، دعونا نضيف تبعية على Zookeeper إلى كتلة التبعيات:
dependencies {
    implementation 'org.apache.zookeeper:zookeeper:3.4.13'
يمكنك قراءة المزيد عن Gradle في المراجعة: " مقدمة موجزة عن Gradle ". لذلك، لدينا مشروع Java، وقمنا بربط مكتبة Zookeeper به. دعونا نكتب شيئا الآن. كما نتذكر، باستخدام واجهة سطر الأوامر (CLI) قمنا بتوصيل شيء من هذا القبيل: zkCli.cmd -server 127.0.0.1:2181 دعنا نعلن عن سمة "الخادم" في فئة التطبيق في الطريقة الرئيسية:
String server = "127.0.0.1:2181";
الاتصال ليس إجراءً فوريًا. سيتعين علينا الانتظار بطريقة ما في الخيط الرئيسي لتنفيذ البرنامج حتى يحدث الاتصال. لذلك، نحن بحاجة إلى القفل. دعنا نعلن ذلك أدناه:
Object lock = new Object();
الآن نحتاج إلى شخص ما ليقول أنه تم إنشاء الاتصال. وكما نتذكر، عندما فعلنا ذلك من خلال CLI، عمل المراقب لصالحنا. لذلك في كود Java، كل شيء هو نفسه تمامًا. سيعرض مراقبنا رسالة حول الإكمال الناجح ويخطر كل من ينتظره عبر القفل. لنكتب مراقبا:
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();
            }
		}
	}
};
لنقم الآن بإضافة الاتصال بخادم ZooKeeper:
int sessionTimeout = 2000;
ZooKeeper zooKeeper = null;
synchronized (lock) {
	zooKeeper = new ZooKeeper(server, sessionTimeout, connectionWatcher);
	lock.wait();
}
كل شيء بسيط هنا. عند تنفيذ الطريقة الرئيسية في الموضوع الرئيسي للبرنامج، نلتقط القفل ونطلب الاتصال بحارس الحديقة. في الوقت نفسه، نحرر القفل وننتظر حتى يمسك شخص آخر بالقفل ويخبرنا أنه يمكننا الاستمرار. عندما يتم إنشاء الاتصال، سيعمل المراقب. سيتحقق من وصول حدث SyncConnected (كما نتذكر، هذا ما اكتشفه المراقب من خلال CLI)، ثم يكتب رسالة. بعد ذلك، نلتقط القفل (نظرًا لأن الخيط الرئيسي قد أطلقه مسبقًا) ونخطر جميع سلاسل الرسائل التي تنتظر القفل بأنه يمكننا الاستمرار. يخرج مؤشر ترابط معالجة الحدث من الكتلة المتزامنة، وبالتالي تحرير القفل. تلقى الخيط الرئيسي إشعارًا، وبعد انتظار تحرير القفل، يستمر التنفيذ، لأنه حتى يتلقى القفل، لن يتمكن من الخروج من الكتلة المتزامنة ومواصلة العمل. وبالتالي، باستخدام تعدد مؤشرات الترابط وZookeeper API، يمكننا تنفيذ إجراءات مختلفة. تعد Zookeeper API أوسع بكثير مما تسمح به واجهة سطر الأوامر (CLI). على سبيل المثال:
// 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"));
كما ترون، عند إنشاء عقدة يمكننا تكوين قائمة التحكم بالوصول (ACL). وهذه ميزة أخرى مهمة. قوائم ACL هي أذونات تنطبق على الإجراءات باستخدام ZNode. هناك الكثير من الإعدادات، لذا أوصيك بالرجوع إلى الوثائق الرسمية للحصول على التفاصيل: " أذونات Zookeeper ACL ".
حارس حديقة الحيوان أو كيف يعيش عامل حديقة الحيوان - 11

خاتمة

لماذا قرأنا هذا؟ لأن Zookeeper يستخدم في التقنيات الشائعة الأخرى. على سبيل المثال، يتطلب Apache Kafka برنامج Zookeeper، والذي يمكنك القراءة عنه في " دليل البدء السريع لـ Kafka ". يتم استخدامه أيضًا في قاعدة بيانات NOSQL HBase، والتي يمكنك قراءة المزيد عنها في " دليل HBase Quickstart ". في الواقع، العديد من المشاريع الأخرى تستخدم Zookeeper. تم إدراج بعضها في " استخدام Zookeeper في العالم الحقيقي ". أتمنى أن أجيب على السؤال "لماذا". والسؤال الأهم الآن هو: "وماذا بعد؟" أولاً، يمكنك قراءة الكتب التالية حول موضوع Apache Zookeeper: ثانيًا، هناك تقارير فيديو ممتازة حول Zookeeper. المشاهدة الموصى بها: ثالثا، هناك العديد من المقالات المفيدة التي من شأنها أن تكمل صورة العالم: هذه مراجعة قصيرة جدًا، ولكن ككلمة تمهيدية، آمل أن تكون مفيدة. # فياتشيسلاف
تعليقات
TO VIEW ALL COMMENTS OR TO MAKE A COMMENT,
GO TO FULL VERSION