Pendahuluan
Kebetulan di tempat kerja saya saat ini saya harus berkenalan dengan teknologi ini. Saya akan mulai dengan sedikit latar belakang. Pada rapat umum berikutnya, tim kami diberitahu bahwa kami perlu menciptakan integrasi dengan sistem yang terkenal . Integrasi berarti bahwa sistem terkenal ini akan mengirimi kami permintaan melalui HTTP ke titik akhir tertentu, dan kami, anehnya, mengirim kembali respons dalam bentuk pesan SOAP. Segalanya tampak sederhana dan sepele. Ini mengikuti apa yang dibutuhkan ...
Tantangan
Buat 3 layanan. Yang pertama adalah Layanan Pembaruan Database. Layanan ini, ketika data baru datang dari sistem pihak ketiga, memperbarui data dalam database dan menghasilkan file tertentu dalam format CSV untuk mentransfernya ke sistem berikutnya. Titik akhir dari layanan kedua disebut - Layanan Transportasi FTP, yang menerima file yang ditransfer, memvalidasinya, dan memasukkannya ke penyimpanan file melalui FTP. Layanan ketiga, Layanan Transfer Data ke konsumen, bekerja secara serempak dengan dua yang pertama. Ini menerima permintaan dari sistem eksternal pihak ketiga, untuk menerima file yang dibahas di atas, mengambil file respon yang selesai, memodifikasinya (memperbarui id, deskripsi, bidang linkToFile) dan mengirimkan respons dalam bentuk pesan SOAP. Yaitu, gambaran keseluruhan adalah sebagai berikut: dua layanan pertama memulai pekerjaan mereka hanya ketika data untuk memperbarui telah tiba. Layanan ketiga bekerja terus-menerus karena ada banyak konsumen informasi, sekitar 1000 permintaan data per menit. Layanan selalu tersedia dan instans mereka berada di lingkungan yang berbeda, seperti tes, demo, praproduk dan prod. Di bawah ini adalah diagram dari karya layanan ini. Saya akan segera menjelaskan bahwa beberapa detail disederhanakan untuk menghindari kompleksitas yang tidak perlu.

Pendalaman teknis
Ketika merencanakan solusi untuk masalah ini, pertama-tama kami memutuskan untuk membuat aplikasi java menggunakan kerangka kerja Spring, penyeimbang Nginx, database Postgres, dan hal-hal teknis lainnya dan tidak terlalu penting. Karena waktu untuk mengembangkan solusi teknis memungkinkan kami untuk mempertimbangkan pendekatan lain untuk menyelesaikan masalah ini, mata saya tertuju pada teknologi Apache NIFI, modis di kalangan tertentu. Saya harus segera mengatakan bahwa teknologi ini memungkinkan kami untuk memperhatikan 3 layanan ini. Artikel ini akan menjelaskan pengembangan layanan transfer file dan layanan transfer data ke konsumen, namun, jika artikel tersebut masuk, saya akan menulis tentang layanan pembaruan data dalam database.
Apa ini
NIFI adalah arsitektur terdistribusi untuk pemuatan paralel dan pemrosesan data yang cepat, sejumlah besar plug-in untuk sumber dan transformasi, konfigurasi versi, dan banyak lagi. Bonus yang bagus adalah sangat mudah digunakan. Proses sepele, seperti getFile, sendHttpRequest dan lainnya, dapat direpresentasikan sebagai kotak. Setiap kotak mewakili proses tertentu, interaksi yang dapat dilihat pada gambar di bawah ini. Dokumentasi yang lebih terperinci tentang interaksi penyetelan proses ditulis di sini. , bagi mereka yang berada di Rusia - di sini . Dokumentasi dengan sempurna menjelaskan cara membongkar dan menjalankan NIFI, serta cara membuat proses, mereka adalah kotak
Gagasan untuk menulis artikel lahir setelah pencarian panjang dan penataan informasi yang diterima dalam sesuatu yang disadari, serta keinginan untuk membuat hidup lebih mudah bagi pengembang masa depan ..
Contoh
Contoh bagaimana kotak berinteraksi satu sama lain dipertimbangkan. Skema umum cukup sederhana: Kami mendapatkan permintaan HTTP (Secara teori, dengan file di badan permintaan. Untuk menunjukkan kemampuan NIFI, dalam contoh ini, permintaan memulai proses penerimaan file dari PF lokal), lalu kami mengirim kembali respons bahwa permintaan diterima, proses penerimaan file dari FH lalu proses memindahkannya melalui FTP ke FH. Perlu dijelaskan 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 aliran. Secara kasar, jika Anda menerima file dari satu kotak dan mentransfernya ke yang lain, konten akan menjadi file Anda.

Seperti yang Anda lihat, angka ini menggambarkan keseluruhan proses. HandleHttpRequest - menerima permintaan, ReplaceText - menghasilkan badan respons, HandleHttpResponse - mengembalikan respons. FetchFile - menerima file dari penyimpanan file dan mentransfernya ke kotak PutSftp - menempatkan file ini di FTP pada alamat yang ditentukan. Sekarang, lebih lanjut tentang proses ini.
Dalam hal ini, permintaan adalah awal dari segalanya. Mari kita lihat opsi konfigurasinya.

Semuanya di sini cukup sepele dengan pengecualian StandartHttpContextMap - ini adalah layanan yang memungkinkan Anda untuk mengirim dan menerima permintaan. Anda dapat melihat lebih banyak detail dan bahkan contoh
di sini Selanjutnya, lihat opsi konfigurasi kotak ReplaceText. Perlu memperhatikan ReplacementValue - inilah yang akan kembali kepada pengguna dalam bentuk jawaban. Dalam pengaturan Anda dapat menyesuaikan tingkat pencatatan, log dapat dilihat {di mana nifi dibongkar} /nifi-1.9.2/log ada juga parameter kegagalan / keberhasilan - berdasarkan pada parameter ini Anda dapat mengontrol proses secara keseluruhan. Yaitu, dalam kasus pemrosesan teks yang sukses, proses pengiriman respons ke pengguna dipanggil, dan dalam kasus lain, kami hanya menjanjikan proses yang tidak berhasil.

Properti HandleHttpResponse tidak memiliki status khusus selain status untuk pembuatan respons yang berhasil.

Kami menyortir permintaan dengan jawabannya - mari beralih ke menerima file dan menempatkannya di server FTP. FetchFile - menerima file di jalur yang ditentukan dalam pengaturan dan mentransfernya ke proses selanjutnya.

Dan kemudian persegi PutSftp - menempatkan file dalam penyimpanan file. Parameter konfigurasi dapat dilihat di bawah ini.

Perlu memperhatikan fakta bahwa setiap kotak adalah proses terpisah yang harus dimulai. Kami memeriksa contoh paling sederhana yang tidak memerlukan penyesuaian yang rumit. Selanjutnya, pertimbangkan prosesnya sedikit lebih rumit, di mana kita menulis sedikit pada alurnya.
Contoh yang lebih kompleks
Layanan transfer data ke konsumen ternyata sedikit lebih rumit karena proses memodifikasi pesan SOAP. Keseluruhan proses disajikan pada gambar di bawah ini.

Di sini, idenya juga tidak terlalu rumit: kami menerima permintaan dari konsumen bahwa mereka membutuhkan data, mengirim respons bahwa mereka 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 pikir itu tidak layak menggambarkan lagi kotak yang kita lihat di atas - kita akan langsung ke yang baru. Jika Anda perlu mengedit file dan kotak biasa seperti ReplaceText tidak cocok, Anda harus menulis skrip Anda sendiri. Ini dapat dilakukan dengan menggunakan kotak ExecuteGroogyScriptScript. Pengaturannya disajikan di bawah ini.

Ada dua opsi untuk memuat skrip ke dalam kotak ini. Yang pertama adalah dengan memuat file skrip. Yang kedua adalah dengan memasukkan skrip ke dalam scriptBody. Sejauh yang saya tahu, mengeksekusi kotak mendukung beberapa JPs - salah satunya adalah asyik. Saya mengecewakan pengembang java - Anda tidak dapat menulis skrip dalam kotak seperti itu di java. Bagi mereka yang benar-benar ingin - Anda perlu membuat kuadrat sendiri dan melemparkannya ke sistem NIFI. Seluruh operasi ini disertai dengan tarian yang agak panjang dengan rebana, yang tidak akan kita bahas dalam kerangka artikel ini. Saya memilih bahasa asyik. Di bawah ini adalah skrip pengujian yang secara bertahap memperbarui id dalam pesan SOAP. Penting untuk diperhatikan. Anda mengambil file dari flowFile, memperbaruinya, jangan lupa bahwa Anda membutuhkannya, diperbarui, taruh kembali ke sana. Perlu juga dicatat bahwa tidak semua perpustakaan terhubung. Mungkin saja Anda masih harus mengimpor salah satu lib. Kelemahannya adalah skrip di kotak ini cukup sulit untuk debut. Ada cara untuk terhubung ke JVM NIFI dan memulai proses debugging. Secara pribadi, saya menjalankan aplikasi lokal dan disimulasikan mendapatkan file dari sesi. Debugging juga dilakukan secara lokal. Kesalahan yang keluar saat memuat skrip cukup mudah untuk google dan ditulis oleh NIFI 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 pada ini kustomisasi ujung persegi. Selanjutnya, file yang diperbarui ditransfer ke alun-alun, yang terlibat dalam mengirim file ke server. Berikut adalah pengaturan untuk kotak ini.

Kami menjelaskan metode pengiriman pesan SOAP. Kami menulis ke mana. Selanjutnya, Anda perlu menunjukkan bahwa ini persis SABUN.

Tambahkan beberapa properti seperti host dan action (soapAction). Simpan, periksa. Rincian lebih lanjut tentang cara mengirim permintaan SOAP dapat ditemukan di sini.
Kami melihat beberapa penggunaan proses NIFI. Bagaimana mereka berinteraksi dan apa manfaat nyata yang mereka miliki. Contoh-contoh yang dipertimbangkan adalah yang uji dan sedikit berbeda dari apa yang nyata dalam pertempuran. Saya harap artikel ini akan sedikit bermanfaat bagi pengembang. Terima kasih atas perhatian anda Jika Anda memiliki pertanyaan - tulis. Saya akan mencoba menjawab.