hace 2 años
En el mundo actual, impulsado por la nube y los microservicios, los eventos juegan un papel crucial en la comunicación y la orquestación de sistemas distribuidos. Sin embargo, la diversidad de formatos y protocolos para describir estos eventos puede generar complejidad e incompatibilidad. Aquí es donde entra en juego CloudEvents, una especificación abierta diseñada para estandarizar la descripción de datos de eventos, simplificando la interoperabilidad y la integración en la nube.

- ¿Qué son exactamente los CloudEvents?
- Beneficios Clave de Adoptar CloudEvents
- El Esquema CloudEvents v1.0: Componentes Fundamentales
- CloudEvents y Azure Event Grid: Una Integración Nativa
- Integración con Azure Functions y Spring Cloud
- Tabla Comparativa: CloudEvents vs. Formato de Event Grid Propietario
- Preguntas Frecuentes sobre CloudEvents
- Conclusión
¿Qué son exactamente los CloudEvents?
CloudEvents se define como una especificación que proporciona un esquema de evento común para la publicación y el consumo de eventos basados en la nube. Imagina un lenguaje universal para que diferentes servicios y plataformas, como Azure Event Grid, sistemas de almacenamiento, o aplicaciones personalizadas, puedan entenderse al intercambiar información sobre lo que sucede. Este "lenguaje" común es precisamente CloudEvents.
Desarrollado por la Cloud Native Computing Foundation (CNCF) con la colaboración de empresas líderes como Microsoft, CloudEvents busca resolver el problema de la fragmentación en la forma en que se describen los eventos. Al adoptar un esquema uniforme, se facilita la creación de herramientas estandarizadas, rutas de eventos consistentes, y métodos universales para deserializar el esquema externo del evento.
Beneficios Clave de Adoptar CloudEvents
La adopción de CloudEvents ofrece una serie de ventajas significativas para desarrolladores y arquitectos de sistemas en la nube:
- Interoperabilidad Simplificada: El principal beneficio es la capacidad de integrar trabajo a través de diversas plataformas de manera más sencilla. Al hablar un "idioma" común, los sistemas pueden intercambiar eventos sin necesidad de traducciones complejas o adaptaciones personalizadas.
- Herramientas Estandarizadas: Un esquema común abre la puerta al desarrollo de herramientas genéricas que pueden funcionar con cualquier evento CloudEvents, independientemente de su origen o destino. Esto reduce la necesidad de crear herramientas específicas para cada plataforma o servicio.
- Rutas y Manejo de Eventos Consistentes: CloudEvents facilita la definición de rutas de eventos y la implementación de lógica de manejo de eventos de manera uniforme. Esto simplifica la gestión y el mantenimiento de sistemas basados en eventos.
- Deserialización Universal: La estandarización del esquema externo del evento permite deserializar los eventos de forma universal, sin importar el sistema que los haya generado.
- Mayor Facilidad de Integración: En general, CloudEvents reduce la fricción en la integración de diferentes componentes y servicios en arquitecturas distribuidas, promoviendo la creación de sistemas más cohesivos y fáciles de mantener.
El Esquema CloudEvents v1.0: Componentes Fundamentales
La versión 1.0 de CloudEvents define un conjunto de atributos que describen un evento de manera estandarizada. Estos atributos se dividen en atributos requeridos y opcionales, proporcionando flexibilidad a la vez que se asegura la consistencia. Algunos de los atributos clave incluyen:
- specversion: Obligatorio. Especifica la versión de la especificación CloudEvents a la que se adhiere el evento. Para la versión 1.0, el valor es "1.0".
- type: Obligatorio. Describe el tipo de evento que ha ocurrido. Debe ser un valor que denote la categoría del evento. Por ejemplo, "Microsoft.Storage.BlobCreated" indica que se ha creado un blob en Azure Storage.
- source: Obligatorio. Identifica el origen del evento en el contexto del productor de eventos. Utiliza un URI absoluto. Por ejemplo, podría ser la URL de un servicio o un recurso específico.
- id: Obligatorio. Un identificador único para cada evento, generado por el productor del evento. Este ID permite el seguimiento y la deduplicación de eventos.
- time: Opcional. La hora en que ocurrió el evento en formato RFC3339. Es útil para ordenar y secuenciar eventos.
- subject: Opcional. Describe el asunto del evento en el contexto del origen del evento. Similar a un "asunto" en un correo electrónico.
- data: Opcional. La carga útil del evento. Contiene los datos específicos del evento. El formato y la estructura de los datos dependen del tipo de evento.
Además de estos atributos principales, CloudEvents permite extensiones, lo que posibilita agregar atributos personalizados para necesidades específicas sin romper la compatibilidad con el esquema estándar.
CloudEvents y Azure Event Grid: Una Integración Nativa
Azure Event Grid, el servicio de enrutamiento de eventos de Azure, ofrece soporte nativo para eventos en formato CloudEvents v1.0 utilizando la implementación JSON y el protocolo HTTP. Esto significa que puedes enviar y recibir eventos CloudEvents directamente a través de Event Grid, aprovechando la robustez y la escalabilidad de este servicio.
La integración con Azure Event Grid permite utilizar CloudEvents tanto para eventos del sistema, como los generados por Azure Blob Storage o IoT Hub, como para eventos personalizados definidos por tus propias aplicaciones. Event Grid también soporta su formato de evento propietario, pero CloudEvents ofrece la ventaja de la estandarización y la interoperabilidad.

Configurando CloudEvents en Azure Event Grid
La configuración para utilizar CloudEvents con Azure Event Grid es sencilla y se puede realizar tanto para la entrada como para la salida de eventos.
Esquema de Entrada
Al crear un tema personalizado en Event Grid, puedes especificar el esquema de entrada utilizando el parámetro input-schema. Puedes elegir entre el esquema de Event Grid propietario o cloudeventschemav1_0 para indicar que deseas utilizar CloudEvents.
Ejemplo con Azure CLI:
az eventgrid topic create --name demotopic -l westcentralus -g gridResourceGroup --input-schema cloudeventschemav1_0Ejemplo con PowerShell:
New-AzEventGridTopic -ResourceGroupName gridResourceGroup -Location westcentralus -Name demotopic -InputSchema CloudEventSchemaV1_0Esquema de Salida
De manera similar, al crear una suscripción a un evento, puedes definir el esquema de salida utilizando el parámetro event-delivery-schema. Esto te permite recibir los eventos en formato CloudEvents incluso si el esquema de entrada del tema es diferente.
Ejemplo con Azure CLI:
topicID=$(az eventgrid topic show --name demotopic -g gridResourceGroup --query id --output tsv) az eventgrid event-subscription create --name demotopicsub --source-resource-id $topicID --endpoint <endpoint_URL> --event-delivery-schema cloudeventschemav1_0Ejemplo con PowerShell:
$topicid = (Get-AzEventGridTopic -ResourceGroupName gridResourceGroup -Name <topic-name>).Id New-AzEventGridSubscription -ResourceId $topicid -EventSubscriptionName <event_subscription_name> -Endpoint <endpoint_URL> -DeliverySchema CloudEventSchemaV1_0Ejemplo de Evento CloudEvents en Azure Blob Storage
A continuación, se muestra un ejemplo de un evento de Azure Blob Storage en formato CloudEvents:
{ "specversion": "1.0", "type": "Microsoft.Storage.BlobCreated", "source": "/subscriptions/{subscription-id}/resourceGroups/{resource-group}/providers/Microsoft.Storage/storageAccounts/{storage-account}", "id": "9aeb0fdf-c01e-0131-0922-9eb54906e209", "time": "2019-11-18T15:13:39.4589254Z", "subject": "blobServices/default/containers/{storage-container}/blobs/{new-file}", "data": { "api": "PutBlockList", "clientRequestId": "4c5dd7fb-2c48-4a27-bb30-5361b5de920a", "requestId": "9aeb0fdf-c01e-0131-0922-9eb549000000", "eTag": "0x8D76C39E4407333", "contentType": "image/png", "contentLength": 30699, "blobType": "BlockBlob", "url": "https://gridtesting.blob.core.windows.net/testcontainer/{new-file}", "sequencer": "000000000000000000000000000099240000000000c41c18", "storageDiagnostics": { "batchId": "681fe319-3006-00a8-0022-9e7cde000000" } } }Como se puede observar, este evento sigue el esquema CloudEvents v1.0, incluyendo los atributos specversion, type, source, id, time, subject y data. El atributo data contiene información específica del evento de creación de blob, como el tipo de contenido, la longitud del contenido, la URL del blob, etc.
Integración con Azure Functions y Spring Cloud
CloudEvents se integra perfectamente con otras tecnologías y frameworks populares, facilitando su adopción en diversos entornos de desarrollo.

Azure Functions
Azure Functions, la plataforma de computación sin servidor de Azure, ofrece soporte para CloudEvents a través del trigger de Event Grid. Esto permite crear funciones que se ejecutan en respuesta a eventos CloudEvents, simplificando la construcción de aplicaciones serverless basadas en eventos.
Para utilizar CloudEvents con Azure Functions, es necesario asegurarse de utilizar la versión adecuada del paquete NuGet Microsoft.Azure.WebJobs.Extensions.EventGrid (versión 3.3.1 o superior). La configuración es sencilla y permite acceder a los atributos del CloudEvent directamente dentro del código de la función.
Spring Cloud
Si bien el texto proporcionado no detalla la integración específica con Spring Cloud, es importante mencionar que Spring Cloud, un proyecto popular para el desarrollo de aplicaciones en la nube con Spring, se centra en proporcionar herramientas para patrones comunes en sistemas distribuidos, incluyendo la gestión de eventos y la interoperabilidad. Es probable que existan proyectos y extensiones dentro del ecosistema de Spring Cloud que faciliten el uso de CloudEvents, aunque esto requeriría una investigación adicional.
Tabla Comparativa: CloudEvents vs. Formato de Event Grid Propietario
| Característica | CloudEvents | Formato de Event Grid Propietario |
|---|---|---|
| Estándar | Sí (especificación abierta de CNCF) | No (propietario de Azure Event Grid) |
| Interoperabilidad | Alta (diseñado para interoperabilidad entre plataformas) | Limitada (específico para Azure Event Grid) |
| Extensibilidad | Sí (permite extensiones de atributos) | No (no extensible) |
| Soporte en Azure Event Grid | Nativo | Nativo |
| Casos de Uso | Ideal para sistemas distribuidos y arquitecturas basadas en eventos que requieren interoperabilidad. | Adecuado para escenarios donde se utiliza principalmente Azure Event Grid y no se requiere interoperabilidad externa. |
Preguntas Frecuentes sobre CloudEvents
- ¿Es CloudEvents un protocolo de transporte?
No, CloudEvents es una especificación para describir los datos del evento, no un protocolo de transporte. Puede utilizarse con diferentes protocolos como HTTP, AMQP, MQTT, etc.
- ¿Qué versiones de CloudEvents existen?
La versión 1.0 es la versión actual y recomendada de CloudEvents.

CloudEvents is an open specification for describing event data. CloudEvents simplifies interoperability by providing a common event schema for publishing, and consuming cloud based events. - ¿Necesito usar Azure Event Grid para utilizar CloudEvents?
No, CloudEvents es una especificación abierta que puede utilizarse con cualquier plataforma o servicio que soporte el estándar. Azure Event Grid simplemente ofrece soporte nativo para CloudEvents.
- ¿Dónde puedo encontrar más información sobre CloudEvents?
Puedes consultar la especificación oficial de CloudEvents en el sitio web de la Cloud Native Computing Foundation (CNCF).
- ¿Cómo manejo la validación de endpoints con CloudEvents en Azure Event Grid?
Azure Event Grid requiere validación de endpoints para suscripciones de eventos, incluso cuando se utilizan CloudEvents. El proceso de validación es similar al utilizado con el formato de Event Grid propietario. Consulta la documentación de Azure Event Grid para obtener detalles sobre la validación de endpoints con CloudEvents 1.0.
Conclusión
CloudEvents representa un paso importante hacia la estandarización en el mundo de los eventos en la nube. Al proporcionar un esquema común y unificado, facilita la interoperabilidad, simplifica el desarrollo de herramientas y promueve la creación de arquitecturas basadas en eventos más robustas y fáciles de gestionar. Su adopción, especialmente en combinación con servicios como Azure Event Grid, puede significar una mejora considerable en la eficiencia y la flexibilidad de los sistemas distribuidos modernos.
