Apache NIFI - Tinjauan Singkat tentang Peluang dalam Praktek

pengenalan

Kebetulan di tempat saya bekerja saat ini, saya harus mengenal teknologi ini. Saya akan mulai dengan sedikit latar belakang. Pada pertemuan berikutnya, tim kami diberitahu bahwa kami perlu menciptakan integrasi sistem yang diketahui. Integrasi berarti bahwa sistem terkenal ini akan mengirimi kami permintaan melalui HTTP ke titik akhir tertentu, dan anehnya, kami akan mengirimkan kembali tanggapan dalam bentuk pesan SOAP. Segalanya tampak sederhana dan sepele. Dari sini maka Anda perlu...

Tugas

Buat 3 layanan. Yang pertama adalah Layanan Pembaruan Basis Data. Layanan ini, ketika data baru masuk dari sistem pihak ketiga, memperbarui data dalam database dan menghasilkan file dalam format CSV untuk ditransfer ke sistem berikutnya. Titik akhir dari layanan kedua disebut - Layanan Transportasi FTP, yang menerima file yang ditransfer, memvalidasinya, dan menyimpannya di penyimpanan file melalui FTP. Layanan ketiga, layanan transfer data konsumen, bekerja secara asinkron dengan dua layanan pertama. Ia menerima permintaan dari sistem eksternal pihak ketiga untuk menerima file yang dibahas di atas, mengambil file respons siap pakai, memodifikasinya (memperbarui bidang id, deskripsi, linkToFile) dan mengirimkan respons dalam bentuk pesan SOAP. Artinya, gambaran keseluruhannya adalah sebagai berikut: dua layanan pertama mulai bekerja hanya ketika data untuk pembaruan telah tiba. Layanan ketiga bekerja terus-menerus karena konsumen informasi banyak, sekitar 1000 permintaan data per menit. Layanan tersedia terus-menerus dan instansnya berlokasi di lingkungan yang berbeda, seperti pengujian, demo, praproduksi, dan produksi. Di bawah ini adalah diagram cara kerja layanan ini. Izinkan saya segera mengklarifikasi bahwa beberapa detail telah disederhanakan untuk menghindari kerumitan yang tidak perlu.

Apache NIFI - Tinjauan Singkat tentang Peluang dalam Praktek

Pendalaman Teknis

Ketika merencanakan solusi untuk masalah ini, pertama-tama kami memutuskan untuk membuat aplikasi di Java menggunakan kerangka Spring, penyeimbang Nginx, database Postgres dan hal-hal teknis dan tidak terlalu teknis lainnya. Karena waktu untuk mengembangkan solusi teknis memungkinkan kami mempertimbangkan pendekatan lain untuk memecahkan masalah ini, pandangan kami tertuju pada teknologi Apache NIFI, yang populer di kalangan tertentu. Saya akan segera mengatakan bahwa teknologi ini memungkinkan kita memperhatikan 3 layanan ini. Artikel ini akan menjelaskan tentang perkembangan layanan transportasi file dan layanan transfer data ke konsumen, namun jika artikel ini bermanfaat saya akan menulis tentang layanan pemutakhiran data di database.

Apa ini

NIFI adalah arsitektur terdistribusi untuk pemuatan paralel cepat dan pemrosesan data, sejumlah besar plugin untuk sumber dan transformasi, pembuatan versi konfigurasi, dan banyak lagi. Bonus yang bagus adalah sangat mudah digunakan. Proses sepele seperti getFile, sendHttpRequest, dan lainnya dapat direpresentasikan sebagai kotak. Setiap kotak mewakili suatu proses, interaksinya dapat dilihat pada gambar di bawah. Dokumentasi lebih rinci tentang interaksi pengaturan proses telah ditulis di sini , bagi mereka yang berbicara bahasa Rusia - di sini. Dokumentasinya dengan sempurna menjelaskan cara membongkar dan menjalankan NIFI, serta cara membuat proses, yang juga dikenal sebagai kotak
Ide untuk menulis artikel lahir setelah pencarian panjang dan penataan informasi yang diterima menjadi sesuatu yang disadari, serta keinginan untuk membuat hidup sedikit lebih mudah bagi pengembang masa depan..

Contoh

Contoh bagaimana kotak berinteraksi satu sama lain dipertimbangkan. Skema umumnya cukup sederhana: Kami menerima permintaan HTTP (Secara teori, dengan file di badan permintaan. Untuk mendemonstrasikan kemampuan NIFI, dalam contoh ini permintaan memulai proses penerimaan file dari penyimpanan file lokal ), kemudian kita mengirimkan kembali respon bahwa permintaan telah diterima, bersamaan dengan proses penerimaan file dari FH dan kemudian proses pemindahan melalui FTP ke FH. Perlu diklarifikasi bahwa proses berinteraksi satu sama lain melalui apa yang disebut flowFile. Ini adalah entitas dasar di NIFI yang menyimpan atribut dan konten. Konten adalah data yang diwakili oleh file streaming. Artinya, secara kasar, jika Anda menerima file dari satu kotak dan mentransfernya ke kotak lain, kontennya akan menjadi file Anda.

Apache NIFI - Tinjauan Singkat tentang Peluang dalam Praktek

Seperti yang Anda lihat, gambar ini menunjukkan proses umum. HandleHttpRequest - menerima permintaan, GantiTeks - menghasilkan isi respons, HandleHttpResponse - mengirimkan respons. FetchFile - menerima file dari penyimpanan file, mentransfernya ke kotak PutSftp - menempatkan file ini di FTP, di alamat yang ditentukan. Sekarang lebih banyak tentang proses ini.

Dalam hal ini, permintaan adalah awal dari segalanya. Mari kita lihat parameter konfigurasinya.

Apache NIFI - Tinjauan Singkat tentang Peluang dalam Praktek

Semuanya di sini cukup sepele kecuali StandardHttpContextMap - ini adalah jenis layanan yang memungkinkan Anda mengirim dan menerima permintaan. Lebih detail dan bahkan dengan contoh, Anda dapat melihat - di sini

Selanjutnya, mari kita lihat parameter konfigurasi GantiTeks persegi. Perlu memperhatikan ReplacementValue - inilah yang akan dikembalikan kepada pengguna dalam bentuk respons. Dalam pengaturan Anda dapat menyesuaikan tingkat logging, Anda dapat melihat log {tempat Anda membongkar nifi}/nifi-1.9.2/logs, ada juga parameter kegagalan/sukses - berdasarkan parameter ini Anda dapat mengatur proses secara keseluruhan . Artinya, jika pemrosesan teks berhasil, proses pengiriman respons ke pengguna akan dipanggil, dan jika tidak, kami hanya akan mencatat proses yang gagal.

Apache NIFI - Tinjauan Singkat tentang Peluang dalam Praktek

Tidak ada yang menarik pada properti HandleHttpResponse kecuali status ketika respons berhasil dibuat.

Apache NIFI - Tinjauan Singkat tentang Peluang dalam Praktek

Kami telah memilah permintaan dan tanggapan - mari beralih ke menerima file dan menempatkannya di server FTP. FetchFile - menerima file di jalur yang ditentukan dalam pengaturan dan meneruskannya ke proses selanjutnya.

Apache NIFI - Tinjauan Singkat tentang Peluang dalam Praktek

Dan kemudian kotak PutSftp - menempatkan file di penyimpanan file. Kita dapat melihat parameter konfigurasi di bawah ini.

Apache NIFI - Tinjauan Singkat tentang Peluang dalam Praktek

Perlu diperhatikan fakta bahwa setiap kotak adalah proses terpisah yang harus dijalankan. Kami melihat contoh paling sederhana yang tidak memerlukan penyesuaian rumit. Selanjutnya, kita akan melihat prosesnya sedikit lebih rumit, di mana kita akan menulis sedikit tentang alurnya.

Contoh yang lebih kompleks

Layanan transfer data ke konsumen ternyata sedikit lebih rumit karena proses modifikasi pesan SOAP. Proses umumnya ditunjukkan pada gambar di bawah ini.

Apache NIFI - Tinjauan Singkat tentang Peluang dalam Praktek

Di sini idenya juga tidak terlalu rumit: kami menerima permintaan dari konsumen bahwa dia membutuhkan data, mengirimkan respons bahwa dia telah menerima pesan, memulai proses penerimaan file respons, kemudian mengeditnya dengan logika tertentu, dan kemudian mentransfer file ke konsumen dalam bentuk pesan SOAP ke server.

Saya rasa tidak perlu menjelaskan lagi kotak-kotak yang kita lihat di atas - mari kita langsung ke kotak yang baru. Jika Anda perlu mengedit file apa pun dan kotak tipe GantiTeks biasa tidak cocok, Anda harus menulis skrip Anda sendiri. Ini dapat dilakukan dengan menggunakan kotak ExecuteGroogyScript. Pengaturannya disajikan di bawah ini.

Apache NIFI - Tinjauan Singkat tentang Peluang dalam Praktek

Ada dua opsi untuk memuat skrip ke dalam kotak ini. Yang pertama adalah dengan mendownload file dengan script. Yang kedua adalah dengan memasukkan script ke dalam scriptBody. Sejauh yang saya tahu, kotak eksekusiScript mendukung beberapa bahasa - salah satunya asyik. Saya akan mengecewakan pengembang java - Anda tidak dapat menulis skrip di java dalam kotak seperti itu. Bagi yang benar-benar menginginkannya, Anda perlu membuat kotak kustom Anda sendiri dan menambahkannya ke sistem NIFI. Keseluruhan operasi ini diiringi dengan tarian rebana yang cukup panjang, yang tidak akan kita bahas di artikel ini. Saya memilih bahasa yang asyik. Di bawah ini adalah skrip pengujian yang secara bertahap memperbarui id dalam pesan SOAP. Penting untuk diperhatikan. Anda mengambil file dari flowFile dan memperbaruinya, jangan lupa bahwa Anda harus meletakkannya kembali di sana, diperbarui. Perlu juga dicatat bahwa tidak semua perpustakaan disertakan. Mungkin saja Anda masih harus mengimpor salah satu lib. Kelemahan lainnya adalah skrip di kotak ini cukup sulit untuk di-debug. Ada cara untuk terhubung ke NIFI JVM dan memulai proses debugging. Secara pribadi, saya meluncurkan aplikasi lokal dan melakukan simulasi penerimaan file dari sesi tersebut. Saya juga melakukan debugging secara lokal. Error yang muncul saat memuat skrip cukup mudah di Google dan ditulis oleh NIFI sendiri ke log.

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)
}

Sebenarnya, disinilah kustomisasi kotak berakhir. Selanjutnya, file yang diperbarui ditransfer ke kotak yang bertanggung jawab untuk mengirim file ke server. Di bawah ini adalah pengaturan untuk kotak ini.

Apache NIFI - Tinjauan Singkat tentang Peluang dalam Praktek

Kami menjelaskan metode dimana pesan SOAP akan dikirimkan. Kami menulis di mana. Selanjutnya Anda perlu menunjukkan bahwa ini adalah SOAP.

Apache NIFI - Tinjauan Singkat tentang Peluang dalam Praktek

Tambahkan beberapa properti seperti host dan action (soapAction). Kami menyimpan dan memeriksa. Anda dapat melihat detail lebih lanjut tentang cara mengirim permintaan SOAP di sini

Kami melihat beberapa opsi untuk menggunakan proses NIFI. Bagaimana cara mereka berinteraksi dan apa manfaat sebenarnya? Contoh yang dipertimbangkan adalah contoh uji coba dan sedikit berbeda dari apa yang sebenarnya terjadi dalam pertempuran. Semoga artikel ini sedikit bermanfaat bagi para developer. Terima kasih atas perhatian Anda. Jika Anda memiliki pertanyaan, tulislah. Saya akan mencoba menjawab.

Sumber: www.habr.com

Tambah komentar