Apache NIFI - Unha breve visión xeral das características na práctica

Introdución

Ocorreu que no meu lugar de traballo actual tiven que familiarizarme con esta tecnoloxía. Vou comezar cun pequeno antecedente. Na seguinte reunión, dixéronlle ao noso equipo que necesitabamos crear integración sistema coñecido. Por integración quería dicir que este coñecido sistema enviaríanos solicitudes vía HTTP a un punto final específico e nós, curiosamente, enviariamos respostas en forma de mensaxe SOAP. Todo parece sinxelo e trivial. De aí despréndese que precisa...

Tarefa

Crea 3 servizos. O primeiro deles é o Servizo de Actualización de Bases de Datos. Este servizo, cando chegan novos datos dun sistema alleo, actualiza os datos da base de datos e xera un ficheiro en formato CSV para transferilo ao seguinte sistema. O punto final do segundo servizo chámase: o servizo de transporte FTP, que recibe o ficheiro transferido, validao e colocao no almacenamento de ficheiros a través de FTP. O terceiro servizo, o servizo de transferencia de datos do consumidor, funciona de forma asíncrona cos dous primeiros. Recibe unha solicitude dun sistema externo de terceiros para recibir o ficheiro comentado anteriormente, toma o ficheiro de resposta listo, modifícao (actualiza o id, descrición, campos linkToFile) e envía a resposta en forma de mensaxe SOAP. É dicir, o panorama xeral é o seguinte: os dous primeiros servizos comezan o seu traballo só cando chegan os datos para a actualización. O terceiro servizo funciona constantemente porque hai moitos consumidores de información, unhas 1000 solicitudes de datos por minuto. Os servizos están dispoñibles constantemente e as súas instancias atópanse en diferentes ambientes, como proba, demostración, preprodución e produción. A continuación móstrase un diagrama de como funcionan estes servizos. Permítanme aclarar de inmediato que algúns detalles foron simplificados para evitar unha complexidade innecesaria.

Apache NIFI - Unha breve visión xeral das características na práctica

Afondamento técnico

Ao planificar unha solución ao problema, primeiro decidimos facer aplicacións en Java usando o marco Spring, o equilibrador Nginx, a base de datos Postgres e outras cousas técnicas e non tan técnicas. Dado que o momento de desenvolver unha solución técnica permitiunos considerar outros enfoques para resolver este problema, a nosa mirada recaeu na tecnoloxía Apache NIFI, que está de moda en certos círculos. Direi de inmediato que esta tecnoloxía permitiunos notar estes 3 servizos. Este artigo describirá o desenvolvemento dun servizo de transporte de ficheiros e un servizo de transferencia de datos para o consumidor, pero se o artigo é útil, escribirei sobre o servizo de actualización de datos na base de datos.

O que é isto

NIFI é unha arquitectura distribuída para a carga e procesamento paralelo rápido de datos, un gran número de complementos para fontes e transformacións, versións de configuracións e moito máis. Unha boa vantaxe é que é moi doado de usar. Procesos triviais como getFile, sendHttpRequest e outros pódense representar como cadrados. Cada cadrado representa un proceso, cuxa interacción pódese ver na seguinte figura. Escribiuse documentación máis detallada sobre as interaccións de configuración do proceso aquí , para os que falan ruso - aquí. A documentación describe perfectamente como desempaquetar e executar NIFI, así como como crear procesos, tamén coñecidos como cadrados
A idea de escribir un artigo naceu despois dunha longa procura e estruturación da información recibida en algo consciente, así como o desexo de facilitar un pouco a vida aos futuros desenvolvedores.

Exemplo

Considérase un exemplo de como os cadrados interactúan entre si. O esquema xeral é bastante sinxelo: recibimos unha solicitude HTTP (En teoría, cun ficheiro no corpo da solicitude. Para demostrar as capacidades de NIFI, neste exemplo a solicitude inicia o proceso de recepción dun ficheiro desde o almacenamento de ficheiros local). ), entón devolvemos unha resposta de que se recibiu a solicitude, paralelamente o proceso de recepción dun ficheiro de FH e despois o proceso de movelo vía FTP a FH. Paga a pena aclarar que os procesos interactúan entre si a través do chamado flowFile. Esta é a entidade base en NIFI que almacena atributos e contido. O contido son os datos representados polo ficheiro de fluxo. É dicir, grosso modo, se recibe un ficheiro dun cadrado e o transfire a outro, o contido será o seu ficheiro.

Apache NIFI - Unha breve visión xeral das características na práctica

Como podes ver, esta imaxe mostra o proceso xeral. HandleHttpRequest - acepta solicitudes, ReplaceText - xera un corpo de resposta, HandleHttpResponse - envía unha resposta. FetchFile - recibe un ficheiro dun almacenamento de ficheiros, transfire ao cadrado PutSftp - pon este ficheiro en FTP, no enderezo especificado. Agora máis sobre este proceso.

Neste caso, a petición é o comezo de todo. Vexamos os seus parámetros de configuración.

Apache NIFI - Unha breve visión xeral das características na práctica

Todo aquí é bastante trivial coa excepción de StandardHttpContextMap: este é un tipo de servizo que che permite enviar e recibir solicitudes. Con máis detalle e mesmo con exemplos, podes ver - aquí

A continuación, vexamos os parámetros de configuración de ReplaceText do cadrado. Paga a pena prestar atención a ReplacementValue: isto é o que se devolverá ao usuario en forma de resposta. Na configuración pode axustar o nivel de rexistro, pode ver os rexistros {onde desempaquetou nifi}/nifi-1.9.2/logs, tamén hai parámetros de fallo/éxito - en base a estes parámetros pode regular o proceso como un todo . É dicir, no caso de procesar correctamente o texto, chamarase ao proceso de envío dunha resposta ao usuario, e noutro caso simplemente rexistraremos o proceso non exitoso.

Apache NIFI - Unha breve visión xeral das características na práctica

Non hai nada especialmente interesante nas propiedades de HandleHttpResponse excepto o estado cando se crea unha resposta con éxito.

Apache NIFI - Unha breve visión xeral das características na práctica

Resolvemos a solicitude e a resposta; pasemos a recibir o ficheiro e colocalo no servidor FTP. FetchFile: recibe un ficheiro na ruta especificada na configuración e pásao ao seguinte proceso.

Apache NIFI - Unha breve visión xeral das características na práctica

E despois o cadrado PutSftp: coloca o ficheiro no almacenamento de ficheiros. Podemos ver os parámetros de configuración a continuación.

Apache NIFI - Unha breve visión xeral das características na práctica

Paga a pena prestar atención ao feito de que cada cadrado é un proceso separado que debe poñerse en marcha. Observamos o exemplo máis sinxelo que non require ningunha personalización complexa. A continuación, veremos o proceso un pouco máis complicado, onde escribiremos un pouco sobre os sucos.

Exemplo máis complexo

O servizo de transferencia de datos ao consumidor resultou un pouco máis complicado debido ao proceso de modificación da mensaxe SOAP. O proceso xeral móstrase na seguinte figura.

Apache NIFI - Unha breve visión xeral das características na práctica

Aquí a idea tampouco é especialmente complicada: recibimos unha solicitude do consumidor de que necesitaba datos, enviamos unha resposta dicindo que recibira unha mensaxe, iniciamos o proceso de recepción do ficheiro de resposta, logo editámolo cunha certa lóxica e despois transferiu o ficheiro ao consumidor en forma de mensaxe SOAP ao servidor.

Creo que non hai que describir de novo eses cadrados que vimos arriba; pasemos directamente aos novos. Se precisa editar algún ficheiro e os cadrados normais de tipo ReplaceText non son axeitados, terá que escribir o seu propio script. Isto pódese facer usando o cadrado ExecuteGroogyScript. A súa configuración preséntase a continuación.

Apache NIFI - Unha breve visión xeral das características na práctica

Hai dúas opcións para cargar o script neste cadrado. O primeiro é descargando un ficheiro cun script. O segundo é inserindo un script en scriptBody. Polo que sei, o cadrado executeScript admite varios idiomas, un deles é groovy. Vou decepcionar aos desenvolvedores de Java: non podes escribir scripts en Java nestes cadrados. Para aqueles que realmente queiran, debes crear o teu propio cadrado personalizado e engadilo ao sistema NIFI. Toda esta operación vai acompañada dun baile bastante longo cunha pandeireta, do que non trataremos neste artigo. Eu escollín a linguaxe groovy. A continuación móstrase un script de proba que simplemente actualiza gradualmente o ID nunha mensaxe SOAP. É importante notar. Colles o ficheiro de flowFile e actualízao, non esquezas que tes que poñelo de novo alí, actualizado. Tamén cabe destacar que non todas as bibliotecas están incluídas. Pode ocorrer que aínda teñas que importar unha das bibliotecas. Outra desvantaxe é que o script neste cadrado é bastante difícil de depurar. Hai unha forma de conectarse á JVM NIFI e iniciar o proceso de depuración. Persoalmente, lancei unha aplicación local e simulei recibir un ficheiro da sesión. Tamén fixen a depuración local. Os erros que aparecen ao cargar un script son bastante sinxelos para Google e son escritos pola propia NIFI no rexistro.

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

En realidade, aquí remata a personalización do cadrado. A continuación, o ficheiro actualizado transfírese ao cadrado, que se encarga de enviar o ficheiro ao servidor. Abaixo amósanse a configuración deste cadrado.

Apache NIFI - Unha breve visión xeral das características na práctica

Describimos o método polo que se transmitirá unha mensaxe SOAP. Escribimos onde. A continuación cómpre indicar que se trata de SOAP.

Apache NIFI - Unha breve visión xeral das características na práctica

Engade varias propiedades como host e action (soapAction). Gardamos e comprobamos. Podes ver máis detalles sobre como enviar solicitudes SOAP aquí

Analizamos varias opcións para usar procesos NIFI. Como interactúan e cal é o seu beneficio real? Os exemplos considerados son de proba e son lixeiramente diferentes do que realmente acontece no combate. Espero que este artigo sexa un pouco útil para os desenvolvedores. Grazas pola súa atención. Se tes algunha dúbida, escribe. Vou tentar responder.

Fonte: www.habr.com

Engadir un comentario