Apache Ignite Zero Deployment: هل هو صفر حقًا؟

Apache Ignite Zero Deployment: هل هو صفر حقًا؟

نحن قسم تطوير التكنولوجيا لشبكة البيع بالتجزئة. في أحد الأيام، كلفت الإدارة بمهمة تسريع العمليات الحسابية واسعة النطاق باستخدام Apache Ignite بالاشتراك مع MSSQL، وأظهرت موقعًا على شبكة الإنترنت يحتوي على رسوم توضيحية جميلة وأمثلة لرمز Java. أعجبني الموقع على الفور النشر صفر، الذي يعد وصفه بالمعجزات: ليس عليك نشر تعليمات Java أو Scala يدويًا على كل عقدة في الشبكة وإعادة نشرها في كل مرة تتغير فيها. مع تقدم العمل، اتضح أن Zero Deployment له استخدامات محددة، وأريد أن أشارككم ميزاتها. أسفل القطع توجد أفكار وتفاصيل التنفيذ.

1. بيان المشكلة

جوهر المشكلة هو على النحو التالي. يوجد دليل نقاط مبيعات SalesPoint ودليل منتجات Sku (وحدة حفظ المخزون). تحتوي نقطة البيع على سمة "نوع المتجر" بالقيمتين "صغير" و"كبير". يتم ربط مجموعة متنوعة (قائمة منتجات نقطة البيع) بكل نقطة بيع (يتم تحميلها من نظام إدارة قواعد البيانات) ويتم توفير المعلومات أنه اعتبارًا من التاريخ المحدد المنتج المحدد
مستبعدة من التشكيلة أو مضافة إلى التشكيلة.

مطلوب تنظيم ذاكرة تخزين مؤقت مقسمة لنقاط البيع وتخزين معلومات حول المنتجات المتصلة فيها لمدة شهر مقدمًا. يتطلب التوافق مع نظام القتال أن تقوم عقدة عميل Ignite بتحميل البيانات، وحساب إجمالي النموذج (نوع المتجر، رمز المنتج، اليوم، عدد_نقاط_المبيعات) وتحميلها مرة أخرى إلى نظام إدارة قواعد البيانات.

2. دراسة الأدب

ليس لدي أي خبرة بعد، لذلك بدأت بالرقص من الموقد. وهذا هو، من مراجعة المنشورات.

مقال 2016 تقديم أباتشي إغنايت: الخطوات الأولى يحتوي على رابط لتوثيق مشروع Apache Ignite وفي نفس الوقت لوم على غموض هذه الوثائق. أعيد قراءتها عدة مرات، لا يأتي الوضوح. وأشير إلى البرنامج التعليمي الرسمي ابدءالتي
يعد بتفاؤل "سوف تكون جاهزًا للعمل في لمح البصر!" أنا أكتشف إعدادات متغير البيئة، وأشاهد مقطعي فيديو لـ Apache Ignite Essentials، لكنهما لم يكونا مفيدًا جدًا لمهمتي المحددة. لقد نجحت في تشغيل Ignite من سطر الأوامر باستخدام الملف القياسي "example-ignite.xml"، وإنشاء التطبيق الأول تطبيق حسابي باستخدام مافن. التطبيق يعمل ويستخدم Zero Deployment، يا له من جمال!

قرأت المزيد، وهناك يستخدم المثال على الفور مفتاح التقارب (الذي تم إنشاؤه مسبقًا من خلال استعلام SQL)، ويستخدم أيضًا BinaryObject الغامض:

IgniteCache<BinaryObject, BinaryObject> people 
        = ignite.cache("Person").withKeepBinary(); 

يقرأ قليلا: تنسيق ثنائي - شيء مثل الانعكاس، والوصول إلى حقول الكائن بالاسم. يمكن قراءة قيمة الحقل دون إلغاء تسلسل الكائن بالكامل (حفظ الذاكرة). ولكن لماذا يتم استخدام BinaryObject بدلاً من الشخص، حيث لا يوجد أي نشر؟ لماذا إجنايت كاش تم النقل إلى IgniteCache ؟ ليس واضحا بعد.

أقوم بإعادة إنشاء تطبيق الحوسبة ليناسب حالتي. يتم تعريف المفتاح الأساسي لدليل نقاط البيع في MSSQL على أنه [id] [int] وليس NULL، أقوم بإنشاء ذاكرة تخزين مؤقت عن طريق القياس

IgniteCache<Integer, SalesPoint> salesPointCache=ignite.cache("spCache")

في تكوين XML أشير إلى أن ذاكرة التخزين المؤقت مقسمة

<bean class="org.apache.ignite.configuration.CacheConfiguration">
    <property name="name" value="spCache"/>
    <property name="cacheMode" value="PARTITIONED"/>
</bean>

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

أنا أقرأ البرنامج التعليمي أول تطبيق حسابي إشعالأفعل ذلك عن طريق القياس. على كل عقدة نظام قم بتشغيل IgniteRunnable()، شيء من هذا القبيل:

  @Override
  public void run() {
    SalesPoint sp=salesPointCache.get(spId);
    sp.calculateSalesPointCount();
    ..
  }

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

أقوم بتشغيل خادمي اختبار CentOs، وتحديد عناوين IP في ملف default-config.xml، وتنفيذهما على كل منهما

./bin/ignite.sh config/default-config.xml

كلتا عقدتي Ignite قيد التشغيل ويمكنهما رؤية بعضهما البعض. أقوم بتحديد العناوين المطلوبة في تكوين XML لتطبيق العميل، ويبدأ، ويضيف عقدة ثالثة إلى الهيكل وعلى الفور هناك عقدتان مرة أخرى. يعرض السجل "ClassNotFoundException: model.SalesPoint" في السطر

SalesPoint sp=salesPointCache.get(spId);

يقول StackOverflow أن سبب الخطأ هو عدم وجود فئة SalesPoint مخصصة على خوادم CentOs. لقد وصلنا. ماذا عن "ليس عليك نشر تعليمات Java البرمجية يدويًا على كل عقدة" وما إلى ذلك؟ أم أن "كود Java الخاص بك" لا يتعلق بـ SalesPoint؟

ربما فاتني شيء ما - أبدأ في البحث مرة أخرى، والقراءة والبحث مرة أخرى. وبعد فترة أشعر بأني قرأت كل ما يتعلق بالموضوع، ولم يعد هناك أي جديد. أثناء بحثي وجدت بعض التعليقات المثيرة للاهتمام.

فالنتين كوليتشينكومهندس رئيسي في شركة GridGain Systems، إجابة في StackOverflow، أبريل 2016:

Model classes are not peer deployed, but you can use withKeepBinary() flag
on the cache and query BinaryObjects. This way you will avoid deserialization
on the server side and will not get ClassNotFoundException.

رأي رسمي آخر: دينيس ماجدة، مدير إدارة المنتجات، GridGain Systems.

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

That's it. Start (..)  node using MaintenanceServiceNodeStartup file or pass
maintenance-service-node-config.xml to Apache Ignite's ignite.sh/bat scripts.
If you prefer the latter then make sure to build a jar file that will contain
all the classes from java/app/common and java/services/maintenance directories.
The jar has to be added to the classpath of every node where the service
might be deployed.

في الواقع، هذا كل شيء. وهنا يتبين لماذا هذا التنسيق الثنائي الغامض!

3. جرة واحدة

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

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

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

4 - نتائج

تبين أن التوبيخ الأول الذي واجهنا بشأن غموض وثائق مشروع Apache Ignite كان عادلاً، ولم يتغير الكثير منذ عام 2016. ليس من السهل على المبتدئ تجميع نموذج أولي فعال استنادًا إلى موقع ويب و/أو مستودع.

بناء على نتائج العمل المنجز، كان الانطباع بأن النشر الصفري يعمل، ولكن فقط على مستوى النظام. شيء من هذا القبيل: يتم استخدام BinaryObject لتعليم عقد المجموعة البعيدة كيفية العمل مع الفئات المخصصة؛ النشر الصفري - الآلية الداخلية
يقوم Apache Ignite بنفسه بتوزيع كائنات النظام في جميع أنحاء المجموعة.

آمل أن تكون تجربتي مفيدة لمستخدمي Apache Ignite الجدد.

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

إضافة تعليق