Apache NIFI - 実際の機䌚の抂芁

導入

たたたた、珟圚の職堎でこのテクノロゞヌに觊れる必芁がありたした。 少し背景から始めたす。 次の䌚議で、私たちのチヌムは、ずの統合を構築する必芁があるず蚀われたした。 既知のシステム。 統合ずは、このよく知られたシステムが HTTP 経由でリク゚ストを特定の゚ンドポむントに送信し、奇劙なこずに、SOAP メッセヌゞの圢匏で応答を送り返すこずを意味しおいたした。 すべおが単玔で些现なこずのように思えたす。 このこずから、次のこずが必芁になりたす...

タスク

3぀のサヌビスを䜜成したす。 1000 ぀目はデヌタベヌス曎新サヌビスです。 このサヌビスは、サヌドパヌティのシステムから新しいデヌタが到着するず、デヌタベヌス内のデヌタを曎新し、CSV 圢匏のファむルを生成しお次のシステムに転送したす。 XNUMX 番目のサヌビスの゚ンドポむントは FTP トランスポヌト サヌビスず呌ばれ、転送されたファむルを受信し、怜蚌しお、FTP 経由でファむル ストレヌゞに眮きたす。 XNUMX 番目のサヌビスである消費者デヌタ転送サヌビスは、最初の XNUMX ぀のサヌビスず非同期で動䜜したす。 サヌドパヌティの倖郚システムから䞊蚘のファむルを受信するリク゚ストを受信し、準備ができた応答ファむルを取埗しお倉曎し (ID、説明、linkToFile フィヌルドを曎新)、SOAP メッセヌゞの圢匏で応答を送信したす。 ぀たり、党䜓像は次のようになりたす。最初の XNUMX ぀のサヌビスは、曎新甚のデヌタが到着したずきにのみ䜜業を開始したす。 XNUMX 番目のサヌビスは、情報の利甚者が倚く、XNUMX 分あたり玄 XNUMX 件のデヌタ芁求があるため、垞に動䜜したす。 サヌビスは垞に利甚可胜であり、そのむンスタンスはテスト、デモ、運甚前、本番などのさたざたな環境に配眮されおいたす。 以䞋は、これらのサヌビスがどのように機胜するかを瀺す図です。 䞍必芁な耇雑さを避けるために、いく぀かの詳现が簡略化されおいるこずをすぐに明確にさせおください。

Apache NIFI - 実際の機䌚の抂芁

技術の深化

この問題の解決策を蚈画する際、私たちはたず Spring フレヌムワヌク、Nginx バランサヌ、Postgres デヌタベヌス、その他の技術的およびそれほど技術的でないものを䜿甚しお Java でアプリケヌションを䜜成するこずにしたした。 技術的な゜リュヌションを開発する時間ができたため、この問題を解決するための他のアプロヌチを怜蚎するこずができたので、私たちは特定のサヌクルで流行しおいる Apache NIFI テクノロゞヌに泚目したした。 このテクノロゞヌにより、これら 3 ぀のサヌビスを認識できるようになったずすぐに蚀いたす。 この蚘事では、コンシュヌマヌ向けのファむル転送サヌビスずデヌタ転送サヌビスの開発に぀いお説明したすが、この蚘事が圹立぀堎合は、デヌタベヌス内のデヌタを曎新するサヌビスに぀いおも曞きたす。

歀れは䜕ですか

NIFI は、デヌタの高速な䞊列読み蟌みず凊理、゜ヌスず倉換甚の倚数のプラグむン、構成のバヌゞョン管理などを行うための分散アヌキテクチャです。 玠晎らしい利点は、非垞に䜿いやすいこずです。 getFile、sendHttpRequest などの単玔なプロセスは正方圢ずしお衚すこずができたす。 各四角圢はプロセスを衚しおおり、その盞互䜜甚を以䞋の図に瀺したす。 プロセス蚭定の察話に関するより詳现なドキュメントが䜜成されたした ここで 、ロシア語を話す人のために - ここで。 このドキュメントには、NIFI を解凍しお実行する方法ず、スク゚アずも呌ばれるプロセスを䜜成する方法が完党に説明されおいたす。
蚘事を曞くずいうアむデアは、長い怜玢ず受け取った情報を意識的なものに構造化するこず、そしお将来の開発者の䜜業を少し楜にしたいずいう願望の埌に生たれたした。

䟋

正方圢がどのように盞互䜜甚するかの䟋を考えおみたしょう。 䞀般的なスキヌムは非垞に単玔です: HTTP リク゚ストを受信したす (理論的には、リク゚ストの本文にファむルが含たれたす。NIFI の機胜を瀺すために、この䟋では、リク゚ストはロヌカル ファむル ストレヌゞからファむルを受信するプロセスを開始したす) 、FHからファむルを受信する凊理ず、FTP経由でFHにファむルを移動する凊理を䞊行しお、リク゚ストを受信した旚の応答を返したす。 プロセスはいわゆる flowFile を通じお盞互に察話するこずを明確にする䟡倀がありたす。 これは、属性ずコンテンツを保存する NIFI の基本゚ンティティです。 コンテンツは、ストリヌム ファむルによっお衚されるデヌタです。 ぀たり、倧たかに蚀うず、あるスク゚アからファむルを受信し、それを別のスク゚アに転送するず、そのコンテンツがあなたのファむルになりたす。

Apache NIFI - 実際の機䌚の抂芁

ご芧のずおり、この図は䞀般的なプロセスを瀺しおいたす。 HandleHttpRequest - リク゚ストを受け入れ、ReplaceText - 応答本文を生成し、HandleHttpResponse - 応答を送信したす。 FetchFile - ファむル ストレヌゞからファむルを受信し、それを正方圢に転送したす。 PutSftp - このファむルを FTP 䞊の指定されたアドレスに眮きたす。 このプロセスに぀いお詳しく説明したす。

この堎合、リク゚ストがすべおの始たりです。 その構成パラメヌタを芋おみたしょう。

Apache NIFI - 実際の機䌚の抂芁

ここでの内容は、StandardHttpContextMap を陀いおすべお非垞に簡単です。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 - 実際の機䌚の抂芁

この四角圢にスクリプトをロヌドするには XNUMX ぀のオプションがありたす。 XNUMX ぀目は、スクリプトを含むファむルをダりンロヌドするこずです。 XNUMX ぀目は、scriptBody にスクリプトを挿入する方法です。 私の知る限り、executeScript 広堎はいく぀かの蚀語をサポヌトしおいたす。そのうちの XNUMX ぀は groovy です。 Java 開発者はがっかりするでしょう - このような四角圢では Java でスクリプトを曞くこずはできたせん。 本圓にそうしたい堎合は、独自のカスタム スク゚アを䜜成しお NIFI システムに远加する必芁がありたす。 この操䜜党䜓には、タンバリンを䜿ったかなり長いダンスが䌎いたすが、この蚘事では扱いたせん。 私はグルヌノィヌな蚀語を遞びたした。 以䞋は、SOAP メッセヌゞ内の ID を単玔に増分曎新するテスト スクリプトです。 泚意するこずが重芁です。 flowFile からファむルを取埗しお曎新したす。曎新しおそこに戻す必芁があるこずを忘れないでください。 すべおのラむブラリが含たれおいるわけではないこずにも泚意しおください。 いずれかのラむブラリをむンポヌトする必芁がある堎合がありたす。 もう XNUMX ぀の欠点は、この広堎のスクリプトのデバッグが非垞に難しいこずです。 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 - 実際の機䌚の抂芁

ホストやアクション (soapAction) などのいく぀かのプロパティを远加したす。 保存しお確認したす。 SOAP リク゚ストの送信方法の詳现を確認できたす。 ここで

NIFI プロセスを䜿甚するためのいく぀かのオプションを怜蚎したした。 それらはどのように盞互䜜甚し、その本圓の利点は䜕でしょうか? 考慮されおいる䟋はテスト甚であり、実際の戊闘で起こるこずずは若干異なりたす。 この蚘事が開発者にずっお少しでも圹立぀こずを願っおいたす。 ご枅聎ありがずうございたした。 ご質問がございたしたら、お曞きください。 答えおみたす。

出所 habr.com

コメントを远加したす