¿Buscas nuestro logo?
Aquí te dejamos una copia, pero si necesitas más opciones o quieres conocer más, visita nuestra área de marca.
Conoce nuestra marca.¿Buscas nuestro logo?
Aquí te dejamos una copia, pero si necesitas más opciones o quieres conocer más, visita nuestra área de marca.
Conoce nuestra marca.dev
Borja Gómez 20/02/2017 Cargando comentarios…
Cada vez son más las empresas que apuestan por arquitecturas basadas en microservicios. Dichos microservicios están fuertemente especializados, por lo que comúnmente se presenta la necesidad de realizar orquestaciones de los mismos para cubrir una funcionalidad de negocio.
Como respuesta a esta necesidad, Netflix ha liberado recientemente Conductor, un nuevo producto dentro del ecosistema Netflix OSS. Este producto implementa un orquestador de flujos que corre en entornos cloud, implementando cada una de las tareas mediante microservicios. Hoy en el blog vamos a ver cómo funciona.
Conductor implementa la orquestación de llamadas a múltiples microservicios, de forma que el consumidor obtenga toda la funcionalidad que necesita sin tener que realizar multitud de llamadas que no le aportan ningún valor como pueden ser insertar un acceso en la tabla de auditoría, o consultar el identificador interno de sus cuentas cuando ya se ha logado en el sistema con su usuario y contraseña y desea el saldo total para mostrarlo por pantalla.
El objetivo de Conductor es ofrecer esta funcionalidad, facilitando el control y la visualización de las interacciones entre los microservicios. Por definición, la orquestación de microservicios que se propone es asíncrona, pudiéndose realizar de forma síncrona en caso de ser necesario.
Netflix ha estado utilizando Conductor durante un año, procesando 2.6 millones de procesos de todo tipo. Además, una característica muy interesante es que se ha utilizado en flujos con una alta complejidad de procesamiento como pueden ser los procesos de ingestión de información desde proveedores de datos o de codificación de videos y el almacenamiento de los mismos.
Conductor está basado en la siguiente arquitectura:
El acceso al servidor se realiza vía balanceador HTTP o bien usando un producto de Discovery (Eureka en caso de Netflix OSS).
La capa de servicios se basa en microservicios implementados en Java. Dado su carácter stateless se pueden desplegar múltiples servidores para escalar y garantizar la disponibilidad y respuesta del sistema.
Conductor está preparado para funcionar con distintos modos de persistencia:
Conductor también permite usar otros backends implementando las interfaces de acceso a base de datos (DAO). Podrían realizarse implementaciones de alguna de las capas, por ejemplo la caché o las colas, dejando la implementación por defecto de la persistencia de los datos de ejecución.
La configuración se realiza mediante un fichero de configuración config.properties, que se pasa como parámetro al arrancar el servidor.
La razón de ser de Conductor es realizar la orquestación de microservicios facilitando la creación de flujos de trabajo.
Dichos flujos de trabajo se diseñan de forma sencilla en formato JSON, utilizando diferentes tipos de tareas. Si estás acostumbrado a la automatización de procesos, echarás de menos el editor gráfico, ya que Conductor no lo tiene (ni para flujos ni para la definición de tareas), aunque sí dispone de un visor gráfico de los flujos. Esta característica hace que los flujos implementados sean fácilmente revisables por gente de negocio, siendo necesario un mínimo conocimiento técnico para su creación y modificación.
Las tareas deben registrarse en el motor previamente a su uso en algún flujo. Este registro puede realizarse de forma programática o bien utilizando el API REST de gestión Metadata.
Las tareas son de dos tipos, principalmente:
Además de las tareas mencionadas, pueden implementarse nuevas tareas de tipo system con un comportamiento personalizado según la necesidades del proyecto. Para ello habría que extender com.netflix.conductor.core.execution.tasks.WorkflowSystemTask e instanciar la nueva clase mediante patrón Eager Singleton en el startup.
Las tareas pueden tener distintas políticas de reintento en caso de fallo:
Los flujos de Conductor son flujos en formato JSON, que hacen referencia a las tareas definidas previamente.
Conductor permite implementar de forma sencilla el intercambio de datos entre las distintas actividades del flujo. Existen dos contextos de datos: workflow y task. De esta forma, el flujo tendrá unos datos de entrada, que podrá propagar a las distintas actividades del flujo a través de los parámetros de entrada de las tareas. También existen datos de salida, tanto a nivel de tarea como de flujo.
El binding de los datos se realizará mediante el uso de JSONPath, que implementa la mayoría de funcionalidad de XPath para DSL JSON. La sintaxis será la siguiente:
${SOURCE.input/output.JSONPath}
Conductor sigue un modelo basado en comunicaciones RPC, de forma que los workers corren en máquinas distintas a las del servidor Conductor. De esta forma, son los propios workers los que, vía HTTP, consultan al servidor las tareas pendientes de ejecución. Tras realizar la acción implementada en dicho worker, informan al servidor de la finalización de la tarea, para que continúe el flujo de trabajo.
Dicho modelo proporciona las siguientes características:
Una pregunta que puede realizarse es qué pasa si existe la necesidad de invocar a microservicios ya existentes, o microservicios que están fuera de mi control y por tanto no puedo implementar con la funcionalidad requerida por los workers.
En este caso existen dos alternativas:
La instalación de Conductor requiere:
El código podemos encontrarlo aquí.
Para instalarlo se deben seguir los siguientes pasos:
git clone git@github.com:Netflix/conductor.git
cd server
../gradlew server
cd ui
gulp watch
POST /workflow/{nombreFlujo}
{
... // dataInput
}
a) Hacer poll del tipo de tarea.
GET /tasks/poll/batch/{tipoDeTarea}
b) Realizar las acciones necesarias.
c) Actualizar el estado de la tarea a “completed”.
POST /tasks
{
…
“outputData” : { ... },
“taskStatus”: “COMPLETED”
}
Como se puede ver, Netflix sigue facilitándonos la vida al proporcionarnos componentes que dan respuesta a las necesidades que nos encontramos diariamente en el desarrollo de aplicaciones basadas en microservicios. ¡Ahora sólo queda ponernos manos a la obra e integrarlo en nuestro stack tecnológico para futuros proyectos!
Los comentarios serán moderados. Serán visibles si aportan un argumento constructivo. Si no estás de acuerdo con algún punto, por favor, muestra tus opiniones de manera educada.
Cuéntanos qué te parece.