مقدمة
لقد حدث أنه في مكان عملي الحالي اضطررت إلى التعرف على هذه التكنولوجيا. سأبدأ بخلفية صغيرة. في المسيرة التالية ، قيل لفريقنا أننا بحاجة إلى إنشاء تكامل مع نظام معروف . يعني التكامل أن هذا النظام المشهور سيرسل لنا طلبات عبر HTTP إلى نقطة نهاية محددة ، ومن الغريب أننا نعيد الردود في شكل رسالة SOAP. يبدو أن كل شيء بسيط وتافه. يتبع ما هو مطلوب ...
مهمة
إنشاء 3 خدمات. أول واحد هو خدمة تحديث قاعدة البيانات. عند وصول هذه البيانات الجديدة من نظام جهة خارجية ، تقوم هذه الخدمة بتحديث البيانات في قاعدة البيانات وإنشاء ملف CSV معين لنقله إلى النظام التالي. يُطلق على نقطة نهاية الخدمة الثانية - خدمة نقل FTP ، التي تستقبل الملف المنقول ، وتقوم بالتحقق من صحتها ، وتضعها في تخزين الملفات عبر FTP. تعمل الخدمة الثالثة ، وهي خدمة نقل البيانات للمستهلك ، بشكل غير متزامن مع الأولين. يتلقى طلبًا من نظام خارجي تابع لجهة خارجية ، لاستلام الملف الذي تمت مناقشته أعلاه ، ويأخذ ملف الاستجابة النهائي ، ويعدله (يقوم بتحديث المعرّف والوصف وحقول linkToFile) ويرسل الاستجابة في شكل رسالة SOAP. بمعنى أن الصورة الإجمالية هي كالتالي: تبدأ أول خدمتين عملها فقط عند وصول بيانات التحديث. تعمل الخدمة الثالثة باستمرار حيث يوجد الكثير من مستهلكي المعلومات ، حوالي 1000 طلب لتلقي البيانات في الدقيقة. الخدمات متوفرة باستمرار ومثيلاتها موجودة في بيئات مختلفة ، مثل الاختبار والعرض التجريبي و proprod و prod. يوجد أدناه رسم تخطيطي لعمل هذه الخدمات. سأوضح على الفور أن بعض التفاصيل مبسطة لتجنب التعقيد غير الضروري.

تعميق التقنية
عند التخطيط لحل المشكلة ، قررنا أولاً إنشاء تطبيقات جافا باستخدام إطار Spring ، وموازن Nginx ، وقاعدة بيانات Postgres ، وغيرها من الأمور الفنية وليس الأشياء ذاتها. منذ أن سمح لنا الوقت لتطوير حل تقني بالنظر في طرق أخرى لحل هذه المشكلة ، سقطت عيني على تقنية Apache NIFI ، وهي عصرية في بعض الدوائر. يجب أن أقول على الفور أن هذه التكنولوجيا سمحت لنا أن نلاحظ هذه الخدمات 3. سوف تصف هذه المقالة تطوير خدمة نقل الملفات وخدمة نقل البيانات إلى المستهلك ، ومع ذلك ، إذا ظهرت هذه المقالة ، فسوف أكتب عن خدمة تحديث البيانات في قاعدة البيانات.
ما هذا
NIFI عبارة عن بنية موزعة لتحميل ومعالجة البيانات بشكل متوازٍ سريع ، وعدد كبير من المكونات الإضافية للمصادر والتحويلات ، وتكوينات الإصدارات وأكثر من ذلك بكثير. مكافأة لطيفة هي أنه من السهل جدا للاستخدام. يمكن تمثيل العمليات البسيطة ، مثل getFile و sendHttpRequest وغيرها ، كمربعات. يمثل كل مربع عملية معينة ، يمكن رؤية تفاعلها في الشكل أدناه. وثائق أكثر تفصيلا عن تفاعل ضبط العملية هو مكتوب هنا. ، لأولئك الذين هم باللغة الروسية - هنا . تصف الوثائق تمامًا كيفية فك حزم وتشغيل NIFI ، وكذلك كيفية إنشاء عمليات ، فهي مربعات
ولدت فكرة كتابة مقال بعد بحث طويل وهيكلة المعلومات الواردة في شيء واع ، وكذلك الرغبة في جعل الحياة أسهل للمطورين في المستقبل ..
مثال
مثال على كيفية تفاعل المربعات مع بعضها البعض. المخطط العام بسيط للغاية: نحصل على طلب HTTP (نظريًا ، مع وجود ملف في نص الطلب. لإظهار قدرات NIFI ، في هذا المثال ، يبدأ الطلب عملية استلام الملف من PF المحلي) ، ثم نعيد الرد الذي تم استلام الطلب منه ، عملية استلام الملف من FH ثم عملية نقله عبر FTP إلى FH. تجدر الإشارة إلى أن العمليات تتفاعل مع بعضها البعض من خلال ما يسمى flowFile. هذا هو الكيان الأساسي في NIFI الذي يخزن السمات والمحتوى. المحتوى هو البيانات التي يمثلها ملف الدفق. بمعنى تقريبي ، إذا تلقيت ملفًا من مربع واحد ونقلته إلى مربع آخر ، فسيكون المحتوى هو ملفك.

كما ترون ، هذا الرقم يصور العملية الشاملة. HandleHttpRequest - يقبل الطلبات ، ReplaceText - ينشئ هيئة استجابة ، ويعيد HandleHttpResponse - استجابة. FetchFile - يستقبل ملف من تخزين الملفات وينقله إلى ميدان PutSftp - يضع هذا الملف على FTP على العنوان المحدد. الآن المزيد عن هذه العملية.
في هذه الحالة ، يعد الطلب بداية كل شيء. دعونا نرى خيارات التكوين الخاصة به.

كل شيء هنا بسيط إلى حد ما باستثناء StandartHttpContextMap - هذه خدمة تتيح لك إرسال واستقبال الطلبات. يمكنك رؤية المزيد من التفاصيل وحتى الأمثلة
هنا بعد ذلك ، راجع خيارات تكوين مربع ReplaceText. يجدر الانتباه إلى ReplacementValue - هذا ما سيعود إلى المستخدم في شكل إجابة. في الإعدادات ، يمكنك ضبط مستوى التسجيل ، ويمكن الاطلاع على السجلات {حيث تم فك حزم nifi} /nifi-1.9.2/logs وهناك أيضًا معلمات الفشل / النجاح - استنادًا إلى هذه المعلمات ، يمكنك التحكم في العملية برمتها. وهذا هو ، في حالة نجاح معالجة النصوص ، يتم استدعاء عملية إرسال استجابة إلى المستخدم ، وفي الحالة الأخرى ، نتعهد ببساطة بالعملية الفاشلة.

لا تملك خصائص HandleHttpResponse أي شيء خاص باستثناء حالة إنشاء استجابة ناجحة.

قمنا بفرز الطلب بالإجابة - دعنا ننتقل إلى تلقي الملف ووضعه على خادم FTP. FetchFile - يستقبل الملف في المسار المحدد في الإعدادات وينقله إلى العملية التالية.

ثم مربع PutSftp - يضع الملف في تخزين الملفات. معلمات التكوين يمكن أن ينظر إليها أدناه.

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

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

هناك خياران لتحميل البرنامج النصي في هذا المربع. الأول هو عن طريق تحميل ملف البرنامج النصي. والثاني هو عن طريق إدخال برنامج نصي في scriptBody. بقدر ما أعرف ، يدعم مربع executeScript العديد من ملفات JP - أحدها رائع. أنا محبط لمطوري جافا - لا يمكنك كتابة نصوص في هذه المربعات في جافا. بالنسبة لأولئك الذين يريدون حقًا - تحتاج إلى إنشاء مربع مخصص خاص بك ورميه في نظام NIFI. هذه العملية برمتها مصحوبة برقصات طويلة إلى حد ما مع الدف ، والتي لن نتعامل معها في إطار هذه المقالة. اخترت لغة رائع. في ما يلي نص برمجي للاختبار يقوم ببساطة بتحديث المعرّف في رسالة SOAP. من المهم أن نلاحظ. يمكنك أخذ الملف من ملف flowFile وتحديثه ولا تنس أنك بحاجة إليه وتحديثه وإعادته إلى هناك. تجدر الإشارة أيضًا إلى أنه ليس كل المكتبات متصلة. قد يحدث أنه لا يزال يتعين عليك استيراد واحدة من الشفاه. الجانب السلبي هو أن البرنامج النصي في هذا المربع من الصعب جدا لاول مرة. هناك طريقة للاتصال بـ JVM NIFI وبدء عملية تصحيح الأخطاء. شخصيا ، قمت بتشغيل تطبيق محلي ومحاكاة الحصول على ملف من جلسة. تم التصحيح أيضًا محليًا. الأخطاء التي تحدث عند تحميل البرنامج النصي سهلة للغاية بالنسبة إلى google وتتم كتابتها بواسطة NIFI في السجل.
import org.apache.commons.io.IOUtils import groovy.xml.XmlUtil import java.nio.charset.* import groovy.xml.StreamingMarkupBuilder def flowFile = session.get() if (!flowFile) return try { flowFile = session.write(flowFile, { inputStream, outputStream -> String result = IOUtils.toString(inputStream, "UTF-8"); def recordIn = new XmlSlurper().parseText(result) def element = recordIn.depthFirst().find { it.name() == 'id' } def newId = Integer.parseInt(element.toString()) + 1 def recordOut = new XmlSlurper().parseText(result) recordOut.Body.ClientMessage.RequestMessage.RequestContent.content.MessagePrimaryContent.ResponseBody.id = newId def res = new StreamingMarkupBuilder().bind { mkp.yield recordOut }.toString() outputStream.write(res.getBytes(StandardCharsets.UTF_8)) } as StreamCallback) session.transfer(flowFile, REL_SUCCESS) } catch(Exception e) { log.error("Error during processing of validate.groovy", e) session.transfer(flowFile, REL_FAILURE) }
في الواقع على هذا التخصيص ينتهي مربع. بعد ذلك ، يتم نقل الملف المحدّث إلى المربع ، والذي يشارك في إرسال الملف إلى الخادم. فيما يلي الإعدادات لهذا المربع.

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

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