اباتشي إشعال صفر النشر: بالضبط الصفر؟


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


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


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


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


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


لا تجربة حتى الآن ، لذلك أنا بدأت الرقص من الموقد. هذا هو ، مع مراجعة المنشورات.


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


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


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

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


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


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

في ملف xml-config ، أشير إلى أن ذاكرة التخزين المؤقت مقسمة


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

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


قرأت البرنامج التعليمي First Ignite Compute Application ، وأنا أفعل ذلك عن طريق القياس. على كل عقدة من الكتلة أركض IgniteRunnable () ، شيء مثل هذا:


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

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


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


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

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


 SalesPoint sp=salesPointCache.get(spId); 

يقول StackOverflow إن سبب الخطأ هو أن خوادم CentOs لا تحتوي على فئة SalesPoint مخصصة. وصلنا. إذاً ، كيف لا يتعين عليك نشر شفرة جافا يدويًا على كل عقدة وما بعدها؟ أو هو رمز جافا الخاص بك لا حول 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.


يشير مقال عن Habré حول الخدمات الصغيرة إلى ثلاث مقالات لـ Denis Magda: Microservices Part I ، Microservices Part II ، Microservices Part III 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. SingleJar


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


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


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


4. الاستنتاجات


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


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


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

Source: https://habr.com/ru/post/ar472568/


All Articles