Introduccion a Azure Event Hubs

Hola a todos!
El dia de hoy veremos que son los Azure Event Hubs y estableceremos las bases de trabajo para futuros proyectos utilizando otros servicios de Azure como Stream Analytics o Notification Hubs.

Para comenzar, los Azure Event Hubs son un servicio que permite digerir hasta millones de eventos por segundo para luego publicarlos o hacer un "streaming" a multiples aplicaciones. La fuente de estos eventos puede ser multiple: logs de paginas web, timelines de redes sociales como Facebook o  Twitter, informacion de aplicaciones moviles, reportes de sensores de dispositivos multiples, etc. La tarea de un Event Hub es precisamente recopilar esta informacion para que luego su procesamiento, transformacion y publicacion sea mas facil de realizar.

Definitivamente, un escenario bastante atractivo para utilizar Azure Event Hubs sera el procesamiento de datos recopilados en escenarios IoT (Internet of Things, o "Internet de las cosas" por sus siglas en ingles), esto debido a que al tener cientos, si no miles o hasta millones de dispositivos, recabando datos con sus sensores necesitaremos de una manera facil de administrar el envio de esta informacion a una base de datos. Ademas, probablemente tambien deseemos enviar una notificacion a los usuarios o administradores de estos dispositivos mientras al mismo tiempo guardamos un registro de errores o fallas de funcionamiento.

Para una documentacion mas detallada de los Azure Event Hubs ingresa aqui. En este post iremos directo a la parte practica de:

  • Como crear un Azure Event Hub
  • Como enviar un evento hacia un Event Hub
  • Como enviar tweets de una busqueda hacia un Event Hub

Como crear un Azure Event Hub

Azure Event Hubs

  • Hacemos click en "New" (el simbolo '+' verde en la parte inferior izquierda

2

  • Seleccionamos "App Services" -> Seleccionamos "Service Bus" -> "Event Hub"

3

  • Tenemos dos opciones:
    • Seleccionamos "Quick create" (Si no tenemos un Service Bus Namespace)
    • Seleccionamos "Custom create" (Si ya tenemos un Service Bus Namespace)
      • Escogemos el numero de particiones que deseamos (En un  "Quick create" el numero de particiones por defecto es 4)
      • Escogemos el numero de dias que nuestros eventos seran retenidos (En un  "Quick create" la retencion por defecto es 1 dia)

4

  • Una vez creado nuestro EventHub, vamos a nuestro Service Bus, seleccionamos el Tab "Event Hubs" y seleccionamos nuestro Event Hub recien creado

5

  • Seleccionamos el Tab "Configure" y creamos un nuevo elemento en la seccion "Shared Acess Policies" Le asignamos los valores "Manage", "Send" y "Listen" y grabamos nuestros cambios presionando el boton "Save" en la parte inferior de la pagina.

6 7

Como enviar un evento hacia un Event Hub

Nuestro Event Hub ya esta creado en la nube y ya le asignamos permisos de envio y recepcion , por lo que ahora crearemos un pequeño proyecto que nos permita enviar eventos.

  • Abrimos Visual Studio para crear un nuevo proyecto de tipo "Console Application" usando C# como lenguage de programacion. Le damos un nombre a nuestro proyecto, por ejemplo "EventHubConsoleSender" y a nuestra Solucion la dejamos con el nombre "EventHub"

8

  • Instalamos el paquete Event Hub via Nuget:
    • Abrimos el Package Manager Console y escribimos: "Install-package WindowsAzure.ServiceBus"
    • Si el Package Manager Console: Hacemos click en "View" en el menu de Visual Studio, seleccionamos "Other Windows" y hacemos click en "Package Manager Console"

9

10

  • Agregamos dos nuevos using statements a nuestro archivo "Program.cs"
    • using System.Threading; Nos servira para hacer pausas de ejecucion en un bucle infinito
    • using Microsoft.ServiceBus.Messaging; Contiene una serie de clases que encapsular y facilitan el trabajo con nuestro EventHub

11

  • Dentro la clase "Program" definimos dos nuevas variables de tipo string:
    • eventHubName, que contendra el nombre de nuestro Event Hub recien creado
    • connectionString, que podemos obtenerlos del portal de Azure al hacer click en el menu "Connection Information" del menu inferior en el portal

12

  • Creamos el metodo SendMessagesToEventHub con el siguiente codigo:

13

  • Ahora, en nuestro metodo Main, solo nos queda agregar el metodo SendMessagesToEventHub

14

Al ejecutar nuestro pequeño programa, se enviaran eventos / mensages con cararecteres aleatorios hacia nuestro Event Hub cada 200 milisegundos. A continuacion veremos como enviar datos reales.

15

Como enviar tweets de una busqueda hacia un Event Hub

Es mucho mas facil de lo que suena porque en este caso usaremos un SDK ya desarrollado para C#. Se llama TweetInvi y pueden encontrarlo en GitHub.
Como requisito para este paso, necesitaremos una cuenta de desarrollador en Twitter. Ingresa aqui para mas informacion. Una vez que tengas tu cuenta y hayas creado una App de Twitter aca vuelve a este post.

  • Creamos un proyecto nuevo en nuestra misma solucion. Esta vez podemos llamar al proyecto: EventHub.TwitterSender
  • Instalamos el paquete TweetInvi en nuestro proyecto escribiendo "install-package TweetInviApi" en nuestro Package Manager Console

16

  • Agregamos los siguientes using statements correspondientes a TweetInvi

17

  • Definimos variables para nuestras llaves de Twitter

18

  • Definimos variables para nuestras llaves de Event Hub

19

  • Definimos una variable tipo EventHubClient a nivel de la clase y la instanciamos en el metodo Main y asignamos las llaves de Twitter con los siguientes metodos:

20

  • Twitter en su API permite hacer dos tipos de busqueda (con y sin parametros. Haremos una primera busqueda sin paramentros, es decir, solamente usando nua palabra o frase a buscar y Twitter nos devolvera los ultimos tweets pertinentes.

21

  • De la lista de estos tweets, obtendremos el ID del ultimo Tweet, que nos ayudara como punto de referencia para las siguientes busquedas con parametros que seran recurrentes cada 5 segundos.

22

  • Lo que hace el metodo a continuacion es una busqueda con parametros para devolver los ultimos 50 Tweets "desde" el ultimo Tweet que obtuvimos mediante su ID. Por tanto, mantenemos un stream fresco de tweets cada 5 segundos.

23

  • Ahora que tenemos una lista de 50 Tweets nuevos cada 5 segundos, enviaremos cada Tweet a nuestro Event Hub.

24

Acabamos de crear un agente que envia datos a nuestro Event Hub. Podriamos instanciar decenas de estos agentes que esten buscando diferentes palabras en Twitter para luego cruzar esa informacion en la nube mediante otros servicios como Stream Analytics, Azure Data Lake, agregar todos los registros a una base de datos SQL o noSQL y luego mostrar resultados en dashboards como los de PowerBI.

De la misma manera, en lugar de buscar palabras en Twitter y enviar Tweets cada 5 segundos a EventHubs imaginemos que:

  • Cada agente esta desplegado en sensores de los jardines de una ciudad y enviamos informacion sobre la humedad, temperatura y luz cada 2 minutos.
  • Cada agente es un bus de la flota de una compañia de tranporte y enviamos informacion sobre la distancia recorrida promedio por mes, lo cual nos serviria para determinar fechas posibles de cambio de aceite, llantas y mantenimiento en general
  • Cada agente es un Smartwatch otorgado a un equipo de futbol y que durante cada partido envia informacion inmediata sobre el pulso cardiaco, distancia recorrida, calorias quemadas y cansancio en general para que el director tecnico pueda tomar decisiones en base a predicciones.

El dia de hoy aprendimos los conceptos mas basicos y funcionamiento de los Azure Event Hubs. Hay diferentes escenarios en los que nos encontramos con cantidades grandes de datos que necesitamos transformar en informacion, y mucho mas importante es el hecho de que necesitamos orquestrar el envio de estos datos a una base para su procesamiento y almacenamiento. En futuros posts iremos revisando algunos de estos escenarios propuestos.

Para cerrar el post, aqui tienen el perfil de un oso en Twitter. Si, leyeron bien, en Twitter hay alguien que tiene un perfil en el que se hace pasar por un oso. Pueden encontrar el codigo fuente aqui: EventHubs . Que tengan buena semana!