Get it on Google Play
07-05-2019
 

Escalando servicios con Colas + Redis

Message Queue Example

Message Queue Example

Aquí tenemos otro vídeo dedicado al desarrollo de sistemas, concretamente hoy presentamos una manera de implementar el patrón “Message Queue”(Cola de mensajes) muy usado en el desarrollo de microservicios. El uso de este patrón nos permite crear aplicaciones mas escalables y con niveles de acoplamiento mas bajo. Aquí tenéis el vídeo:

Empezamos el vídeo arrancando la base de datos Redis como contenedor Docker:

sudo docker run --name redis -d redis:5.0.4

Configuración Gradle

La configuración del fichero Gradle queda de la siguiente manera para generar un Jar autoejecutable que contenga todas sus dependencias dentro:

plugins {
    id 'java'
	}

dependencies {
	compile group: 'redis.clients', name: 'jedis', version: '3.0.1'
}
	
repositories {
    jcenter()
}

jar {
    manifest {
        attributes 'Main-Class': 'com.lostsys.redis.Main'
    }
    
	from {
        configurations.compile.collect { it.isDirectory() ? it : zipTree(it) }
    }    
}

Con esto si queremos generar el Jar solo tendremos que ejecutar(Desde la carpeta del proyecto, donde además tenemos el ejecutable gradlew):

./gradlew jar

Código de la aplicación

La aplicación cabe toda en un solo fichero:

package com.lostsys.redis;

import java.util.List;
import java.util.UUID;

import redis.clients.jedis.Jedis;

public class Main {
	private static String REDIS_HOST="172.17.0.4";
	private static String REDIS_LIST="listayoutube";

	public static void main(String[] args) {
		if ( args.length!=1 ) { printUsage(); return; }
		
		if ( args[0].equals("producer") ) producer();
		else if ( args[0].equals("consumer") ) consumer();
		else printUsage();
		
		}
	
	public static void producer() {
		Jedis jedis = new Jedis( REDIS_HOST );
		
		while (true) {
		    String newElement=UUID.randomUUID().toString();
		    jedis.rpush( REDIS_LIST, newElement );
		    
			/* limpiamos pantalla */
			System.out.print("\033[H\033[2J");  
		    System.out.flush();

		    System.out.println("REDIS Productor");
		    System.out.println("===============");
		    System.out.println("");
		    System.out.println("Total de elementos: "+jedis.llen( REDIS_LIST ));
		    System.out.println("Elemento: "+jedis.lrange( REDIS_LIST , 0, -1));
		    
		    try {
		    	Thread.sleep(1000);
		    } catch (Exception ex) { ex.printStackTrace(); }
			
			}
		
		}
	
	public static void consumer() {
		Jedis jedis = new Jedis( REDIS_HOST );
		
		/* limpiamos pantalla */
		System.out.print("\033[H\033[2J");  
	    System.out.flush();
	    
	    System.out.println("REDIS Consumidor");
	    System.out.println("================");
	    
		while (true) {
			List<String> element=jedis.blpop( 0, REDIS_LIST );
			
		    System.out.print("Elemento leído: "+element);
		    System.out.println(" ("+jedis.llen( REDIS_LIST )+" Pendientes)");
			
		    try {
		    	Thread.sleep(1500);
		    } catch (Exception ex) { ex.printStackTrace(); }
		    
			}
		}
	
	
	public static void printUsage() {
		System.out.println("");
		System.out.println("USAGE: java -jar Redis.jar <producer|consumer>");
		System.out.println("");
		}

}

Una vez compilada la aplicación podremos ejecutarla de la siguiente manera:

# Para arrancar la aplicación como productor
java -jar build/libs/Redis.jar producer

#Para arrancar la aplicación como consumidor
java -jar build/libs/Redis.jar consumer

Espero no dejarme nada, si queréis mas posts y vídeos como este ya sabéis!!! Compartir, like, suscribirse y comentar 😀

Si te ha servido, por favor comparte
 

Leave a Reply