Saltar al contenido

La computación gráfica distribuida es tan simple como lo es con Apache Storm

Ok, así que algunos de ustedes probablemente pensaron que cuando di la validación de la orden, el embalaje y el envío, mi ejemplo no era tan bueno para demostrar el cálculo de gráficos.

No estoy de acuerdo. El cálculo de gráficos, como cualquier otro modelo es una herramienta. Como desarrolladores, arquitectos de software y/o VP R&D, tenemos que decidir si esta herramienta se adapta a la tarea en cuestión. Afirmo que para los sitios web de comercio electrónico de alto rendimiento, Storm realmente encaja bien como un backend estable.

La computación gráfica distribuida es tan simple como lo es con Apache Storm
La computación gráfica distribuida es tan simple como lo es con Apache Storm

Veamos cómo podríamos implementar el caso de uso antes mencionado como una topología de Tormenta.

Primero, necesitamos establecer un nuevo proyecto. Estoy haciendo una demostración con un proyecto de Maven. He añadido la siguiente dependencia a mi archivo pom.xml:

Empezaremos creando una topología, usando el TopologyBuilder proporcionado por Storm:

Para establecer los picos de topología, invocamos el método setSpout en la instancia del TopologyBuilder, pasándole un id de pico y una instancia de pico.

Este es nuestro punto de entrada en nuestro cálculo de gráficos. En tu caso podría ser un KafkaSpout, por ejemplo.

Ahora que tenemos información fluyendo en nuestro sistema, nos gustaría digerirla. Es hora de añadir algunos pernos a la topología.

Por cada perno que conectemos con la topología, proporcionaremos la siguiente información:

  1. Identificación del perno, que lo identifica de forma única en la topología.
  2. Su predecesor en la topología, junto con un método de agrupación preferido.
  3. Una identificación opcional de la corriente.

2 y 3 serán cubiertos en breve.

Así que, echemos un vistazo a nuestra topología, con todos sus pernos:

Cada vez que he añadido un perno a la topología, he invocado a SetBolt.

Entonces, le puse nombre al cerrojo, y le di una instancia para ese cerrojo. Esa instancia es una clase implementada por cada cerrojo que requiere lógica. Revisaré ese cerrojo en breve.

Por cada perno, lo hemos conectado a otro perno o caño que le proporcionará la entrada.

En el caso del perno de validación, como son posibles dos resultados (válido o inválido) – por cada resultado posible hemos creado un perno que escucha los mensajes sólo en una corriente particular (a la que el perno de validación está enviando mensajes).

Ahora, observemos la implementación de un perno. ¿Qué debemos implementar para cumplir con la arquitectura de Storm?

Como se puede ver aquí, he ampliado la clase de BaseRichBolt. Para cumplir con su definición, debo implementar tres métodos.

El método de preparación , como su nombre lo indica, es un marcador de posición para que hagamos cualquier inicialización necesaria para que el cerrojo funcione correctamente una vez que le lleguen las tuplas. En la mayoría de los casos, al menos guardaremos la referencia de nuestro colector de salida en una variable local. El colector de salida nos permite emitir nuevas tuplas a los siguientes pernos.

También nos permite reconocer una tupla. Storm considerará cualquier tupla no reconocida como una estructura de datos sin manejar destinada a ser reprocesada.

El método execute será invocado (por la infraestructura de Storm) una vez por cada tupla que se nos pase. Dentro del método execute consumiremos la tupla, emitiremos nuevas tuplas en caso de que queramos, y finalmente – reconoceremos la tupla entrante.

El método declareOutputFields es necesario cuando queremos pasar un campo específico al siguiente o los siguientes pernos. Por ejemplo, el perno PackageGenerationBolt pasa su solicitud de envío en un campo llamado «ShipmentRequest» al que el siguiente perno (ShipmentRequestBolt) sabe cómo referirse:

En nuestro caso, nos sometemos a un grupo local, desarrollado específicamente para fines de depuración:

Una vez que nuestra topología fue probada y depurada, podemos desplegarla con seguridad a nuestro «verdadero» grupo de tormentas.

Eso se puede hacer de varias maneras.

En general, tenemos que empaquetar nuestra topología en un archivo de tarro, junto con todas las dependencias relevantes, y pasarlo a nuestro grupo de Tormenta. Eso se puede hacer utilizando la línea de comandos de forma bastante simple.

Si quieres ver una demostración «en la vida real» de cómo se hace eso, mírala aquí.