Apache NIFI - نظرة عامة موجزة عن الفرص في الممارسة

مقدمة

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

مهمة

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

Apache NIFI - نظرة عامة موجزة عن الفرص في الممارسة

التعميق الفني

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

ما هذا؟

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

مثال

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

Apache NIFI - نظرة عامة موجزة عن الفرص في الممارسة

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

في هذه الحالة ، يكون الطلب هو بداية كل شيء. دعونا نرى خيارات التكوين الخاصة به.

Apache NIFI - نظرة عامة موجزة عن الفرص في الممارسة

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

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

Apache NIFI - نظرة عامة موجزة عن الفرص في الممارسة

لا يوجد شيء مثير للاهتمام بشكل خاص في خصائص HandleHttpResponse ، باستثناء الحالة التي تم فيها إنشاء الاستجابة بنجاح.

Apache NIFI - نظرة عامة موجزة عن الفرص في الممارسة

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

Apache NIFI - نظرة عامة موجزة عن الفرص في الممارسة

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

Apache NIFI - نظرة عامة موجزة عن الفرص في الممارسة

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

مثال أكثر تعقيدا

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

Apache NIFI - نظرة عامة موجزة عن الفرص في الممارسة

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

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

Apache NIFI - نظرة عامة موجزة عن الفرص في الممارسة

هناك خياران لتحميل البرنامج النصي في هذا المربع. الأول هو تحميل ملف بنص. والثاني هو إدخال البرنامج النصي في scriptBody. بقدر ما أعرف ، يدعم مربع executeScript عدة PLs - واحد منهم رائع. سأخيب ظن مطوري جافا - لا يمكنك كتابة نصوص بلغة جافا في مثل هذه المربعات. بالنسبة لأولئك الذين يرغبون حقًا في ذلك ، فأنت بحاجة إلى إنشاء مربع مخصص خاص بك وإلقائه في نظام NIFI. هذه العملية برمتها مصحوبة برقصات طويلة إلى حد ما مع الدف ، والتي لن نتعامل معها في هذا المقال. اخترت اللغة الرائعة. يوجد أدناه برنامج نصي للاختبار يقوم ببساطة بتحديث المعرف في رسالة SOAP بشكل تدريجي. من المهم أن نلاحظ. تأخذ ملفًا من flowFile وتقوم بتحديثه ، لا تنس أنك بحاجة إليه وتحديثه وإعادته إلى هناك. وتجدر الإشارة أيضًا إلى أنه ليست كل المكتبات متصلة ببعضها البعض. قد يتبين أنه لا يزال يتعين عليك استيراد أحد libs. الجانب السلبي هو أنه من الصعب جدًا تصحيح البرنامج النصي في هذا المربع. توجد طريقة للاتصال بـ NIFI JVM وبدء عملية التصحيح. أنا شخصياً قمت بتشغيل تطبيق محلي ومحاكاة الحصول على ملف من الجلسة. تم التصحيح أيضًا محليًا. الأخطاء التي تظهر عند تحميل البرنامج النصي من السهل جدًا على 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)
}

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

Apache NIFI - نظرة عامة موجزة عن الفرص في الممارسة

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

Apache NIFI - نظرة عامة موجزة عن الفرص في الممارسة

نضيف بعض الخصائص مثل host and action (soapAction). حفظ ، تحقق. لمزيد من التفاصيل حول كيفية إرسال طلبات SOAP ، راجع هنا

لقد درسنا عدة خيارات لاستخدام عمليات NIFI. كيف يتفاعلون وما هي الفوائد الحقيقية لهم. الأمثلة المدروسة هي أمثلة اختبارية وتختلف قليلاً عما هو حقيقي في القتال. آمل أن يكون هذا المقال مفيدًا للمطورين. شكرًا لكم على اهتمامكم. إذا كان لديك أي أسئلة - اكتب. سأحاول الإجابة.

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

إضافة تعليق