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

نخطط هذا العام لتطوير مواضيع الحاويات بجدية ، Java-Native Java و Kubernetes . استمرار منطقي لهذه المواضيع سيكون القصة حول إطار Quarkus ، الذي تم النظر فيه بالفعل في حبري. لا تركز مقالة اليوم كثيرًا على "جهاز جافا فائق السرعة دون الذري" مثل المنظورات التي يقدمها Quarkus إلى Enterprise. (بالمناسبة ، قم بالتسجيل وانتقل إلى ندوة الويب الخاصة بنا " هذا هو Quarkus - Kubernetes الأصلي Java Framework Framework " ، الذي سيعقد في 27 مايو . سنوضح كيفية البدء من الصفر أو نقل الحلول الجاهزة)



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

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


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

سنخبر اليوم كيف يجمع Quarkus بين نماذج البرمجة الحتمية والتفاعلية القائمة على نواة تفاعلية واحدة. نبدأ بتاريخًا موجزًا ​​، ثم نلقي نظرة فاحصة على رد فعل النواة المزدوجة لـ Quarkus وكيف يمكن لمطوري Java الاستفادة من ذلك.

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

أولاً ، دعنا ننتقل إلى القصة.


الجداول والحاويات


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

نفاد الذاكرة


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

الحصص والقيود


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

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


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

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

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


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

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

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

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

إدخال Quarkus


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

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

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



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



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

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


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

موارد مفيدة




10 دروس فيديو Quarkus للراحة مع هذا الموضوع


وفقًا لموقع Quarkus.io ، فإن Quarkus عبارة عن حزمة Java موجهة إلى Kubernetes مصممة خصيصًا لـ GraalVM و OpenJDK HotSpot وتم تجميعها من أفضل مكتبات ومعايير Java.

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

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


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



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


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



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


المؤلف: Sane Grinovero
من العرض التقديمي سوف تتعلم كيف ظهر Quarkus وكيف يعمل وكيف يسمح لك بجعل المكتبات المعقدة مثل Hibernate ORM متوافقة مع الصور الأصلية GraalVM.



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


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



5. Quarkus: كود بسرور


تم النشر بواسطة Edson Yanaga
Wideguide لإنشاء أول مشروع لـ Quarkus لفهم سبب فوز Quarkus بقلوب المطورين.



6. الجافا والحاويات - ماذا سيكون مستقبلهم المشترك



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



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


المؤلف: Dimitris Andreadis Dimitris Andreadis
نظرة عامة على مطوري Quarkus المشهود لهم: البساطة والسرعات الفائقة والمكتبات والمعايير العليا.



8. Quarkus والأنظمة التفاعلية دون الذرية


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



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


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



10. جافا ، إصدار توربو


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


All Articles