Redis: Almacenamiento de datos NoSQL clave-valor en memoria

Redis

Redis (REmote DIctionary Server) es un sistema de almacenamiento en memoria volátil en RAM basado en registros clave-valor NoSQL (opcionalmente podemos hacer que sea persistente o durable). También soporta la replicación de datos maestro-esclavo. Actualmente Redis es usado por: TwitterInstagramGitHubFlickr, o Digg.

¿Pero en que casos puede ser necesario un sistema así?

Por ejemplo para el análisis y procesamiento de datos en tiempo real, supongamos que obtenemos muestreos periódicos de un sensor y cada nueva lectura vuelve a calcular un valor basándonos en las lecturas previas, en ese caso un sistema de gestión de base de datos clásico como MySQL realizando transacciones a disco puede no ser muy eficiente comparado con Redis (tiempos de respuesta menores).

Un sistema de comunicaciones basado en mensajería por ejemplo.

Redis incluye clientes para la mayoría de los lenguajes de programación conocidos (PHP y C# entre ellos claro).

Redis está escrito en C y está ideado para sistemas Linux, aún así existe un desarrollo para sistemas MS Windows.

Instalación en Windows

Podemos descargar versiones binarias del instalador del siguiente enlace en GitHub. La versión que he descargado es Redis-x64-3.2.100.zip.

 

 

El paquete apenas ocupa 5MB.  Una vez descomprimido tenemos todos los binarios y utilidades básicas necesarias.

Abrimos una consola DOS y ejecutamos redis-server.exe.

Una vez ejecutado la consola nos muestra información valiosa, se está ejecutando a la escucha en el puerto 6379, para que ejecute el fichero de configuración copiamos el fichero redis.windows.conf a redis.conf y ejecutamos:

C:\> redis-server.exe redis.conf

Redis incluye la utilidad redis-benchmark.exe para poner a prueba su velocidad, simula la ejecución de comandos de forma simultanea desde varios clientes.

Enlaces externos

 

Anuncios

C# BasicMSMQClient: Ejemplo básico de envío de mensaje a una cola MSMQ

Con el servicio MSMQ arrancado en el PC local Win7 (ver “MSMQ: Microsoft Message Queuing“) vamos a crear una aplicación C# mínima para publicar un mensaje en la cola “test_queue”.

Para  poder usar el espacio de nombres “System.Messaging” y sus clases una vez creado el proyecto debemos añadir la referencia en el explorador de soluciones (CTRL+ALT+L).

Después añadimos el espacio de  nombres “using System.Messaging;” que nos proporciona las clases necesarias para trabajar con MSMQ.

La única clase que vamos a necesitar para un ejemplo mínimo es MessageQueue. Esta clase nos permite acceder a una cola existente o incluso crearla. Al constructor de la case le pasamos una cadena con la ruta de la cola. Cuando una cola es privada como la del ejemplo esta no se pública en los servicios de AD (Active Directory),  una cola privada es para ser empleada solo en el ámbito del PC local (entre dos aplicaciones en el mismo servidor por ejemplo).

El método send manda un mensaje no transaccional con una etiqueta.

Aquí tenéis el ejemplo:

Cada vez que ejecutamos la aplicación un nuevo mensaje se almacena en la cola (gestionar las colas ejecutando con compmgmt.msc).

Podemos abrir cada mensaje para ver sus campos:

 

 

 

 

 

 

 

MSMQ: Microsoft Message Queuing

En algún otro post he hablado sobre brokers de mensajería como RabbitMQ o WSO2. Muchas de estas soluciones internamente usan JMS (Java Message Service).  Microsoft no podía ser menos y tiene su propia solución llamada MSMQ para sistemas operativos Windows Server. MSMQ permite la comunicación basada en colas de mensajería entre procesos o máquinas. Su funcionamiento hace especial hincapié en la confiabilidad y en la tolerancia a fallas mediante mecanismos que aseguren que el mensaje siempre llega al destinatario tarde o temprano (incluso en el caso de que la máquina destino este temporalemente fuera de servicio).

Es muy sencillo habilitar MSQM incluso en Win7:

Podemos administrar las colas ejecutando el siguiente comando compmgmt.msc:


Podemos crear una nueva cola privada haciendo clic con el botón derecho del ratón en la carpeta “Colas privadas”. 

También podemos comprobar si el servidor esta arrancado como un servicio de Windows (para arrancarlo en cualquier momento ejecutamos “NET START MSMQ”).

 

C# RabbitMQClient: Productor de mensajes básico (con WSO2) usando .NET/C# en VS2012

RabbitMQ es un broker de mensajería (ver entrada RabbitMQ primeros pasos con colas de mensajería). Vamos a tratar de usar el cliente para .NET en  un proyecto con MS Visual Studio 2012 para conectar a un broker de mensajería WSO2 (ver WSO2: Broker de mensajería IoT (WSO2 IoTS))

Para instalar el paquete RabbitMQ.Client en VS2012  es recomendable usar el gestor de paquetes incorporado NuGet (RabbitMQ.Client 4.1.3) ejecutando el siguiente comando:

PM> Install-Package RabbitMQ.Client -Version 4.1.3

Para instalar el paquete previamente hemos creado un nuevo proyecto C# para consola.

Importamos la librería con la línea


using RabbitMQ.Client;

La clase ConnectionFactory construye instancias de IConnection y permite configurar el nombre el host, el virtual host y las credenciales de acceso. En vez usar las propiedades  factory.UserName, factory.Password… Compactamos la cadena de conexión en una sola línea usando la propiedad URI.


ConnectionFactory factory = new ConnectionFactory();
factory.Uri = "amqp://admin:admin@localhost:5672/carbon";

WSO2 usa el puerto TCP 5672 como broker de mensajería con el protocolo AMQP, podemos cambiar en cualquier momento el puerto editando el fichero C:\wso2mb-3.1.0\repository\conf\broker.xml.


El último parámetro del URI es el VHost, en WSO2 podemos encontrar información del VHost en C:\wso2mb-3.1.0\repository\conf\advanced\qpid-virtualhosts.xml. El VHost por defecto se llama “carbon”. Dentro del fichero también encontramos información sobre el exchange y queue (“amq.direct" is the default exchange that should be used for queue creation.).


IConnection conn = factory.CreateConnection();

IModel channel = conn.CreateModel();
channel.ExchangeDeclare("amq.direct","direct",true);

Le pasamos la conexión a la instancia IConnection empleado para crear nuevos canales.  La llamada a CreateConnection produce una excepción si el servidor WSO2 está parado por ejemplo.

El interface IModel se usa para el modelo AMQP le pasamos tres parámetros al método ExchangeDeclare. 

  • exchangeName: Un productor nunca envía directamente los mensajes directamente a la cola, en su lugar los envía a un exchange.

 

  • type: Debe ser uno de los siguientes “direct” (los mensajes van sólo a la cola especificada en routingKey), “topic”, “headers” o “fanout” (broadcast a todas las colas).
  • El tercer parámetro “durable” a true mantiene la cola persistente en el servidor.

La última parte es publicar el mensaje usando el método BasicPublish.

 var message = GetMessage(args);
 var body = Encoding.UTF8.GetBytes(message);
 
 channel.BasicPublish(exchange: "amq.direct",
 routingKey: "test-queue",
 basicProperties: null,
 body: body);

 channel.Close();
 conn.Close();

Código completo

Crear la cola en “test-queue” en WSO2

En el servidor WSO2 creamos una cola llamada “test-queue” a media que ejecutemos nuestro cliente publicador irá aumentando el contador de mensajes.

 

Referencias

WSO2: Broker de mensajería IoT (WSO2 IoTS)

WSO2 es un servidor de mensajería para conectar dispositivos IoT (ver entrada RabbitMQ primeros pasos con colas de mensajería), funciona como muchos otros servidores sobre un motor JDK (JMS – Java Message Service) lo que lo convierte en una solución multiplataforma de facto.  Permite trabajar con la base de datos embebida con la aplicación, para entornos empresariales puede trabajar con los sistemas de gestión de bases de datos más populares como Oracle, MySQL, PostreSQL.

Sin entrar en detalles un broker funciona como un enrutador de mensajería, las aplicaciones que se comunican con el servidor de mensajería pueden jugar varios roles, como productor / publicador de mensajes en un topic (gestión de colas basadas en contenidos) determinado o como consumidores / subcriptores de mensajes (Publish–subscribe pattern). El nodo central puede recibir de múltiples origenes y enrutar el mensaje al canal correcto, incluso transformar el mensaje a una representación alternativa.

WSO2: Working with Topics

Es arquitectura favorece la escalabilidad y la incorporación de nuevos nodos. La dependencia mutua entre aplicaciones se minimiza (decoupling), los publicadores que envían mensajes no lo hacen directamente a un receptor especifico, no tienen porque saber si al otro lado hay una aplicación, varias o ninguna recibiendo esos mensajes.

Podemos descargar el servidor del siguiente enlace. En la Web de descarga también ofrecen la subscripción a la comunidad y hospedar nuestra infraestructura IoT en su nube (Beta y previo pago).

Protocolos soportados:

  • Advanced Message Queuing Protocol (AMQP)(0-91))
  • Message Queuing Telemetry Transport Protocol (MQTT) v 3.1.1.

WSO2 IoTS es Open Source. He descargado el servidor wso2mb-3.1.0.zip a mi PC con Win7Pro y lo he descomprimido desde el raíz C:\wso2mb-3.1.0\.

Estructura de carpetas principales:

  • README.txt: El primer fichero que hay leer siempre.
  • bin: Script para Shell Linux y DOS.
  • client-lib: librerías JMS.
  • dbscripts: Scripts SQL para MySQL, Oracle…
  • lib: Librerías necesarias para WSO2.
  • repository.
    • conf: Ficheros de configuración.
    • database.
    • logs: Ficheros de logs de la ejecución.
  • resources: Recursos adicionales.
  • tmp: Ficheros temporales.

Una vez descomprimido sólo debemos ejecutar el script \bin\wso2server.bat para arrancar el servidor.

Una vez que arranca podemos administrar el servidor usando la aplicación Web en la siguiente dirección: https://localhost:9443/carbon  (usuario “admin” y clave “admin” por defecto).

Referencias externas:

 

 

 

 

 

RabbitMQ primeros pasos con colas de mensajería

Las MQ (Message Queue) son sistemas de almacenamiento de mensajes donde juegan un papel principal los roles de:

  • Publishers o creadores de mensajes en la cola.
  • Workers o consumidores de mensajes.

Ambos trabajan sobre un sistema independiente donde encolan mensajes y se van consumiendo por uno o varios agentes.

Gracias a un sistema de mensajería independiente podemos asegurar de que estos no se pierdan al menos hasta que no se consuman, podemos decidir el momento de consumirlos a intervalos determinados.

RabbitMQ es uno de los sistemas más populares, es de código abierto y disponible para múltiples plataformas. Cambien ofrecen implementaciones de clientes para múltiples lenguajes de programación.

Lo primero es descargar el instalador para Windows de este enlace e instalarlo (se instala en C:\Program Files\RabbitMQ Server), Actualmente la versión es la 3.6.1 (probablemente necesitaras instalar el interprete de lenguaje de programación Erlang previamente).

Una vez instaladas ambas aplicaciones vamos a tratar de hacer un par de ejemplos basados en PHP.

El servidor RabbitMQ  se instala como servicio de Windows.

Ejemplo 1: Productor y consumidor en PHP

Este ejemplo esta tomado directamente de la Web oficial de Rabbit. Consiste en 2 scripts, un productor y un consumidor.

Para realizar el ejemplo es necesaria la API php-amqplib que instalamos con Composer (debemos descargar e instalar para Win32), Composer es un gestor de dependencias para paquetes de PHP.

Creamos un fichero composer.json con el siguiente contenido:

{
    "require": {
        "php-amqplib/php-amqplib": "2.5.*"
    }
}

Y ejecutamos composer install en la carpeta donde esta el fichero.

Envió de mensajes send.php

<?php
require_once __DIR__ . '/vendor/autoload.php';
use PhpAmqpLib\Connection\AMQPStreamConnection;
use PhpAmqpLib\Message\AMQPMessage;
$connection = new AMQPStreamConnection('localhost', 5672, 'guest', 'guest');
$channel = $connection->channel();
$channel->queue_declare('hello', false, false, false, false);
$msg = new AMQPMessage('Hello World!');
$channel->basic_publish($msg, '', 'hello');
echo " [x] Sent 'Hello World!'\n";
$channel->close();
$connection->close();
?>