كيف يجمع Quarkus بين البرمجة الحتمية والتفاعلية

نخطط هذا العام لتطوير موضوعات الحاوية بشكل جدي، جافا السحابية الأصلية и Kubernetes. سيكون الاستمرار المنطقي لهذه المواضيع عبارة عن قصة حول إطار عمل Quarkus بالفعل يعتبر على حبري. مقالة اليوم لا تتعلق بتصميم "Java فائق السرعة دون الذرية" بقدر ما تتعلق بالوعد الذي يقدمه Quarkus إلى Enterprise.

كيف يجمع Quarkus بين البرمجة الحتمية والتفاعلية

لا تزال Java وJVM تحظى بشعبية كبيرة، ولكن عند العمل باستخدام تقنيات بدون خادم والخدمات السحابية الصغيرة الأصلية، يتم استخدام Java ولغات JVM الأخرى بشكل أقل فأقل لأنها تشغل مساحة كبيرة جدًا من الذاكرة وبطيئة جدًا في التحميل، مما يجعلها غير مناسب للاستخدام مع الحاويات قصيرة العمر. ولحسن الحظ، بدأ هذا الوضع يتغير الآن بفضل Quarkus.

لقد وصلت جافا دون الذرية فائقة السرعة إلى مستوى جديد!

42 إصدارًا و8 أشهر من العمل المجتمعي و177 مطورًا رائعًا - وكانت النتيجة كلها الإصدار في نوفمبر 2019 كواركوس 1.0، وهو إصدار يمثل علامة فارقة مهمة في تطوير المشروع ويقدم الكثير من الميزات والإمكانيات الرائعة (يمكنك قراءة المزيد عنها في إعلان).

سنوضح لك اليوم كيف يجمع Quarkus بين نماذج البرمجة الحتمية والتفاعلية في نواة تفاعلية واحدة. سنبدأ بنبذة تاريخية موجزة ثم ندخل في التفاصيل حول ماهية الثنائية الأساسية التفاعلية لـ Quarkus وكيف جافا-يمكن للمطورين الاستفادة من هذه الفوائد.

الخدمات المصغرة, أبنية مدفوعة بالحدث и serverless-الوظائف – كل هذا، كما يقولون، في ارتفاع اليوم. في الآونة الأخيرة، أصبح إنشاء البنى المرتكزة على السحابة أسهل بكثير ويمكن الوصول إليها بشكل أكبر، ولكن لا تزال هناك مشاكل - خاصة بالنسبة لمطوري Java. على سبيل المثال، في حالة الوظائف والخدمات الصغيرة بدون خادم، هناك حاجة ملحة لتقليل وقت بدء التشغيل، وتقليل استهلاك الذاكرة، مع الاستمرار في جعل تطويرها أكثر ملاءمة ومتعة. قامت Java بإجراء العديد من التحسينات في السنوات الأخيرة، مثل تحسين وظائف بيئة العمل للحاويات وما إلى ذلك. ومع ذلك، فإن جعل Java تعمل بشكل صحيح في حاوية لا يزال يمثل تحديًا. لذا، سنبدأ بالنظر في بعض التعقيدات المتأصلة في Java، والتي تكون حادة بشكل خاص عند تطوير تطبيقات Java الموجهة نحو الحاوية.

أولا، دعونا ننظر إلى التاريخ.

كيف يجمع Quarkus بين البرمجة الحتمية والتفاعلية

تيارات وحاويات

بدءًا من الإصدار 8u131، بدأت Java في دعم الحاويات بشكل أو بآخر بسبب التحسينات في وظائف بيئة العمل. على وجه الخصوص، يعرف JVM الآن عدد نوى المعالج التي يعمل عليها ويمكنه تكوين تجمعات الخيوط - عادةً تجمعات الشوكة/الانضمام - وفقًا لذلك. بالطبع، هذا أمر رائع، ولكن لنفترض أن لدينا تطبيق ويب تقليدي يستخدم servlets HTTP ويعمل في Tomcat وJetty وما إلى ذلك. ونتيجة لذلك، سيعطي هذا التطبيق لكل طلب موضوعًا منفصلاً ويسمح له بحظر هذا الموضوع أثناء انتظار عمليات الإدخال/الإخراج، على سبيل المثال، عند الوصول إلى قاعدة البيانات أو الملفات أو الخدمات الأخرى. أي أن حجم هذا التطبيق لا يعتمد على عدد النوى المتاحة، بل على عدد الطلبات المتزامنة. بالإضافة إلى ذلك، هذا يعني أن الحصص أو القيود في Kubernetes على عدد النوى لن تساعد كثيرًا هنا، وسينتهي الأمر في النهاية بالاختناق.

استنفاد الذاكرة

المواضيع هي الذاكرة. والقيود المفروضة على الذاكرة داخل الحاوية ليست بأي حال من الأحوال حلاً سحريًا. ما عليك سوى البدء في زيادة عدد التطبيقات والخيوط، وستواجه عاجلاً أم آجلاً زيادة حرجة في تردد التبديل، ونتيجة لذلك، تدهور الأداء. أيضًا، إذا كان تطبيقك يستخدم أطر عمل الخدمات الصغيرة التقليدية، أو يتصل بقاعدة بيانات، أو يستخدم التخزين المؤقت، أو يستخدم الذاكرة بطريقة أخرى، فمن الواضح أنك بحاجة إلى أداة تسمح لك بالنظر داخل JVM ومعرفة كيفية إدارته للذاكرة دون قتلها. JVM نفسه (على سبيل المثال، XX:+UseCGroupMemoryLimitForHeap). وعلى الرغم من أنه منذ Java 9، تعلم JVM قبول مجموعات التحكم والتكيف وفقًا لذلك، إلا أن حجز الذاكرة وإدارتها يظل أمرًا معقدًا إلى حد ما.

الحصص والحدود

قدم Java 11 دعمًا لحصص وحدة المعالجة المركزية (مثل PreferContainerQuotaForCPUCount). يقدم Kubernetes أيضًا دعمًا للحدود والحصص. نعم، كل هذا منطقي، ولكن إذا تجاوز التطبيق الحصة المخصصة مرة أخرى، فسوف ينتهي بنا الأمر مرة أخرى إلى الحجم - كما هو الحال مع تطبيقات Java التقليدية - الذي يتم تحديده حسب عدد النوى ومع تخصيص مؤشر ترابط منفصل لكل منها طلب، ثم هناك القليل من المعنى في كل هذا.
بالإضافة إلى ذلك، إذا كنت تستخدم الحصص والحدود أو وظائف التوسع للنظام الأساسي الأساسي لـ Kubernetes، فلن تحل المشكلة نفسها أيضًا. نحن ببساطة ننفق المزيد من الموارد على حل المشكلة الأصلية أو ينتهي بنا الأمر إلى الإفراط في الإنفاق. وإذا كان النظام عالي التحميل في سحابة عامة، فمن المؤكد أننا سننتهي باستخدام موارد أكثر مما نحتاجه حقًا.

وماذا تفعل مع كل هذا؟

لتبسيط الأمر، استخدم مكتبات وأطر الإدخال/الإخراج غير المتزامنة وغير المحظورة مثل Netty، فيرت.x أو عكا. إنها أكثر ملاءمة للعمل في الحاويات نظرًا لطبيعتها التفاعلية. بفضل ميزة الإدخال/الإخراج غير المحظورة، يمكن للخيط نفسه معالجة طلبات متعددة في وقت واحد. أثناء انتظار أحد الطلبات لنتائج الإدخال/الإخراج، يتم تحرير معالجة مؤشر الترابط والاستيلاء عليها بواسطة طلب آخر. وعندما تصل نتائج الإدخال/الإخراج أخيرًا، تستمر معالجة الطلب الأول. من خلال معالجة الطلبات المتداخلة داخل نفس مؤشر الترابط، يمكنك تقليل إجمالي عدد سلاسل الرسائل وتقليل استهلاك الموارد لمعالجة الطلبات.

مع الإدخال/الإخراج غير المحظور، يصبح عدد النوى معلمة رئيسية لأنه يحدد عدد مؤشرات ترابط الإدخال/الإخراج التي يمكن تنفيذها بالتوازي. عند استخدامه بشكل صحيح، يتيح لك ذلك توزيع الحمل بشكل فعال بين النوى والتعامل مع أعباء العمل الأعلى بموارد أقل.

كيف، هل هذا كل شيء؟

لا، هناك شيء آخر. تساعد البرمجة التفاعلية على الاستفادة بشكل أفضل من الموارد، ولكن لها أيضًا ثمن. على وجه الخصوص، يجب إعادة كتابة التعليمات البرمجية وفقًا لمبادئ عدم الحظر وتجنب حظر سلاسل الإدخال/الإخراج. وهذا نموذج مختلف تمامًا للتطوير والتنفيذ. وعلى الرغم من وجود الكثير من المكتبات المفيدة هنا، إلا أنه لا يزال يمثل تغييرًا جذريًا في طريقة التفكير المعتادة.

أولاً، عليك أن تتعلم كيفية كتابة التعليمات البرمجية التي تعمل بشكل غير متزامن. بمجرد البدء في استخدام الإدخال/الإخراج غير المحظور، ستحتاج إلى تحديد ما يجب أن يحدث بشكل واضح عند تلقي استجابة لطلب ما. إن مجرد الحظر والانتظار لن ينجح بعد الآن. بدلاً من ذلك، يمكنك تمرير عمليات الاسترجاعات أو استخدام البرمجة التفاعلية أو المتابعة. ولكن هذا ليس كل شيء: لاستخدام الإدخال/الإخراج غير المحظور، تحتاج إلى خوادم وعملاء غير محظورين، ويفضل أن يكون ذلك في كل مكان. في حالة HTTP، كل شيء بسيط، ولكن هناك أيضًا قواعد بيانات وأنظمة ملفات وغير ذلك الكثير.

وعلى الرغم من أن التفاعل الشامل من البداية إلى النهاية يزيد من الكفاءة إلى الحد الأقصى، إلا أن مثل هذا التحول قد يكون من الصعب قبوله عمليًا. لذلك، تصبح القدرة على الجمع بين التعليمات البرمجية التفاعلية والأمرية شرطًا أساسيًا من أجل:

  1. الاستخدام الفعال للموارد في المناطق الأكثر تحميلا في نظام البرمجيات؛
  2. استخدم رمز نمط أبسط في أجزائه المتبقية.

تقديم كواركوس

في الواقع، هذا هو جوهر Quarkus - الجمع بين النماذج التفاعلية والحتمية في بيئة تشغيل واحدة.

يعتمد Quarkus على Vert.x وNetty، مع مجموعة من الأطر والإضافات التفاعلية في الأعلى لمساعدة المطور. تم تصميم Quarkus ليس فقط لبناء خدمات HTTP الصغيرة، ولكن أيضًا للبنى المبنية على الأحداث. ونظرًا لطبيعته التفاعلية، فهو يعمل بفعالية كبيرة مع أنظمة المراسلة (Apache Kafka، وAMQP، وما إلى ذلك).

الحيلة هي كيفية استخدام نفس المحرك التفاعلي لكل من التعليمات البرمجية الحتمية والتفاعلية.

كيف يجمع Quarkus بين البرمجة الحتمية والتفاعلية

يقوم Quarkus بهذا ببراعة. الاختيار بين الأمر ورد الفعل واضح - استخدم نواة تفاعلية لكليهما. ما يساعد حقًا هو التعليمات البرمجية السريعة وغير المحظورة التي تتعامل تقريبًا مع كل شيء يمر عبر خيط حلقة الحدث، المعروف أيضًا باسم IO Thread. ولكن إذا كان لديك تطبيقات REST كلاسيكية أو تطبيقات من جانب العميل، فإن Quarkus لديه نموذج برمجة حتمي جاهز. على سبيل المثال، يعتمد دعم HTTP في Quarkus على استخدام محرك تفاعلي وغير محظور (Eclipse Vert.x وNetty). يتم تمرير جميع طلبات HTTP التي يتلقاها تطبيقك أولاً عبر حلقة حدث (IO Thread) ثم يتم إرسالها إلى جزء التعليمات البرمجية الذي يدير الطلبات. اعتمادًا على الوجهة، يمكن استدعاء رمز إدارة الطلب ضمن خيط منفصل (ما يسمى بخيط العامل، المستخدم في حالة servlets وJax-RS) أو استخدام خيط الإدخال/الإخراج المصدر (المسار التفاعلي).

كيف يجمع Quarkus بين البرمجة الحتمية والتفاعلية

تستخدم موصلات نظام المراسلة عملاء غير محظورين يعملون أعلى محرك Vert.x. لذلك، يمكنك إرسال واستقبال ومعالجة الرسائل بشكل فعال من أنظمة البرامج الوسيطة للمراسلة.

الموقع Quarkus.io فيما يلي بعض البرامج التعليمية الجيدة لمساعدتك على البدء باستخدام Quarkus:

لقد قمنا أيضًا بإنشاء برامج تعليمية عملية عبر الإنترنت لتعليمك جوانب مختلفة من البرمجة التفاعلية في متصفح فقط، ولا يتطلب IDE ولا يتطلب جهاز كمبيوتر. يمكنك أن تجد هذه الدروس هنا.

موارد مفيدة

10 دروس فيديو عن Quarkus للتعرف على الموضوع

كما يقولون على الموقع Quarkus.io, كواركوس - هل Kubernetesمكدس Java موجه، مصمم خصيصًا لـ GraalVM وOpenJDK HotSpot وتم تجميعه من أفضل مكتبات ومعايير Java.

ولمساعدتك على فهم الموضوع، قمنا باختيار 10 دروس فيديو تغطي جوانب مختلفة من برنامج Quarkus وأمثلة على استخدامه:

1. تقديم Quarkus: الجيل التالي من إطار عمل Java لـ Kubernetes

بقلم توماس كفارنستروم وجيسون جرين
الهدف من مشروع Quarkus هو إنشاء منصة Java لـ Kubernetes والبيئات التي لا تحتوي على خادم، والجمع بين نماذج البرمجة التفاعلية والحتمية في بيئة تشغيل واحدة حتى يتمكن المطورون من تنويع نهجهم بمرونة عند العمل مع مجموعة واسعة من بنيات التطبيقات الموزعة. تعرف على المزيد في المحاضرة التمهيدية أدناه.

2. كواركوس: جافا دون الذرية فائقة السرعة

بواسطة: بور سوتر
يوضح هذا الفيديو التعليمي من DevNation Live كيفية استخدام Quarkus لتحسين تطبيقات Java للمؤسسات وواجهات برمجة التطبيقات والخدمات الصغيرة والوظائف بدون خادم في بيئة Kubernetes/OpenShift، مما يجعلها أصغر حجمًا وأسرع وأكثر قابلية للتطوير.

3. Quarkus وGraalVM: تسريع السبات إلى سرعات فائقة وتقليصه إلى أحجام دون ذرية

المؤلف: ساني غرينوفيرو
ستتعرف من العرض التقديمي على كيفية ظهور Quarkus، وكيف يعمل، وكيف يسمح لك بإنشاء مكتبات معقدة، مثل Hibernate ORM، المتوافقة مع صور GraalVM الأصلية.

4. تعلم كيفية تطوير التطبيقات بدون خادم

المؤلف: مارتن لوثر
يوضح الفيديو أدناه كيفية إنشاء تطبيق Java بسيط باستخدام Quarkus ونشره كتطبيق بدون خادم على Knative.

5. Quarkus: استمتع بالبرمجة

المؤلف: إدسون ياناجا
دليل فيديو لإنشاء مشروع Quarkus الأول الخاص بك، مما يسمح لك بفهم سبب فوز Quarkus بقلوب المطورين.

6. جافا والحاويات - كيف سيكون مستقبلهم معًا

كتب بواسطة مارك ليتل
يقدم هذا العرض تاريخ Java ويشرح لماذا يعتبر Quarkus مستقبل Java.

7. كواركوس: جافا دون الذرية فائقة السرعة

المؤلف: ديميتريس أندرياديس
نظرة عامة على مزايا Quarkus التي حظيت بتقدير المطورين: البساطة، والسرعات الفائقة، وأفضل المكتبات والمعايير.

8. الكواركوس وأنظمة الصواريخ دون الذرية

المؤلف: كليمنت اسكوفييه
من خلال التكامل مع GraalVM، يوفر Quarkus تجربة تطوير فائقة السرعة وبيئة تشغيل دون ذرية. يتحدث المؤلف عن الجانب التفاعلي من Quarkus وكيفية استخدامه لبناء التطبيقات التفاعلية والمتدفقة.

9. Quarkus والتطوير السريع للتطبيقات في Eclipse MicroProfile

المؤلف: جون كلينجان
من خلال الجمع بين Eclipse MicroProfile وQuarkus، يمكن للمطورين إنشاء تطبيقات MicroProfile كاملة الميزات في حاويات يتم تشغيلها في عشرات المللي ثانية. يتناول الفيديو بالتفصيل كيفية ترميز تطبيق MicroProfile المعبأ في حاوية للنشر على منصة Kubernetes.

10. جافا، الإصدار "Turbo".

المؤلف: ماركوس بيل
يوضح المؤلف كيفية استخدام Quarkus لإنشاء حاويات Java صغيرة جدًا وفائقة السرعة تتيح اختراقات حقيقية، خاصة في البيئات التي لا تحتوي على خادم.



المصدر: www.habr.com

إضافة تعليق