Está en la página 1de 454

Contents

Documentación de Event Hubs


Información general
¿Qué es Event Hubs?
Event Hubs para Apache Kafka
Captura de Event Hubs
Event Hubs dedicado
Guías de inicio rápido
Creación de un centro de eventos
Azure portal
Azure CLI
Azure PowerShell
Plantilla ARM
Envío y recepción de eventos
.NET (Azure.Messaging.EventHubs)
Java (azure-messaging-eventhubs)
Python (azure-eventhub, versión 5)
JavaScript (azure/event-hubs, versión 5)
Go
C (solo enviar)
Apache Storm (solo recibir)
Envío y recepción de eventos (versiones o paquetes antiguos)
.NET (Microsoft.Azure.EventHubs)
Java (azure-eventhubs)
Python (azure-eventhub, versión 1)
JavaScript (azure/event-hubs, versión 2)
.NET Framework (Microsoft.ServiceBus)
Captura de eventos
Uso de Azure Portal para habilitar la captura de Event Hubs
Uso de una plantilla de Resource Manager para habilitar la captura de Event Hubs
Lectura de los datos capturados mediante Python (azure-eventhub, versión 5)
Lectura de los datos capturados con Python (azure-eventhub, versión 1)
Streaming en Event Hubs para Apache Kafka
Creación de un clúster dedicado
Tutoriales
Visualización de anomalías de datos en flujos de datos de Event Hubs
Almacene los datos capturados en un almacén de datos de SQL
Procesamiento de eventos de Apache Kafka para Event Hubs mediante Stream
Analytics
Streaming de datos a Azure Databricks con Event Hubs
Ejemplos
Ejemplos de código
Elementos integrados de Azure Policy
Conceptos
Terminología de Event Hubs
Host del procesador de eventos (SDK heredado)
Procesador de eventos (SDK más reciente)
Disponibilidad y coherencia
Escalabilidad
Recuperación ante desastres geográfica
Recuperación ante desastres geográfica y replicación geográfica
Seguridad
Authorization
Autorización del acceso a Azure Event Hubs
Autorización del acceso con Azure Active Directory
Autorización del acceso con una firma de acceso compartido
Authentication
Autenticación mediante Azure Active Directory
Autenticación con una identidad administrada
Autenticación desde una aplicación
Autenticación con una firma de acceso compartido
Seguridad de las redes
Controles de seguridad integrados
Controles de seguridad de Azure Policy
Línea de base de seguridad
Guía del protocolo AMQP 1.0
Guías paso a paso
Traslado entre regiones
Adición dinámica de particiones
Uso de Blob Storage como almacén de puntos de comprobación en Azure Stack Hub
Migración desde las API de Azure Service Manager (clásico) hasta las API de
Resource Manager
Desarrollar
Obtención de la cadena de conexión de Event Hubs
Intercambio de eventos entre aplicaciones mediante distintos protocolos
Guías de programación
.NET (Azure.Messaging.EventHubs)
Java (azure-messaging-eventhubs)
Python (azure-eventhub, versión 5)
JavaScript (azure/event-hubs, versión 5)
.NET (Microsoft.Azure.EventHubs)
Datos de proceso
Procesamiento de datos con Azure Stream Analytics
Integración con la plataforma Spring
Creación de una aplicación de Spring Cloud Stream Binder
Uso de Spring Boot Starter para Apache Kafka
Integración con Apache Kafka
Guía del desarrollador de Kafka para Event Hubs
Guía de migración de Kafka para Event Hubs
Guía de solución de problemas de Kafka para Event Hubs
Reflejo de un agente de Kafka en un centro de eventos
Conexión de Apache Spark a un centro de eventos
Conexión de Apache Flink a un centro de eventos
Integración de Apache Kafka Connect con un centro de eventos (versión preliminar)
Integración de Apache Kafka Connect (versión preliminar) con Debezium
Conexión de Akka Streams a un centro de eventos
Preguntas frecuentes: Event Hubs para Kafka
Administración y supervisión
Supervisión de Event Hubs con Azure Monitoring
Configuración de registros de diagnósticos
Transmisión de datos de Diagnósticos de Azure mediante Event Hubs
Escalado automático de las unidades de rendimiento
Bibliotecas de administración de Event Hubs
Seguridad
Permitir el acceso desde determinadas direcciones IP
Permitir el acceso desde determinadas redes virtuales
Permitir el acceso a través de puntos de conexión privados
Configuración de claves administradas por el cliente
Solución de problemas
Solución de problemas de conectividad
Solución de problemas de autenticación y autorización
Guía de solución de problemas de Kafka para Event Hubs
Excepciones .NET
Excepciones de Resource Manager
Referencia
SDK
.NET
Biblioteca de cliente
Migración de Microsoft.Azure.Event Hubs a Azure.Messaging.EventHubs
Azure.Messaging.EventHubs (más reciente)
Microsoft.Azure.EventHubs (heredado)
Microsoft.ServiceBus.Messaging (heredado)
Biblioteca de administración
Java
Biblioteca de cliente
Migración de azure-eventhubs a azure-messaging-eventhubs
azure-messaging-eventhubs (más reciente)
azure-eventhubs (heredado)
Biblioteca de administración
Python
Migración desde azure-eventhub versión 1 a la versión 5
Biblioteca de cliente
azure-eventhub, versión 5
azure-eventhub, versión 1
Biblioteca de administración
JavaScript
Migración desde azure/eventhubs versión 2 a la versión 5
Biblioteca de cliente
azure/eventhubs versión 5
azure/eventhubs versión 2
Biblioteca de administración
Go
Biblioteca de cliente
Biblioteca de administración
REST
Plantilla de Resource Manager
Cuotas
Configuraciones de Apache Kafka
Recursos
Desarrollo de aptitudes con Microsoft Learn
Preguntas más frecuentes
Azure Roadmap
Precios
Calculadora de precios
Actualizaciones del servicio
Stack Overflow
Vídeos
Azure Event Hubs: una plataforma de streaming
de macrodatos y un servicio de ingesta de
eventos
18/08/2020 • 9 minutes to read • Edit Online

Azure Event Hubs es una plataforma de streaming de macrodatos y un servicio de ingesta de eventos.
Puede recibir y procesar millones de eventos por segundo. Los datos enviados a un centro de eventos se
pueden transformar y almacenar con cualquier proveedor de análisis en tiempo real o adaptadores de
procesamiento por lotes y almacenamiento.
Los siguientes escenarios son algunos de los casos donde se puede usar Event Hubs:
Detección de anomalías (fraude/valores atípicos)
Registro de aplicaciones
Canalizaciones de análisis, como secuencias de clics
Paneles en vivo
Archivado de datos
Procesamiento de transacciones
Procesamiento de telemetría de usuario
Streaming de telemetría de dispositivo
https://www.youtube.com/embed/45wgY-VSk9I

¿Por qué usar Event Hubs?


Los datos solo son valiosos cuando existe una forma sencilla de procesarlos y obtener información
oportuna a partir de los orígenes de datos. Event Hubs ofrece una plataforma distribuida de
procesamiento de secuencias con baja latencia e integración perfecta, con servicios de datos y análisis
dentro y fuera de Azure para crear una canalización de macrodatos completa.
Event Hubs representa la "puerta principal" de una canalización de eventos, conocida a menudo como un
agente de ingesta de eventos en las arquitecturas de la solución. Un agente de ingesta de eventos es un
componente o servicio que se encuentra entre los publicadores de eventos y los consumidores de eventos
para desacoplar la producción de un flujo de eventos del consumo de esos eventos. Event Hubs ofrece una
plataforma de streaming unificada con búfer de retención de tiempo, de forma que los productores de
eventos se desacoplan de los consumidores de eventos.
En las secciones siguientes se describen las características clave del servicio Azure Event Hubs:

PaaS completamente administrada


Event Hubs es una plataforma como servicio (PaaS) completamente administrada con poca sobrecarga de
administración o configuración, para que pueda centrarse en las soluciones empresariales. Event Hubs
para ecosistemas de Apache Kafka le ofrece la experiencia de PaaS de Kafka sin tener que administrar,
configurar ni ejecutar los clústeres.

Compatibilidad con procesamiento por lotes y en tiempo real


Ingiera, almacene en búfer y procese la secuencia en tiempo real para obtener información práctica y útil.
Event Hubs usa un modelo de consumidor con particiones, que permite que varias aplicaciones procesen
la secuencia de manera simultánea y le deja controlar la velocidad del procesamiento.
Capture los datos casi en tiempo real en una instancia de Azure Blob Storage o de Azure Data Lake
Storagepara la retención a largo plazo o el procesamiento por microlotes. Puede lograr este
comportamiento en la misma secuencia que usa para derivar análisis en tiempo real. La configuración de
la captura de datos de eventos es rápida. Su ejecución no conlleva gastos administrativos y se escala
automáticamente con las unidades de procesamiento de Event Hubs. Event Hubs le permite centrarse en el
procesamiento de datos en lugar de hacerlo en la captura de datos.
Azure Event Hubs también se integra con Azure Functions para una arquitectura sin servidor.

Escalable
Con Event Hubs, puede comenzar con los flujos de datos en megabytes y aumentar a gigabytes o
terabytes. La característica de inflado automático es una de las muchas opciones disponibles para escalar
el número de unidades de procesamiento con el fin de satisfacer las necesidades de uso.

Ecosistema enriquecido
Event Hubs para ecosistemas de Apache Kafka permite que aplicaciones y clientes de Apache Kafka (1.0 y
posteriores) se comuniquen con Event Hubs. No es necesario configurar ni administrar sus propios
clústeres de Kafka.
Con un ecosistema amplio disponible en diversos lenguajes, como .NET, Java, Python o JavaScript, puede
empezar a procesar fácilmente los flujos desde Event Hubs. Todos los lenguajes de cliente compatibles
proporcionan integración de nivel bajo. El ecosistema también proporciona una perfecta integración con
servicios de Azure como Azure Stream Analytics y Azure Functions, lo que permite crear arquitecturas sin
servidor.

Componentes clave de la arquitectura


Event Hubs contiene los siguientes componentes clave:
Productores de eventos : una entidad que envía datos a un centro de eventos. Los publicadores de
eventos pueden publicar eventos mediante HTTPS, AMQP 1.0 o Apache Kafka (1.0 y posterior)
Par ticiones : cada consumidor solo lee un subconjunto específico, o partición, de la secuencia de
mensajes.
Grupos de consumidores : vista (estado, posición o desplazamiento) de todo un centro de eventos.
Los grupos de consumidores permiten consumir aplicaciones y que cada una tenga una vista
independiente de la secuencia de eventos. Leen la secuencia de forma independiente, a su propio ritmo
y con sus propios desplazamientos.
Unidades de procesamiento : unidades de capacidad compradas previamente que controlan la
capacidad de rendimiento de Event Hubs.
Receptores de eventos : cualquier entidad que lea datos de evento de un centro de eventos. Todos los
consumidores de Event Hubs se conectan a través de la sesión de AMQP 1.0. El servicio Event Hubs
entrega eventos a través de una sesión a medida que están disponibles. Todos los consumidores de
Kafka se conectan a través del protocolo de 1.0 de Kafka y las versiones posteriores.
La siguiente ilustración muestra la arquitectura de procesamiento del flujo de Event Hubs:
Event Hubs en Azure Stack Hub
Event Hubs en Azure Stack Hub permite desarrollar escenarios de nube híbrida. Se admiten las soluciones
de streaming y basadas en eventos, tanto en el procesamiento local como en la nube de Azure. Tanto si el
escenario es híbrido (con conexión) como sin conexión, la solución puede admitir el procesamiento de
eventos o secuencias a gran escala. El escenario solo está limitado por el tamaño del clúster de Event Hubs,
que puede aprovisionar según sus necesidades.
Las ediciones de Event Hubs (en Azure Stack Hub y en Azure) ofrecen un alto grado de paridad de
características. Esta paridad significa que los SDK, los ejemplos, PowerShell, la CLI y los portales ofrecen
una experiencia similar, con algunas diferencias.
Event Hubs en la pila es gratis durante la versión preliminar pública. Para más información, consulte
Información general sobre Event Hubs en Azure Stack Hub.

Pasos siguientes
Para empezar a usar Event Hubs, consulte los tutoriales sobre envío y recepción de eventos :
.NET Core
Java
Python
JavaScript
Go
C (solo enviar)
Apache Storm (solo recibir)
Para obtener más información sobre Event Hubs, consulte los siguientes artículos:
Información general de las características de Event Hubs
Preguntas más frecuentes.
Uso de Azure Event Hubs desde aplicaciones de
Apache Kafka
18/08/2020 • 9 minutes to read • Edit Online

Event Hubs proporciona un punto de conexión de Kafka que las aplicaciones basadas en Kafka existentes
pueden usar como alternativa a la ejecución de su propio clúster de Kafka. Event Hubs admite el protocolo de
Apache Kafka 1.0 y versiones más recientes y funciona con las aplicaciones existentes de Kafka, incluida
MirrorMaker.

¿Qué proporciona Event Hubs para Kafka?


La característica Event Hubs para Kafka proporciona un protocolo principal basado en Azure Event Hubs que es
compatible a nivel binario con la versión 1.0 de Kafka y posteriores, tanto para leer desde temas de Kafka como
para escribir en ellos. Puede empezar a utilizar el punto de conexión de Kafka desde sus aplicaciones sin tener
que realizar ningún cambio en el código, pero será preciso realizar un cambio mínimo en la configuración.
Actualice la cadena de conexión en las configuraciones para que apunte al punto de conexión de Kafka que se
expone en el evento, en lugar de apuntar al clúster de Kafka. A partir de ahí, puede empezar a hacer streaming
de los eventos desde las aplicaciones que usen el protocolo Kafka en Event Hubs. Esta integración también
admite marcos como Kafka Connect, que está en versión preliminar actualmente.
Desde un punto de vista conceptual, Kafka y Event Hubs son prácticamente idénticos: ambos son registros con
particiones creados para transmitir datos. En la tabla siguiente, se asignan conceptos entre Kafka y Event Hubs.
Asignación conceptual de Kafka y Event Hubs
C O N C EP TO DE K A F K A C O N C EP TO DE EVEN T H UB S

Clúster Espacio de nombres

Tema Centro de eventos

Partition Partition

Grupo de consumidores Grupo de consumidores

Offset Offset

Diferencias principales entre Kafka y Event Hubs


Mientras que Kafka Apache es un software que se puede ejecutar siempre que elija, Event Hubs es un servicio
en la nube similar a Azure Blob Storage. No hay ningún servidor o red que administrar ni ningún agente que
configurar. Se crea un espacio de nombres, que es un FQDN en el que están los temas, y después se crean
Event Hubs o temas dentro de ese espacio de nombres. Para más información acerca de Event Hubs y de los
espacios de nombres, consulte las características de Event Hubs. Como servicio en la nube, Event Hubs usa una
única dirección IP virtual estable como punto de conexión, de forma que los clientes no necesitan conocer los
agentes o equipos de un clúster.
La escala en Event Hubs se controla por el número de unidades de rendimiento que adquiere; cada unidad de
rendimiento le otorga 1 MB por segundo o 1000 eventos por segundo de entrada. De forma predeterminada,
Event Hubs escala verticalmente las unidades de procesamiento cuando se alcanza el límite con la
característica Inflado automático; esta característica también funciona con la característica Event Hubs para
Kafka.
Seguridad y autenticación
Cada vez que se publican o consumen eventos de Event Hubs para Kafka, el cliente intenta acceder a los
recursos de Event Hubs. Quiere asegurarse de que se accede a los recursos mediante una entidad autorizada.
Al usar el protocolo Apache Kafka con los clientes, puede establecer la configuración para la autenticación y el
cifrado mediante los mecanismos de SASL. El empleo de Event Hubs para Kafka exige cifrado TLS (ya que todos
los datos en tránsito con Event Hubs están cifrados con TLS). Para ello, especifique la opción SASL_SSL en el
archivo de configuración.
Azure Event Hubs proporciona varias opciones para autorizar el acceso a los recursos protegidos.
OAuth
Firma de acceso compartido (SAS)
OAuth
Event Hubs se integra con Azure Active Directory (Azure AD), lo que proporciona un servidor de autorización
centralizado compatible con OAuth 2.0 . Con Azure AD, puede usar el control de acceso basado en rol (RBAC)
para aplicar personalización avanzada de permisos a las identidades de cliente. Puede usar esta característica
con los clientes de Kafka si especifica SASL_SSL para el protocolo y OAUTHBEARER para el mecanismo. Para
obtener detalles sobre los roles y los niveles de Azure para el control de acceso, consulte Autorización del
acceso con Azure AD.

bootstrap.servers=NAMESPACENAME.servicebus.windows.net:9093
security.protocol=SASL_SSL
sasl.mechanism=OAUTHBEARER
sasl.jaas.config=org.apache.kafka.common.security.oauthbearer.OAuthBearerLoginModule required;
sasl.login.callback.handler.class=CustomAuthenticateCallbackHandler;

Firma de acceso compartido (SAS)


Event Hubs también proporciona firmas de acceso compar tido (SAS) para el acceso delegado a recursos
de Event Hubs para Kafka. La autorización del acceso mediante el mecanismo basado en tokens de OAuth 2.0
proporciona una mayor seguridad y facilidad de uso que SAS. Los roles integrados también pueden eliminar la
necesidad de autorización basada en ACL, que el usuario debe mantener y administrar. Puede usar esta
característica con los clientes de Kafka si especifica SASL_SSL para el protocolo y PL AIN para el mecanismo.

bootstrap.servers=NAMESPACENAME.servicebus.windows.net:9093
security.protocol=SASL_SSL
sasl.mechanism=PLAIN
sasl.jaas.config=org.apache.kafka.common.security.plain.PlainLoginModule required
username="$ConnectionString" password="{YOUR.EVENTHUBS.CONNECTION.STRING}";

NOTE
Al usar la autenticación de SAS con los clientes de Kafka, las conexiones establecidas no se desconectan cuando se vuelve
a generar la clave SAS.

Ejemplos
Para leer un tutorial con instrucciones paso a paso para crear un centro de eventos y acceder a él mediante
SAS u OAuth, consulte Inicio rápido: Streaming de datos con Event Hubs mediante el protocolo de Kafka.
Para obtener más ejemplos que muestran cómo usar OAuth con Event Hubs para Kafka, vea ejemplos en
GitHub.
Otras características de Event Hubs disponibles para Kafka
La característica Event Hubs para Kafka le permite escribir con un protocolo y leer con otro, para que los
productores de Kafka actuales puedan seguir publicando a través de Kafka y usted pueda agregar lectores con
Event Hubs, como Azure Stream Analytics o Azure Functions. Además, las características de Event Hubs como
Capture y Recuperación ante desastres geográfica también funcionan con la característica Event Hubs para
Kafka.

Características que aún no se admiten


A continuación, se incluye la lista de características de Kafka que aún no se admiten:
Transacción
Compresión
Retención basada en el tamaño
Compactación del registro
Compatibilidad con HTTP Kafka API
Kafka Streams

Pasos siguientes
En este artículo se proporciona una introducción a Event Hubs para Kafka. Para más información, consulte Guía
del desarrollador de Apache Kafka para Azure Event Hubs.
Captura de eventos a través de Azure Event Hubs
en Azure Blob Storage o Azure Data Lake Storage
18/08/2020 • 14 minutes to read • Edit Online

Azure Event Hubs permite capturar automáticamente los datos de streaming de Event Hubs de la cuenta de
Azure Blob Storage o de Azure Data Lake Storage Gen1 o Gen2 que prefiera, con la flexibilidad adicional de
especificar un intervalo de tiempo o de tamaño. La configuración de Capture es rápida, su ejecución no tiene
costes administrativos y se escala automáticamente con las unidades de procesamiento de Event Hubs. El uso
de Event Hubs Capture constituye la forma más sencilla de cargar datos de streaming en Azure y permite
centrarse en el procesamiento de datos, en lugar de en su captura.

NOTE
La configuración de Event Hubs Capture para usar Azure Data Lake Storage Gen2 es la misma que la configuración
para utilizar una instancia de Azure Blob Storage. Para obtener información, consulte Configuración de Event Hubs
Capture.

Event Hubs Capture permite procesar las canalizaciones en tiempo real y las basadas en lotes en la misma
transmisión, lo que permite crear soluciones que crecen a la par que sus necesidades. Si ya está creando
sistemas basados en lotes pensando en un futuro procesamiento en tiempo real o desea agregar una ruta de
acceso inactiva eficaz a una solución en tiempo real existente, Event Hubs Capture facilita el trabajo con datos
de streaming.

Cómo funciona Event Hubs Capture


Event Hubs es un búfer duradero de retención temporal para la entrada de datos de telemetría, es similar a un
registro distribuido. La clave para reducir horizontalmente en Event Hubs es el modelo de consumidor con
particiones. Cada partición es un segmento de datos independiente y se consume de forma independiente.
Con el tiempo estos datos envejecen basándose en el período de retención configurable. Como consecuencia,
un centro de eventos determinado nunca llega a estar "demasiado lleno".
Event Hubs Capture permite especificar una cuenta y un contenedor propios de Azure Blob Storage, o una
cuenta de Azure Data Lake Storage, que se usan para almacenar los datos capturados. Estas cuentas pueden
estar en la misma región que el centro de eventos o en otra, lo que se suma a la flexibilidad de la característica
Event Hubs Capture.
Los datos capturados se escriben en el formato de Apache Avro, que es un formato compacto, rápido y binario
que proporciona estructuras de datos enriquecidos con un esquema insertado. Este formato se usa
ampliamente en el ecosistema de Hadoop, en Stream Analytics y en Azure Data Factory. En este mismo
artículo encontrará más información acerca de cómo trabajar con Avro.
Ventanas de captura
Event Hubs Capture permite configurar una ventana para controlar la captura. Esta ventana es una
configuración mínima de tamaño y tiempo con una "directiva de que el primero gana", lo que significa que el
primer desencadenador que se encuentre provocará una operación de captura. Si tiene una ventana de
captura de 100 MB cada quince minutos y envía 1 MB/s, la ventana de tamaño se desencadenará antes que la
ventana de tiempo. Cada partición se captura de forma independiente y escribe un blob en bloques
completado en el momento de la captura, denominado como la hora en que se encontró el intervalo de
captura. Esta es la convención de nomenclatura de almacenamiento:
{Namespace}/{EventHub}/{PartitionId}/{Year}/{Month}/{Day}/{Hour}/{Minute}/{Second}

Tenga en cuenta que los valores de fecha se rellenan con ceros. Un ejemplo de nombre de archivo podría ser
el siguiente:

https://mystorageaccount.blob.core.windows.net/mycontainer/mynamespace/myeventhub/0/2017/12/08/03/03/17.av
ro

En caso de que Azure Storage Blob está temporalmente no disponible, Event Hubs Capture retendrá los datos
durante el período de retención de datos configurado en el centro de eventos y volverá a rellenar los datos
una vez que la cuenta de almacenamiento esté disponible nuevamente.
Escalado a unidades de procesamiento
El tráfico de los Event Hubs lo controlan las unidades de procesamiento. Una sola unidad de procesamiento
permite una entrada de 1 MB/s o 1000 eventos por segundo y una salida que duplica esas cifras. Event Hubs
estándar se puede configurar con entre 1 y 20 unidades de procesamiento, y puede adquirir más a través de
una solicitud de aumento de cuota al equipo de soporte técnico. El uso por encima de las unidades de
procesamiento adquiridas está limitado. Event Hubs Capture copia los datos directamente del
almacenamiento interno de Event Hubs, omite las cuotas de salida de unidades de procesamiento y guarda la
salida para otros lectores de procesamiento como Stream Analytics o Spark.
Una vez configurado, Event Hubs Capture se ejecuta automáticamente cuando se envía el primer evento y
continúa ejecutándose. Para facilitar que el procesamiento de bajada sepa que el proceso funciona, Event Hubs
escribe archivos vacíos cuando no hay datos. Este proceso proporciona un marcador y una cadencia
predecibles que puede alimentar sus procesadores de lotes.

Configuración de Event Hubs Capture


Puede configurar la funcionalidad de captura en el momento de creación del centro de eventos mediante
Azure Portal o con las plantillas de Azure Resource Manager. Para más información, consulte los siguientes
artículos.
Habilitación de Event Hubs Capture mediante Azure Portal
Creación de un espacio de nombres de Event Hubs con un centro de eventos y habilitación de la
característica Capture mediante una plantilla de Azure Resource Manager

Exploración de los archivos capturados y trabajo con Avro


Event Hubs Capture crea archivos en formato Avro, como se especifica en la ventana de tiempo configurada.
Dichos archivos se pueden ver en cualquier herramienta, como el Explorador de Azure Storage. Los archivos
se pueden descargar de forma local para trabajar con ellos.
Los archivos que genera Event Hubs Capture tienen el siguiente esquema de Avro:
Para explorar los archivos de Avro fácilmente, utilice el archivo jar Avro Tools desde Apache. También puede
usar Apache Drill para una experiencia sencilla con SQL o Apache Spark para realizar un procesamiento
distribuido complejo en los datos ingeridos.
Uso de Apache Drill
Apache Drill es un "motor de consulta SQL de código abierto para la exploración de macrodatos" que puede
consultar datos estructurados y semiestructurados. El motor se puede ejecutar como un nodo independiente o
como un clúster grande para lograr un rendimiento óptimo.
Hay disponible una compatibilidad nativa con Azure Blob Storage, lo cual facilita la consulta de datos en un
archivo de Avro, como se describe en esta documentación:
Apache Drill: Complemento de Azure Blob Storage
Para consultar con facilidad archivos capturados, puede crear y ejecutar una máquina virtual con Apache Drill
habilitado mediante un contenedor para acceder a Azure Blob Storage:
https://github.com/yorek/apache-drill-azure-blob
Hay un ejemplo completo disponible en el repositorio de streaming a escala:
Streaming a escala: Event Hubs Capture
Uso de Apache Spark
Apache Spark es un "motor de análisis unificado para el procesamiento de datos a gran escala". Admite
diferentes idiomas, incluido SQL, y puede acceder fácilmente a Azure Blob Storage. Hay varias opciones para
ejecutar Apache Spark en Azure, y todas proporcionan un acceso fácil a Azure Blob Storage:
HDInsight: Archivos adicionales en Azure Storage
Azure Databricks: Azure Blob Storage
Azure Kubernetes Service
Uso de Avro Tools
Las herramientas de Avro Tools están disponibles como un paquete jar. Tras descargar este archivo, para ver el
esquema de un archivo específico de Avro, ejecute el comando siguiente:

java -jar avro-tools-1.9.1.jar getschema <name of capture file>

Este comando devuelve


{

"type":"record",
"name":"EventData",
"namespace":"Microsoft.ServiceBus.Messaging",
"fields":[
{"name":"SequenceNumber","type":"long"},
{"name":"Offset","type":"string"},
{"name":"EnqueuedTimeUtc","type":"string"},
{"name":"SystemProperties","type":{"type":"map","values":
["long","double","string","bytes"]}},
{"name":"Properties","type":{"type":"map","values":["long","double","string","bytes"]}},
{"name":"Body","type":["null","bytes"]}
]
}

Avro Tools también puede utilizarse para convertir el archivo al formato JSON y realizar otro procesamiento.
Para realizar un procesamiento más avanzado, descargue e instale Avro para la plataforma que desee. En el
momento de redactar este artículo, existen implementaciones para C, C++, C#, Java, NodeJS, Perl, PHP, Python
y Ruby.
Apache Avro tiene guías de introducción para Java y Python muy completas. También puede leer el artículo
Getting started with Event Hubs Capture (Introducción a Event Hubs Capture).

Cómo se factura Event Hubs Capture


Event Hubs Capture se mide de forma similar a las unidades de procesamiento, por hora. El cargo es
directamente proporcional al número de unidades de procesamiento que se adquirieron para el espacio de
nombres. A medida que las unidades de procesamiento se incrementan y reducen, las mediciones de Event
Hubs Capture aumentan y disminuyen, con el fin de proporcionar un rendimiento coincidente. Los medidores
se ejecutan de manera simultánea. Para conocer los precios detallados, consulte Precios de Event Hubs.
Capture no consume la cuota de salida, porque se factura por separado.

Integración con Event Grid


Puede crear una suscripción de Azure Event Grid con un espacio de nombres de Event Hubs como origen. En
el tutorial siguiente se muestra cómo crear una suscripción de Event Grid con un centro de eventos como
origen y una aplicación de Azure Functions como receptor: Procesamiento y migración de datos de Event
Hubs capturados a SQL Data Warehouse mediante Event Grid y Azure Functions.

Pasos siguientes
Event Hubs Capture es el modo más sencillo de obtener datos en Azure. Con Azure Data Lake, Azure Data
Factory y Azure HDInsight, se puede realizar el procesamiento por lotes y cualquier otro análisis mediante las
plataformas y herramientas conocidas a la escala que necesite.
Aprenda a habilitar esta característica mediante Azure Portal y una plantilla de Azure Resource Manager:
Uso de Azure Portal para habilitar la captura de Event Hubs
Uso de una plantilla de Azure Resource Manager para habilitar Event Hubs Capture
Introducción a Event Hubs dedicado
18/08/2020 • 10 minutes to read • Edit Online

Los clústeres de Event Hubs disponen de implementaciones con un único inquilino, ideales para aquellos clientes
con las necesidades de streaming más exigentes. Esta oferta de inquilino único tiene un acuerdo de nivel de
servicio garantizado del 99,99 % y solo está disponible en el plan de tarifa Dedicado. Los clústeres de Event Hubs
pueden admitir la entrada de millones de eventos por segundo con una capacidad garantizada y una latencia
inferior a un segundo. Los espacios de nombres y los centros de eventos creados en el clúster Dedicado incluyen
todas las características de la oferta Estándar y muchas otras, pero sin imponer límites de entrada. También
incluye la popular característica Event Hubs Capture sin costo adicional, que permite crear lotes de flujos de
datos y transmitirlos a Azure Storage o Azure Data Lake de forma automática.
Los clústeres se aprovisionan y facturan por unidades de capacidad (CU) , una cantidad de recursos de CPU y
memoria asignada previamente. Puede adquirir 1, 2, 4, 8, 12, 16 o 20 CU para cada clúster. La cantidad de datos
que se puede ingerir y transmitir en cada unidad de capacidad depende de diversos factores, como el número de
productores y consumidores, la forma de la carga y la velocidad de salida (consulte los resultados de las pruebas
comparativas a continuación para más información).

NOTE
De forma predeterminada, todos los clústeres de Event Hubs están habilitados para Kafka y admiten puntos de conexión
de Kafka que se pueden usar en las aplicaciones existentes basadas en esta plataforma. El hecho de tener habilitado Kafka
en el clúster no afectará a otros casos de uso que no estén relacionados con Kafka, por lo que no existe la opción ni la
necesidad de deshabilitar Kafka en un clúster.

¿Por qué el plan de tarifa Dedicado?


Event Hubs dedicado brinda tres atractivas ventajas para los clientes que necesitan capacidad de nivel
empresarial:
Al haber un único inquilino, se asegura de que hay capacidad suficiente para mejorar el rendimiento.
Los clústeres dedicados garantizan la capacidad con el máximo nivel de escalado y pueden admitir hasta
gigabytes de datos de streaming de entrada con un almacenamiento de máxima duración y una latencia inferior
a un segundo para acomodar ráfagas de tráfico de todo tipo.
Acceso incluido y exclusivo a características
La oferta Dedicado incluye algunas características como Capture sin ningún costo adicional y proporciona acceso
exclusivo a otras características que se publicarán próximamente, como Bring Your Own Key (BYOK). El servicio
también administra el equilibrio de carga, las actualizaciones del sistema operativo, las revisiones de seguridad y
la creación de particiones para el cliente, por lo que puede dedicar menos tiempo al mantenimiento de la
infraestructura y más tiempo a la creación de características en el lado cliente.
Ahorro de costos
Cuando los volúmenes de entrada son altos (> 100 TU), el costo por hora de un clúster es significativamente
inferior a la cantidad equivalente de unidades de procesamiento de la oferta Estándar.

Cuotas y límites de Event Hubs dedicado


La oferta de Event Hubs dedicado se factura aplicando una tarifa mensual fija con un uso mínimo de 4 horas. El
nivel Dedicado ofrece todas las características del plan Estándar, pero con una capacidad de escalado de nivel
empresarial para aquellos clientes que tienen cargas de trabajo muy exigentes.
C A RA C T ERÍST IC A ESTÁ N DA R DEDIC A DO

Ancho de banda 20 TU (hasta 40 TU) 20 CU

Espacios de nombres 1 50 por CU

Event Hubs 10 por espacio de nombres 1000 por espacio de nombres

Eventos de entrada Pago por millones de eventos Se incluye

Tamaño de los mensajes 1 millón de bytes 1 millón de bytes

Particiones 32 por centro de eventos 1024 por centro de eventos

Grupos de consumidores 20 por centro de eventos Sin límite por CU, 1000 por centro de
eventos

Conexiones asincrónicas 1000 incluidas, 5000 como máximo 100 000 incluidos y como máximo

Retención de mensajes 7 días, 84 GB incluidas por TU 90 días, 10 TB incluidas por TU

Capturar Pago por hora Se incluye

¿Cómo incorporarlo?
La experiencia de autoservicio para crear un clúster de Event Hubs en Azure Portal está ahora en versión
preliminar. Si tiene alguna pregunta o necesita ayuda para empezar a utilizar Event Hubs dedicado, póngase en
contacto con el equipo de Event Hubs.

Preguntas más frecuentes


¿ Qué puedo conseguir con un clúster?
En un clúster de Event Hubs, la cantidad de datos que puede ingerir y transmitir depende de varios factores,
como los productores, los consumidores, la velocidad a la que se ingiere y procesa, etc.
En la tabla siguiente se muestran los resultados del banco de pruebas que hemos obtenido durante nuestras
pruebas:

A N C H O DE M EN SA JES A N C H O DE
F O RM A DE REC EP TO RE B A N DA DE DE B A N DA DE M EN SA JES TU
L A C A RGA S EN T RA DA EN T RA DA SA L IDA DE SA L IDA TOTA L ES T U POR C U

Lotes de 2 400 MB/s 400 000 m 800 MB/s 800 000 m 400 TU 100 TU
100 x 1 KB ensajes/s ensajes/s

Lotes de 10 2 666 MB/s 66 600 me 1,33 GB/s 133 000 m 666 TU 166 TU
x 10 KB nsajes/s ensajes/s

Lotes de 6 1 1,05 GB/s 34 000 me 1,05 GB/s 34 000 me 1000 TU 250 TU


x 32 KB nsajes/s nsajes/s

En las pruebas, se usaron los siguientes criterios:


Se usó un clúster de Event Hubs dedicado con cuatro unidades de capacidad (CU).
El centro de eventos usado para la ingesta tenía 200 particiones.
Dos aplicaciones receptoras recibieron los datos ingeridos de todas las particiones.
¿ Se puede escalar o reducir verticalmente el clúster?
Una vez creados los clústeres, se factura un mínimo de 4 horas de uso. En la versión preliminar de la experiencia
de autoservicio, puede enviar una solicitud de soporte técnico al equipo de Event Hubs en Técnico > Cuota >
Request to Scale Up or Scale Down Dedicated Cluster (Solicitud para escalar o reducir verticalmente el clúster
dedicado) para escalar o reducir verticalmente el clúster. La solicitud para reducir verticalmente el clúster puede
tardar hasta 7 días en completarse.
¿ Cómo va a funcionar la recuperación ante desastres con localización geográfica en mi clúster?
Puede emparejar geográficamente un espacio de nombres de un clúster del nivel Dedicado con otro espacio de
nombres de un clúster del mismo nivel. No es recomendable emparejar un espacio de nombres del nivel
Dedicado con otro de la oferta Estándar, ya que el límite de rendimiento sería incompatible y se producirían
errores.
¿ Puedo migrar espacios de nombres del nivel Estándar para que pertenezcan a un clúster del nivel Dedicado?
Actualmente, no se admite ningún proceso automático para migrar los datos de los centros de eventos de un
espacio de nombres Estándar a otro Dedicado.

Pasos siguientes
Póngase en contacto con un representante de ventas o con el Soporte técnico de Microsoft para obtener detalles
adicionales sobre Event Hubs dedicado. También puede crear un clúster u obtener más información sobre los
planes de tarifa de Event Hubs en los vínculos siguientes:
Creación de un clúster de Event Hubs con Azure Portal
Precios de Event Hubs dedicado. También puede ponerse en contacto con su representante de ventas de
Microsoft o el Servicio de soporte técnico de Microsoft para obtener detalles adicionales sobre la capacidad
dedicada de Event Hubs.
En Preguntas más frecuentes sobre Event Hubs se proporciona información sobre los precios, así como
respuestas a algunas preguntas frecuentes acerca de Event Hubs.
Inicio rápido: Creación de un centro de eventos
mediante Azure Portal
18/08/2020 • 7 minutes to read • Edit Online

Azure Event Hubs es una plataforma de streaming de macrodatos y servicio de ingesta de eventos de gran
escalabilidad capaz de recibir y procesar millones de eventos por segundo. Event Hubs puede procesar y
almacenar eventos, datos o telemetría generados por dispositivos y software distribuido. Los datos
enviados a un centro de eventos se pueden transformar y almacenar con cualquier proveedor de análisis
en tiempo real o adaptadores de procesamiento por lotes y almacenamiento. Para más información sobre
Event Hubs, consulte Introducción a Event Hubs y Características de Event Hubs.
En esta guía de inicio rápido se crea un centro de eventos mediante Azure Portal.

Prerrequisitos
Para completar esta guía de inicio rápido, asegúrese de que tiene:
Suscripción de Azure. Si no tiene una, cree una cuenta gratuita antes de empezar.
Visual Studio 2019 o posterior.
SDK de .NET Standard, versión 2.0 o posterior.

Crear un grupo de recursos


Un grupo de recursos es una recopilación lógica de recursos de Azure. Todos los recursos se implementan y
administran en un grupo de recursos. Para crear un grupo de recursos:
1. Inicie sesión en Azure Portal.
2. En el panel de la izquierda, seleccione Grupos de recursos . A continuación, haga clic en Agregar .

3. En Suscripción seleccione el nombre de la suscripción de Azure en la que desea crear el grupo de


recursos.
4. Escriba un nombre único para el grupo de recursos . El sistema comprueba de forma inmediata
para ver si el nombre está disponible en la suscripción de Azure seleccionada actualmente.
5. Seleccione una región para el grupo de recursos.
6. Seleccione Revisar + crear .

7. En la página Revisar + crear , seleccione Crear .

Creación de un espacio de nombres de Event Hubs


Un espacio de nombres de Event Hubs proporciona un contenedor con un único ámbito, al que hace
referencia su nombre de dominio completo, en el que puede crear uno o varios centros de eventos. Para
crear un espacio de nombres en el grupo de recursos mediante el portal, haga lo siguiente:
1. En Azure Portal, haga clic en Crear un recurso en la parte superior izquierda de la pantalla.
2. Seleccione Todos los ser vicios en el menú de la izquierda y seleccione el asterisco ( * ) junto a
Event Hubs en la categoría Análisis . Confirme que Event Hubs se agrega a FAVORITOS en el
menú de navegación de la izquierda.
3. Seleccione Event Hubs en FAVORITOS en el menú de navegación de la izquierda y seleccione
Agregar en la barra de herramientas.

4. En la página Crear espacio de nombres , realice los pasos siguientes:


a. Seleccione la suscripción en la que desea crear el espacio de nombres.
b. Seleccione el grupo de recursos que ha creado en el paso anterior.
c. Escriba el nombre del espacio de nombres. El sistema realiza la comprobación
automáticamente para ver si el nombre está disponible.
d. Seleccione una ubicación para el espacio de nombres.
e. Elija el plan de tarifa (Básico o Estándar).
f. Deje la configuración de las unidades de procesamiento tal como está. Para obtener
información acerca de las unidades de procesamiento, consulte Escalabilidad de Event Hubs
g. En la parte inferior de la página, seleccione Revisar y crear .

h. En la página Revisar y crear , examine la configuración y seleccione Crear . Espere a que la


implementación se complete.
i. En la página Implementación , seleccione Ir al recurso para ir a la página de su espacio de
nombres.
j. Confirme que la página Espacio de nombres de Event Hubs que ve es similar al ejemplo
siguiente:

NOTE
Azure Event Hubs proporciona un punto de conexión de Kafka. Este punto de conexión permite que
el espacio de nombres de Event Hubs entienda el protocolo de mensajes y las API de Apache Kafka.
Con esta funcionalidad, puede comunicarse con las instancias de Event Hubs como lo haría con
temas de Kafka sin cambiar los clientes de protocolo ni ejecutar sus propios clústeres. Admite Apache
Kafka versión 1.0. y versiones posteriores. Para más información, consulte Uso de Azure Event Hubs
desde aplicaciones de Apache Kafka.

Creación de un centro de eventos


Para crear un centro de eventos en el espacio de nombres, haga lo siguiente:
1. En la página Espacio de nombres de Event Hubs, seleccione Event Hubs en el menú de la izquierda.
2. En la parte superior de la ventana, haga clic en + Centro de eventos .
3. Escriba el nombre del centro de eventos y, a continuación, haga clic en Crear .

4. Puede comprobar el estado de la creación del centro de eventos en las alertas. Una vez creado el
centro de eventos, puede verlo en la lista de centros de eventos como se muestra en la siguiente
imagen:
Pasos siguientes
En este artículo, ha creado un grupo de recursos, un espacio de nombres de Event Hubs y un centro de
eventos. Para encontrar instrucciones paso a paso sobre cómo enviar eventos a un centro de eventos o
recibirlos de este, consulte los tutoriales sobre envío y recepción de eventos :
.NET Core
Java
Python
JavaScript
Go
C (solo enviar)
Apache Storm (solo recibir)
Guía de inicio rápido: Creación de un centro de
eventos mediante la CLI de Azure
18/08/2020 • 6 minutes to read • Edit Online

Azure Event Hubs es una plataforma de streaming de macrodatos y servicio de ingesta de eventos de gran
escalabilidad capaz de recibir y procesar millones de eventos por segundo. Event Hubs puede procesar y almacenar
eventos, datos o telemetría generados por dispositivos y software distribuido. Los datos enviados a un centro de
eventos se pueden transformar y almacenar con cualquier proveedor de análisis en tiempo real o adaptadores de
procesamiento por lotes y almacenamiento. Para más información sobre Event Hubs, consulte Introducción a Event
Hubs y Características de Event Hubs.
En esta guía de inicio rápido se crea un centro de eventos mediante la CLI de Azure.

Prerequisites
Para completar esta guía de inicio rápido, necesita una suscripción de Azure. Si no tiene una, cree una cuenta
gratuita antes de empezar.

Uso de Azure Cloud Shell


En Azure se hospeda Azure Cloud Shell, un entorno de shell interactivo que puede utilizar mediante el explorador.
Puede usar Bash o PowerShell con Cloud Shell para trabajar con los servicios de Azure. Puede usar los comandos
preinstalados de Cloud Shell para ejecutar el código de este artículo sin tener que instalar nada en su entorno local.
Para iniciar Azure Cloud Shell:

O P C IÓ N E JEM P LO O VÍN C ULO

Seleccione Pruébelo en la esquina superior derecha de un


bloque de código. Solo con seleccionar Pruébelo no se copia
automáticamente el código en Cloud Shell.

Vaya a https://shell.azure.com o seleccione el botón Iniciar


Cloud Shell para abrir Cloud Shell en el explorador.

Seleccione el botón Cloud Shell en la barra de menús de la


esquina superior derecha de Azure Portal.

Para ejecutar el código de este artículo en Azure Cloud Shell:


1. Inicie Cloud Shell.
2. Seleccione el botón Copiar de un bloque de código para copiar el código.
3. Pegue el código en la sesión de Cloud Shell. Para ello, seleccione Ctrl +Mayús +V en Windows y Linux, o
bien seleccione Cmd +Mayús +V en macOS.
4. Seleccione Entrar para ejecutar el código.
Si decide instalar y usar la CLI de Azure localmente, para este tutorial es preciso que esté ejecutando la CLI de Azure
versión 2.0.4 o posterior. Ejecute az --version para comprobar la versión. Si necesita instalarla o actualizarla,
consulte Instalación de la CLI de Azure.

Inicio de sesión en Azure


Los pasos siguientes no son necesarios si ejecuta comandos en Cloud Shell. Si está ejecutando la CLI localmente,
realice los pasos siguientes para iniciar sesión en Azure y establecer su suscripción actual:
Ejecute el siguiente comandos para iniciar sesión en Azure:

az login

Establezca el contexto de la suscripción actual. Reemplace MyAzureSub por el nombre de la suscripción de Azure
que desea usar:

az account set --subscription MyAzureSub

Crear un grupo de recursos


Un grupo de recursos es una recopilación lógica de recursos de Azure. Todos los recursos se implementan y
administran en un grupo de recursos. Ejecute el comando siguiente para crear un grupo de recursos:

# Create a resource group. Specify a name for the resource group.


az group create --name <resource group name> --location eastus

Creación de un espacio de nombres de Event Hubs


Un espacio de nombres de Event Hubs proporciona un contenedor con un único ámbito, al que hace referencia su
nombre de dominio completo, en el que puede crear uno o varios centros de eventos. Para crear un espacio de
nombres en el grupo de recursos, ejecute el comando siguiente:

# Create an Event Hubs namespace. Specify a name for the Event Hubs namespace.
az eventhubs namespace create --name <Event Hubs namespace> --resource-group <resource group name> -l <region,
for example: East US>

Creación de un centro de eventos


Ejecute el comando siguiente para crear un centro de eventos:

# Create an event hub. Specify a name for the event hub.


az eventhubs eventhub create --name <event hub name> --resource-group <resource group name> --namespace-name
<Event Hubs namespace>

Felicidades. Ha usado la CLI de Azure para crear un espacio de nombres de Event Hubs y un centro de eventos
dentro de ese espacio de nombres.

Pasos siguientes
En este artículo, ha creado un grupo de recursos, un espacio de nombres de Event Hubs y un centro de eventos.
Para encontrar instrucciones paso a paso sobre cómo enviar eventos a un centro de eventos o recibirlos de este,
consulte los tutoriales sobre envío y recepción de eventos :
.NET Core
Java
Python
JavaScript
Go
C (solo enviar)
Apache Storm (solo recibir)
Inicio rápido: Creación de un centro de eventos
mediante Azure PowerShell
18/08/2020 • 6 minutes to read • Edit Online

Azure Event Hubs es una plataforma de streaming de macrodatos y servicio de ingesta de eventos de gran
escalabilidad capaz de recibir y procesar millones de eventos por segundo. Event Hubs puede procesar y almacenar
eventos, datos o telemetría generados por dispositivos y software distribuido. Los datos enviados a un centro de
eventos se pueden transformar y almacenar con cualquier proveedor de análisis en tiempo real o adaptadores de
procesamiento por lotes y almacenamiento. Para más información sobre Event Hubs, consulte Introducción a Event
Hubs y Características de Event Hubs.
En esta guía de inicio rápido se crea un centro de eventos mediante Azure PowerShell.

Prerrequisitos
NOTE
Este artículo se ha actualizado para usar el nuevo módulo Az de Azure PowerShell. Aún puede usar el módulo de AzureRM
que continuará recibiendo correcciones de errores hasta diciembre de 2020 como mínimo. Para más información acerca del
nuevo módulo Az y la compatibilidad con AzureRM, consulte Introducing the new Azure PowerShell Az module (Presentación
del nuevo módulo Az de Azure PowerShell). Para obtener instrucciones sobre la instalación del módulo Az, consulte
Instalación de Azure PowerShell.

Para completar este tutorial, asegúrese de disponer de los siguientes elementos:


Suscripción de Azure. Si no tiene una, cree una cuenta gratuita antes de empezar.
Visual Studio 2019.
SDK de .NET Standard, versión 2.0 o posterior.

Uso de Azure Cloud Shell


En Azure se hospeda Azure Cloud Shell, un entorno de shell interactivo que puede utilizar mediante el explorador.
Puede usar Bash o PowerShell con Cloud Shell para trabajar con los servicios de Azure. Puede usar los comandos
preinstalados de Cloud Shell para ejecutar el código de este artículo sin tener que instalar nada en su entorno local.
Para iniciar Azure Cloud Shell:

O P C IÓ N E JEM P LO O VÍN C ULO

Seleccione Pruébelo en la esquina superior derecha de un


bloque de código. Solo con seleccionar Pruébelo no se copia
automáticamente el código en Cloud Shell.

Vaya a https://shell.azure.com o seleccione el botón Iniciar


Cloud Shell para abrir Cloud Shell en el explorador.

Seleccione el botón Cloud Shell en la barra de menús de la


esquina superior derecha de Azure Portal.
Para ejecutar el código de este artículo en Azure Cloud Shell:
1. Inicie Cloud Shell.
2. Seleccione el botón Copiar de un bloque de código para copiar el código.
3. Pegue el código en la sesión de Cloud Shell. Para ello, seleccione Ctrl +Mayús +V en Windows y Linux, o
bien seleccione Cmd +Mayús +V en macOS.
4. Seleccione Entrar para ejecutar el código.
Si está usando PowerShell localmente, tiene que ejecutar la versión más reciente de PowerShell para completar esta
guía de inicio rápido. Si necesita instalarlo o actualizarlo, consulte Instalación y configuración de Azure PowerShell.

Crear un grupo de recursos


Un grupo de recursos es una recopilación lógica de recursos de Azure, para crear un centro de eventos necesita un
grupo de recursos.
En el siguiente ejemplo, se crea un grupo de recursos en la región Este de EE. UU. Sustituya myResourceGroup por el
nombre del grupo de recursos que quiere utilizar:

New-AzResourceGroup –Name myResourceGroup –Location eastus

Creación de un espacio de nombres de Event Hubs


Una vez que se crea el grupo de recursos, cree un espacio de nombres de Event Hubs dentro de ese grupo de
recursos. Un espacio de nombres de Event Hubs proporciona un nombre de dominio completo y exclusivo en el
que puede crear el centro de eventos. Reemplace namespace_name por un nombre único para el espacio de
nombres:

New-AzEventHubNamespace -ResourceGroupName myResourceGroup -NamespaceName namespace_name -Location eastus

Creación de un centro de eventos


Ahora que ya tiene un espacio de nombres de Event Hubs, cree un centro de eventos dentro de ese espacio de
nombres:
El período permitido para MessageRetentionInDays está comprendido entre 1 y 7 días.

New-AzEventHub -ResourceGroupName myResourceGroup -NamespaceName namespace_name -EventHubName eventhub_name -


MessageRetentionInDays 3

Felicidades. Ha usado Azure PowerShell para crear un espacio de nombres de Event Hubs y un centro de eventos
dentro de ese espacio de nombres.

Pasos siguientes
En este artículo, ha creado el espacio de nombres de Event Hubs y ha usado aplicaciones de ejemplo para enviar
eventos al centro de eventos y recibirlos de este. Para encontrar instrucciones paso a paso sobre cómo enviar
eventos a un centro de eventos o recibirlos de este, consulte los tutoriales sobre envío y recepción de eventos :
.NET Core
Java
Python
JavaScript
Go
C (solo enviar)
Apache Storm (solo recibir)
Inicio rápido: Creación de un centro de eventos
mediante una plantilla de Resource Manager
18/08/2020 • 5 minutes to read • Edit Online

Azure Event Hubs es una plataforma de streaming de macrodatos y servicio de ingesta de eventos de gran
escalabilidad capaz de recibir y procesar millones de eventos por segundo. Event Hubs puede procesar y almacenar
eventos, datos o telemetría generados por dispositivos y software distribuido. Los datos enviados a un centro de
eventos se pueden transformar y almacenar con cualquier proveedor de análisis en tiempo real o adaptadores de
procesamiento por lotes y almacenamiento. Para más información sobre Event Hubs, consulte Introducción a Event
Hubs y Características de Event Hubs. En este inicio rápido, creará un centro de eventos mediante una plantilla de
Azure Resource Manager. Puede implementar una plantilla de Resource Manager para crear un espacio de
nombres de tipo Event Hubs, con un centro de eventos.
Una plantilla de Resource Manager es un archivo de notación de objetos JavaScript (JSON) que define la
infraestructura y la configuración del proyecto. La plantilla usa sintaxis declarativa, lo que permite establecer lo que
pretende implementar sin tener que escribir la secuencia de comandos de programación para crearla.
Si su entorno cumple los requisitos previos y está familiarizado con el uso de plantillas de Resource Manager,
seleccione el botón Implementar en Azure . La plantilla se abrirá en Azure Portal.

Requisitos previos
Si no tiene una suscripción a Azure, cree una cuenta gratuita antes de empezar.

Revisión de la plantilla
La plantilla usada en este inicio rápido forma parte de las plantillas de inicio rápido de Azure.
{
"$schema": "https://schema.management.azure.com/schemas/2019-04-01/deploymentTemplate.json#",
"contentVersion": "1.0.0.0",
"parameters": {
"projectName":{
"type": "string",
"metadata": {
"description": "Specifies a project name that is used to generate the Event Hub name and the Namespace
name."
}
},
"location": {
"type": "string",
"defaultValue": "[resourceGroup().location]",
"metadata": {
"description": "Specifies the Azure location for all resources."
}
},
"eventHubSku": {
"type": "string",
"allowedValues": [ "Basic", "Standard" ],
"defaultValue": "Standard",
"metadata": {
"description": "Specifies the messaging tier for Event Hub Namespace."
}
}
},
"variables": {
"eventHubNamespaceName": "[concat(parameters('projectName'), 'ns')]",
"eventHubName": "[parameters('projectName')]"
},
"resources": [
{
"apiVersion": "2017-04-01",
"type": "Microsoft.EventHub/namespaces",
"name": "[variables('eventHubNamespaceName')]",
"location": "[parameters('location')]",
"sku": {
"name": "[parameters('eventHubSku')]",
"tier": "[parameters('eventHubSku')]",
"capacity": 1
},
"properties": {
"isAutoInflateEnabled": false,
"maximumThroughputUnits": 0
}
},
{
"apiVersion": "2017-04-01",
"type": "Microsoft.EventHub/namespaces/eventhubs",
"name": "[concat(variables('eventHubNamespaceName'), '/', variables('eventHubName'))]",
"location": "[parameters('location')]",
"dependsOn": [
"[resourceId('Microsoft.EventHub/namespaces', variables('eventHubNamespaceName'))]"
],
"properties": {
"messageRetentionInDays": 7,
"partitionCount": 1
}
}
]
}

Los recursos definidos en la plantilla incluyen:


Microsoft.EventHub/namespaces
Microsoft.EventHub/namespaces/eventhubs
Para buscar más ejemplos de plantillas, consulte Plantillas de inicio rápido de Azure.

Implementación de la plantilla
Para implementar la plantilla:
1. Seleccione Probar en el bloque de código siguiente y luego siga las instrucciones para iniciar sesión en
Azure Cloud Shell.

$projectName = Read-Host -Prompt "Enter a project name that is used for generating resource names"
$location = Read-Host -Prompt "Enter the location (i.e. centralus)"
$resourceGroupName = "${projectName}rg"
$templateUri = "https://raw.githubusercontent.com/Azure/azure-quickstart-templates/master/101-eventhubs-
create-namespace-and-eventhub/azuredeploy.json"

New-AzResourceGroup -Name $resourceGroupName -Location $location


New-AzResourceGroupDeployment -ResourceGroupName $resourceGroupName -TemplateUri $templateUri -
projectName $projectName

Write-Host "Press [ENTER] to continue ..."

Lleva algunos minutos crear un centro de eventos.


2. Seleccione Copiar para copiar el script de PowerShell.
3. Haga clic con el botón derecho en la consola del shell y seleccione Pegar .

Validación de la implementación
Para comprobar la implementación, puede abrir el grupo de recursos desde Azure Portal o usar el script de
Azure PowerShell siguiente. Si Cloud Shell sigue abierto, no es necesario copiar ni ejecutar la primera línea (Read-
Host).

$projectName = Read-Host -Prompt "Enter the same project name that you used in the last procedure"
$resourceGroupName = "${projectName}rg"
$namespaceName = "${projectName}ns"

Get-AzEventHub -ResourceGroupName $resourceGroupName -Namespace $namespaceName

Write-Host "Press [ENTER] to continue ..."

Limpieza de recursos
Cuando los recursos de Azure ya no sean necesarios, limpie los recursos que implementó eliminando el grupo de
recursos. Si Cloud Shell sigue abierto, no es necesario copiar ni ejecutar la primera línea (Read-Host).

$projectName = Read-Host -Prompt "Enter the same project name that you used in the last procedure"
$resourceGroupName = "${projectName}rg"

Remove-AzResourceGroup -ResourceGroupName $resourceGroupName

Write-Host "Press [ENTER] to continue ..."

Pasos siguientes
En este artículo, creo un espacio de nombres de Event Hubs y un centro de eventos en el espacio de nombres. Para
encontrar instrucciones paso a paso sobre cómo enviar eventos a un centro de eventos o recibirlos de este,
consulte los tutoriales sobre envío y recepción de eventos :
.NET Core
Java
Python
JavaScript
Go
C (solo enviar)
Apache Storm (solo recibir)
Envío y recepción de eventos desde Azure Event
Hubs: .NET (Azure.Messaging.EventHubs)
18/08/2020 • 14 minutes to read • Edit Online

En este inicio rápido se muestra cómo enviar y recibir eventos desde un centro de eventos mediante la
biblioteca de .NET Azure.Messaging.EventHubs .

IMPORTANT
Este inicio rápido usa la nueva biblioteca del servicio Azure.Messaging.EventHubs . Para ver un inicio rápido que use la
biblioteca Microsoft.Azure.EventHubs anterior, consulte Envío y recepción de eventos mediante la biblioteca
Microsoft.Azure.EventHubs.

Prerrequisitos
Si es la primera vez que usa Azure Event Hubs, consulte la información general de Event Hubs antes de
continuar con este inicio rápido.
Para completar este tutorial de inicio rápido, debe cumplir los siguientes requisitos previos:
Una suscripción a Microsoft Azure . Para usar los servicios de Azure, entre los que se incluye Azure Event
Hubs, se necesita una suscripción. Si no se dispone de una cuenta de Azure, es posible registrarse para
obtener una evaluación gratuita, o bien usar las ventajas que disfrutan los suscriptores MSDN al crear una
cuenta.
Microsoft Visual Studio 2019 . La biblioteca cliente de Azure Event Hubs utiliza las nuevas características
que se introdujeron en C# 8.0. Aunque puede seguir usando la biblioteca con versiones anteriores de C#, la
nueva sintaxis no estará disponible. Para usar la sintaxis completa, se recomienda realizar la compilación con
el SDK de .NET Core 3.0 o superior y la versión de lenguaje establecida en latest . Si usa Visual Studio, las
versiones anteriores a Visual Studio 2019 no son compatibles con las herramientas necesarias para compilar
proyectos de C# 8.0. Visual Studio 2019, incluida la edición gratuita Community, se puede descargar aquí.
Creación de un espacio de nombres de Event Hubs y un centro de eventos . El primer paso consiste
en usar Azure Portal para crear un espacio de nombres de tipo Event Hubs y obtener las credenciales de
administración que la aplicación necesita para comunicarse con el centro de eventos. Para crear un espacio
de nombres y un centro de eventos, siga el procedimiento que se indica en este artículo. Después, obtenga la
cadena de conexión para el espacio de nombres de Event Hubs . Para ello, siga las instrucciones del
artículo: Obtenga la cadena de conexión. La utilizará más adelante en este inicio rápido.

Envío de eventos
En esta sección se muestra cómo crear una aplicación de consola de .NET Core para enviar eventos a un centro
de eventos.
Creación de una aplicación de consola
1. Inicie Visual Studio 2019.
2. Seleccione Crear un proyecto .
3. En el cuadro de diálogo Crear un nuevo proyecto , siga estos pasos: Si no ve este cuadro de diálogo,
seleccione Archivo en el menú, seleccione Nuevo y, después, seleccione Proyecto .
a. Seleccione C# como lenguaje de programación.
b. Seleccione Consola como tipo de aplicación.
c. Seleccione Aplicación de consola (.NET Core) en la lista de resultados.
d. Después, seleccione Siguiente .

4. Escriba EventHubsSender como nombre del proyecto, EventHubsQuickStar t como nombre de la


solución y, después, seleccione Aceptar para crear el proyecto.

Incorporación del paquete NuGet de Event Hubs


1. Seleccione Herramientas > Administrador de paquetes NuGet > Consola del Administrador de
paquetes en el menú.
2. Ejecute el siguiente comando para instalar el paquete NuGet Azure.Messaging.EventHubs :

Install-Package Azure.Messaging.EventHubs

Escritura de código para enviar mensajes al centro de eventos


1. Agregue las siguientes instrucciones using al principio del archivo Program.cs :
using System.Text;
using System.Threading.Tasks;
using Azure.Messaging.EventHubs;
using Azure.Messaging.EventHubs.Producer;

2. Agregue constantes a la clase Program de la cadena de conexión de Event Hubs y del nombre del centro
de eventos. Reemplace los marcadores de posición entre llaves por los valores adecuados que recibió al
crear el centro de eventos. Asegúrese de que {Event Hubs namespace connection string} es la cadena de
conexión en el nivel de espacio de nombres y no la cadena de Event Hub.

private const string connectionString = "<EVENT HUBS NAMESPACE - CONNECTION STRING>";


private const string eventHubName = "<EVENT HUB NAME>";

3. Reemplace el método Main por el siguiente método async Main . Vea los comentarios de código para
obtener más detalles.

static async Task Main()


{
// Create a producer client that you can use to send events to an event hub
await using (var producerClient = new EventHubProducerClient(connectionString, eventHubName))
{
// Create a batch of events
using EventDataBatch eventBatch = await producerClient.CreateBatchAsync();

// Add events to the batch. An event is a represented by a collection of bytes and


metadata.
eventBatch.TryAdd(new EventData(Encoding.UTF8.GetBytes("First event")));
eventBatch.TryAdd(new EventData(Encoding.UTF8.GetBytes("Second event")));
eventBatch.TryAdd(new EventData(Encoding.UTF8.GetBytes("Third event")));

// Use the producer client to send the batch of events to the event hub
await producerClient.SendAsync(eventBatch);
Console.WriteLine("A batch of 3 events has been published.");
}
}

4. Compile el proyecto y asegúrese de que no hay errores.


5. Ejecute el programa y espere el mensaje de confirmación.
6. En Azure Portal, puede comprobar que el centro de eventos ha recibido los mensajes. Cambie a la vista
Mensajes en la sección Métricas . Actualice la página para actualizar el gráfico. Puede tardar unos
segundos en mostrar que los mensajes se han recibido.
NOTE
Para ver el código fuente completo con comentarios muy útiles, consulte este archivo en GitHub.

Recepción de eventos
En esta sección se muestra cómo escribir una aplicación de consola de .NET Core que reciba mensajes de un
centro de eventos mediante un procesador de eventos. El procesador de eventos simplifica la recepción de
eventos desde centros de eventos mediante la administración de puntos de control persistentes y las
recepciones paralelas desde esos centros de eventos. Un procesador de eventos está asociado a un centro de
eventos concreto y a un grupo de consumidores. Recibe eventos de varias particiones del centro de eventos y
los pasa a un controlador delegado para que realice el procesamiento mediante el código que se ha
especificado.

NOTE
Si trabaja en Azure Stack Hub, esa plataforma puede admitir una versión diferente del SDK de Blob Storage que las que
suelen estar disponibles en Azure. Por ejemplo, si trabaja en la versión 2002 de Azure Stack Hub, la versión más alta
disponible para el servicio Storage es 2017-11-09. En este caso, además de seguir los pasos de esta sección, también
tendrá que agregar código para usar como destino la versión 2017-11-09 de la API del servicio de almacenamiento.
Consulte este ejemplo en GitHub para ver cómo usar como destino una versión específica de la API de Storage. Para más
información sobre las versiones del servicio Azure Storage que se admiten en Azure Stack Hub, consulte Almacenamiento
de Azure Stack Hub: diferencias y consideraciones.

Creación de una instancia de Azure Storage y un contenedor de blobs de Azure Storage


En este inicio rápido, se usa Azure Storage como almacén de puntos de control. Siga estos pasos para crear una
cuenta de Azure Storage.
1. Creación de una cuenta de Azure Storage
2. Creación de un contenedor de blobs
3. Obtención de la cadena de conexión para una cuenta de almacenamiento
Anote la cadena de conexión y el nombre del contenedor. Los usará en el código de recepción.
Creación de un proyecto para el destinatario
1. En la ventana del Explorador de soluciones, haga clic con el botón derecho en la solución
EventHubQuickStar t , haga clic en Agregar y seleccione Nuevo proyecto .
2. Seleccione Aplicación de consola (.NET Core) y, después, Siguiente .
3. Escriba EventHubsReceiver en Nombre de proyecto y seleccione Crear .
Incorporación del paquete NuGet de Event Hubs
1. Seleccione Herramientas > Administrador de paquetes NuGet > Consola del Administrador de
paquetes en el menú.
2. Ejecute el siguiente comando para instalar el paquete NuGet Azure.Messaging.EventHubs :

Install-Package Azure.Messaging.EventHubs

3. Ejecute el siguiente comando para instalar el paquete NuGet Azure.Messaging.EventHubs.Processor :

Install-Package Azure.Messaging.EventHubs.Processor

Actualización del método Main


1. Agregue las siguientes instrucciones using al principio del archivo Program.cs .

using System.Text;
using System.Threading.Tasks;
using Azure.Storage.Blobs;
using Azure.Messaging.EventHubs;
using Azure.Messaging.EventHubs.Consumer;
using Azure.Messaging.EventHubs.Processor;

2. Agregue constantes a la clase Program de la cadena de conexión de Event Hubs y del nombre del centro
de eventos. Reemplace los marcadores de posición entre llaves por los valores adecuados que recibió al
crear el centro de eventos. Reemplace los marcadores de posición entre llaves por los valores adecuados
que recibió al crear el centro de eventos y la cuenta de almacenamiento (claves de acceso y cadena de
conexión principal). Asegúrese de que {Event Hubs namespace connection string} es la cadena de
conexión en el nivel de espacio de nombres y no la cadena de Event Hub.

private const string ehubNamespaceConnectionString = "<EVENT HUBS NAMESPACE - CONNECTION


STRING>";
private const string eventHubName = "<EVENT HUB NAME>";
private const string blobStorageConnectionString = "<AZURE STORAGE CONNECTION STRING>";
private const string blobContainerName = "<BLOB CONTAINER NAME>";

3. Reemplace el método Main por el siguiente método async Main . Vea los comentarios de código para
obtener más detalles.
static async Task Main()
{
// Read from the default consumer group: $Default
string consumerGroup = EventHubConsumerClient.DefaultConsumerGroupName;

// Create a blob container client that the event processor will use
BlobContainerClient storageClient = new BlobContainerClient(blobStorageConnectionString,
blobContainerName);

// Create an event processor client to process events in the event hub


EventProcessorClient processor = new EventProcessorClient(storageClient, consumerGroup,
ehubNamespaceConnectionString, eventHubName);

// Register handlers for processing events and handling errors


processor.ProcessEventAsync += ProcessEventHandler;
processor.ProcessErrorAsync += ProcessErrorHandler;

// Start the processing


await processor.StartProcessingAsync();

// Wait for 10 seconds for the events to be processed


await Task.Delay(TimeSpan.FromSeconds(10));

// Stop the processing


await processor.StopProcessingAsync();
}

4. Ahora, agregue los siguientes métodos de control de eventos y errores a la clase.

static async Task ProcessEventHandler(ProcessEventArgs eventArgs)


{
// Write the body of the event to the console window
Console.WriteLine("\tRecevied event: {0}",
Encoding.UTF8.GetString(eventArgs.Data.Body.ToArray()));

// Update checkpoint in the blob storage so that the app receives only new events the next
time it's run
await eventArgs.UpdateCheckpointAsync(eventArgs.CancellationToken);
}

static Task ProcessErrorHandler(ProcessErrorEventArgs eventArgs)


{
// Write details about the error to the console window
Console.WriteLine($"\tPartition '{ eventArgs.PartitionId}': an unhandled exception was
encountered. This was not expected to happen.");
Console.WriteLine(eventArgs.Exception.Message);
return Task.CompletedTask;
}

5. Compile el proyecto y asegúrese de que no hay errores.

NOTE
Para ver el código fuente completo con comentarios muy útiles, consulte este archivo en GitHub.

6. Ejecute la aplicación del destinatario.


7. Debería ver un mensaje que indica que el evento se ha recibido.
Estos eventos son los tres que envió al centro de eventos anteriormente mediante la ejecución del
programa del emisor.

Pasos siguientes
Consulte los ejemplos de GitHub.
Ejemplos de Event Hubs en GitHub
Ejemplos de procesador de eventos en GitHub
Control de acceso basado en rol (RBAC): Ejemplos
Use Java para enviar eventos a Azure Event Hubs o
recibir eventos de él (azure-messaging-eventhubs)
18/08/2020 • 12 minutes to read • Edit Online

En este inicio rápido se muestra cómo enviar y recibir eventos desde un centro de eventos mediante el paquete
de Java azure-messaging-eventhubs .

IMPORTANT
Este inicio rápido usa el nuevo paquete azure-messaging-eventhubs . Para ver un inicio rápido que use los paquetes
azure-eventhubs y azure-eventhubs-eph anteriores, consulte Envío y recepción de eventos mediante azure-
eventhubs y azure-eventhubs-eph.

Requisitos previos
Si es la primera vez que usa Azure Event Hubs, consulte la información general de Event Hubs antes de
continuar con este inicio rápido.
Para completar este tutorial de inicio rápido, debe cumplir los siguientes requisitos previos:
Una suscripción a Microsoft Azure . Para usar los servicios de Azure, entre los que se incluye Azure Event
Hubs, se necesita una suscripción. Si no se dispone de una cuenta de Azure, es posible registrarse para
obtener una evaluación gratuita, o bien usar las ventajas que disfrutan los suscriptores MSDN al crear una
cuenta.
Un entorno de desarrollo de Java. Este inicio rápido utiliza Eclipse. Se requiere el kit de desarrollo de Java
(JDK), versión 8 o posteriores.
Creación de un espacio de nombres de Event Hubs y un centro de eventos . El primer paso consiste
en usar Azure Portal para crear un espacio de nombres de tipo Event Hubs y obtener las credenciales de
administración que la aplicación necesita para comunicarse con el centro de eventos. Para crear un espacio
de nombres y un centro de eventos, siga el procedimiento que se indica en este artículo. Después, obtenga la
cadena de conexión para el espacio de nombres de Event Hubs . Para ello, siga las instrucciones del
artículo: Obtenga la cadena de conexión. La utilizará más adelante en este inicio rápido.

Envío de eventos
En esta sección se muestra cómo crear una aplicación de Java para enviar eventos a un centro de eventos.
Incorporación de una referencia a la biblioteca de Azure Event Hubs
La biblioteca de cliente de Java para Event Hubs está disponible en repositorio central de Maven. Puede hacer
referencia a esta biblioteca con la siguiente declaración de dependencia en el archivo de proyecto de Maven:

<dependency>
<groupId>com.azure</groupId>
<artifactId>azure-messaging-eventhubs</artifactId>
<version>5.0.1</version>
</dependency>

Escritura de código para enviar mensajes al centro de eventos


Para el ejemplo siguiente, primero cree un nuevo proyecto de Maven para una aplicación de consola o shell en
su entorno de desarrollo de Java favorito. Agregue una clase denominada Sender y agréguele el código
siguiente:

import com.azure.messaging.eventhubs.*;
import static java.nio.charset.StandardCharsets.UTF_8;

public class Sender {


public static void main(String[] args) {
}
}

Cadena de conexión y centro de eventos


Este código usa la cadena de conexión al espacio de nombres de Event Hubs y el nombre del centro de eventos
para compilar un cliente de Event Hubs.

String connectionString = "<CONNECTION STRING to EVENT HUBS NAMESPACE>";


String eventHubName = "<EVENT HUB NAME>";

Creación de un cliente productor de Event Hubs


Este código crea un objeto cliente productor que se usa para generar o enviar eventos al centro de eventos.

EventHubProducerClient producer = new EventHubClientBuilder()


.connectionString(connectionString, eventHubName)
.buildProducerClient();

Preparación de un lote de eventos


Este código prepara un lote de eventos.

EventDataBatch batch = producer.createBatch();


batch.tryAdd(new EventData("First event"));
batch.tryAdd(new EventData("Second event"));
batch.tryAdd(new EventData("Third event"));
batch.tryAdd(new EventData("Fourth event"));
batch.tryAdd(new EventData("Fifth event"));

Envío del lote de eventos al centro de eventos


Este código envía al centro de eventos el lote de eventos que preparó en el paso anterior. El siguiente código se
bloquea en la operación de envío.

producer.send(batch);

Cierre y limpieza
Este código cierra el productor.

producer.close();

Código completo para enviar eventos


Este es el código completo para enviar eventos al centro de eventos.
import com.azure.messaging.eventhubs.*;

public class Sender {


public static void main(String[] args) {
final String connectionString = "EVENT HUBS NAMESPACE CONNECTION STRING";
final String eventHubName = "EVENT HUB NAME";

// create a producer using the namespace connection string and event hub name
EventHubProducerClient producer = new EventHubClientBuilder()
.connectionString(connectionString, eventHubName)
.buildProducerClient();

// prepare a batch of events to send to the event hub


EventDataBatch batch = producer.createBatch();
batch.tryAdd(new EventData("First event"));
batch.tryAdd(new EventData("Second event"));
batch.tryAdd(new EventData("Third event"));
batch.tryAdd(new EventData("Fourth event"));
batch.tryAdd(new EventData("Fifth event"));

// send the batch of events to the event hub


producer.send(batch);

// close the producer


producer.close();
}
}

Compile el programa y asegúrese de que no hay errores. Este programa se ejecutará después de ejecutar el
programa del destinatario.

Recepción de eventos
El código de este tutorial se basa en el ejemplo EventProcessorClient de GitHub, que se puede examinar para ver
toda la aplicación en funcionamiento.

NOTE
Si trabaja en Azure Stack Hub, esa plataforma puede admitir una versión diferente del SDK de Blob Storage que las que
suelen estar disponibles en Azure. Por ejemplo, si trabaja en la versión 2002 de Azure Stack Hub, la versión más alta
disponible para el servicio Storage es 2017-11-09. En este caso, además de seguir los pasos de esta sección, también
tendrá que agregar código para usar como destino la versión 2017-11-09 de la API del servicio de almacenamiento.
Consulte este ejemplo en GitHub para ver cómo usar como destino una versión específica de la API de Storage. Para más
información sobre las versiones del servicio Azure Storage que se admiten en Azure Stack Hub, consulte Almacenamiento
de Azure Stack Hub: diferencias y consideraciones.

Creación de una instancia de Azure Storage y un contenedor de blobs de Azure Storage


En este inicio rápido, se usa Azure Storage (concretamente Blob Storage) como almacén de puntos de control. La
creación de puntos de control es un proceso por el que un procesador de eventos marca o confirma la posición
del último evento procesado correctamente en una partición. Normalmente, el marcado de un punto de control
se realiza en la función que procesa los eventos. Para obtener más información acerca de la creación de puntos
de control, consulte la sección sobre el procesador de eventos.
Siga estos pasos para crear una cuenta de Azure Storage.
1. Creación de una cuenta de Azure Storage
2. Creación de un contenedor de blobs
3. Obtención de la cadena de conexión para una cuenta de almacenamiento
Anote la cadena de conexión y el nombre del contenedor . Los usará en el código de recepción.
Incorporación de bibliotecas de Event Hubs al proyecto de Java
Agregue las siguientes dependencias en el archivo pom.xml.
azure-messaging-eventhubs
azure-messaging-eventhubs-checkpointstore-blob

<dependencies>
<dependency>
<groupId>com.azure</groupId>
<artifactId>azure-messaging-eventhubs</artifactId>
<version>5.1.1</version>
</dependency>
<dependency>
<groupId>com.azure</groupId>
<artifactId>azure-messaging-eventhubs-checkpointstore-blob</artifactId>
<version>1.1.1</version>
</dependency>
</dependencies>

1. Agregue las siguientes instrucciones impor t en la parte superior del archivo Java.

import com.azure.messaging.eventhubs.EventHubClientBuilder;
import com.azure.messaging.eventhubs.EventProcessorClient;
import com.azure.messaging.eventhubs.EventProcessorClientBuilder;
import com.azure.messaging.eventhubs.checkpointstore.blob.BlobCheckpointStore;
import com.azure.messaging.eventhubs.models.ErrorContext;
import com.azure.messaging.eventhubs.models.EventContext;
import com.azure.storage.blob.BlobContainerAsyncClient;
import com.azure.storage.blob.BlobContainerClientBuilder;
import java.util.function.Consumer;
import java.util.concurrent.TimeUnit;

2. Cree una clase denominada Receiver y agréguele las siguientes variables de cadena. Reemplace los
marcadores de posición por los valores correctos.

private static final String EH_NAMESPACE_CONNECTION_STRING = "<EVENT HUBS NAMESPACE CONNECTION


STRING>";
private static final String eventHubName = "<EVENT HUB NAME>";
private static final String STORAGE_CONNECTION_STRING = "<AZURE STORAGE CONNECTION STRING>";
private static final String STORAGE_CONTAINER_NAME = "<AZURE STORAGE CONTAINER NAME>";

3. Agregue el siguiente método main a la clase.


public static void main(String[] args) throws Exception {
// Create a blob container client that you use later to build an event processor client to
receive and process events
BlobContainerAsyncClient blobContainerAsyncClient = new BlobContainerClientBuilder()
.connectionString(STORAGE_CONNECTION_STRING)
.containerName(STORAGE_CONTAINER_NAME)
.buildAsyncClient();

// Create a builder object that you will use later to build an event processor client to receive
and process events and errors.
EventProcessorClientBuilder eventProcessorClientBuilder = new EventProcessorClientBuilder()
.connectionString(EH_NAMESPACE_CONNECTION_STRING, eventHubName)
.consumerGroup(EventHubClientBuilder.DEFAULT_CONSUMER_GROUP_NAME)
.processEvent(PARTITION_PROCESSOR)
.processError(ERROR_HANDLER)
.checkpointStore(new BlobCheckpointStore(blobContainerAsyncClient));

// Use the builder object to create an event processor client


EventProcessorClient eventProcessorClient =
eventProcessorClientBuilder.buildEventProcessorClient();

System.out.println("Starting event processor");


eventProcessorClient.start();

System.out.println("Press enter to stop.");


System.in.read();

System.out.println("Stopping event processor");


eventProcessorClient.stop();
System.out.println("Event processor stopped.");

System.out.println("Exiting process");
}

4. Agregue los dos métodos auxiliares ( PARTITION_PROCESSOR y ERROR_HANDLER ) que procesan eventos y
errores a la clase Receiver .

public static final Consumer<EventContext> PARTITION_PROCESSOR = eventContext -> {


System.out.printf("Processing event from partition %s with sequence number %d with body: %s %n",
eventContext.getPartitionContext().getPartitionId(),
eventContext.getEventData().getSequenceNumber(), eventContext.getEventData().getBodyAsString());

if (eventContext.getEventData().getSequenceNumber() % 10 == 0) {
eventContext.updateCheckpoint();
}
};

public static final Consumer<ErrorContext> ERROR_HANDLER = errorContext -> {


System.out.printf("Error occurred in partition processor for partition %s, %s.%n",
errorContext.getPartitionContext().getPartitionId(),
errorContext.getThrowable());
};

5. El código completo debería ser similar al siguiente:


import com.azure.messaging.eventhubs.EventHubClientBuilder;
import com.azure.messaging.eventhubs.EventProcessorClient;
import com.azure.messaging.eventhubs.EventProcessorClientBuilder;
import com.azure.messaging.eventhubs.checkpointstore.blob.BlobCheckpointStore;
import com.azure.messaging.eventhubs.models.ErrorContext;
import com.azure.messaging.eventhubs.models.EventContext;
import com.azure.storage.blob.BlobContainerAsyncClient;
import com.azure.storage.blob.BlobContainerClientBuilder;
import java.util.function.Consumer;
import java.util.concurrent.TimeUnit;

public class Receiver {

private static final String EH_NAMESPACE_CONNECTION_STRING = "<EVENT HUBS NAMESPACE CONNECTION


STRING>";
private static final String eventHubName = "<EVENT HUB NAME>";
private static final String STORAGE_CONNECTION_STRING = "<AZURE STORAGE CONNECTION STRING>";
private static final String STORAGE_CONTAINER_NAME = "<AZURE STORAGE CONTAINER NAME>";

public static final Consumer<EventContext> PARTITION_PROCESSOR = eventContext -> {


System.out.printf("Processing event from partition %s with sequence number %d with body: %s %n",
eventContext.getPartitionContext().getPartitionId(),
eventContext.getEventData().getSequenceNumber(), eventContext.getEventData().getBodyAsString());

if (eventContext.getEventData().getSequenceNumber() % 10 == 0) {
eventContext.updateCheckpoint();
}
};

public static final Consumer<ErrorContext> ERROR_HANDLER = errorContext -> {


System.out.printf("Error occurred in partition processor for partition %s, %s.%n",
errorContext.getPartitionContext().getPartitionId(),
errorContext.getThrowable());
};

public static void main(String[] args) throws Exception {


BlobContainerAsyncClient blobContainerAsyncClient = new BlobContainerClientBuilder()
.connectionString(STORAGE_CONNECTION_STRING)
.containerName(STORAGE_CONTAINER_NAME)
.buildAsyncClient();

EventProcessorClientBuilder eventProcessorClientBuilder = new EventProcessorClientBuilder()


.connectionString(EH_NAMESPACE_CONNECTION_STRING, eventHubName)
.consumerGroup(EventHubClientBuilder.DEFAULT_CONSUMER_GROUP_NAME)
.processEvent(PARTITION_PROCESSOR)
.processError(ERROR_HANDLER)
.checkpointStore(new BlobCheckpointStore(blobContainerAsyncClient));

EventProcessorClient eventProcessorClient =
eventProcessorClientBuilder.buildEventProcessorClient();

System.out.println("Starting event processor");


eventProcessorClient.start();

System.out.println("Press enter to stop.");


System.in.read();

System.out.println("Stopping event processor");


eventProcessorClient.stop();
System.out.println("Event processor stopped.");

System.out.println("Exiting process");
}

}
6. Compile el programa y asegúrese de que no hay errores.

Ejecución de las aplicaciones


1. Ejecute primero la aplicación del destinatario .
2. Luego, ejecute la aplicación del remitente .
3. En la ventana de la aplicación del destinatario , confirme que ve los eventos publicados por la aplicación del
remitente.
4. Presione ENTRAR en la ventana de la aplicación del destinatario para detener la aplicación.

Pasos siguientes
Consulte los siguientes ejemplos en GitHub:
Ejemplos de azure-messaging-eventhubs
Ejemplos de azure-messaging-eventhubs-checkpointstore-blob
Envío o recepción de eventos en Event Hubs
mediante Python (azure-eventhub versión 5)
18/08/2020 • 8 minutes to read • Edit Online

En este inicio rápido se muestra cómo enviar y recibir eventos desde un centro de eventos mediante el paquete
de Python azure-eventhub, versión 5 .

IMPORTANT
En este inicio rápido se usa el reciente paquete azure-eventhub, versión 5. Para ver un inicio rápido que use el antiguo
paquete de la versión 1 de azure-eventhub, consulte Envío y recepción de eventos mediante azure-eventhub, versión 1.

Prerrequisitos
Si es la primera vez que usa Azure Event Hubs, consulte la información general de Event Hubs antes de continuar
con este inicio rápido.
Para completar este tutorial de inicio rápido, debe cumplir los siguientes requisitos previos:
Una suscripción a Microsoft Azure . Para usar los servicios de Azure, entre los que se incluye Azure
Event Hubs, se necesita una suscripción. Si no se dispone de una cuenta de Azure, es posible registrarse
para obtener una evaluación gratuita, o bien usar las ventajas que disfrutan los suscriptores MSDN al
crear una cuenta.
Python 2.7, 3.5 o cualquier versión posterior, con PIP instalado y actualizado.
El paquete de Python para Event Hubs.
Para instalar el paquete, ejecute este comando en un símbolo del sistema que tenga Python en su ruta de
acceso:

pip install azure-eventhub

Instale el siguiente paquete para recibir los eventos y usar Azure Blob Storage como almacén de puntos
de control:

pip install azure-eventhub-checkpointstoreblob-aio

Creación de un espacio de nombres de Event Hubs y un centro de eventos . El primer paso


consiste en usar Azure Portal para crear un espacio de nombres de tipo Event Hubs y obtener las
credenciales de administración que la aplicación necesita para comunicarse con el centro de eventos. Para
crear un espacio de nombres y un centro de eventos, siga el procedimiento que se indica en este artículo.
Después, obtenga la cadena de conexión para el espacio de nombres de Event Hubs . Para ello,
siga las instrucciones del artículo: Obtenga la cadena de conexión. La utilizará más adelante en este inicio
rápido.

Envío de eventos
En esta sección, se crea un script de Python para enviar eventos al centro de eventos que creó anteriormente.
1. Abra el editor de Python que prefiera, como Visual Studio Code.
2. Cree un script llamado send.py. Este script envía un lote de eventos al centro de eventos que creó
anteriormente.
3. Pegue el siguiente código en send.py:

import asyncio
from azure.eventhub.aio import EventHubProducerClient
from azure.eventhub import EventData

async def run():


# Create a producer client to send messages to the event hub.
# Specify a connection string to your event hubs namespace and
# the event hub name.
producer = EventHubProducerClient.from_connection_string(conn_str="EVENT HUBS NAMESPACE -
CONNECTION STRING", eventhub_name="EVENT HUB NAME")
async with producer:
# Create a batch.
event_data_batch = await producer.create_batch()

# Add events to the batch.


event_data_batch.add(EventData('First event '))
event_data_batch.add(EventData('Second event'))
event_data_batch.add(EventData('Third event'))

# Send the batch of events to the event hub.


await producer.send_batch(event_data_batch)

loop = asyncio.get_event_loop()
loop.run_until_complete(run())

NOTE
Para ver todo el código fuente, incluidos los comentarios informativos, vaya a la página send_async de GitHub.

Recepción de eventos
En este inicio rápido se usa Azure Blob Storage como almacén de puntos de control. El almacén de puntos de
control se usa para conservar los puntos de control (es decir, las últimas posiciones de lectura).

NOTE
Si trabaja en Azure Stack Hub, esa plataforma puede admitir una versión diferente del SDK de Blob Storage que las que
suelen estar disponibles en Azure. Por ejemplo, si trabaja en la versión 2002 de Azure Stack Hub, la versión más alta
disponible para el servicio Storage es 2017-11-09. En este caso, además de seguir los pasos de esta sección, también
tendrá que agregar código para usar como destino la versión 2017-11-09 de la API del servicio de almacenamiento. Para
ver un ejemplo de cómo usar como destino una versión de la API de Storage, consulte los ejemplos sincrónicos y
asincrónicos en GitHub. Para más información sobre las versiones del servicio Azure Storage que se admiten en Azure
Stack Hub, consulte Almacenamiento de Azure Stack Hub: diferencias y consideraciones.

Creación de una cuenta de Azure Storage y un contenedor de blobs


Cree una cuenta de Azure Storage y un contenedor de blobs en ella, para lo que debe seguir estos pasos:
1. Creación de una cuenta de Azure Storage
2. Creación de un contenedor de blobs
3. Obtención de la cadena de conexión para una cuenta de almacenamiento
Asegúrese de registrar la cadena de conexión y el nombre del contenedor para usarlo posteriormente en el
código de recepción.
Creación de un script de Python para recibir eventos
En esta sección, creará un script de Python para recibir eventos del centro de eventos:
1. Abra el editor de Python que prefiera, como Visual Studio Code.
2. Cree un script llamado recv.py.
3. Pegue el siguiente código en recv.py:

import asyncio
from azure.eventhub.aio import EventHubConsumerClient
from azure.eventhub.extensions.checkpointstoreblobaio import BlobCheckpointStore

async def on_event(partition_context, event):


# Print the event data.
print("Received the event: \"{}\" from the partition with ID: \"
{}\"".format(event.body_as_str(encoding='UTF-8'), partition_context.partition_id))

# Update the checkpoint so that the program doesn't read the events
# that it has already read when you run it next time.
await partition_context.update_checkpoint(event)

async def main():


# Create an Azure blob checkpoint store to store the checkpoints.
checkpoint_store = BlobCheckpointStore.from_connection_string("AZURE STORAGE CONNECTION STRING",
"BLOB CONTAINER NAME")

# Create a consumer client for the event hub.


client = EventHubConsumerClient.from_connection_string("EVENT HUBS NAMESPACE CONNECTION STRING",
consumer_group="$Default", eventhub_name="EVENT HUB NAME", checkpoint_store=checkpoint_store)
async with client:
# Call the receive method. Read from the beginning of the partition (starting_position: "-1")
await client.receive(on_event=on_event, starting_position="-1")

if __name__ == '__main__':
loop = asyncio.get_event_loop()
# Run the main method.
loop.run_until_complete(main())

NOTE
Para ver todo el código fuente, incluidos los comentarios informativos adicionales, vaya a la página
recv_with_checkpoint_store_async.py de GitHub.

Ejecución de la aplicación del receptor


Para ejecutar el script, abra un símbolo del sistema que tenga Python en su ruta de acceso y, después, ejecute el
siguiente comando:

python recv.py

Ejecución de la aplicación del remitente


Para ejecutar el script, abra un símbolo del sistema que tenga Python en su ruta de acceso y, después, ejecute el
siguiente comando:
python send.py

La ventana del destinatario debería mostrar los mensajes que se enviaron al centro de eventos.

Pasos siguientes
En este inicio rápido, ha enviado y recibido eventos de forma asincrónica. Para aprender a enviar y recibir
eventos de forma sincrónica, vaya a la página sync_samples de GitHub.
Para ver todos los ejemplos (tanto sincrónicos como asincrónicos) de GitHub, vaya a Biblioteca cliente de Azure
Event Hubs para ejemplos de Python.
Envío o recepción de eventos en Event Hubs
mediante JavaScript (azure/event-hubs, versión 5)
18/08/2020 • 11 minutes to read • Edit Online

En este inicio rápido se muestra cómo enviar y recibir eventos desde un centro de eventos mediante el paquete
de JavaScript azure/event-hubs, versión 5 .

IMPORTANT
En este inicio rápido se usa el reciente paquete azure/event-hubs, versión 5. Para ver un inicio rápido que use el antiguo
paquete de la versión 2 de azure/event-hubs, consulte más reciente del paquete, consulte Envío o recepción de eventos en
Event Hubs mediante Node.js ( versión 2).

Prerrequisitos
Si es la primera vez que usa Azure Event Hubs, consulte la información general de Event Hubs antes de continuar
con este inicio rápido.
Para completar este tutorial de inicio rápido, debe cumplir los siguientes requisitos previos:
Una suscripción a Microsoft Azure . Para usar los servicios de Azure, entre los que se incluye Azure
Event Hubs, se necesita una suscripción. Si no se dispone de una cuenta de Azure, es posible registrarse
para obtener una evaluación gratuita, o bien usar las ventajas que disfrutan los suscriptores MSDN al
crear una cuenta.
Node.js, versión 8.x o posteriores. Descargue la versión más reciente del soporte técnico a largo plazo
(LTS).
Visual Studio Code (se recomienda) o cualquier otro entorno de desarrollo integrado (IDE).
Un espacio de nombres de Event Hubs y un centro de eventos activos. Para crearlos, siga estos pasos:
1. En Azure Portal, cree un espacio de nombres del tipo Event Hubs y obtenga las credenciales de
administración que la aplicación necesita para comunicarse con el centro de eventos.
2. Para crear tanto el espacio de nombres como el centro de eventos, siga las instrucciones que
encontrará en Inicio rápido: Creación de un centro de eventos desde Azure Portal.
3. Para continuar, siga las instrucciones de este inicio rápido.
4. Para obtener la cadena de conexión del espacio de nombres del centro de eventos, siga las
instrucciones de Obtención de una cadena de conexión. Registre la cadena de conexión para usarla más
adelante en este inicio rápido.
Creación de un espacio de nombres de Event Hubs y un centro de eventos . El primer paso
consiste en usar Azure Portal para crear un espacio de nombres de tipo Event Hubs y obtener las
credenciales de administración que la aplicación necesita para comunicarse con el centro de eventos. Para
crear un espacio de nombres y un centro de eventos, siga el procedimiento que se indica en este artículo.
Después, obtenga la cadena de conexión para el espacio de nombres de Event Hubs . Para ello,
siga las instrucciones del artículo: Obtenga la cadena de conexión. La cadena de conexión la utilizará más
adelante en este inicio rápido.
Instalación del paquete npm
Para instalar el paquete del administrador de paquetes de nodos (npm) para Event Hubs, abra un símbolo del
sistema que tenga npm en su ruta de acceso, cambie el directorio a la carpeta en la que quiere tener los ejemplos
y después ejecute este comando:

npm install @azure/event-hubs

En el lado del receptor, tiene que instalar dos paquetes más. En este inicio rápido se usar Azure Blob Storage para
conservar los puntos de control, con el fin de que el programa no lea los eventos que ya ha leído. Ejecuta los
puntos de comprobación de metadatos en los mensajes recibidos a intervalos regulares en un blob. Este enfoque
facilita la tarea de seguir recibiendo posteriormente mensajes desde donde lo dejó.
Ejecute los comandos siguientes:

npm install @azure/storage-blob

npm install @azure/eventhubs-checkpointstore-blob

Envío de eventos
En esta sección se crea una aplicación de JavaScript que envía eventos a un centro de eventos.
1. Abra el editor que prefiera, como Visual Studio Code.
2. Cree un archivo denominado send.js y pegue en él el código siguiente:

const { EventHubProducerClient } = require("@azure/event-hubs");

const connectionString = "EVENT HUBS NAMESPACE CONNECTION STRING";


const eventHubName = "EVENT HUB NAME";

async function main() {

// Create a producer client to send messages to the event hub.


const producer = new EventHubProducerClient(connectionString, eventHubName);

// Prepare a batch of three events.


const batch = await producer.createBatch();
batch.tryAdd({ body: "First event" });
batch.tryAdd({ body: "Second event" });
batch.tryAdd({ body: "Third event" });

// Send the batch to the event hub.


await producer.sendBatch(batch);

// Close the producer client.


await producer.close();

console.log("A batch of three events have been sent to the event hub");
}

main().catch((err) => {
console.log("Error occurred: ", err);
});

3. En el código, use valores reales para reemplazar los siguientes:


EVENT HUBS NAMESPACE CONNECTION STRING
EVENT HUB NAME
4. Ejecute node send.js para ejecutar este archivo. Este comando envía un lote de tres eventos al centro de
eventos.
5. En Azure Portal, compruebe que el centro de eventos ha recibido los mensajes. En la sección Métricas ,
cambie a la vista Mensajes . Actualice la página para actualizar el gráfico. Pueden pasar unos segundos
hasta que aparezca que los mensajes se han recibido.

NOTE
Para ver todo el código fuente, incluidos los comentarios informativos adicionales, vaya a la página sendEvents.js de
GitHub.

Felicidades. Ha enviado eventos a un centro de eventos.

Recepción de eventos
En esta sección recibe eventos de un centro de eventos mediante un almacén de puntos de comprobación de
Azure Blob Storage en una aplicación de JavaScript. Ejecuta los puntos de comprobación de metadatos en los
mensajes recibidos a intervalos regulares en Azure Storage Blob. Este enfoque facilita la tarea de seguir
recibiendo posteriormente mensajes desde donde lo dejó.

NOTE
Si trabaja en Azure Stack Hub, esa plataforma puede admitir una versión diferente del SDK de Blob Storage que las que
suelen estar disponibles en Azure. Por ejemplo, si trabaja en la versión 2002 de Azure Stack Hub, la versión más alta
disponible para el servicio Storage es 2017-11-09. En este caso, además de seguir los pasos de esta sección, también
tendrá que agregar código para usar como destino la versión 2017-11-09 de la API del servicio de almacenamiento. Para
ver un ejemplo de cómo establecer como destino una versión específica de la API de Storage, consulte los ejemplos de
JavaScript y TypeScript en GitHub. Para más información sobre las versiones del servicio Azure Storage que se admiten en
Azure Stack Hub, consulte Almacenamiento de Azure Stack Hub: diferencias y consideraciones.

Creación de una cuenta de Azure Storage y un contenedor de blobs


Para crear una cuenta de Azure Storage y un contenedor de blobs en ella, realice estas acciones:
1. Creación de una cuenta de Azure Storage
2. Creación de un contenedor de blobs en la cuenta de almacenamiento
3. Obtención de la cadena de conexión para una cuenta de almacenamiento
Asegúrese de registrar la cadena de conexión y el nombre del contenedor para usarlo posteriormente en el
código de recepción.
Escritura de código para recibir eventos
1. Abra el editor que prefiera, como Visual Studio Code.
2. Cree un archivo denominado receive.js y pegue en él el código siguiente:

const { EventHubConsumerClient } = require("@azure/event-hubs");


const { ContainerClient } = require("@azure/storage-blob");
const { BlobCheckpointStore } = require("@azure/eventhubs-checkpointstore-blob");

const connectionString = "EVENT HUBS NAMESPACE CONNECTION STRING";


const eventHubName = "EVENT HUB NAME";
const consumerGroup = "$Default"; // name of the default consumer group
const storageConnectionString = "AZURE STORAGE CONNECTION STRING";
const containerName = "BLOB CONTAINER NAME";

async function main() {


// Create a blob container client and a blob checkpoint store using the client.
const containerClient = new ContainerClient(storageConnectionString, containerName);
const checkpointStore = new BlobCheckpointStore(containerClient);

// Create a consumer client for the event hub by specifying the checkpoint store.
const consumerClient = new EventHubConsumerClient(consumerGroup, connectionString, eventHubName,
checkpointStore);

// Subscribe to the events, and specify handlers for processing the events and errors.
const subscription = consumerClient.subscribe({
processEvents: async (events, context) => {
for (const event of events) {
console.log(`Received event: '${event.body}' from partition: '${context.partitionId}' and
consumer group: '${context.consumerGroup}'`);
}
// Update the checkpoint.
await context.updateCheckpoint(events[events.length - 1]);
},

processError: async (err, context) => {


console.log(`Error : ${err}`);
}
}
);

// After 30 seconds, stop processing.


await new Promise((resolve) => {
setTimeout(async () => {
await subscription.close();
await consumerClient.close();
resolve();
}, 30000);
});
}

main().catch((err) => {
console.log("Error occurred: ", err);
});
3. En el código, use valores reales para reemplazar los siguientes:
EVENT HUBS NAMESPACE CONNECTION STRING
EVENT HUB NAME
AZURE STORAGE CONNECTION STRING
BLOB CONTAINER NAME
4. Ejecute node receive.js en un símbolo del sistema para ejecutar este archivo. La ventana debe mostrar
mensajes sobre los eventos recibidos.

NOTE
Para ver todo el código fuente, incluidos los comentarios informativos adicionales, vaya a la página
receiveEventsUsingCheckpointStore.js de GitHub.

Felicidades. Ya ha recibido eventos procedentes del centro de eventos. El programa del destinatario recibirá los
eventos de todas las particiones del grupo de consumidores predeterminado en el centro de eventos.

Pasos siguientes
Consulte estos ejemplos de código en GitHub:
Ejemplos de JavaScript
Ejemplos de TypeScript
Inicio rápido: Envío o recepción de eventos en Event
Hubs mediante Go
18/08/2020 • 11 minutes to read • Edit Online

Azure Event Hubs es una plataforma de streaming de macrodatos y servicio de ingesta de eventos de gran
escalabilidad capaz de recibir y procesar millones de eventos por segundo. Event Hubs puede procesar y
almacenar eventos, datos o telemetría generados por dispositivos y software distribuido. Los datos enviados a un
centro de eventos se pueden transformar y almacenar con cualquier proveedor de análisis en tiempo real o
adaptadores de procesamiento por lotes y almacenamiento. Para más información sobre Event Hubs, consulte
Introducción a Event Hubs y Características de Event Hubs.
En este tutorial se describe cómo escribir aplicaciones de Go para enviar o recibir eventos en un centro de
eventos.

NOTE
Puede descargar esta guía de inicio rápido como un ejemplo desde GitHub, reemplazar las cadenas
EventHubConnectionString y EventHubName por los valores del centro de eventos, y ejecutarlo. También puede seguir
los pasos de este tutorial para crear el suyo propio.

Prerrequisitos
Para completar este tutorial, debe cumplir los siguientes requisitos previos:
Go instalado de forma local. Siga estas instrucciones si es necesario.
Una cuenta de Azure activa. Si no tiene una suscripción a Azure, cree una cuenta gratuita antes de empezar.
Creación de un espacio de nombres de Event Hubs y un centro de eventos . Use Azure Portal para
crear un espacio de nombres de tipo Event Hubs y obtener las credenciales de administración que la aplicación
necesita para comunicarse con el centro de eventos. Para crear un espacio de nombres y un centro de eventos,
siga el procedimiento que se indica en este artículo.

Envío de eventos
En esta sección se muestra cómo crear una aplicación de Go para enviar eventos a un centro de eventos.
Instalación del paquete Go
Consiga el paquete Go para Event Hubs con go get o dep . Por ejemplo:

go get -u github.com/Azure/azure-event-hubs-go
go get -u github.com/Azure/azure-amqp-common-go/...

# or

dep ensure -add github.com/Azure/azure-event-hubs-go


dep ensure -add github.com/Azure/azure-amqp-common-go

Importación de paquetes en el archivo de código


Para importar paquetes de Go, utilice el siguiente ejemplo de código:
import (
aad "github.com/Azure/azure-amqp-common-go/aad"
eventhubs "github.com/Azure/azure-event-hubs-go"
)

Creación de una entidad de servicio


Cree una nueva entidad de servicio siguiendo las instrucciones que se indican en Creación de una entidad de
servicio de Azure con la CLI de Azure 2.0. Guarde las credenciales proporcionadas en su entorno con los
siguientes nombres. Los paquetes de Azure SDK para Go y de Event Hubs se han configurado previamente para
buscar estos nombres de variables:

export AZURE_CLIENT_ID=
export AZURE_CLIENT_SECRET=
export AZURE_TENANT_ID=
export AZURE_SUBSCRIPTION_ID=

Ahora, cree un proveedor de autorización para el cliente de Event Hubs que usa estas credenciales:

tokenProvider, err := aad.NewJWTProvider(aad.JWTProviderWithEnvironmentVars())


if err != nil {
log.Fatalf("failed to configure AAD JWT provider: %s\n", err)
}

Creación de cliente de Event Hubs


El siguiente código crea un cliente de Event Hubs:

hub, err := eventhubs.NewHub("namespaceName", "hubName", tokenProvider)


ctx := context.WithTimeout(context.Background(), 10 * time.Second)
defer hub.Close(ctx)
if err != nil {
log.Fatalf("failed to get hub %s\n", err)
}

Escritura de código para enviar mensajes


En el siguiente fragmento de código, utilice (1) para enviar mensajes de forma interactiva desde un terminal, o (2)
para enviar mensajes desde el programa:

// 1. send messages at the terminal


ctx = context.Background()
reader := bufio.NewReader(os.Stdin)
for {
fmt.Printf("Input a message to send: ")
text, _ := reader.ReadString('\n')
hub.Send(ctx, eventhubs.NewEventFromString(text))
}

// 2. send messages within program


ctx = context.Background()
hub.Send(ctx, eventhubs.NewEventFromString("hello Azure!"))

Extras
Obtenga los identificadores de las particiones del centro de eventos:
info, err := hub.GetRuntimeInformation(ctx)
if err != nil {
log.Fatalf("failed to get runtime info: %s\n", err)
}
log.Printf("got partition IDs: %s\n", info.PartitionIDs)

Ejecute la aplicación para enviar eventos al centro de eventos.


Felicidades. Ha enviado mensajes a un centro de eventos.

Recepción de eventos
Creación de una cuenta de almacenamiento y un contenedor
Los estados como, por ejemplo, las concesiones sobre particiones y puntos de comprobación del flujo de eventos
se comparten entre receptores mediante un contenedor de Azure Storage. Puede crear una cuenta de
almacenamiento y un contenedor con el SDK para Go, pero también puede crearlos siguiendo las instrucciones de
Acerca de las cuentas de almacenamiento de Azure.
Hay ejemplos disponibles para la creación de artefactos de Storage con el SDK para Go en el repositorio de
ejemplos de Go y en el ejemplo correspondiente de este tutorial.
Paquetes de Go
Para recibir los mensajes, obtenga los paquetes de Go para Event Hubs con go get o dep :

go get -u github.com/Azure/azure-event-hubs-go/...
go get -u github.com/Azure/azure-amqp-common-go/...
go get -u github.com/Azure/go-autorest/...

# or

dep ensure -add github.com/Azure/azure-event-hubs-go


dep ensure -add github.com/Azure/azure-amqp-common-go
dep ensure -add github.com/Azure/go-autorest

Importación de paquetes en el archivo de código


Para importar paquetes de Go, utilice el siguiente ejemplo de código:

import (
aad "github.com/Azure/azure-amqp-common-go/aad"
eventhubs "github.com/Azure/azure-event-hubs-go"
eph "github.com/Azure/azure-event-hubs-go/eph"
storageLeaser "github.com/Azure/azure-event-hubs-go/storage"
azure "github.com/Azure/go-autorest/autorest/azure"
)

Creación de una entidad de servicio


Cree una nueva entidad de servicio siguiendo las instrucciones que se indican en Creación de una entidad de
servicio de Azure con la CLI de Azure 2.0. Guarde las credenciales proporcionadas en su entorno con los
siguientes nombres: Los paquetes de Azure SDK para Go y de Event Hubs se han configurado previamente para
buscar estos nombres de variables.

export AZURE_CLIENT_ID=
export AZURE_CLIENT_SECRET=
export AZURE_TENANT_ID=
export AZURE_SUBSCRIPTION_ID=
A continuación, cree un proveedor de autorización para el cliente de Event Hubs que usa estas credenciales:

tokenProvider, err := aad.NewJWTProvider(aad.JWTProviderWithEnvironmentVars())


if err != nil {
log.Fatalf("failed to configure AAD JWT provider: %s\n", err)
}

Obtención de la estructura de metadatos


Obtenga una estructura con metadatos sobre el entorno de Azure mediante Azure SDK para Go. Las operaciones
posteriores usarán esta estructura para buscar los puntos de conexión correctos.

azureEnv, err := azure.EnvironmentFromName("AzurePublicCloud")


if err != nil {
log.Fatalf("could not get azure.Environment struct: %s\n", err)
}

Creación de un asistente de credenciales


Cree un asistente de credenciales que use las credenciales anteriores de Azure Active Directory (AAD) para crear
una credencial de firma de acceso compartido (SAS) para Storage. El último parámetro le indica a este constructor
que debe usar las mismas variables de entorno que se usaron anteriormente:

cred, err := storageLeaser.NewAADSASCredential(


subscriptionID,
resourceGroupName,
storageAccountName,
storageContainerName,
storageLeaser.AADSASCredentialWithEnvironmentVars())
if err != nil {
log.Fatalf("could not prepare a storage credential: %s\n", err)
}

Creación de un generador de puntos de comprobación y un generador de concesiones


Cree un generador de concesiones , que se encargue de conceder una partición a un receptor determinado, y
un generador de puntos de comprobación , encargado de escribir puntos de comprobación para el flujo de
mensajes para que otros receptores puedan empezar a leerlos desde la posición de desplazamiento correcta.
Actualmente, solo hay una instancia de StorageLeaserCheckpointer disponible que usa el mismo contenedor
de Storage para administrar las concesiones y los puntos de comprobación. Además de la cuenta de
almacenamiento y de los nombres de contenedor, StorageLeaserCheckpointer necesita las credenciales que se
crearon en el paso anterior y la estructura del entorno de Azure para acceder correctamente al contenedor.

leaserCheckpointer, err := storageLeaser.NewStorageLeaserCheckpointer(


cred,
storageAccountName,
storageContainerName,
azureEnv)
if err != nil {
log.Fatalf("could not prepare a storage leaserCheckpointer: %s\n", err)
}

Construcción del host del procesador de eventos


Ahora tiene los elementos necesarios para construir un host EventProcessorHost, de la forma que se indica a
continuación. Se usa la misma instancia de StorageLeaserCheckpointer para el generador de concesiones y de
puntos de comprobación, como se ha descrito anteriormente:
ctx := context.Background()
p, err := eph.New(
ctx,
nsName,
hubName,
tokenProvider,
leaserCheckpointer,
leaserCheckpointer)
if err != nil {
log.Fatalf("failed to create EPH: %s\n", err)
}
defer p.Close(context.Background())

Creación de un controlador
Cree un controlador y regístrelo con el host del procesador de eventos. Cuando se inicie el host, se aplicará este y
todos los demás controladores especificados a los mensajes entrantes:

handler := func(ctx context.Context, event *eventhubs.Event) error {


fmt.Printf("received: %s\n", string(event.Data))
return nil
}

// register the handler with the EPH


_, err := p.RegisterHandler(ctx, handler)
if err != nil {
log.Fatalf("failed to register handler: %s\n", err)
}

Escritura de código para recibir mensajes


Una vez configurado todo, puede iniciar el host del procesador de eventos con Start(context) para mantenerlo
constantemente en ejecución, o con StartNonBlocking(context) para que se ejecute solo si los mensajes están
disponibles.
Este tutorial se inicia y se ejecuta de la siguiente manera. Consulte el ejemplo mediante StartNonBlocking :

ctx := context.Background()
err = p.Start()
if err != nil {
log.Fatalf("failed to start EPH: %s\n", err)
}

Pasos siguientes
Lea los siguientes artículos:
EventProcessorHost
Características y terminología de Azure Event Hubs
Preguntas más frecuentes sobre Event Hubs
Inicio rápido: Envío de eventos a Azure Event Hubs
mediante C
18/08/2020 • 6 minutes to read • Edit Online

Introducción
Azure Event Hubs es una plataforma de streaming de macrodatos y servicio de ingesta de eventos de gran
escalabilidad capaz de recibir y procesar millones de eventos por segundo. Event Hubs puede procesar y
almacenar eventos, datos o telemetría generados por dispositivos y software distribuido. Los datos enviados a un
centro de eventos se pueden transformar y almacenar con cualquier proveedor de análisis en tiempo real o
adaptadores de procesamiento por lotes y almacenamiento. Para más información sobre Event Hubs, consulte
Introducción a Event Hubs y Características de Event Hubs.
En este tutorial se describe cómo enviar eventos a un centro de eventos mediante una aplicación de consola en C.

Prerrequisitos
Para completar este tutorial, necesitará lo siguiente:
Un entorno de desarrollo de C. Para este tutorial se presupone el uso de la pila de gcc en una máquina virtual
Linux de Azure con Ubuntu 14.04.
Microsoft Visual Studio.
Creación de un espacio de nombres de Event Hubs y un centro de eventos . Use Azure Portal para
crear un espacio de nombres de tipo Event Hubs y obtener las credenciales de administración que la aplicación
necesita para comunicarse con el centro de eventos. Para crear un espacio de nombres y un centro de eventos,
siga el procedimiento que se indica en este artículo. Obtenga el valor de la clave de acceso para el centro de
eventos siguiendo las instrucciones del artículo: Obtenga la cadena de conexión. Utilice la clave de acceso en el
código que escriba más adelante en este tutorial. El nombre de la clave predeterminada es:
RootManageSharedAccessKey .

Escritura de código para enviar mensajes a Event Hubs


En esta sección se muestra cómo se escribe una aplicación en C para enviar eventos al centro de eventos. El
código usa la biblioteca Proton AMQP del proyecto Apache Qpid. Esto es parecido a usar temas y colas de Service
Bus con AMQP desde C como se muestra en este ejemplo. Para más información, consulte la documentación de
Qpid Proton.
1. En la página Qpid AMQP Messenger, siga las instrucciones para instalar Qpid Proton según su entorno.
2. Para compilar la biblioteca Proton, instale los paquetes siguientes:

sudo apt-get install build-essential cmake uuid-dev openssl libssl-dev

3. Descargue la biblioteca de Qpid Proton y extráigala; por ejemplo:

wget https://archive.apache.org/dist/qpid/proton/0.7/qpid-proton-0.7.tar.gz
tar xvfz qpid-proton-0.7.tar.gz

4. Cree un directorio de compilación, compile y realice la instalación:


cd qpid-proton-0.7
mkdir build
cd build
cmake -DCMAKE_INSTALL_PREFIX=/usr ..
sudo make install

5. En su directorio de trabajo, cree un nuevo archivo denominado sender.c con el siguiente código. No olvide
reemplazar los valores de nombre/clave de SAS, el nombre del centro de eventos y del espacio de
nombres. También debe sustituir una versión con codificación URL de la clave para la regla SendRule
creada anteriormente. Puede codificar con URL aquí.

#include "proton/message.h"
#include "proton/messenger.h"

#include <getopt.h>
#include <proton/util.h>
#include <sys/time.h>
#include <stddef.h>
#include <stdio.h>
#include <string.h>
#include <unistd.h>
#include <stdlib.h>

#define check(messenger) \
{ \
if(pn_messenger_errno(messenger)) \
{ \
printf("check\n"); \
die(__FILE__, __LINE__, pn_error_text(pn_messenger_error(messenger))); \
} \
}

pn_timestamp_t time_now(void)
{
struct timeval now;
if (gettimeofday(&now, NULL)) pn_fatal("gettimeofday failed\n");
return ((pn_timestamp_t)now.tv_sec) * 1000 + (now.tv_usec / 1000);
}

void die(const char *file, int line, const char *message)


{
printf("Dead\n");
fprintf(stderr, "%s:%i: %s\n", file, line, message);
exit(1);
}

int sendMessage(pn_messenger_t * messenger) {


char * address = (char *) "amqps://{SAS Key Name}:{SAS key}@{namespace
name}.servicebus.windows.net/{event hub name}";
char * msgtext = (char *) "Hello from C!";

pn_message_t * message;
pn_data_t * body;
message = pn_message();

pn_message_set_address(message, address);
pn_message_set_content_type(message, (char*) "application/octect-stream");
pn_message_set_inferred(message, true);

body = pn_message_body(message);
pn_data_put_binary(body, pn_bytes(strlen(msgtext), msgtext));

pn_messenger_put(messenger, message);
check(messenger);
pn_messenger_send(messenger, 1);
check(messenger);

pn_message_free(message);
}

int main(int argc, char** argv) {


printf("Press Ctrl-C to stop the sender process\n");

pn_messenger_t *messenger = pn_messenger(NULL);


pn_messenger_set_outgoing_window(messenger, 1);
pn_messenger_start(messenger);

while(true) {
sendMessage(messenger);
printf("Sent message\n");
sleep(1);
}

// release messenger resources


pn_messenger_stop(messenger);
pn_messenger_free(messenger);

return 0;
}

6. Compile el archivo, suponiendo que gcc :

gcc sender.c -o sender -lqpid-proton

NOTE
En este código se usa una ventana de salida de 1 para forzar que los mensajes salgan tan pronto como sea posible.
Se recomienda que la aplicación pruebe con los mensajes por lotes para aumentar el rendimiento. Consulte la
página Qpid AMQP Messenger para más información sobre cómo usar la biblioteca de Qpid Proton en este y otros
entornos y desde las plataformas para las que se proporcionan enlaces (actualmente, Perl, PHP, Python y Ruby).

Ejecute la aplicación para enviar mensajes al centro de eventos.


Felicidades. Ha enviado mensajes a un centro de eventos.

Pasos siguientes
Lea los siguientes artículos:
EventProcessorHost
Características y terminología de Azure Event Hubs
Inicio rápido: Recepción de eventos desde Event
Hubs mediante Apache Storm
18/08/2020 • 7 minutes to read • Edit Online

Apache Storm es un sistema distribuido de cálculo en tiempo real que simplifica el procesamiento confiable de
flujos de datos sin enlazar. Esta sección muestra cómo utilizar un spout de Storm para Azure Event Hubs a fin de
recibir eventos de Event Hubs. Con Apache Storm, se pueden dividir los eventos en varios procesos hospedados
en distintos nodos. La integración de Event Hubs con Storm simplifica el consumo de eventos al comprobar de
forma transparente el progreso mediante la instalación de Zookeeper de Storm, la administración de puntos de
comprobación persistentes y las recepciones en paralelo de Event Hubs.
Para más información sobre los patrones de recepción de Event Hubs, vea la Información general de Event Hubs.

Prerrequisitos
Antes de empezar con el inicio rápido, cree un espacio de nombres de Event Hubs y un centro de
eventos . Use Azure Portal para crear un espacio de nombres de tipo Event Hubs y obtener las credenciales de
administración que la aplicación necesita para comunicarse con el centro de eventos. Para crear un espacio de
nombres y un centro de eventos, siga el procedimiento que se indica en este artículo.

Creación del proyecto y adición de código


Este tutorial usa una instalación de HDInsight Storm , que integra el emisor de Event Hubs que ya se encuentra
disponible.
1. Siga el procedimiento descrito en Introducción a HDInsight Storm para crear un clúster nuevo de HDInsight
y conectarlo a través del Escritorio remoto.
2. Copie el archivo %STORM_HOME%\examples\eventhubspout\eventhubs-storm-spout-0.9-jar-with-dependencies.jar
en su entorno de desarrollo local. Contiene events-storm-spout.
3. Utilice el comando siguiente para instalar el paquete en el almacén Maven local. Esto permite agregarlo
como referencia en el proyecto de Storm en un paso posterior.

mvn install:install-file -Dfile=target\eventhubs-storm-spout-0.9-jar-with-dependencies.jar -


DgroupId=com.microsoft.eventhubs -DartifactId=eventhubs-storm-spout -Dversion=0.9 -Dpackaging=jar

4. En Eclipse, cree un proyecto Maven nuevo (haga clic en Archivo , Nuevo y, a continuación, en Proyecto ).
5. Seleccione Usar ubicación del área de trabajo predeterminada y, a continuación, haga clic en
Siguiente
6. Seleccione el arquetipo maven-archetype-quickstar t y, a continuación, haga clic en Siguiente
7. Inserte un GroupId y Ar tifactId y, a continuación, haga clic en Finalizar
8. En pom.xml , agregue las siguientes dependencias en el nodo <dependency> .

<dependency>
<groupId>org.apache.storm</groupId>
<artifactId>storm-core</artifactId>
<version>0.9.2-incubating</version>
<scope>provided</scope>
</dependency>
<dependency>
<groupId>com.microsoft.eventhubs</groupId>
<artifactId>eventhubs-storm-spout</artifactId>
<version>0.9</version>
</dependency>
<dependency>
<groupId>com.netflix.curator</groupId>
<artifactId>curator-framework</artifactId>
<version>1.3.3</version>
<exclusions>
<exclusion>
<groupId>log4j</groupId>
<artifactId>log4j</artifactId>
</exclusion>
<exclusion>
<groupId>org.slf4j</groupId>
<artifactId>slf4j-log4j12</artifactId>
</exclusion>
</exclusions>
<scope>provided</scope>
</dependency>

9. En la carpeta src , cree un archivo llamado Config.proper ties y copie el siguiente contenido, sustituyendo
los valores receive rule key y event hub name :

eventhubspout.username = ReceiveRule
eventhubspout.password = {receive rule key}
eventhubspout.namespace = ioteventhub-ns
eventhubspout.entitypath = {event hub name}
eventhubspout.partitions.count = 16

# if not provided, will use storm's zookeeper settings


# zookeeper.connectionstring=localhost:2181

eventhubspout.checkpoint.interval = 10
eventhub.receiver.credits = 10

El valor de eventhub.receiver.credits determina cuántos eventos se procesan por lotes antes de


liberarlos a la canalización de Storm. Por simplicidad, este ejemplo establece el valor en 10. En producción,
se debe normalmente establecer en valores más altos; Por ejemplo, 1024.
10. Cree una clase nueva denominada LoggerBolt con el código siguiente:

import java.util.Map;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import backtype.storm.task.OutputCollector;
import backtype.storm.task.TopologyContext;
import backtype.storm.topology.OutputFieldsDeclarer;
import backtype.storm.topology.base.BaseRichBolt;
import backtype.storm.tuple.Tuple;

public class LoggerBolt extends BaseRichBolt {


private OutputCollector collector;
private static final Logger logger = LoggerFactory
.getLogger(LoggerBolt.class);

@Override
public void execute(Tuple tuple) {
String value = tuple.getString(0);
logger.info("Tuple value: " + value);

collector.ack(tuple);
}

@Override
public void prepare(Map map, TopologyContext context, OutputCollector collector) {
this.collector = collector;
this.count = 0;
}

@Override
public void declareOutputFields(OutputFieldsDeclarer declarer) {
// no output fields
}

Este elemento de Storm registra el contenido de los eventos recibidos. Esto se puede ampliar fácilmente
para almacenar las tuplas en un servicio de almacenamiento. El ejemplo de HDInsight Storm con Event
Hubs usa este mismo enfoque para almacenar datos en Azure Storage y Power BI.
11. Cree una clase denominada LogTopology con el código siguiente:

import java.io.FileReader;
import java.util.Properties;
import java.util.Properties;
import backtype.storm.Config;
import backtype.storm.LocalCluster;
import backtype.storm.StormSubmitter;
import backtype.storm.generated.StormTopology;
import backtype.storm.topology.TopologyBuilder;
import com.microsoft.eventhubs.samples.EventCount;
import com.microsoft.eventhubs.spout.EventHubSpout;
import com.microsoft.eventhubs.spout.EventHubSpoutConfig;

public class LogTopology {


protected EventHubSpoutConfig spoutConfig;
protected int numWorkers;

protected void readEHConfig(String[] args) throws Exception {


Properties properties = new Properties();
if (args.length > 1) {
properties.load(new FileReader(args[1]));
} else {
properties.load(EventCount.class.getClassLoader()
.getResourceAsStream("Config.properties"));
}

String username = properties.getProperty("eventhubspout.username");


String password = properties.getProperty("eventhubspout.password");
String namespaceName = properties
.getProperty("eventhubspout.namespace");
String entityPath = properties.getProperty("eventhubspout.entitypath");
String zkEndpointAddress = properties
.getProperty("zookeeper.connectionstring"); // opt
int partitionCount = Integer.parseInt(properties
.getProperty("eventhubspout.partitions.count"));
int checkpointIntervalInSeconds = Integer.parseInt(properties
.getProperty("eventhubspout.checkpoint.interval"));
int receiverCredits = Integer.parseInt(properties
.getProperty("eventhub.receiver.credits")); // prefetch count
// (opt)
System.out.println("Eventhub spout config: ");
System.out.println(" partition count: " + partitionCount);
System.out.println(" checkpoint interval: "
+ checkpointIntervalInSeconds);
System.out.println(" receiver credits: " + receiverCredits);

spoutConfig = new EventHubSpoutConfig(username, password,


namespaceName, entityPath, partitionCount, zkEndpointAddress,
checkpointIntervalInSeconds, receiverCredits);

// set the number of workers to be the same as partition number.


// the idea is to have a spout and a logger bolt co-exist in one
// worker to avoid shuffling messages across workers in storm cluster.
numWorkers = spoutConfig.getPartitionCount();

if (args.length > 0) {
// set topology name so that sample Trident topology can use it as
// stream name.
spoutConfig.setTopologyName(args[0]);
}
}

protected StormTopology buildTopology() {


TopologyBuilder topologyBuilder = new TopologyBuilder();

EventHubSpout eventHubSpout = new EventHubSpout(spoutConfig);


topologyBuilder.setSpout("EventHubsSpout", eventHubSpout,
spoutConfig.getPartitionCount()).setNumTasks(
spoutConfig.getPartitionCount());
topologyBuilder
.setBolt("LoggerBolt", new LoggerBolt(),
spoutConfig.getPartitionCount())
.localOrShuffleGrouping("EventHubsSpout")
.localOrShuffleGrouping("EventHubsSpout")
.setNumTasks(spoutConfig.getPartitionCount());
return topologyBuilder.createTopology();
}

protected void runScenario(String[] args) throws Exception {


boolean runLocal = true;
readEHConfig(args);
StormTopology topology = buildTopology();
Config config = new Config();
config.setDebug(false);

if (runLocal) {
config.setMaxTaskParallelism(2);
LocalCluster localCluster = new LocalCluster();
localCluster.submitTopology("test", config, topology);
Thread.sleep(5000000);
localCluster.shutdown();
} else {
config.setNumWorkers(numWorkers);
StormSubmitter.submitTopology(args[0], config, topology);
}
}

public static void main(String[] args) throws Exception {


LogTopology topology = new LogTopology();
topology.runScenario(args);
}
}

Esta clase crea un emisor de Event Hubs, utilizando las propiedades del archivo de configuración para crear
una instancia. Es importante tener en cuenta que este ejemplo crea tantas tareas de spout como número de
particiones hay en el centro de eventos, para poder usar el paralelismo máximo permitido por ese centro
de eventos.

Pasos siguientes
Para más información acerca de Event Hubs, visite los vínculos siguientes:
Información general de Event Hubs
Creación de un centro de eventos
Preguntas más frecuentes sobre Event Hubs
Envío o recepción de eventos desde Azure Event
Hubs mediante .NET Core
(Microsoft.Azure.EventHubs)
18/08/2020 • 15 minutes to read • Edit Online

En este inicio rápido se explica cómo enviar eventos a un centro de eventos o recibirlos de este mediante la
biblioteca de .NET Core Microsoft.Azure.EventHubs .

WARNING
En este inicio rápido se usa el paquete Microsoft.Azure.EventHubs anterior. Para obtener un inicio rápido que use la
biblioteca Azure.Messaging.EventHubs más reciente, consulte Envío y recepción de eventos mediante la biblioteca
Azure.Messaging.EventHubs. Para que la aplicación use la biblioteca nueva en lugar de la anterior, consulte la Guía para
migrar desde Microsoft.Azure.EventHubs a Azure.Messaging.EventHubs.

Prerrequisitos
Si es la primera vez que usa Azure Event Hubs, consulte la información general de Event Hubs antes de continuar
con este inicio rápido.
Para completar este tutorial de inicio rápido, debe cumplir los siguientes requisitos previos:
Una suscripción a Microsoft Azure . Para usar los servicios de Azure, entre los que se incluye Azure Event
Hubs, se necesita una suscripción. Si no se dispone de una cuenta de Azure, es posible registrarse para obtener
una evaluación gratuita, o bien usar las ventajas que disfrutan los suscriptores MSDN al crear una cuenta.
Microsoft Visual Studio 2019.
Herramientas de .NET Core Visual Studio 2015 o 2017.
Creación de un espacio de nombres de Event Hubs y un centro de eventos . El primer paso consiste
en usar Azure Portal para crear un espacio de nombres de tipo Event Hubs y obtener las credenciales de
administración que la aplicación necesita para comunicarse con el centro de eventos. Para crear un espacio de
nombres y un centro de eventos, siga el procedimiento que se indica en este artículo. A continuación, obtenga
la cadena de conexión para el espacio de nombres del centro de eventos siguiendo las instrucciones
del artículo: Obtenga la cadena de conexión. La utilizará más adelante en este inicio rápido.

Envío de eventos
En esta sección se muestra cómo crear una aplicación de consola de .NET Core para enviar eventos a un centro de
eventos.

NOTE
Puede descargar esta guía de inicio rápido como un ejemplo desde GitHub, reemplazar las cadenas
EventHubConnectionString y EventHubName por los valores del centro de eventos, y ejecutarlo. También puede seguir los
pasos de este inicio rápido para crear la suya propia.

Creación de una aplicación de consola


Inicie Visual Studio. En el menú Archivo , haga clic en Nuevo y en Proyecto . Cree una aplicación de consola de
.NET Core.

Incorporación del paquete NuGet de Event Hubs


Agregue el paquete NuGet de la biblioteca .NET Core Microsoft.Azure.EventHubs a su proyecto siguiendo estos
pasos:
1. Haga clic con el botón derecho en el proyecto recién creado y seleccione Administrar paquetes NuGet .
2. Haga clic en la pestaña Examinar y, después, busque "Microsoft.Azure.EventHubs" y seleccione el paquete
Microsoft.Azure.EventHubs . Haga clic en Instalar para completar la instalación y, a continuación, cierre este
cuadro de diálogo.
Escritura de código para enviar mensajes al centro de eventos
1. Agregue las siguientes instrucciones using al principio del archivo Program.cs:

using Microsoft.Azure.EventHubs;
using System.Text;
using System.Threading.Tasks;

2. Agregue constantes a la clase Program para la cadena de conexión de Event Hubs y la ruta de la entidad
(nombre de centro de eventos individual). Reemplace los marcadores de posición entre llaves por los
valores adecuados obtenidos al crear el centro de eventos. Asegúrese de que
{Event Hubs connection string} es la cadena de conexión en el nivel de espacio de nombres y no la cadena
de Event Hub.

private static EventHubClient eventHubClient;


private const string EventHubConnectionString = "{Event Hubs connection string}";
private const string EventHubName = "{Event Hub path/name}";

3. Agregue un nuevo método denominado MainAsync a la clase Program , de esta manera:


private static async Task MainAsync(string[] args)
{
// Creates an EventHubsConnectionStringBuilder object from the connection string, and sets the
EntityPath.
// Typically, the connection string should have the entity path in it, but this simple scenario
// uses the connection string from the namespace.
var connectionStringBuilder = new EventHubsConnectionStringBuilder(EventHubConnectionString)
{
EntityPath = EventHubName
};

eventHubClient = EventHubClient.CreateFromConnectionString(connectionStringBuilder.ToString());

await SendMessagesToEventHub(100);

await eventHubClient.CloseAsync();

Console.WriteLine("Press ENTER to exit.");


Console.ReadLine();
}

4. Agregue un nuevo método denominado SendMessagesToEventHub a la clase Program , de esta manera:

// Uses the event hub client to send 100 messages to the event hub.
private static async Task SendMessagesToEventHub(int numMessagesToSend)
{
for (var i = 0; i < numMessagesToSend; i++)
{
try
{
var message = $"Message {i}";
Console.WriteLine($"Sending message: {message}");
await eventHubClient.SendAsync(new EventData(Encoding.UTF8.GetBytes(message)));
}
catch (Exception exception)
{
Console.WriteLine($"{DateTime.Now} > Exception: {exception.Message}");
}

await Task.Delay(10);
}

Console.WriteLine($"{numMessagesToSend} messages sent.");


}

5. Agregue el siguiente código al método Main de la clase Program :

MainAsync(args).GetAwaiter().GetResult();

Este es el aspecto que debería tener Program.cs.


namespace SampleSender
{
using System;
using System.Text;
using System.Threading.Tasks;
using Microsoft.Azure.EventHubs;

public class Program


{
private static EventHubClient eventHubClient;
private const string EventHubConnectionString = "{Event Hubs connection string}";
private const string EventHubName = "{Event Hub path/name}";

public static void Main(string[] args)


{
MainAsync(args).GetAwaiter().GetResult();
}

private static async Task MainAsync(string[] args)


{
// Creates an EventHubsConnectionStringBuilder object from the connection string, and sets
the EntityPath.
// Typically, the connection string should have the entity path in it, but for the sake of
this simple scenario
// we are using the connection string from the namespace.
var connectionStringBuilder = new
EventHubsConnectionStringBuilder(EventHubConnectionString)
{
EntityPath = EventHubName
};

eventHubClient =
EventHubClient.CreateFromConnectionString(connectionStringBuilder.ToString());

await SendMessagesToEventHub(100);

await eventHubClient.CloseAsync();

Console.WriteLine("Press ENTER to exit.");


Console.ReadLine();
}

// Uses the event hub client to send 100 messages to the event hub.
private static async Task SendMessagesToEventHub(int numMessagesToSend)
{
for (var i = 0; i < numMessagesToSend; i++)
{
try
{
var message = $"Message {i}";
Console.WriteLine($"Sending message: {message}");
await eventHubClient.SendAsync(new EventData(Encoding.UTF8.GetBytes(message)));
}
catch (Exception exception)
{
Console.WriteLine($"{DateTime.Now} > Exception: {exception.Message}");
}

await Task.Delay(10);
}

Console.WriteLine($"{numMessagesToSend} messages sent.");


}
}
}
6. Ejecute el programa y asegúrese de que no hay ningún error.

Recepción de eventos
En esta sección se muestra cómo escribir una aplicación de consola de .NET Core que reciba mensajes de un
centro de eventos mediante el host de procesador de eventos. El host de procesador de eventos es una clase de
.NET que simplifica la recepción de eventos desde Event Hubs mediante la administración de puntos de control
persistentes y recepciones paralelas desde dichas instancias de Event Hubs. Mediante el host de procesador de
eventos, puede dividir eventos entre varios receptores, aunque estén hospedados en distintos nodos. En este
ejemplo se muestra cómo usar el host de procesador de eventos en un solo receptor.

NOTE
Puede descargar esta guía de inicio rápido como un ejemplo desde GitHub, reemplazar las cadenas
EventHubConnectionString y EventHubName , StorageAccountName , StorageAccountKey y StorageContainerName
con los valores del centro de eventos y ejecutarlo. También puede seguir los pasos de este tutorial para crear el suyo propio.

Creación de una cuenta de almacenamiento para el host de procesador de eventos


El host de procesador de eventos es un agente inteligente que simplifica la recepción de eventos desde Event Hubs
mediante la administración de puntos de control persistentes y recepciones paralelas. Para los puntos de
comprobación, el host de procesador de eventos requiere una cuenta de almacenamiento. El ejemplo siguiente
muestra cómo crear una cuenta de almacenamiento y cómo obtener sus claves para el acceso:
1. En el menú de Azure Portal, seleccione Crear un recurso .

2. Seleccione Storage > Cuenta de Storage .


3. En la página Crear cuenta de almacenamiento , realice los pasos siguientes:
a. Escriba el nombre de la cuenta de almacenamiento .
b. Elija una suscripción de Azure que contenga el centro de eventos.
c. Elija o cree el grupo de recursos que tenga el centro de eventos.
d. Seleccione la ubicación en la que va a crear el recurso.
e. Seleccione Revisar + crear .
4. En la página Revisar + crear , revise los valores y seleccione Crear .
5. Después de ver el mensaje Correcto en las notificaciones, seleccione Ir al recurso para abrir la página de
la cuenta de almacenamiento. Como alternativa, puede expandir Detalles de la implementación y,
después, seleccionar el nuevo recurso en la lista de recursos.
6. Seleccione Contenedores .

7. Seleccione + Contenedor en la parte superior, escriba un nombre para el contenedor y seleccione


Aceptar .

8. Elija Claves de acceso en el menú de la página Cuenta de almacenamiento y copie el valor de key1 .
Guarde los valores siguientes en el Bloc de notas o en cualquier otra ubicación temporal.
Nombre de la cuenta de almacenamiento
Clave de acceso para la cuenta de almacenamiento
Nombre del contenedor
Creación de una aplicación de consola
Inicie Visual Studio. En el menú Archivo , haga clic en Nuevo y en Proyecto . Cree una aplicación de consola de
.NET Core.
Incorporación del paquete NuGet de Event Hubs
Agregue los paquetes NuGet de la biblioteca de .NET Standard Microsoft.Azure.EventHubs y
Microsoft.Azure.EventHubs.Processor al proyecto mediante estos pasos:
1. Haga clic con el botón derecho en el proyecto recién creado y seleccione Administrar paquetes NuGet .
2. Haga clic en la pestaña Examinar , busque Microsoft.Azure.EventHubs y seleccione el paquete
Microsoft.Azure.EventHubs . Haga clic en Instalar para completar la instalación y, a continuación, cierre este
cuadro de diálogo.
3. Repita los pasos 1 y 2 e instale el paquete Microsoft.Azure.EventHubs.Processor .
Implementación de la interfaz de IEventProcessor
1. En el Explorador de soluciones, haga clic con el botón derecho en el proyecto, haga clic en Agregar y
después en Clase . Asigne el nombre SimpleEventProcessor a la nueva clase.
2. Abra el archivo SimpleEventProcessor.cs y agregue las siguientes instrucciones using en la parte superior
del archivo.

using Microsoft.Azure.EventHubs;
using Microsoft.Azure.EventHubs.Processor;
using System.Threading.Tasks;

3. Implemente la interfaz IEventProcessor . Reemplace todo el contenido de la clase SimpleEventProcessor con


el código siguiente:
public class SimpleEventProcessor : IEventProcessor
{
public Task CloseAsync(PartitionContext context, CloseReason reason)
{
Console.WriteLine($"Processor Shutting Down. Partition '{context.PartitionId}', Reason:
'{reason}'.");
return Task.CompletedTask;
}

public Task OpenAsync(PartitionContext context)


{
Console.WriteLine($"SimpleEventProcessor initialized. Partition: '{context.PartitionId}'");
return Task.CompletedTask;
}

public Task ProcessErrorAsync(PartitionContext context, Exception error)


{
Console.WriteLine($"Error on Partition: {context.PartitionId}, Error: {error.Message}");
return Task.CompletedTask;
}

public Task ProcessEventsAsync(PartitionContext context, IEnumerable<EventData> messages)


{
foreach (var eventData in messages)
{
var data = Encoding.UTF8.GetString(eventData.Body.Array, eventData.Body.Offset,
eventData.Body.Count);
Console.WriteLine($"Message received. Partition: '{context.PartitionId}', Data: '{data}'");
}

return context.CheckpointAsync();
}
}

Actualización del método Main para usar SimpleEventProcessor


1. Agregue las siguientes instrucciones using al principio del archivo Program.cs.

using Microsoft.Azure.EventHubs;
using Microsoft.Azure.EventHubs.Processor;
using System.Threading.Tasks;

2. Agregue constantes a la clase Program para la cadena de conexión del centro de eventos, el nombre del
centro de eventos, el nombre del contenedor de la cuenta de almacenamiento, y el nombre de la cuenta de
almacenamiento y la clave de la cuenta de almacenamiento. Agregue el código siguiente, reemplazando los
marcadores de posición con sus valores correspondientes:

private const string EventHubConnectionString = "{Event Hubs connection string}";


private const string EventHubName = "{Event Hub path/name}";
private const string StorageContainerName = "{Storage account container name}";
private const string StorageAccountName = "{Storage account name}";
private const string StorageAccountKey = "{Storage account key}";

private static readonly string StorageConnectionString =


string.Format("DefaultEndpointsProtocol=https;AccountName={0};AccountKey={1}", StorageAccountName,
StorageAccountKey);

3. Agregue un nuevo método denominado MainAsync a la clase Program , de esta manera:


private static async Task MainAsync(string[] args)
{
Console.WriteLine("Registering EventProcessor...");

var eventProcessorHost = new EventProcessorHost(


EventHubName,
PartitionReceiver.DefaultConsumerGroupName,
EventHubConnectionString,
StorageConnectionString,
StorageContainerName);

// Registers the Event Processor Host and starts receiving messages


await eventProcessorHost.RegisterEventProcessorAsync<SimpleEventProcessor>();

Console.WriteLine("Receiving. Press ENTER to stop worker.");


Console.ReadLine();

// Disposes of the Event Processor Host


await eventProcessorHost.UnregisterEventProcessorAsync();
}

4. Agregue la siguiente línea de código al método Main :

MainAsync(args).GetAwaiter().GetResult();

Este es el aspecto que debería tener el archivo Program.cs:


namespace SampleEphReceiver
{

public class Program


{
private const string EventHubConnectionString = "{Event Hubs connection string}";
private const string EventHubName = "{Event Hub path/name}";
private const string StorageContainerName = "{Storage account container name}";
private const string StorageAccountName = "{Storage account name}";
private const string StorageAccountKey = "{Storage account key}";

private static readonly string StorageConnectionString =


string.Format("DefaultEndpointsProtocol=https;AccountName={0};AccountKey={1}", StorageAccountName,
StorageAccountKey);

public static void Main(string[] args)


{
MainAsync(args).GetAwaiter().GetResult();
}

private static async Task MainAsync(string[] args)


{
Console.WriteLine("Registering EventProcessor...");

var eventProcessorHost = new EventProcessorHost(


EventHubName,
PartitionReceiver.DefaultConsumerGroupName,
EventHubConnectionString,
StorageConnectionString,
StorageContainerName);

// Registers the Event Processor Host and starts receiving messages


await eventProcessorHost.RegisterEventProcessorAsync<SimpleEventProcessor>();

Console.WriteLine("Receiving. Press ENTER to stop worker.");


Console.ReadLine();

// Disposes of the Event Processor Host


await eventProcessorHost.UnregisterEventProcessorAsync();
}
}
}

5. Ejecute el programa y asegúrese de que no hay ningún error.

Pasos siguientes
Lea los siguientes artículos:
Control de acceso basado en rol (RBAC): ejemplos.
En estos ejemplos se usa la biblioteca anterior Microsoft.Azure.EventHubs , pero se puede actualizar
fácilmente para usar la biblioteca Azure.Messaging.EventHubs más reciente. Para que los ejemplos usen
la biblioteca nueva en lugar de la anterior, consulte la Guía para migrar de Microsoft.Azure.EventHubs a
Azure.Messaging.EventHubs.
EventProcessorHost
Características y terminología de Azure Event Hubs
Preguntas más frecuentes sobre Event Hubs
Use Java para enviar eventos a Azure Event Hubs o
recibir eventos de él (azure-eventhubs)
18/08/2020 • 19 minutes to read • Edit Online

En este inicio rápido se muestra cómo enviar y recibir eventos desde un centro de eventos mediante el paquete de
Java azure-eventhubs .

WARNING
En este inicio rápido se usan los anteriores paquetes azure-eventhubs y azure-eventhubs-eph . Para ver un inicio rápido
que use el paquete azure-messaging-eventhubs más reciente, consulte Envío y recepción de eventos mediante azure-
messaging-eventhubs. Para que la aplicación deje de usar el paquete anterior y use el nuevo, consulte la Guía para migrar
desde azure-eventhubs a azure-messaging-eventhubs.

Prerrequisitos
Si es la primera vez que usa Azure Event Hubs, consulte la información general de Event Hubs antes de continuar
con este inicio rápido.
Para completar este tutorial de inicio rápido, debe cumplir los siguientes requisitos previos:
Una suscripción a Microsoft Azure . Para usar los servicios de Azure, entre los que se incluye Azure Event
Hubs, se necesita una suscripción. Si no se dispone de una cuenta de Azure, es posible registrarse para obtener
una evaluación gratuita, o bien usar las ventajas que disfrutan los suscriptores MSDN al crear una cuenta.
Un entorno de desarrollo de Java. Este inicio rápido utiliza Eclipse.
Creación de un espacio de nombres de Event Hubs y un centro de eventos . El primer paso consiste en
usar Azure Portal para crear un espacio de nombres de tipo Event Hubs y obtener las credenciales de
administración que la aplicación necesita para comunicarse con el centro de eventos. Para crear un espacio de
nombres y un centro de eventos, siga el procedimiento que se indica en este artículo. Luego, para obtener el
valor de la clave de acceso del centro de eventos, siga las instrucciones del artículo: Obtenga la cadena de
conexión. Utilice la clave de acceso en el código que escribirá más adelante en este inicio rápido. El nombre de
la clave predeterminada es: RootManageSharedAccessKey .

Envío de eventos
En esta sección se muestra cómo crear una aplicación de Java para enviar eventos a un centro de eventos.

NOTE
Puede descargar esta guía de inicio rápido como un ejemplo desde GitHub, reemplazar las cadenas
EventHubConnectionString y EventHubName por los valores del centro de eventos, y ejecutarlo. También puede seguir los
pasos de este inicio rápido para crear la suya propia.

Incorporación de una referencia a la biblioteca de Azure Event Hubs


La biblioteca de cliente de Java para Event Hubs está disponible para su uso en proyectos de Maven desde el
repositorio central de Maven. Puede hacer referencia a esta biblioteca con la siguiente declaración de dependencia
en el archivo de proyecto de Maven:
<dependency>
<groupId>com.microsoft.azure</groupId>
<artifactId>azure-eventhubs</artifactId>
<version>2.2.0</version>
</dependency>

Para distintos tipos de entornos de compilación, puede obtener explícitamente los últimos archivos JAR publicados
del repositorio central de Maven.
Para un editor de eventos simples, importe el paquete com.microsoft.azure.eventhubs para las clases de cliente de
Event Hubs y el paquete com.microsoft.azure.servicebus para las clases de utilidad, como las excepciones comunes
que se comparten con el cliente de mensajería de Azure Service Bus.
Escritura de código para enviar mensajes al centro de eventos
Para el ejemplo siguiente, primero cree un nuevo proyecto de Maven para una aplicación de consola o shell en su
entorno de desarrollo de Java favorito. Agregue una clase denominada SimpleSend y agréguele el código
siguiente:

import com.google.gson.Gson;
import com.google.gson.GsonBuilder;
import com.microsoft.azure.eventhubs.ConnectionStringBuilder;
import com.microsoft.azure.eventhubs.EventData;
import com.microsoft.azure.eventhubs.EventHubClient;
import com.microsoft.azure.eventhubs.EventHubException;

import java.io.IOException;
import java.nio.charset.Charset;
import java.time.Instant;
import java.util.concurrent.ExecutionException;
import java.util.concurrent.Executors;
import java.util.concurrent.ScheduledExecutorService;

public class SimpleSend {

public static void main(String[] args)


throws EventHubException, ExecutionException, InterruptedException, IOException {

}
}

Crear cadena de conexión


Use la clase ConnectionStringBuilder para construir un valor de cadena de conexión y pasarlo a la instancia de
cliente de Event Hubs. Reemplace los marcadores de posición por los valores que obtuvo al crear el espacio de
nombres y el centro de eventos:

final ConnectionStringBuilder connStr = new ConnectionStringBuilder()


.setNamespaceName("<EVENTHUB NAMESPACE")
.setEventHubName("EVENT HUB")
.setSasKeyName("RootManageSharedAccessKey")
.setSasKey("SHARED ACCESS KEY");

Escritura de código para enviar eventos


Cree un evento singular transformando una cadena en su codificación de bytes UTF-8. Después cree una instancia
de cliente de Event Hubs a partir de la cadena de conexión y envíe el mensaje:
final Gson gson = new GsonBuilder().create();

// The Executor handles all asynchronous tasks and this is passed to the EventHubClient instance.
// This enables the user to segregate their thread pool based on the work load.
// This pool can then be shared across multiple EventHubClient instances.
// The following sample uses a single thread executor, as there is only one EventHubClient instance,
// handling different flavors of ingestion to Event Hubs here.
final ScheduledExecutorService executorService = Executors.newScheduledThreadPool(4);

// Each EventHubClient instance spins up a new TCP/TLS connection, which is expensive.


// It is always a best practice to reuse these instances. The following sample shows this.
final EventHubClient ehClient = EventHubClient.createSync(connStr.toString(), executorService);

try {
for (int i = 0; i < 10; i++) {

String payload = "Message " + Integer.toString(i);


byte[] payloadBytes = gson.toJson(payload).getBytes(Charset.defaultCharset());
EventData sendEvent = EventData.create(payloadBytes);

// Send - not tied to any partition


// Event Hubs service will round-robin the events across all Event Hubs partitions.
// This is the recommended & most reliable way to send to Event Hubs.
ehClient.sendSync(sendEvent);
}

System.out.println(Instant.now() + ": Send Complete...");


System.out.println("Press Enter to stop.");
System.in.read();
} finally {
ehClient.closeSync();
executorService.shutdown();
}

Compile y ejecute el programa y asegúrese de que no haya errores.


Felicidades. Ha enviado mensajes a un centro de eventos.
Apéndice: Cómo se enrutan los mensajes a las particiones de EventHub
Antes de que los consumidores puedan recuperar los mensajes, los editores tienen que publicarlos primero en las
particiones. Cuando los mensajes se publican en el centro de eventos de manera sincrónica con el método
sendSync() en el objeto com.microsoft.azure.eventhubs.EventHubClient, se pueden enviar a una partición
específica o distribuirse a todas las particiones disponibles en modo round-robin, según si se especifica o no la
clave de partición.
Cuando se especifica una cadena que representa la clave de partición, se aplicará un algoritmo hash a la clave para
determinar la partición a la que desea enviar el evento.
Cuando no se establece la clave de partición, los mensajes se envían en modo round-robin a todas las particiones
disponibles
// Serialize the event into bytes
byte[] payloadBytes = gson.toJson(messagePayload).getBytes(Charset.defaultCharset());

// Use the bytes to construct an {@link EventData} object


EventData sendEvent = EventData.create(payloadBytes);

// Transmits the event to event hub without a partition key


// If a partition key is not set, then we will round-robin to all topic partitions
eventHubClient.sendSync(sendEvent);

// the partitionKey will be hash'ed to determine the partitionId to send the eventData to.
eventHubClient.sendSync(sendEvent, partitionKey);

// close the client at the end of your program


eventHubClient.closeSync();

Recepción de eventos
El código de este tutorial se basa en el código EventProcessorSample en GitHub, que se puede examinar para ver
toda la aplicación en funcionamiento.
Recepción de mensajes con EventProcessorHost en Java
EventProcessorHost es una clase de Java que simplifica la recepción de eventos desde Event Hubs mediante la
administración de puntos de control persistentes y recepciones paralelas desde tales Centros de eventos. Con
EventProcessorHost, puede dividir eventos entre varios destinatarios, incluso cuando están hospedados en
distintos nodos. Este ejemplo muestra cómo usar EventProcessorHost para un solo destinatario.
Crear una cuenta de almacenamiento
Para usar EventProcessorHost, debe tener una [cuenta de Azure Storage][cuenta de Azure Storage]:
1. Inicie sesión en Azure Portal y seleccione Crear un recurso en la parte izquierda de la pantalla.
2. Seleccione Almacenamiento y, luego, Cuenta de almacenamiento . En la ventana Crear cuenta de
almacenamiento , escriba un nombre para la cuenta de almacenamiento. Complete el resto de los campos,
seleccione la región deseada y, finalmente, seleccione Crear .
3. Seleccione la cuenta de almacenamiento recién creada y, a continuación, Claves de acceso :
Copie el valor key1 en una ubicación temporal. Lo usará más adelante en este tutorial.
Creación de un proyecto de Java mediante EventProcessorHost
La biblioteca de cliente de Java para Event Hubs está disponible para su uso en proyectos de Maven en el
repositorio central de Maven, y se puede hacer referencia a ella mediante la siguiente declaración de dependencia
en el archivo de proyecto de Maven:

<dependency>
<groupId>com.microsoft.azure</groupId>
<artifactId>azure-eventhubs</artifactId>
<version>2.2.0</version>
</dependency>
<dependency>
<groupId>com.microsoft.azure</groupId>
<artifactId>azure-eventhubs-eph</artifactId>
<version>2.4.0</version>
</dependency>

Para distintos tipos de entornos de compilación, puede obtener explícitamente los últimos archivos JAR publicados
del repositorio central de Maven.
1. Para el ejemplo siguiente, primero cree un nuevo proyecto de Maven para una aplicación de consola o shell
en su entorno de desarrollo de Java favorito. La clase se denomina ErrorNotificationHandler .
import java.util.function.Consumer;
import com.microsoft.azure.eventprocessorhost.ExceptionReceivedEventArgs;

public class ErrorNotificationHandler implements Consumer<ExceptionReceivedEventArgs>


{
@Override
public void accept(ExceptionReceivedEventArgs t)
{
System.out.println("SAMPLE: Host " + t.getHostname() + " received general error notification
during " + t.getAction() + ": " + t.getException().toString());
}
}

2. Cree una clase nueva denominada EventProcessorSample con el código siguiente. Reemplace los siguientes
marcadores de posición por los valores que usó al crear el centro de eventos y la cuenta de
almacenamiento:

package com.microsoft.azure.eventhubs.samples.eventprocessorsample;

import com.microsoft.azure.eventhubs.ConnectionStringBuilder;
import com.microsoft.azure.eventhubs.EventData;
import com.microsoft.azure.eventprocessorhost.CloseReason;
import com.microsoft.azure.eventprocessorhost.EventProcessorHost;
import com.microsoft.azure.eventprocessorhost.EventProcessorOptions;
import com.microsoft.azure.eventprocessorhost.ExceptionReceivedEventArgs;
import com.microsoft.azure.eventprocessorhost.IEventProcessor;
import com.microsoft.azure.eventprocessorhost.PartitionContext;

import java.util.concurrent.ExecutionException;
import java.util.function.Consumer;

public class EventProcessorSample


{
public static void main(String args[]) throws InterruptedException, ExecutionException
{
String consumerGroupName = "$Default";
String namespaceName = "----NamespaceName----";
String eventHubName = "----EventHubName----";
String sasKeyName = "----SharedAccessSignatureKeyName----";
String sasKey = "----SharedAccessSignatureKey----";
String storageConnectionString = "----AzureStorageConnectionString----";
String storageContainerName = "----StorageContainerName----";
String hostNamePrefix = "----HostNamePrefix----";

ConnectionStringBuilder eventHubConnectionString = new ConnectionStringBuilder()


.setNamespaceName(namespaceName)
.setEventHubName(eventHubName)
.setSasKeyName(sasKeyName)
.setSasKey(sasKey);

EventProcessorHost host = new EventProcessorHost(


EventProcessorHost.createHostName(hostNamePrefix),
eventHubName,
consumerGroupName,
eventHubConnectionString.toString(),
storageConnectionString,
storageContainerName);

System.out.println("Registering host named " + host.getHostName());


EventProcessorOptions options = new EventProcessorOptions();
options.setExceptionNotification(new ErrorNotificationHandler());

host.registerEventProcessor(EventProcessor.class, options)
.whenComplete((unused, e) ->
{
if (e != null)
if (e != null)
{
System.out.println("Failure while registering: " + e.toString());
if (e.getCause() != null)
{
System.out.println("Inner exception: " + e.getCause().toString());
}
}
})
.thenAccept((unused) ->
{
System.out.println("Press enter to stop.");
try
{
System.in.read();
}
catch (Exception e)
{
System.out.println("Keyboard read failed: " + e.toString());
}
})
.thenCompose((unused) ->
{
return host.unregisterEventProcessor();
})
.exceptionally((e) ->
{
System.out.println("Failure while unregistering: " + e.toString());
if (e.getCause() != null)
{
System.out.println("Inner exception: " + e.getCause().toString());
}
return null;
})
.get(); // Wait for everything to finish before exiting main!

System.out.println("End of sample");
}
}

3. Cree una clase final más llamada EventProcessor , con el código siguiente:

public static class EventProcessor implements IEventProcessor


{
private int checkpointBatchingCount = 0;

// OnOpen is called when a new event processor instance is created by the host.
@Override
public void onOpen(PartitionContext context) throws Exception
{
System.out.println("SAMPLE: Partition " + context.getPartitionId() + " is opening");
}

// OnClose is called when an event processor instance is being shut down.


@Override
public void onClose(PartitionContext context, CloseReason reason) throws Exception
{
System.out.println("SAMPLE: Partition " + context.getPartitionId() + " is closing for reason "
+ reason.toString());
}

// onError is called when an error occurs in EventProcessorHost code that is tied to this
partition, such as a receiver failure.
@Override
public void onError(PartitionContext context, Throwable error)
{
System.out.println("SAMPLE: Partition " + context.getPartitionId() + " onError: " +
error.toString());
error.toString());
}

// onEvents is called when events are received on this partition of the Event Hub.
@Override
public void onEvents(PartitionContext context, Iterable<EventData> events) throws Exception
{
System.out.println("SAMPLE: Partition " + context.getPartitionId() + " got event batch");
int eventCount = 0;
for (EventData data : events)
{
try
{
System.out.println("SAMPLE (" + context.getPartitionId() + "," +
data.getSystemProperties().getOffset() + "," +
data.getSystemProperties().getSequenceNumber() + "): " + new
String(data.getBytes(), "UTF8"));
eventCount++;

// Checkpointing persists the current position in the event stream for this partition
and means that the next
// time any host opens an event processor on this event hub+consumer group+partition
combination, it will start
// receiving at the event after this one.
this.checkpointBatchingCount++;
if ((checkpointBatchingCount % 5) == 0)
{
System.out.println("SAMPLE: Partition " + context.getPartitionId() + "
checkpointing at " +
data.getSystemProperties().getOffset() + "," +
data.getSystemProperties().getSequenceNumber());
// Checkpoints are created asynchronously. It is important to wait for the result
of checkpointing
// before exiting onEvents or before creating the next checkpoint, to detect errors
and to ensure proper ordering.
context.checkpoint(data).get();
}
}
catch (Exception e)
{
System.out.println("Processing failed for an event: " + e.toString());
}
}
System.out.println("SAMPLE: Partition " + context.getPartitionId() + " batch size was " +
eventCount + " for host " + context.getOwner());
}
}

Este tutorial usa una sola instancia de EventProcessorHost. Para aumentar la capacidad de procesamiento, se
recomienda ejecutar varias instancias de EventProcessorHost, preferiblemente en máquinas independientes. Esto
proporciona redundancia también. En esos casos, las diferentes instancias se coordinan automáticamente entre sí
con el fin de equilibrar la carga de los eventos recibidos. Si desea que varios destinatarios procesen todos los
eventos, debe usar el concepto ConsumerGroup . Cuando se reciben eventos de distintos equipos, puede ser útil
especificar nombres para las instancias de EventProcessorHost según los equipos (o roles) en que se implementan.
Publicación de mensajes en EventHub
Antes de que los consumidores puedan recuperar los mensajes, los editores tienen que publicarlos primero en las
particiones. Merece la pena destacar que cuando los mensajes se publican en el centro de eventos de manera
sincrónica con el método sendSync() en el objeto com.microsoft.azure.eventhubs.EventHubClient, se podrían
enviar a una partición específica o distribuirse a todas las particiones disponibles en modo round-robin, según si
se especifica o no la clave de partición.
Cuando se especifica una cadena que representa la clave de partición, se aplicará un algoritmo hash a la clave para
determinar la partición a la que desea enviar el evento.
Cuando no se establece la clave de partición, los mensajes se envían en modo round-robin a todas las particiones
disponibles

// Serialize the event into bytes


byte[] payloadBytes = gson.toJson(messagePayload).getBytes(Charset.defaultCharset());

// Use the bytes to construct an {@link EventData} object


EventData sendEvent = EventData.create(payloadBytes);

// Transmits the event to event hub without a partition key


// If a partition key is not set, then we will round-robin to all topic partitions
eventHubClient.sendSync(sendEvent);

// the partitionKey will be hash'ed to determine the partitionId to send the eventData to.
eventHubClient.sendSync(sendEvent, partitionKey);

Implementación del administrador de puntos de control personalizado para EventProcessorHost (EPH )


La API proporciona un mecanismo para implementar el administrador de puntos de control personalizado en
escenarios donde la implementación predeterminada no es compatible con su caso de uso.
El administrador de puntos de control predeterminado usa el almacenamiento de blobs, pero si reemplaza el
administrador de puntos de control que usa EPH por su propia implementación, puede usar cualquier almacén
que quiera para respaldar la implementación del administrador de puntos de control.
Cree una clase que implemente la interfaz com.microsoft.azure.eventprocessorhost.ICheckpointManager.
Use la implementación personalizada del administrador de puntos de control
(com.microsoft.azure.eventprocessorhost.ICheckpointManager).
Dentro de su implementación, puede reemplazar el mecanismo de puntos de control predeterminado e
implementar nuestros propios puntos de control en función de su propio almacén de datos (SQL Server,
CosmosDB y Azure Cache for Redis). Se recomienda que el almacén usado para respaldar la implementación del
administrador de puntos de control sea accesible para todas las instancias de EPH que van a procesar eventos para
el grupo de consumidores.
Puede usar cualquier almacén de datos que esté disponible en su entorno.
La clase com.microsoft.azure.eventprocessorhost.EventProcessorHost proporciona dos constructores que le
permiten reemplazar el administrador de puntos de control por EventProcessorHost.

Pasos siguientes
Lea los siguientes artículos:
EventProcessorHost
Características y terminología de Azure Event Hubs
Preguntas más frecuentes sobre Event Hubs
Inicio rápido: Envío y recepción de eventos con
Azure Event Hubs mediante Python (azure-eventhub
versión 1)
18/08/2020 • 6 minutes to read • Edit Online

En este inicio rápido se muestra cómo enviar y recibir eventos desde un centro de eventos mediante el paquete de
Python azure-eventhub, versión 1 .

WARNING
En este inicio rápido se usa el antiguo paquete azure-eventhub, versión 1. Para ver un inicio rápido que use la versión 5
más reciente del paquete, consulte Envío y recepción de eventos mediante la versión 5 de azure-eventhub. Para que la
aplicación pase de usar el paquete antiguo a uno nuevo, consulte la guía para migrar de la versión 1 a la versión 5 de azure-
eventhub.

Requisitos previos
Si es la primera vez que usa Azure Event Hubs, consulte la información general de Event Hubs antes de continuar
con este inicio rápido.
Para completar este tutorial de inicio rápido, debe cumplir los siguientes requisitos previos:
Una suscripción a Microsoft Azure . Para usar los servicios de Azure, entre los que se incluye Azure Event
Hubs, se necesita una suscripción. Si no se dispone de una cuenta de Azure, es posible registrarse para
obtener una evaluación gratuita, o bien usar las ventajas que disfrutan los suscriptores MSDN al crear una
cuenta.
Python 3.4 o posterior, con pip instalado y actualizado.
El paquete de Python para Event Hubs. Para instalar el paquete, ejecute este comando en un símbolo del
sistema que tenga Python en su ruta de acceso:

pip install azure-eventhub==1.3.*

Creación de un espacio de nombres de Event Hubs y un centro de eventos . El primer paso


consiste en usar Azure Portal para crear un espacio de nombres de tipo Event Hubs y obtener las
credenciales de administración que la aplicación necesita para comunicarse con el centro de eventos. Para
crear un espacio de nombres y un centro de eventos, siga el procedimiento que se indica en este artículo.
Luego, para obtener el valor de la clave de acceso del centro de eventos, siga las instrucciones del artículo:
Obtenga la cadena de conexión. Utilice la clave de acceso en el código que escribirá más adelante en este
inicio rápido. El nombre de la clave predeterminada es: RootManageSharedAccessKey .

Envío de eventos
Para crear una aplicación de Python que envíe eventos a un centro de eventos:
NOTE
En lugar de trabajar con el inicio rápido, puede descargar y ejecutar las aplicaciones de ejemplo de GitHub. Reemplace las
cadenas EventHubConnectionString y EventHubName por los valores del centro de eventos.

1. Abra el editor de Python que prefiera, como Visual Studio Code.


2. Cree un nuevo archivo denominado send.py. Este script envía 100 eventos a un centro de eventos.
3. Pegue el código siguiente en send.py, y reemplace los valores de <namespace>, <eventhub>,
<AccessKeyName> y <primary key value> de Event Hubs por sus valores:

import sys
import logging
import datetime
import time
import os

from azure.eventhub import EventHubClient, Sender, EventData

logger = logging.getLogger("azure")

# Address can be in either of these formats:


# "amqps://<URL-encoded-SAS-policy>:<URL-encoded-SAS-key>@<namespace>.servicebus.windows.net/eventhub"
# "amqps://<namespace>.servicebus.windows.net/<eventhub>"
# SAS policy and key are not required if they are encoded in the URL

ADDRESS = "amqps://<namespace>.servicebus.windows.net/<eventhub>"
USER = "<AccessKeyName>"
KEY = "<primary key value>"

try:
if not ADDRESS:
raise ValueError("No EventHubs URL supplied.")

# Create Event Hubs client


client = EventHubClient(ADDRESS, debug=False, username=USER, password=KEY)
sender = client.add_sender(partition="0")
client.run()
try:
start_time = time.time()
for i in range(100):
print("Sending message: {}".format(i))
message = "Message {}".format(i)
sender.send(EventData(message))
except:
raise
finally:
end_time = time.time()
client.stop()
run_time = end_time - start_time
logger.info("Runtime: {} seconds".format(run_time))

except KeyboardInterrupt:
pass

4. Guarde el archivo.
Para ejecutar el script, desde el directorio en el que guardó send.py, ejecute este comando:

start python send.py


Felicidades. Ha enviado mensajes a un centro de eventos.

Recepción de eventos
Para crear una aplicación de Python que reciba eventos de un centro de eventos:
1. En el editor de Python, cree un archivo llamado recv.py.
2. Pegue el código siguiente en recv.py, y reemplace los valores de <namespace>, <eventhub>,
<AccessKeyName> y <primary key value> de Event Hubs por sus valores:

import os
import sys
import logging
import time
from azure.eventhub import EventHubClient, Receiver, Offset

logger = logging.getLogger("azure")

# Address can be in either of these formats:


# "amqps://<URL-encoded-SAS-policy>:<URL-encoded-SAS-
key>@<mynamespace>.servicebus.windows.net/myeventhub"
# "amqps://<namespace>.servicebus.windows.net/<eventhub>"
# SAS policy and key are not required if they are encoded in the URL

ADDRESS = "amqps://<namespace>.servicebus.windows.net/<eventhub>"
USER = "<AccessKeyName>"
KEY = "<primary key value>"

CONSUMER_GROUP = "$default"
OFFSET = Offset("-1")
PARTITION = "0"

total = 0
last_sn = -1
last_offset = "-1"
client = EventHubClient(ADDRESS, debug=False, username=USER, password=KEY)
try:
receiver = client.add_receiver(
CONSUMER_GROUP, PARTITION, prefetch=5000, offset=OFFSET)
client.run()
start_time = time.time()
for event_data in receiver.receive(timeout=100):
print("Received: {}".format(event_data.body_as_str(encoding='UTF-8')))
total += 1

end_time = time.time()
client.stop()
run_time = end_time - start_time
print("Received {} messages in {} seconds".format(total, run_time))

except KeyboardInterrupt:
pass
finally:
client.stop()

3. Guarde el archivo.
Para ejecutar el script, desde el directorio en el que guardó recv.py, ejecute este comando:

start python recv.py


Pasos siguientes
Para más información acerca de Event Hubs, consulte los siguientes artículos:
EventProcessorHost
Características y terminología de Azure Event Hubs
Preguntas más frecuentes sobre Event Hubs
Inicio rápido: Envío de eventos a Azure Event Hubs o
recepción de eventos de él mediante JavaScript
(@azure/event-hubsversión 2)
18/08/2020 • 9 minutes to read • Edit Online

En este inicio rápido, se muestra cómo crear aplicaciones de JavaScript para enviar y recibir eventos desde un
centro de eventos mediante el paquete de JavaScript azure/event-hubs, versión 2.

WARNING
En este inicio rápido se usa el paquete azure/event-hubs versión 2 anterior. Para ver un inicio rápido que use la versión 5
más reciente del paquete, consulte Envío y recepción de eventos mediante la versión 5 de azure/eventhubs. Para que la
aplicación pase de usar el paquete antiguo a uno nuevo, consulte la guía para migrar de la versión 1 a la versión 5 de
azure/eventhubs.

Prerrequisitos
Si es la primera vez que usa Azure Event Hubs, consulte la información general de Event Hubs antes de continuar
con este inicio rápido.
Para completar este tutorial de inicio rápido, debe cumplir los siguientes requisitos previos:
Una suscripción a Microsoft Azure . Para usar los servicios de Azure, entre los que se incluye Azure Event
Hubs, se necesita una suscripción. Si no se dispone de una cuenta de Azure, es posible registrarse para obtener
una evaluación gratuita, o bien usar las ventajas que disfrutan los suscriptores MSDN al crear una cuenta.
Node.js versión 8.x y posteriores. Descargue la versión LTS más reciente en https://nodejs.org.
Visual Studio Code (recomendado) o cualquier otro IDE
Creación de un espacio de nombres de Event Hubs y un centro de eventos . El primer paso consiste en
usar Azure Portal para crear un espacio de nombres de tipo Event Hubs y obtener las credenciales de
administración que la aplicación necesita para comunicarse con el centro de eventos. Para crear un espacio de
nombres y un centro de eventos, siga el procedimiento de este artículo y después continúe con los pasos
siguientes de este tutorial. Después, obtenga la cadena de conexión para el espacio de nombres del centro de
eventos. Para ello, siga las instrucciones del artículo Obtenga la cadena de conexión. Utilizará la cadena de
conexión más adelante en el tutorial.
Instalación del paquete de npm
Para instalar el paquete de npm para Event Hubs, abra un símbolo del sistema que tenga npm en la ruta de acceso,
cambie el directorio a la carpeta en la que quiere tener los ejemplos y ejecute este comando.

npm install @azure/event-hubs@2

Para instalar el paquete de npm para el Host de procesador de eventos, ejecute el comando siguiente.

npm install @azure/event-processor-host

Envío de eventos
En esta sección se muestra cómo crear una aplicación de JavaScript que envíe eventos a un centro de eventos.

NOTE
Puede descargar esta guía de inicio rápido como un ejemplo desde GitHub, reemplazar las cadenas
EventHubConnectionString y EventHubName por los valores del centro de eventos, y ejecutarlo. También puede seguir los
pasos de este tutorial para crear el suyo propio.

1. Abra el editor que prefiera, como Visual Studio Code.


2. Cree un archivo denominado send.js y pegue en él el código siguiente. Obtenga la cadena de conexión
para el espacio de nombres del centro de eventos siguiendo las instrucciones del artículo: Obtenga la
cadena de conexión.

const { EventHubClient } = require("@azure/event-hubs@2");

// Connection string - primary key of the Event Hubs namespace.


// For example:
Endpoint=sb://myeventhubns.servicebus.windows.net/;SharedAccessKeyName=RootManageSharedAccessKey;Shared
AccessKey=XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX
const connectionString = "Endpoint=sb://<EVENT HUBS NAMESPACE
NAME>.servicebus.windows.net/;SharedAccessKeyName=RootManageSharedAccessKey;SharedAccessKey=<SHARED
ACCESS KEY>";

// Name of the event hub. For example: myeventhub


const eventHubsName = "<EVENT HUB NAME>";

async function main() {


const client = EventHubClient.createFromConnectionString(connectionString, eventHubsName);

for (let i = 0; i < 100; i++) {


const eventData = {body: `Event ${i}`};
console.log(`Sending message: ${eventData.body}`);
await client.send(eventData);
}

await client.close();
}

main().catch(err => {
console.log("Error occurred: ", err);
});

3. Escriba la cadena de conexión y el nombre del centro de eventos en el código anterior.


4. Después, ejecute el comando node send.js en un símbolo del sistema para ejecutar este archivo. De este
modo, se enviarán 100 eventos a su centro de eventos.
Felicidades. Ha enviado eventos a un centro de eventos.

Recepción de eventos
En esta sección se muestra cómo crear una aplicación de JavaScript que recibe eventos de una única partición del
grupo de consumidores predeterminado de un centro de eventos.
1. Abra el editor que prefiera, como Visual Studio Code.
2. Cree un archivo denominado receive.js y pegue en él el código siguiente.
const { EventHubClient, delay } = require("@azure/event-hubs@2");

// Connection string - primary key of the Event Hubs namespace.


// For example:
Endpoint=sb://myeventhubns.servicebus.windows.net/;SharedAccessKeyName=RootManageSharedAccessKey;Shared
AccessKey=XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX
const connectionString = "Endpoint=sb://<EVENT HUBS NAMESPACE
NAME>.servicebus.windows.net/;SharedAccessKeyName=RootManageSharedAccessKey;SharedAccessKey=<SHARED
ACCESS KEY>";

// Name of the event hub. For example: myeventhub


const eventHubsName = "<EVENT HUB NAME>";

async function main() {


const client = EventHubClient.createFromConnectionString(connectionString, eventHubsName);
const allPartitionIds = await client.getPartitionIds();
const firstPartitionId = allPartitionIds[0];

const receiveHandler = client.receive(firstPartitionId, eventData => {


console.log(`Received message: ${eventData.body} from partition ${firstPartitionId}`);
}, error => {
console.log('Error when receiving message: ', error)
});

// Sleep for a while before stopping the receive operation.


await delay(15000);
await receiveHandler.stop();

await client.close();
}

main().catch(err => {
console.log("Error occurred: ", err);
});

3. Escriba la cadena de conexión y el nombre del centro de eventos en el código anterior.


4. Después, ejecute el comando node receive.js en un símbolo del sistema para ejecutar este archivo. Recibirá
los eventos de una de las particiones del grupo de consumidores predeterminado en su centro de eventos.
Felicidades. Ha recibido eventos procedentes del centro de eventos.

Recepción de eventos mediante el Host de procesador de eventos


En esta sección se muestra cómo recibir eventos de un centro de eventos mediante EventProcessorHost de Azure
en una aplicación de JavaScript. EventProcessorHost (EPH) ayuda a recibir de manera eficaz eventos de un centro
de eventos mediante la creación de receptores en todas las particiones del grupo de consumidores de un centro de
eventos. Establece un punto de comprobación de los metadatos de los mensajes recibidos a intervalos regulares
en una instancia de Azure Storage Blob. Este enfoque le permite seguir recibiendo más adelante mensajes desde
donde lo dejó.
1. Abra el editor que prefiera, como Visual Studio Code.
2. Cree un archivo denominado receiveAll.js y pegue en él el código siguiente.
const { EventProcessorHost, delay } = require("@azure/event-processor-host");

// Connection string - primary key of the Event Hubs namespace.


// For example:
Endpoint=sb://myeventhubns.servicebus.windows.net/;SharedAccessKeyName=RootManageSharedAccessKey;Shared
AccessKey=XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX
const eventHubConnectionString = "Endpoint=sb://<EVENT HUBS NAMESPACE
NAME>.servicebus.windows.net/;SharedAccessKeyName=RootManageSharedAccessKey;SharedAccessKey=<SHARED
ACCESS KEY>";

// Name of the event hub. For example: myeventhub


const eventHubName = "<EVENT HUB NAME>";

// Azure Storage connection string


const storageConnectionString = "DefaultEndpointsProtocol=https;AccountName=<STORAGE ACCOUNT
NAME>;AccountKey=<STORAGE ACCOUNT KEY>;EndpointSuffix=core.windows.net";

async function main() {


const eph = EventProcessorHost.createFromConnectionString(
"my-eph",
storageConnectionString,
"my-storage-container-name",
eventHubConnectionString,
{
eventHubPath: eventHubName,
onEphError: (error) => {
console.log("[%s] Error: %O", error);
}
}
);

eph.start((context, eventData) => {


console.log(`Received message: ${eventData.body} from partition ${context.partitionId}`);
}, error => {
console.log('Error when receiving message: ', error)
});

// Sleep for a while before stopping the receive operation.


await delay(15000);
await eph.stop();
}

main().catch(err => {
console.log("Error occurred: ", err);
});

3. Escriba la cadena de conexión y el nombre del centro de eventos en el código anterior, junto con la cadena de
conexión de Azure Blob Storage.
4. Después, ejecute el comando node receiveAll.js en un símbolo del sistema para ejecutar este archivo.
Felicidades. Ha recibido eventos de un centro de eventos por medio del Host de procesador de eventos. Recibirá
los eventos de todas las particiones del grupo de consumidores predeterminado en su centro de eventos.

Pasos siguientes
Lea los siguientes artículos:
EventProcessorHost
Características y terminología de Azure Event Hubs
Preguntas más frecuentes sobre Event Hubs
Consulte otros ejemplos de JavaScript para Event Hubs y Host de procesador de eventos en GitHub
Inicio rápido: Envío o recepción de eventos en Azure
Event Hubs mediante .NET Framework
18/08/2020 • 12 minutes to read • Edit Online

Azure Event Hubs es una plataforma de streaming de macrodatos y servicio de ingesta de eventos de gran
escalabilidad capaz de recibir y procesar millones de eventos por segundo. Event Hubs puede procesar y
almacenar eventos, datos o telemetría generados por dispositivos y software distribuido. Los datos enviados a un
centro de eventos se pueden transformar y almacenar con cualquier proveedor de análisis en tiempo real o
adaptadores de procesamiento por lotes y almacenamiento. Para más información sobre Event Hubs, consulte
Introducción a Event Hubs y Características de Event Hubs.
En este tutorial se describe cómo crear aplicaciones de consola de .NET Framework en C# para enviar o recibir
eventos en un centro de eventos.

Prerrequisitos
Para completar este tutorial, debe cumplir los siguientes requisitos previos:
Microsoft Visual Studio 2019.
Creación de un espacio de nombres de Event Hubs y un centro de eventos . El primer paso consiste en
usar Azure Portal para crear un espacio de nombres de tipo Event Hubs y obtener las credenciales de
administración que la aplicación necesita para comunicarse con el centro de eventos. Para crear un espacio de
nombres y un centro de eventos, siga el procedimiento que se indica en este artículo. A continuación, obtenga
la cadena de conexión para el espacio de nombres del centro de eventos siguiendo las instrucciones
del artículo: Obtenga la cadena de conexión. Utilizará la cadena de conexión más adelante en el tutorial.

Envío de eventos
En esta sección se muestra cómo crear una aplicación de consola de .NET Framework para enviar eventos a un
centro de eventos.
Creación de una aplicación de consola
En Visual Studio, cree un nuevo proyecto de aplicación de escritorio de Visual C# con la plantilla de proyecto
Aplicación de consola . Asigne al proyecto el nombre Remitente .
Incorporación del paquete NuGet de Event Hubs
1. En el Explorador de soluciones, haga clic con el botón derecho en el proyecto Remitente y luego haga clic
en Administrar paquetes NuGet para la solución .
2. Haga clic en la pestaña Examinar y luego busque WindowsAzure.ServiceBus . Haga clic en Instalar y acepte
las condiciones de uso.

Visual Studio descarga, instala y agrega una referencia al paquete NuGet de la biblioteca de Azure Service
Bus.
Escritura de código para enviar mensajes al centro de eventos
1. Agregue las siguientes instrucciones using al principio del archivo Program.cs :

using System.Threading;
using Microsoft.ServiceBus.Messaging;

2. Agregue los siguientes campos a la clase Program ; para ello, sustituya los valores del marcador de posición
por el nombre del centro de eventos creado en la sección anterior y la cadena de conexión de nivel del
espacio de nombres que ha guardado anteriormente. Puede copiar la cadena de conexión para el centro de
eventos desde la clave Connection string-primar y en RootManageSharedAccessKey en la página del
centro de eventos en Azure Portal. Para ver los pasos detallados, consulte Obtención de la cadena de
conexión.

static string eventHubName = "Your Event Hub name";


static string connectionString = "namespace connection string";

3. Agregue el método siguiente a la clase Program :

static void SendingRandomMessages()


{
var eventHubClient = EventHubClient.CreateFromConnectionString(connectionString, eventHubName);
while (true)
{
try
{
var message = Guid.NewGuid().ToString();
Console.WriteLine("{0} > Sending message: {1}", DateTime.Now, message);
eventHubClient.Send(new EventData(Encoding.UTF8.GetBytes(message)));
}
catch (Exception exception)
{
Console.ForegroundColor = ConsoleColor.Red;
Console.WriteLine("{0} > Exception: {1}", DateTime.Now, exception.Message);
Console.ResetColor();
}

Thread.Sleep(200);
}
}

Este método envía continuamente los eventos al centro de eventos con un retraso de 200 ms.
4. Por último, agregue las líneas siguientes al método Main :

Console.WriteLine("Press Ctrl-C to stop the sender process");


Console.WriteLine("Press Enter to start now");
Console.ReadLine();
SendingRandomMessages();

5. Ejecute el programa y asegúrese de que no hay ningún error.

Recepción de eventos
En esta sección, escribirá una aplicación de consola de .NET Framework que recibe mensajes de un centro de
eventos mediante el host de procesador de eventos. El host de procesador de eventos es una clase de .NET que
simplifica la recepción de eventos desde Event Hubs mediante la administración de puntos de control persistentes
y recepciones paralelas desde dichas instancias de Event Hubs. Mediante el host de procesador de eventos, puede
dividir eventos entre varios receptores, aunque estén hospedados en distintos nodos.
Creación de una cuenta de almacenamiento para el host de procesador de eventos
El host de procesador de eventos es un agente inteligente que simplifica la recepción de eventos desde Event Hubs
mediante la administración de puntos de control persistentes y recepciones paralelas. Para los puntos de
comprobación, el host de procesador de eventos requiere una cuenta de almacenamiento. El ejemplo siguiente
muestra cómo crear una cuenta de almacenamiento y cómo obtener sus claves para el acceso:
1. En el menú de Azure Portal, seleccione Crear un recurso .
2. Seleccione Storage > Cuenta de Storage .
3. En la página Crear cuenta de almacenamiento , realice los pasos siguientes:
a. Escriba el nombre de la cuenta de almacenamiento .
b. Elija una suscripción de Azure que contenga el centro de eventos.
c. Elija o cree el grupo de recursos que tenga el centro de eventos.
d. Seleccione la ubicación en la que va a crear el recurso.
e. Seleccione Revisar + crear .
4. En la página Revisar + crear , revise los valores y seleccione Crear .
5. Después de ver el mensaje Correcto en las notificaciones, seleccione Ir al recurso para abrir la página de
la cuenta de almacenamiento. Como alternativa, puede expandir Detalles de la implementación y,
después, seleccionar el nuevo recurso en la lista de recursos.
6. Seleccione Contenedores .

7. Seleccione + Contenedor en la parte superior, escriba un nombre para el contenedor y seleccione


Aceptar .

8. Elija Claves de acceso en el menú de la página Cuenta de almacenamiento y copie el valor de key1 .
Guarde los valores siguientes en el Bloc de notas o en cualquier otra ubicación temporal.
Nombre de la cuenta de almacenamiento
Clave de acceso para la cuenta de almacenamiento
Nombre del contenedor
Creación de una aplicación de consola
En Visual Studio, cree un nuevo proyecto de aplicación de escritorio de Visual C# con la plantilla de proyecto
Aplicación de consola . Asigne al proyecto el nombre Receptor .
Incorporación del paquete NuGet de Event Hubs
1. En el Explorador de soluciones, haga clic con el botón derecho en el proyecto Receptor y luego haga clic en
Administrar paquetes NuGet para la solución .
2. Haga clic en la pestaña Examinar y luego busque
Microsoft Azure Service Bus Event Hub - EventProcessorHost . Haga clic en Instalar y acepte las condiciones
de uso.

Visual Studio descarga, instala y agrega una referencia al paquete de NuGet de Azure Service Bus -
EventProcessorHost, con todas sus dependencias.
Implementación de la interfaz de IEventProcessor
1. Haga clic con el botón derecho en el proyecto Receptor , haga clic en Agregar y, después, haga clic en
Clase . Asigne a la nueva clase el nombre SimpleEventProcessor y después haga clic en Agregar para
crear la clase.
2. Agregue las siguientes instrucciones en la parte superior del archivo SimpleEventProcessor.cs:

using Microsoft.ServiceBus.Messaging;
using System.Diagnostics;

3. Sustituya el código siguiente por el cuerpo de la clase:


class SimpleEventProcessor : IEventProcessor
{
Stopwatch checkpointStopWatch;

async Task IEventProcessor.CloseAsync(PartitionContext context, CloseReason reason)


{
Console.WriteLine("Processor Shutting Down. Partition '{0}', Reason: '{1}'.",
context.Lease.PartitionId, reason);
if (reason == CloseReason.Shutdown)
{
await context.CheckpointAsync();
}
}

Task IEventProcessor.OpenAsync(PartitionContext context)


{
Console.WriteLine("SimpleEventProcessor initialized. Partition: '{0}', Offset: '{1}'",
context.Lease.PartitionId, context.Lease.Offset);
this.checkpointStopWatch = new Stopwatch();
this.checkpointStopWatch.Start();
return Task.FromResult<object>(null);
}

async Task IEventProcessor.ProcessEventsAsync(PartitionContext context, IEnumerable<EventData>


messages)
{
foreach (EventData eventData in messages)
{
string data = Encoding.UTF8.GetString(eventData.GetBytes());

Console.WriteLine(string.Format("Message received. Partition: '{0}', Data: '{1}'",


context.Lease.PartitionId, data));
}

//Call checkpoint every 5 minutes, so that worker can resume processing from 5 minutes back if it
restarts.
if (this.checkpointStopWatch.Elapsed > TimeSpan.FromMinutes(5))
{
await context.CheckpointAsync();
this.checkpointStopWatch.Restart();
}
}
}

EventProcessorHost llama a esta clase para procesar los eventos recibidos del centro de eventos. La clase
SimpleEventProcessor usa un cronómetro para llamar periódicamente al método de punto de control en el
contexto EventProcessorHost . Este procesamiento garantiza que, si se reinicia el destinatario, no se
pierden más de cinco minutos de trabajo de procesamiento.
Actualización del método Main para usar SimpleEventProcessor
1. En la clase Program.cs , agregue la siguiente instrucción using al principio del archivo:

using Microsoft.ServiceBus.Messaging;

2. Reemplace el método Main de la clase Program por el código siguiente, y sustituya el nombre del centro de
eventos y la cadena de conexión de nivel del espacio de nombres que ha guardado anteriormente, y la
cuenta de almacenamiento y la clave que ha copiado en las secciones anteriores.
static void Main(string[] args)
{
string eventHubConnectionString = "{Event Hubs namespace connection string}";
string eventHubName = "{Event Hub name}";
string storageAccountName = "{storage account name}";
string storageAccountKey = "{storage account key}";
string storageConnectionString = string.Format("DefaultEndpointsProtocol=https;AccountName=
{0};AccountKey={1}", storageAccountName, storageAccountKey);

string eventProcessorHostName = Guid.NewGuid().ToString();


EventProcessorHost eventProcessorHost = new EventProcessorHost(eventProcessorHostName, eventHubName,
EventHubConsumerGroup.DefaultGroupName, eventHubConnectionString, storageConnectionString);
Console.WriteLine("Registering EventProcessor...");
var options = new EventProcessorOptions();
options.ExceptionReceived += (sender, e) => { Console.WriteLine(e.Exception); };
eventProcessorHost.RegisterEventProcessorAsync<SimpleEventProcessor>(options).Wait();

Console.WriteLine("Receiving. Press enter key to stop worker.");


Console.ReadLine();
eventProcessorHost.UnregisterEventProcessorAsync().Wait();
}

3. Ejecute el programa y asegúrese de que no hay ningún error.

Pasos siguientes
Lea los siguientes artículos:
EventProcessorHost
Características y terminología de Azure Event Hubs
Preguntas más frecuentes sobre Event Hubs
Habilitación de la captura de eventos que se
transmiten por streaming mediante Azure Event
Hubs
18/08/2020 • 8 minutes to read • Edit Online

Azure Event Hubs Capture permite entregar automáticamente los datos de streaming de Event Hubs a la cuenta
de Azure Blob Storage o Azure Data Lake Storage Gen1 o Gen2 que prefiera.
Puede configurar la funcionalidad de captura en el momento de creación del centro de eventos mediante Azure
Portal. Puede capturar los datos para un contenedor de Azure Blob Storage o para una cuenta de Azure Data Lake
Storage Gen1 o Gen2.
Para más información, consulte Introducción a Event Hubs Capture.

Captura de datos para Azure Storage


Al crear un centro de eventos, puede habilitar Capture haciendo clic en el botón On de la pantalla del portal
Creación de un centro de eventos . Después, para especificar una cuenta de almacenamiento y un contenedor,
haga clic en Azure Storage en el cuadro Capture Provider (Proveedor de Capture). Dado que la captura de
Event Hubs utiliza la autenticación de servicio a servicio con el almacenamiento, no es necesario especificar una
cadena de conexión de almacenamiento. El selector de recursos selecciona automáticamente el identificador URI
del recurso para la cuenta de almacenamiento. Si se usa Azure Resource Manager, es preciso suministrar
explícitamente dicho identificador URI como una cadena.
La ventana de tiempo predeterminada es cinco minutos. El valor mínimo es 1 y el máximo 15. La ventana
Tamaño tiene un intervalo de 10-500 MB.
NOTE
Puede habilitar o deshabilitar el envío de archivos vacíos cuando no se producen eventos durante la ventana de Capture.

Captura de datos para Azure Data Lake Storage Gen2


1. Siga los pasos del artículo Crear una cuenta de almacenamiento para crear una cuenta de Azure Storage.
Establezca Espacio de nombres jerárquico en Habilitado en la pestaña Opciones avanzadas para
convertirlo en una cuenta de Azure Data Lake Storage Gen2.
2. Al crear un centro de eventos, siga estos pasos:
a. Seleccione Activar para Capture .
b. Seleccione Azure Storage como proveedor de captura. La opción Azure Data Lake Storage que
se ve para Proveedor de captura corresponde a la generación 1 de Azure Data Lake Storage. Para
usar una generación 2 de Azure Data Lake Storage, seleccione Azure Storage .
c. Seleccione el botón Seleccionar contenedor .

3. Seleccione la cuenta Azure Data Lake Storage Gen2 en la lista.

4. Seleccione el contenedor (sistema de archivos de Data Lake Storage Gen2).


5. En la página Crear centro de eventos , seleccione Crear .
NOTE
El contenedor que se crea en una cuenta de Azure Data Lake Storage Gen2 con esta interfaz de usuario (IU) se
muestra en Sistemas de archivos en Explorador de Storage . Del mismo modo, el sistema de archivos que se
crea en una cuenta de Data Lake Storage Gen2 se muestra como un contenedor en esta interfaz de usuario.

Captura de datos para Azure Data Lake Storage Gen1


Para capturar datos para Azure Data Lake Storage Gen1, cree una cuenta de Data Lake Storage Gen1 y un centro
de eventos:
Creación de una cuenta de Azure Data Lake Storage Gen1 y carpetas
1. Cree una cuenta de Data Lake Storage con las instrucciones de Introducción a Azure Data Lake Storage Gen1
con Azure Portal.
2. Siga las instrucciones de la sección Asignar permisos a Event Hubs para crear una carpeta dentro de la cuenta
de Data Lake Storage Gen1 en la que quiere capturar los datos de Event Hubs y asigne permisos a Event Hubs
para que pueda escribir datos en la cuenta de Data Lake Storage Gen1.
Creación de un centro de eventos
1. El centro de eventos debe estar en la misma suscripción de Azure que la cuenta de Azure Data Lake
Storage Gen1 que ha creado. Para crear el centro de eventos, haga clic en el botón Activado situado bajo
Capture en la página del portal Crear centro de eventos .
2. En la página del portal Crear centro de eventos , seleccione Azure Data Lake Store en el cuadro
Capture Provider (Proveedor de Capture).
3. En Seleccionar Store , junto a la lista desplegable Data Lake Store , especifique la cuenta de Data Lake
Storage Gen1 creada anteriormente y, en el campo Ruta de acceso de Data Lake , escriba la ruta de
acceso a la carpeta de datos creada.
Adición o configuración de Capture en un centro de eventos existente
Se puede configurar Capture en los centros de eventos existentes que se encuentran en los espacios de nombres
de Event Hubs. Para habilitar Capture en un centro de eventos existente o para cambiar la configuración de
Capture, haga clic en el espacio de nombres para cargar la pantalla de la introducción y, después, haga clic en el
centro de eventos para el que desea habilitar o cambiar la configuración de Capture. Por último, haga clic en la
opción Capture del lado izquierdo de la página abierta y después edite la configuración, tal como se muestra en
las ilustraciones siguientes:
Azure Blob Storage
Azure Data Lake Storage Gen 2

Azure Data Lake Storage Gen 1


Pasos siguientes
Obtenga más información sobre Event Hubs Capture en el artículo Introducción a Event Hubs Capture.
La Event Hubs Capture también se puede configurar a través de las plantillas de Azure Resource Manager. Para
más información, consulte Habilitar Capture mediante la plantilla de Azure Resource Manager.
Aprenda a crear una suscripción de Azure Event Grid con un espacio de nombres de Event Hubs como origen
Introducción al uso de Azure Portal por parte de Azure Data Lake Store
Creación de un espacio de nombres con Event Hubs
y habilitación de la característica Capture mediante
una plantilla
18/08/2020 • 12 minutes to read • Edit Online

En este artículo se muestra cómo usar una plantilla de Azure Resource Manager que crea un espacio de nombres
de Event Hubs, con una instancia de centro de eventos, y también habilita la característica Capture en el centro de
eventos. En este artículo se describe cómo definir los recursos que se implementan y los parámetros que se
especifican cuando se ejecuta la implementación. Puede usar esta plantilla para sus propias implementaciones o
personalizarla para satisfacer sus necesidades.
En este artículo también se muestra cómo especificar los eventos que se capturan en instancias de Azure Storage
Blob o de Azure Data Lake Store, basándose en el destino que elija.
Para más información sobre la creación de plantillas, consulte Creación de plantillas de Azure Resource Manager.
Para la sintaxis y las propiedades de JSON que se usan en una plantilla, consulte Tipos de recursos de
Microsoft.EventHub.
Para obtener más información sobre patrones y prácticas de convenciones de nomenclatura de recursos de Azure,
consulte las convenciones de nomenclatura de los recursos de Azure.
Para ver las plantillas completas, haga clic en los siguientes vínculos de GitHub:
Centro de eventos y habilitación de Capture en una plantilla de Storage
Centro de eventos y habilitación de Capture en una plantilla de Azure Data Lake Store

NOTE
Para buscar las últimas plantillas, visite la galería de Plantillas de inicio rápido de Azure y busque Event Hubs.

¿Qué va a implementar?
Con esta plantilla, implementará un espacio de nombres de Event Hubs con un centro de eventos y habilitará la
captura de Event Hubs. Event Hubs Capture le permite entregar automáticamente los datos de streaming de sus
instancias de Event Hubs a una instancia de Azure Blob Storage o Azure Data Lake Store, en el tiempo especificado
o el intervalo de tamaño que prefiera. Haga clic en el botón siguiente para habilitar Event Hubs Capture en Azure
Storage:

Haga clic en el botón siguiente para habilitar Event Hubs Capture en Azure Data Lake Store:

Parámetros
Con el Administrador de recursos de Azure, se definen los parámetros de los valores que desea especificar al
implementar la plantilla. La plantilla incluye una sección denominada Parameters que contiene todos los valores
de los parámetros. Debe definir un parámetro para esos valores que variarán según el proyecto que vaya a
implementar o según el entorno en el que vaya a realizar la implementación. No defina parámetros para valores
que siempre permanezcan igual. Cada valor de parámetro se usa en la plantilla para definir los recursos que se
implementan.
La plantilla define los parámetros siguientes.
eventHubNamespaceName
El nombre del espacio de nombres de Event Hubs que se creará.

"eventHubNamespaceName":{
"type":"string",
"metadata":{
"description":"Name of the EventHub namespace"
}
}

eventHubName
El nombre del centro de eventos creado en el espacio de nombres de Event Hubs.

"eventHubName":{
"type":"string",
"metadata":{
"description":"Name of the event hub"
}
}

messageRetentionInDays
El número de días que se deben conservar los mensajes en el centro de eventos.

"messageRetentionInDays":{
"type":"int",
"defaultValue": 1,
"minValue":"1",
"maxValue":"7",
"metadata":{
"description":"How long to retain the data in event hub"
}
}

partitionCount
El número de particiones que se van a crear en el centro de eventos.

"partitionCount":{
"type":"int",
"defaultValue":2,
"minValue":2,
"maxValue":32,
"metadata":{
"description":"Number of partitions chosen"
}
}

captureEnabled
Habilita la funcionalidad de captura en el centro de eventos.
"captureEnabled":{
"type":"string",
"defaultValue":"true",
"allowedValues": [
"false",
"true"],
"metadata":{
"description":"Enable or disable the Capture for your event hub"
}
}

captureEncodingFormat
El formato de codificación que especifica para serializar los datos de eventos.

"captureEncodingFormat":{
"type":"string",
"defaultValue":"Avro",
"allowedValues":[
"Avro"],
"metadata":{
"description":"The encoding format in which Capture serializes the EventData"
}
}

captureTime
El intervalo de tiempo en el que Event Hubs Capture comienza a capturar los datos.

"captureTime":{
"type":"int",
"defaultValue":300,
"minValue":60,
"maxValue":900,
"metadata":{
"description":"The time window in seconds for the capture"
}
}

captureSize
El intervalo de tamaño en el que Capture comienza a capturar los datos.

"captureSize":{
"type":"int",
"defaultValue":314572800,
"minValue":10485760,
"maxValue":524288000,
"metadata":{
"description":"The size window in bytes for capture"
}
}

captureNameFormat
El formato de nombre que usa Event Hubs Capture para escribir archivos Avro. Tenga en cuenta que un formato
de nombre de Capture debe contener los campos {Namespace} , {EventHub} , {PartitionId} , {Year} , {Month} ,
{Day} , {Hour} , {Minute} y {Second} . Estos se pueden organizar en cualquier orden, con o sin delimitadores.
"captureNameFormat": {
"type": "string",
"defaultValue": "{Namespace}/{EventHub}/{PartitionId}/{Year}/{Month}/{Day}/{Hour}/{Minute}/{Second}",
"metadata": {
"description": "A Capture Name Format must contain {Namespace}, {EventHub}, {PartitionId}, {Year},
{Month}, {Day}, {Hour}, {Minute} and {Second} fields. These can be arranged in any order with or without
delimeters. E.g. Prod_{EventHub}/{Namespace}\\{PartitionId}_{Year}_{Month}/{Day}/{Hour}/{Minute}/{Second}"
}
}

apiVersion
La versión de API de la plantilla.

"apiVersion":{
"type":"string",
"defaultValue":"2017-04-01",
"metadata":{
"description":"ApiVersion used by the template"
}
}

Si elige como destino Azure Storage, use los parámetros siguientes.


destinationStorageAccountResourceId
La funcionalidad de captura requiere un identificador de recurso de una cuenta de Azure Storage para habilitar
esta funcionalidad en la cuenta deseada de Storage.

"destinationStorageAccountResourceId":{
"type":"string",
"metadata":{
"description":"Your existing Storage account resource ID where you want the blobs be captured"
}
}

blobContainerName
El contenedor de blobs en el que se van a capturar los datos del evento.

"blobContainerName":{
"type":"string",
"metadata":{
"description":"Your existing storage container in which you want the blobs captured"
}
}

Use los parámetros siguientes si elige Azure Data Lake Storage Gen1 como destino. Debe establecer permisos en
la ruta de acceso de Data Lake Store, en el que desea capturar el evento. Para establecer permisos, vea Captura de
datos para Azure Data Lake Storage Gen1.
subscriptionId
El identificador de suscripción para el espacio de nombres de Event Hubs y Azure Data Lake Store. Ambos recursos
deben estar en el mismo identificador de suscripción.
"subscriptionId": {
"type": "string",
"metadata": {
"description": "Subscription ID of both Azure Data Lake Store and Event Hubs namespace"
}
}

dataLakeAccountName
El nombre de Azure Data Lake Store para los eventos capturados.

"dataLakeAccountName": {
"type": "string",
"metadata": {
"description": "Azure Data Lake Store name"
}
}

dataLakeFolderPath
La ruta de acceso de la carpeta de destino para los eventos capturados. Es la carpeta de Data Lake Store en la que
se insertarán los eventos durante la operación de captura. Para establecer los permisos de esta carpeta, consulte
Uso de Azure Data Lake Store para capturar datos de Event Hubs.

"dataLakeFolderPath": {
"type": "string",
"metadata": {
"description": "Destination capture folder path"
}
}

Recursos que deben implementarse para Azure Storage como destino


para los eventos capturados
Crea un espacio de nombres del tipo EventHub , con un centro de eventos, y también habilita la característica
Capture en Azure Blob Storage.
"resources":[
{
"apiVersion":"[variables('ehVersion')]",
"name":"[parameters('eventHubNamespaceName')]",
"type":"Microsoft.EventHub/Namespaces",
"location":"[variables('location')]",
"sku":{
"name":"Standard",
"tier":"Standard"
},
"resources": [
{
"apiVersion": "2017-04-01",
"name": "[parameters('eventHubNamespaceName')]",
"type": "Microsoft.EventHub/Namespaces",
"location": "[resourceGroup().location]",
"sku": {
"name": "Standard"
},
"properties": {
"isAutoInflateEnabled": "true",
"maximumThroughputUnits": "7"
},
"resources": [
{
"apiVersion": "2017-04-01",
"name": "[parameters('eventHubName')]",
"type": "EventHubs",
"dependsOn": [
"[concat('Microsoft.EventHub/namespaces/', parameters('eventHubNamespaceName'))]"
],
"properties": {
"messageRetentionInDays": "[parameters('messageRetentionInDays')]",
"partitionCount": "[parameters('partitionCount')]",
"captureDescription": {
"enabled": "true",
"skipEmptyArchives": false,
"encoding": "[parameters('captureEncodingFormat')]",
"intervalInSeconds": "[parameters('captureTime')]",
"sizeLimitInBytes": "[parameters('captureSize')]",
"destination": {
"name": "EventHubArchive.AzureBlockBlob",
"properties": {
"storageAccountResourceId": "[parameters('destinationStorageAccountResourceId')]",
"blobContainer": "[parameters('blobContainerName')]",
"archiveNameFormat": "[parameters('captureNameFormat')]"
}
}
}
}

}
]
}
]

Recursos que deben implementarse para Azure Data Lake Store como
destino
Crea un espacio de nombres de tipo EventHub , con una instancia de Event Hubs, y también habilita la
característica Capture en Azure Data Lake Store.
"resources": [
{
"apiVersion": "2017-04-01",
"name": "[parameters('namespaceName')]",
"type": "Microsoft.EventHub/Namespaces",
"location": "[variables('location')]",
"sku": {
"name": "Standard",
"tier": "Standard"
},
"resources": [
{
"apiVersion": "2017-04-01",
"name": "[parameters('eventHubName')]",
"type": "EventHubs",
"dependsOn": [
"[concat('Microsoft.EventHub/namespaces/', parameters('namespaceName'))]"
],
"properties": {
"path": "[parameters('eventHubName')]",
"captureDescription": {
"enabled": "true",
"skipEmptyArchives": false,
"encoding": "[parameters('archiveEncodingFormat')]",
"intervalInSeconds": "[parameters('captureTime')]",
"sizeLimitInBytes": "[parameters('captureSize')]",
"destination": {
"name": "EventHubArchive.AzureDataLake",
"properties": {
"DataLakeSubscriptionId": "[parameters('subscriptionId')]",
"DataLakeAccountName": "[parameters('dataLakeAccountName')]",
"DataLakeFolderPath": "[parameters('dataLakeFolderPath')]",
"ArchiveNameFormat": "[parameters('captureNameFormat')]"
}
}
}
}
}
]
}
]

NOTE
Puede habilitar o deshabilitar el envío de archivos vacíos cuando no se producen eventos durante la ventura de Capture
mediante la propiedad skipEmptyArchives .

Comandos para ejecutar la implementación


Para implementar los recursos en Azure, debe haber iniciado sesión en la cuenta de Azure y debe usar el módulo
de Azure Resource Manager. Para obtener información sobre cómo usar el Administrador de recursos de Azure
con PowerShell de Azure o la CLI de Azure, consulte:
Administración de recursos de Azure con Azure PowerShell
Administración de recursos de Azure mediante la CLI de Azure.
En los ejemplos siguientes se supone que ya dispone de un grupo de recursos en la cuenta con el nombre
especificado.

PowerShell
NOTE
Este artículo se ha actualizado para usar el nuevo módulo Az de Azure PowerShell. Aún puede usar el módulo de AzureRM
que continuará recibiendo correcciones de errores hasta diciembre de 2020 como mínimo. Para más información acerca del
nuevo módulo Az y la compatibilidad con AzureRM, consulte Introducing the new Azure PowerShell Az module
(Presentación del nuevo módulo Az de Azure PowerShell). Para obtener instrucciones sobre la instalación del módulo Az,
consulte Instalación de Azure PowerShell.

Implemente la plantilla para habilitar Event Hubs Capture en Azure Storage:

New-AzResourceGroupDeployment -ResourceGroupName \<resource-group-name\> -TemplateFile


https://raw.githubusercontent.com/azure/azure-quickstart-templates/master/201-eventhubs-create-namespace-and-
enable-capture/azuredeploy.json

Implemente la plantilla para habilitar Event Hubs Capture en Azure Data Lake Store:

New-AzResourceGroupDeployment -ResourceGroupName \<resource-group-name\> -TemplateFile


https://raw.githubusercontent.com/azure/azure-quickstart-templates/master/201-eventhubs-create-namespace-and-
enable-capture-for-adls/azuredeploy.json

Azure CLI
Azure Blob Storage como destino:

az group deployment create \<my-resource-group\> \<my-deployment-name\> --template-uri


[https://raw.githubusercontent.com/azure/azure-quickstart-templates/master/201-eventhubs-create-namespace-and-
enable-capture/azuredeploy.json][]

Azure Data Lake Store como destino:

az group deployment create \<my-resource-group\> \<my-deployment-name\> --template-uri


[https://raw.githubusercontent.com/azure/azure-quickstart-templates/master/201-eventhubs-create-namespace-and-
enable-capture-for-adls/azuredeploy.json][]

Pasos siguientes
También puede configurar la funcionalidad de captura de Event Hubs mediante Azure Portal. Para más
información, consulte Habilitación de la funcionalidad de captura de Event Hubs mediante Azure Portal.
Para más información acerca de Event Hubs, visite los vínculos siguientes:
Información general de Event Hubs
Creación de un centro de eventos
Preguntas más frecuentes sobre Event Hubs
Capture datos de Event Hubs en Azure Storage y
léalos mediante Python (azure-eventhub versión 5)
18/08/2020 • 11 minutes to read • Edit Online

Puede configurar un centro de eventos para que los datos que se envíen al mismo se capturen en una cuenta de
Azure Storage o en Azure Data Lake Storage Gen 1 o Gen 2. En este artículo se muestra cómo escribir código de
Python para enviar eventos a un centro de eventos y cómo leer los datos capturados de Azure Blob Storage . Para
más información sobre esta característica, consulte la introducción a la característica de captura de Event Hubs.
Este inicio rápido usa el SDK de Azure Python para mostrar la característica de captura. La aplicación sender.py
envía datos telemétricos del entorno simulados a Event Hubs en formato JSON. El centro de eventos está
configurado para usar la característica Capture para escribir estos datos en Blob Storage en lotes. La aplicación
capturereader.py lee estos blobs y crea un archivo de anexos para cada dispositivo. Luego, la aplicación escribe los
datos en archivos .CSV.

IMPORTANT
En este inicio rápido se usa la versión 5 del SDK de Python para Azure Event Hubs. Para ver un inicio rápido que use la
versión 1 del SDK de Python, consulte este artículo.

En esta guía de inicio rápido:


Crear una cuenta de Azure Blob Storage y un contenedor en Azure Portal.
Crear un espacio de nombres de Event Hubs mediante Azure Portal.
Cree un centro de eventos con la característica de Captura habilitada y conéctelo a su cuenta de
almacenamiento.
Enviar datos al centro de eventos con un script de Python.
Leer y procesar los archivos de Capture de Event Hubs con otro script de Python.

Requisitos previos
Python 2.7 y 3.5 o posterior, con PIP instalado y actualizado.
Suscripción a Azure. Si no tiene una, cree una cuenta gratuita antes de empezar.
Un espacio de nombres de Event Hubs y un centro de eventos activos. Crear un espacio de nombres de
Event Hubs y un centro de eventos en el espacio de nombres. Registre el nombre del espacio de nombres de
Event Hubs, el nombre del centro de eventos y la clave de acceso principal del espacio de nombres. Para
obtener la clave de acceso, consulte Obtención de una cadena de conexión de Event Hubs. El nombre de la
clave predeterminada es RootManageSharedAccessKey. Para este inicio rápido solo necesita la clave
principal. No necesita la cadena de conexión.
Una cuenta de Azure Storage, un contenedor de blobs en la cuenta de almacenamiento y una cadena de
conexión de la cuenta de almacenamiento. Si no tiene estos elementos, realice estas operaciones:
1. Creación de una cuenta de Azure Storage
2. Creación de un contenedor de blobs en la cuenta de almacenamiento
3. Obtención de la cadena de conexión para una cuenta de almacenamiento
Asegúrese de registrar la cadena de conexión y el nombre del contenedor para usarlo posteriormente en
este inicio rápido.
Habilite la característica de captura para el centro de eventos. Para ello, siga las instrucciones de Habilitación
de la característica de captura de Event Hubs desde Azure Portal. Seleccione la cuenta de almacenamiento y
el contenedor de blobs que creó en el paso anterior. También puede habilitar la característica al crear un
centro de eventos.

Creación de un script de Python para enviar eventos a un centro de


eventos
En esta sección, creará un script de Python que envía 200 eventos (10 dispositivos x 20 eventos) a un centro de
eventos. Estos eventos son una lectura del entorno de ejemplo que se envía en formato JSON.
1. Abra el editor de Python que prefiera, como Visual Studio Code.
2. Crear un script denominado sender.py.
3. Pegue el código siguiente en sender.py.

import time
import os
import uuid
import datetime
import random
import json

from azure.eventhub import EventHubProducerClient, EventData

# This script simulates the production of events for 10 devices.


devices = []
for x in range(0, 10):
devices.append(str(uuid.uuid4()))

# Create a producer client to produce and publish events to the event hub.
producer = EventHubProducerClient.from_connection_string(conn_str="EVENT HUBS NAMESAPCE CONNECTION
STRING", eventhub_name="EVENT HUB NAME")

for y in range(0,20): # For each device, produce 20 events.


event_data_batch = producer.create_batch() # Create a batch. You will add events to the batch later.
for dev in devices:
# Create a dummy reading.
reading = {'id': dev, 'timestamp': str(datetime.datetime.utcnow()), 'uv': random.random(),
'temperature': random.randint(70, 100), 'humidity': random.randint(70, 100)}
s = json.dumps(reading) # Convert the reading into a JSON string.
event_data_batch.add(EventData(s)) # Add event data to the batch.
producer.send_batch(event_data_batch) # Send the batch of events to the event hub.

# Close the producer.


producer.close()

4. Reemplace los valores siguientes en los scripts:


Reemplace EVENT HUBS NAMESPACE CONNECTION STRING por la cadena de conexión para el espacio de
nombres de Event Hubs.
Reemplace EVENT HUB NAME por el nombre del centro de eventos.
5. Ejecute el script para enviar eventos al centro de eventos.
6. En Azure Portal, puede comprobar que el centro de eventos ha recibido los mensajes. Cambie a la vista
Mensajes en la sección Métricas . Actualice la página para actualizar el gráfico. Pueden pasar unos
segundos hasta que aparezca en la página que los mensajes se han recibido.
Creación de un script de Python que lea archivos de Capture
En este ejemplo, los datos capturados se almacenan en Azure Blob Storage. El script de esta sección lee los archivos
de datos capturados de la cuenta de Azure Storage y genera archivos CSV que podrá abrir y ver fácilmente. Verá 10
archivos en el directorio de trabajo actual de la aplicación. Estos archivos contendrán las lecturas de entorno para
los 10 dispositivos.
1. En el editor de Python, cree un script denominado capturereader.py. Este script lee los archivos capturados y
crea un archivo para cada dispositivo, con el fin de escribir los datos solo de dicho dispositivo.
2. Pegue el código siguiente en capturereader.py.
import os
import string
import json
import uuid
import avro.schema

from azure.storage.blob import ContainerClient, BlobClient


from avro.datafile import DataFileReader, DataFileWriter
from avro.io import DatumReader, DatumWriter

def processBlob2(filename):
reader = DataFileReader(open(filename, 'rb'), DatumReader())
dict = {}
for reading in reader:
parsed_json = json.loads(reading["Body"])
if not 'id' in parsed_json:
return
if not parsed_json['id'] in dict:
list = []
dict[parsed_json['id']] = list
else:
list = dict[parsed_json['id']]
list.append(parsed_json)
reader.close()
for device in dict.keys():
filename = os.getcwd() + '\\' + str(device) + '.csv'
deviceFile = open(filename, "a")
for r in dict[device]:
deviceFile.write(", ".join([str(r[x]) for x in r.keys()])+'\n')

def startProcessing():
print('Processor started using path: ' + os.getcwd())
# Create a blob container client.
container = ContainerClient.from_connection_string("AZURE STORAGE CONNECTION STRING",
container_name="BLOB CONTAINER NAME")
blob_list = container.list_blobs() # List all the blobs in the container.
for blob in blob_list:
# Content_length == 508 is an empty file, so process only content_length > 508 (skip empty
files).
if blob.size > 508:
print('Downloaded a non empty blob: ' + blob.name)
# Create a blob client for the blob.
blob_client = ContainerClient.get_blob_client(container, blob=blob.name)
# Construct a file name based on the blob name.
cleanName = str.replace(blob.name, '/', '_')
cleanName = os.getcwd() + '\\' + cleanName
with open(cleanName, "wb+") as my_file: # Open the file to write. Create it if it doesn't
exist.
my_file.write(blob_client.download_blob().readall()) # Write blob contents into the
file.
processBlob2(cleanName) # Convert the file into a CSV file.
os.remove(cleanName) # Remove the original downloaded file.
# Delete the blob from the container after it's read.
container.delete_blob(blob.name)

startProcessing()

3. Reemplace AZURE STORAGE CONNECTION STRING por la cadena de conexión de su cuenta de Azure Storage. El
nombre del contenedor que creó en este inicio rápido es capture. Si ha usado otro nombre para el
contenedor, reemplace capture por el nombre del contenedor en la cuenta de almacenamiento.

Ejecución de los scripts


1. Abra un símbolo del sistema que tiene Python en su ruta de acceso y, después, ejecute dichos comandos
para instalar los paquetes de requisitos previos de Python:

pip install azure-storage-blob


pip install azure-eventhub
pip install avro-python3

2. Vaya al directorio en que guardó sender.py y capturereader.py y ejecute este comando:

python sender.py

Este comando inicia un nuevo proceso de Python para ejecutar el remitente.


3. Espere unos minutos a que se ejecute la captura y, después, escriba el siguiente comando en la ventana de
comandos original:

python capturereader.py

Este procesador de captura usa el directorio local para descargar todos los blobs de la cuenta de
almacenamiento y del contenedor. Procesa los que no estén vacíos y escribe los resultados en forma de
archivos .CSV en el directorio local.

Pasos siguientes
Consulte los ejemplos de Python en GitHub.
Inicio rápido: Tutorial de Event Hubs Capture: Python
(azure-eventhub, versión 1)
18/08/2020 • 10 minutes to read • Edit Online

Capture es una característica de Azure Event Hubs. Puede usar Capture para enviar automáticamente los datos de
streaming que hay en un centro de eventos a una cuenta de Azure Blob Storage que prefiera. Esto facilita el
procesamiento por lotes en datos de streaming en tiempo real. En este artículo se describe cómo utilizar Event
Hubs Capture con Python. Para más información acerca de Capture de Event Hubs, consulte Capture de Event
Hubs mediante Azure Event Hubs.
En esta guía se usa el SDK de Azure para Python a fin de demostrar la característica Capture. El programa
sender.py envía datos telemétricos del entorno simulados a Event Hubs en formato JSON. El centro de eventos usa
la característica Capture para escribir estos datos en Blob Storage en lotes. La aplicación capturereader.py lee estos
blobs, crea un archivo de anexos para cada uno de los dispositivos y escribe los datos en los archivos .csv de cada
dispositivo.

WARNING
Este inicio rápido es para la versión 1 del SDK de Python para Azure Event Hubs. Se recomienda migrar el código a la
versión 5 del SDK de Python.

En este tutorial realizará lo siguiente:


Crear una cuenta de Azure Blob Storage y un contenedor en Azure Portal.
Habilitar Capture de Event Hubs y dirigirlo a su cuenta de almacenamiento.
Enviar datos al centro de eventos con un script de Python.
Leer y procesar los archivos de Capture de Event Hubs con otro script de Python.

Requisitos previos
Python 3.4 o posterior, con pip instalado y actualizado.
Suscripción a Azure. Si no tiene una, cree una cuenta gratuita antes de empezar.
Un espacio de nombres de Event Hubs activo y un centro de eventos, creados siguiendo las instrucciones
que se indican en Inicio rápido: Creación de un centro de eventos mediante Azure Portal. Tome nota del
espacio de nombres y los nombres del centro de eventos para usarlos más adelante en este tutorial.

NOTE
Si ya tiene un contenedor de almacenamiento para usar, puede habilitar Capture y seleccionar el contenedor de
almacenamiento al crear el centro de eventos.

El nombre de la clave de acceso compartido y el valor de clave principal de Event Hubs. Busque o cree estos
valores en Directivas de acceso compar tido en la página de Event Hubs. El nombre de la clave de
acceso predeterminada es RootManageSharedAccessKey . Copie el nombre de clave de acceso y el valor
de clave principal para usarlos más adelante en este tutorial.

Creación de una cuenta y un contenedor de Azure Blob Storage


Cree una cuenta de almacenamiento y un contenedor que se usarán para la captura.
1. Inicie sesión en Azure Portal.
2. En el panel de navegación izquierdo, seleccione Cuentas de almacenamiento y, en la pantalla Cuentas
de almacenamiento , seleccione Agregar .
3. En la pantalla de creación de cuentas de almacenamiento, seleccione una suscripción y un grupo de
recursos, y asigne un nombre a la cuenta de almacenamiento. Puede dejar las demás selecciones con sus
valores predeterminados. Seleccione Revisar y crear , revise la configuración y, después, seleccione Crear .

4. Una vez finalizada la implementación, seleccione Ir al recurso y, en la pantalla Información general de


la cuenta de almacenamiento, seleccione Contenedores .
5. En la pantalla Contenedores , seleccione + Contenedor .
6. En la pantalla Nuevo contenedor , asigne un nombre al contenedor y, a continuación, seleccione Aceptar .
Tome nota del nombre del contenedor para usarlo más adelante en el tutorial.
7. En el panel de navegación izquierdo de la pantalla Contenedores , seleccione Claves de acceso . Copie el
Nombre de cuenta de almacenamiento y el valor de Clave en key1 (clave1), para usarlo más adelante
en el tutorial.

Habilitación de Capture de Event Hubs


1. En Azure Portal, vaya al centro de eventos; para ello, seleccione su espacio de nombres de Event Hubs en
Todos los recursos , seleccione Event Hubs en el panel de navegación izquierdo y, a continuación, seleccione
el centro de eventos.
2. En la pantalla Información general del centro de eventos, seleccione Capturar eventos .
3. En la pantalla Capture , seleccione Activar . A continuación, en Contenedor de Azure Storage , seleccione
Seleccionar el contenedor .
4. En la pantalla Contenedores , seleccione el contenedor de almacenamiento que quiera utilizar y, a
continuación, seleccione Seleccionar .
5. En la pantalla Capture , seleccione Guardar cambios .

Creación de un script de Python para enviar eventos a un centro de


eventos
Este script le envía 200 eventos a un centro de eventos. Los eventos son lecturas simples del entorno enviadas en
JSON.
1. Abra el editor de Python que prefiera, como Visual Studio Code.
2. Cree un nuevo archivo denominado sender.py.
3. Pegue el código siguiente en sender.py. Sustituya sus propios valores por los valores <namespace>,
<AccessKeyName>, <primary key value> y <eventhub> de Event Hubs.

import uuid
import datetime
import random
import json
from azure.servicebus.control_client import ServiceBusService

sbs = ServiceBusService(service_namespace='<namespace>', shared_access_key_name='<AccessKeyName>',


shared_access_key_value='<primary key value>')
devices = []
for x in range(0, 10):
devices.append(str(uuid.uuid4()))

for y in range(0,20):
for dev in devices:
reading = {'id': dev, 'timestamp': str(datetime.datetime.utcnow()), 'uv': random.random(),
'temperature': random.randint(70, 100), 'humidity': random.randint(70, 100)}
s = json.dumps(reading)
sbs.send_event('<eventhub>', s)
print(y)

4. Guarde el archivo.

Creación de un script de Python que lea archivos de Capture


Este script lee los archivos capturados y crea un archivo para cada dispositivo a fin de escribir los datos solo para
dicho dispositivo.
1. En el editor de Python, cree un nuevo archivo denominado capturereader.py.
2. Pegue el código siguiente en capturereader.py. Sustituya los valores guardados por sus valores
<storageaccount>, <storage account access key> y <storagecontainer>.
import os
import string
import json
import avro.schema
from avro.datafile import DataFileReader, DataFileWriter
from avro.io import DatumReader, DatumWriter
from azure.storage.blob import BlockBlobService

def processBlob(filename):
reader = DataFileReader(open(filename, 'rb'), DatumReader())
dict = {}
for reading in reader:
parsed_json = json.loads(reading["Body"])
if not 'id' in parsed_json:
return
if not parsed_json['id'] in dict:
list = []
dict[parsed_json['id']] = list
else:
list = dict[parsed_json['id']]
list.append(parsed_json)
reader.close()
for device in dict.keys():
deviceFile = open(device + '.csv', "a")
for r in dict[device]:
deviceFile.write(", ".join([str(r[x]) for x in r.keys()])+'\n')

def startProcessing(accountName, key, container):


print('Processor started using path: ' + os.getcwd())
block_blob_service = BlockBlobService(account_name=accountName, account_key=key)
generator = block_blob_service.list_blobs(container)
for blob in generator:
#content_length == 508 is an empty file, so only process content_length > 508 (skip empty
files)
if blob.properties.content_length > 508:
print('Downloaded a non empty blob: ' + blob.name)
cleanName = str.replace(blob.name, '/', '_')
block_blob_service.get_blob_to_path(container, blob.name, cleanName)
processBlob(cleanName)
os.remove(cleanName)
block_blob_service.delete_blob(container, blob.name)
startProcessing('<storageaccount>', '<storage account access key>', '<storagecontainer>')

Ejecución de los scripts de Python


1. Abra un símbolo del sistema que tenga Python en su ruta de acceso y ejecute dichos comandos para
instalar los paquetes de requisitos previos de Python:

pip install azure-storage


pip install azure-servicebus
pip install avro-python3

Si tiene una versión anterior de azure-storage o azure , es posible que tenga que utilizar la opción
--upgrade .

También puede que tenga que ejecutar el comando siguiente. La ejecución de este comando no es necesaria
en la mayoría de los sistemas.

pip install cryptography

2. Desde el directorio en el que guardó sender.py y capturereader.py, ejecute este comando:


start python sender.py

Este comando inicia un nuevo proceso de Python para ejecutar el remitente.


3. Cuando la captura termine de ejecutarse, ejecute este comando:

python capturereader.py

El procesador de captura descarga todos los blobs que no estén vacíos del contenedor de la cuenta de
almacenamiento y escribe los resultados como archivos .csv en el directorio local.

Pasos siguientes
Para más información sobre Event Hubs, consulte:
Información general de Event Hubs Capture
Aplicaciones de ejemplo que usan Event Hubs
Información general de Event Hubs
Inicio rápido: Streaming de datos con Event Hubs
mediante el protocolo de Kafka
18/08/2020 • 4 minutes to read • Edit Online

En esta guía de inicio rápido se muestra cómo transmitir a instancias de Event Hubs sin cambiar los clientes del
protocolo o ejecutar sus propios clústeres. Aprenderá a usar los productores y los consumidores para hablar con
instancias de Event Hubs solo con un cambio de configuración en las aplicaciones. Azure Event Hubs admite
Apache Kafka versión 1.0.

NOTE
Este ejemplo está disponible en GitHub.

Prerrequisitos
Para completar esta guía de inicio rápido, asegúrese de cumplir los siguientes requisitos previos:
Lea el artículo Event Hubs para Apache Kafka.
Suscripción a Azure. Si no tiene una, cree una cuenta gratuita antes de empezar.
Kit de desarrollo de Java (JDK) 1.7+.
Descargue e instale un archivo binario de Maven.
Git

Creación de un espacio de nombres de Event Hubs


Al crear un espacio de nombres en el nivel estándar de Event Hubs, se habilita automáticamente el punto de
conexión de Kafka para el espacio de nombres. Puede transmitir eventos desde las aplicaciones que usan el
protocolo de Kafka a instancias del nivel estándar de Event Hubs. Siga las instrucciones paso a paso de Creación
de un centro de eventos mediante Azure Portal para crear un espacio de nombres de Event Hubs de nivel
estándar .

NOTE
Event Hubs para Kafka solo está disponible en los niveles estándar y dedicado . El nivel básico no es compatible con Kafka
en Event Hubs.

Envío y recepción de mensajes con Kafka en Event Hubs


1. Clone el repositorio de Azure Event Hubs para Kafka.
2. Vaya a azure-event-hubs-for-kafka/quickstart/java/producer .
3. Actualice los detalles de configuración para el productor en src/main/resources/producer.config de la
siguiente manera:
TLS/SSL:
bootstrap.servers=NAMESPACENAME.servicebus.windows.net:9093
security.protocol=SASL_SSL
sasl.mechanism=PLAIN
sasl.jaas.config=org.apache.kafka.common.security.plain.PlainLoginModule required
username="$ConnectionString" password="{YOUR.EVENTHUBS.CONNECTION.STRING}";

OAuth:

bootstrap.servers=NAMESPACENAME.servicebus.windows.net:9093
security.protocol=SASL_SSL
sasl.mechanism=OAUTHBEARER
sasl.jaas.config=org.apache.kafka.common.security.oauthbearer.OAuthBearerLoginModule required;
sasl.login.callback.handler.class=CustomAuthenticateCallbackHandler;

Aquí puede encontrar el código fuente de la clase de controlador de ejemplo


CustomAuthenticateCallbackHandler en GitHub.
4. Ejecute el código del productor y transmita los eventos a Event Hubs:

mvn clean package


mvn exec:java -Dexec.mainClass="TestProducer"

5. Vaya a azure-event-hubs-for-kafka/quickstart/java/consumer .
6. Actualice los detalles de configuración para el consumidor en src/main/resources/consumer.config de la
siguiente manera:
TLS/SSL:

bootstrap.servers=NAMESPACENAME.servicebus.windows.net:9093
security.protocol=SASL_SSL
sasl.mechanism=PLAIN
sasl.jaas.config=org.apache.kafka.common.security.plain.PlainLoginModule required
username="$ConnectionString" password="{YOUR.EVENTHUBS.CONNECTION.STRING}";

OAuth:

bootstrap.servers=NAMESPACENAME.servicebus.windows.net:9093
security.protocol=SASL_SSL
sasl.mechanism=OAUTHBEARER
sasl.jaas.config=org.apache.kafka.common.security.oauthbearer.OAuthBearerLoginModule required;
sasl.login.callback.handler.class=CustomAuthenticateCallbackHandler;

Aquí puede encontrar el código fuente de la clase de controlador de ejemplo


CustomAuthenticateCallbackHandler en GitHub.
Puede encontrar todos los ejemplos de OAuth de Event Hubs para Kafka aquí.
7. Ejecute el código de consumidor y procese eventos desde el centro de eventos mediante los clientes de
Kafka:

mvn clean package


mvn exec:java -Dexec.mainClass="TestConsumer"

Si el clúster de Kafka de Event Hubs tiene eventos, ahora comenzará a recibirlos desde el consumidor.
Pasos siguientes
En este artículo se muestra cómo hacer streaming a instancias de Event Hubs sin cambiar los clientes del
protocolo o ejecutar sus propios clústeres. Para más información, consulte Guía del desarrollador de Apache Kafka
para Azure Event Hubs.
Inicio rápido: Creación de un clúster de Event Hubs
dedicado mediante Azure Portal
18/08/2020 • 9 minutes to read • Edit Online

Los clústeres de Event Hubs ofrecen implementaciones de inquilino único para los clientes con las necesidades de
streaming más exigentes. Esta oferta tiene un Acuerdo de Nivel de Servicio garantizado del 99,99 % y solo está
disponible en nuestro plan de tarifa dedicado. Un clúster de Event Hubs puede incorporar millones de eventos por
segundo con capacidad garantizada y una latencia inferior a un segundo. Los espacios de nombres y centros de
eventos creados en un clúster incluyen todas las características de la oferta estándar y mucho más, pero sin límites
de entrada. La oferta dedicada también incluye la popular característica Event Hubs Capture sin costo adicional,
que permite transferir por lotes secuencias de datos a Azure Blob Storage o Azure Data Lake Storage Gen 1 y
registrarlas ahí automáticamente.
Los clústeres dedicados se aprovisionan y se facturan por unidades de capacidad (CU) , una cantidad de
recursos de CPU y memoria asignada previamente. Puede adquirir 1, 2, 4, 8, 12, 16 o 20 CU para cada clúster. En
este inicio rápido, le guiaremos por la creación de un clúster de Event Hubs de 1 unidad de capacidad (CU)
mediante Azure Portal.

NOTE
Esta experiencia de autoservicio está disponible actualmente en versión preliminar en Azure Portal. Si tiene alguna pregunta
sobre la oferta dedicada, póngase en contacto con el equipo de Event Hubs.

Prerrequisitos
Para completar esta guía de inicio rápido, asegúrese de que tiene:
Una cuenta de Azure. Si no dispone de una, puede adquirir una cuenta antes de comenzar. Esta característica no
es compatible con una cuenta gratuita de Azure.
Visual Studio 2017 Update 3 (versión 15.3, 26730.01) o posterior.
SDK de .NET Standard, versión 2.0 o posterior.
Un grupo de recursos creado.

Creación de un clúster dedicado de Event Hubs


Un clúster de Event Hubs proporciona un único contenedor de ámbito en el que puede crear uno o varios espacios
de nombres. En esta fase de versión preliminar de la experiencia de autoservicio del portal, puede crear clústeres
de 1 CU en determinadas regiones. Si necesita un clúster mayor de 1 CU, puede enviar una solicitud de soporte
técnico de Azure para escalar verticalmente el clúster después de crearlo.
Para crear un clúster en el grupo de recursos mediante Azure Portal, haga lo siguiente:
1. Siga este vínculo para crear un clúster en Azure Portal. Por otro lado, seleccione Todos los ser vicios
desde el panel de navegación izquierdo, escriba "Clústeres de Event Hubs" en la barra de búsqueda y
seleccione "Clústeres de Event Hubs" en la lista de resultados.
2. En la página Crear clúster , configure lo siguiente:
a. Escriba un nombre para el clúster . El sistema realiza la comprobación automáticamente para ver
si el nombre está disponible.
b. Seleccione la suscripción en la que desea crear el clúster.
c. Seleccione el grupo de recursos en el que desea crear el clúster.
d. Seleccione una ubicación para el clúster. Si su región preferida está atenuada, significa que se
encuentra temporalmente sin capacidad y puede enviar una solicitud de soporte técnico al equipo de
Event Hubs.
e. Seleccione el botón Siguiente: Etiquetas situado en la parte inferior de la página. Puede que tenga
que esperar unos minutos hasta que el sistema aprovisione totalmente los recursos.

3. En la página Etiquetas , configure lo siguiente:


a. Escriba un nombre y un valor para la etiqueta que desea agregar. Este paso es opcional .
b. Seleccione el botón Revisar y Crear .
4. En la página Revisar y crear , revise los detalles y seleccione Crear .

Creación de un espacio de nombres y un centro de eventos dentro de


un clúster
1. Para crear un espacio de nombres dentro de un clúster, en la página Clúster de Event Hubs del clúster,
seleccione + Espacio de nombres en el menú superior.

2. En la página de creación de un espacio de nombres, siga los pasos siguientes:


a. Escriba nombre para el espacio de nombres . El sistema comprueba si el nombre está disponible.
b. El espacio de nombres hereda las propiedades siguientes:
a. Id. de suscripción
b. Grupo de recursos
c. Location
d. Cluster Name
c. Seleccione Crear para crear el espacio de nombres. Ahora puede administrar el clúster.
3. Una vez creado el espacio de nombres, puede crear un centro de eventos tal y como crearía normalmente
uno dentro de un espacio de nombres.

Enviar una solicitud de soporte técnico.


Si quiere cambiar el tamaño del clúster después de crearlo o si su región preferida no está disponible, envíe una
solicitud de soporte técnico mediante estos pasos:
1. En Azure Portal, seleccione Ayuda y sopor te técnico en el menú izquierdo.
2. Seleccione + Nueva solicitud de sopor te técnico en el menú de soporte técnico.
3. En la página de soporte técnico, siga estos pasos:
a. Para Tipo de problema , seleccione Técnico en la lista desplegable.
b. En Suscripción , seleccione la suscripción.
c. Para Ser vicio , seleccione Mis ser vicios y, a continuación, seleccione Event Hubs .
d. Para Recurso , seleccione el clúster si ya existe, en caso contrario, seleccione Pregunta
general/Recurso no disponible .
e. Para Tipo de problema , seleccione Cuota .
f. Para Subtipo de problema , seleccione uno de los siguientes valores en la lista desplegable:
a. Seleccione Solicitud de SKU dedicada para solicitar que la característica sea admitida en la
región.
b. Seleccione Solicitar escalar o reducir ver ticalmente el clúster dedicado si desea escalar o
reducir verticalmente el clúster dedicado.
g. En Asunto , describa el problema.
Eliminación de un clúster dedicado
1. Para eliminar el clúster, seleccione Eliminar en el menú superior. Tenga en cuenta que, tras la creación del
clúster, se le facturará un mínimo de cuatro horas de uso.
2. Aparecerá un mensaje para confirmar su voluntad de eliminar el clúster.
3. Escriba el nombre del clúster y seleccione Eliminar para eliminar el clúster.

Pasos siguientes
En este artículo, ha creado un clúster de Event Hubs. Para obtener instrucciones paso a paso para enviar y recibir
eventos desde un centro de eventos y capturar eventos en Azure Storage o Azure Data Lake Store, consulte los
siguientes tutoriales:
Envío y recepción de eventos
.NET Core
Java
Python
JavaScript
Uso de Azure Portal para habilitar Event Hubs Capture
Uso de Azure Event Hubs para Apache Kafka
Tutorial: Visualización de anomalías de datos de
eventos en tiempo real enviados a Azure Event Hubs
18/08/2020 • 26 minutes to read • Edit Online

Con Azure Event Hubs, puede usar Azure Stream Analytics para comprobar los datos entrantes y extraer las
anomalías, que luego puede visualizar en Power BI. Supongamos que tiene miles de dispositivos que envían
constantemente datos en tiempo real a un centro de eventos, lo que suma millones de eventos por segundo.
¿Cómo comprueba errores y anomalías en tantos datos? Por ejemplo, ¿y si los dispositivos envían transacciones de
tarjeta de crédito y necesita capturarlas en cualquier lugar donde tenga varias transacciones en varios países o
regiones dentro de un intervalo de tiempo de 5 segundos? Esto podría ocurrir si alguien roba tarjetas de crédito y
luego las usa para comprar artículos en todo el mundo a la misma hora.
En este tutorial, se simula este ejemplo. Ejecutará una aplicación que crea y envía transacciones de tarjeta de crédito
a un centro de eventos. A continuación, leerá el flujo de datos en tiempo real con Azure Stream Analytics, que
separa las transacciones válidas de las que no lo son y, luego, usará Power BI para identificar visualmente las
transacciones etiquetadas como no válidas.
En este tutorial, aprenderá a:
Creación de un espacio de nombres de Event Hubs
Creación de un centro de eventos
Ejecutar la aplicación que envía transacciones de tarjeta de crédito
Configurar un trabajo de Stream Analytics para procesar esas transacciones
Configurar una visualización de Power BI para mostrar los resultados
Para completar este tutorial, necesitará una suscripción de Azure. Si no tiene una, cree una cuenta gratuita antes de
empezar.

Prerrequisitos
NOTE
Este artículo se ha actualizado para usar el nuevo módulo Az de Azure PowerShell. Aún puede usar el módulo de AzureRM
que continuará recibiendo correcciones de errores hasta diciembre de 2020 como mínimo. Para más información acerca del
nuevo módulo Az y la compatibilidad con AzureRM, consulte Introducing the new Azure PowerShell Az module (Presentación
del nuevo módulo Az de Azure PowerShell). Para obtener instrucciones sobre la instalación del módulo Az, consulte
Instalación de Azure PowerShell.

Uso de Azure Cloud Shell


En Azure se hospeda Azure Cloud Shell, un entorno de shell interactivo que puede utilizar mediante el explorador.
Puede usar Bash o PowerShell con Cloud Shell para trabajar con los servicios de Azure. Puede usar los comandos
preinstalados de Cloud Shell para ejecutar el código de este artículo sin tener que instalar nada en su entorno local.
Para iniciar Azure Cloud Shell:
O P C IÓ N E JEM P LO O VÍN C ULO

Seleccione Pruébelo en la esquina superior derecha de un


bloque de código. Solo con seleccionar Pruébelo no se copia
automáticamente el código en Cloud Shell.

Vaya a https://shell.azure.com o seleccione el botón Iniciar


Cloud Shell para abrir Cloud Shell en el explorador.

Seleccione el botón Cloud Shell en la barra de menús de la


esquina superior derecha de Azure Portal.

Para ejecutar el código de este artículo en Azure Cloud Shell:


1. Inicie Cloud Shell.
2. Seleccione el botón Copiar de un bloque de código para copiar el código.
3. Pegue el código en la sesión de Cloud Shell. Para ello, seleccione Ctrl +Mayús +V en Windows y Linux, o
bien seleccione Cmd +Mayús +V en macOS.
4. Seleccione Entrar para ejecutar el código.
Instale Visual Studio.
Necesitará una cuenta de Power BI para analizar la salida de un trabajo de Stream Analytics. Puede probar Power
BI de forma gratuita.

Configuración de recursos
En este tutorial, necesitará un espacio de nombres de Event Hubs y un centro de eventos. Puede crear estos
recursos con Azure PowerShell o la CLI de Azure. Use el mismo grupo de recursos y la misma ubicación para todos
los recursos. Al final, puede quitar todos los elementos en un solo paso mediante la eliminación del grupo de
recursos.
En las secciones siguientes se describe cómo realizar estos pasos necesarios. Siga las instrucciones de la CLI o de
PowerShell para realizar los pasos siguientes:
1. Cree un grupo de recursos.
2. Cree un espacio de nombres de Event Hubs.
3. Cree un centro de eventos.

NOTE
Hay variables establecidas en cada script que necesitará más adelante en este tutorial. Estas incluyen el nombre del grupo de
recursos ($resourceGroup), el espacio de nombres del centro de eventos ( $eventHubNamespace ) y el nombre del centro
de eventos ( $eventHubName ). Más adelante en este artículo se hace referencia a ellas con su prefijo de signo del dólar ($),
para que sepa que se establecieron en el script.

Configuración de los recursos mediante la CLI de Azure


Copie y pegue este script en Cloud Shell. Suponiendo que ya haya iniciado sesión, el script se ejecutará línea a línea.
Las variables que deben ser globalmente únicas llevan concatenado $RANDOM . Cuando se ejecuta el script y se
establecen las variables, se genera y se concatena una cadena numérica aleatoria al final de la cadena fija, lo que la
convierte en única.
# Set the values for location and resource group name.
location=westus
resourceGroup=ContosoResourcesEH

# Create the resource group to be used


# for all the resources for this tutorial.
az group create --name $resourceGroup \
--location $location

# The Event Hubs namespace name must be globally unique, so add a random number to the end.
eventHubNamespace=ContosoEHNamespace$RANDOM
echo "Event Hub Namespace = " $eventHubNamespace

# Create the Event Hubs namespace.


az eventhubs namespace create --resource-group $resourceGroup \
--name $eventHubNamespace \
--location $location \
--sku Standard

# The event hub name must be globally unique, so add a random number to the end.
eventHubName=ContosoEHhub$RANDOM
echo "event hub name = " $eventHubName

# Create the event hub.


az eventhubs eventhub create --resource-group $resourceGroup \
--namespace-name $eventHubNamespace \
--name $eventHubName \
--message-retention 3 \
--partition-count 2

# Get the connection string that authenticates the app with the Event Hubs service.
connectionString=$(az eventhubs namespace authorization-rule keys list \
--resource-group $resourceGroup \
--namespace-name $eventHubNamespace \
--name RootManageSharedAccessKey \
--query primaryConnectionString \
--output tsv)
echo "Connection string = " $connectionString

Configuración de los recursos mediante Azure PowerShell


Copie y pegue este script en Cloud Shell. Suponiendo que ya haya iniciado sesión, el script se ejecutará línea a línea.
Las variables que deben ser globalmente únicas llevan concatenado $(Get-Random) . Cuando se ejecuta el script y se
establecen las variables, se genera y se concatena una cadena numérica aleatoria al final de la cadena fija, lo que la
convierte en única.
# Log in to Azure account.
Login-AzAccount

# Set the values for the location and resource group.


$location = "West US"
$resourceGroup = "ContosoResourcesEH"

# Create the resource group to be used


# for all resources for this tutorial.
New-AzResourceGroup -Name $resourceGroup -Location $location

# The Event Hubs namespace name must be globally unique, so add a random number to the end.
$eventHubNamespace = "contosoEHNamespace$(Get-Random)"
Write-Host "Event Hub Namespace is " $eventHubNamespace

# The event hub name must be globally unique, so add a random number to the end.
$eventHubName = "contosoEHhub$(Get-Random)"
Write-Host "Event hub Name is " $eventHubName

# Create the Event Hubs namespace.


New-AzEventHubNamespace -ResourceGroupName $resourceGroup `
-NamespaceName $eventHubNamespace `
-Location $location

# Create the event hub.


$yourEventHub = New-AzEventHub -ResourceGroupName $resourceGroup `
-NamespaceName $eventHubNamespace `
-Name $eventHubName `
-MessageRetentionInDays 3 `
-PartitionCount 2

# Get the event hub key, and retrieve the connection string from that object.
# You need this to run the app that sends test messages to the event hub.
$eventHubKey = Get-AzEventHubKey -ResourceGroupName $resourceGroup `
-Namespace $eventHubNamespace `
-AuthorizationRuleName RootManageSharedAccessKey

# Save this value somewhere local for later use.


Write-Host "Connection string is " $eventHubKey.PrimaryConnectionString

Ejecución de la aplicación para generar datos de eventos de prueba


Los ejemplos de Event Hubs en GitHub incluyen una aplicación de Anomaly Detector que genera datos de prueba
automáticamente. Para simular el uso de tarjetas de crédito, escribe transacciones de tarjeta de crédito en el centro
de eventos, y ocasionalmente escribe varias transacciones para la misma tarjeta de crédito en varias ubicaciones
para que se etiqueten como anomalías. Para ejecutar esta aplicación, siga estos pasos:
1. Descargue los ejemplos de Azure Event Hubs desde GitHub y descomprímalos localmente.
2. Vaya a la carpeta \azure-event-hubs-master\samples\DotNet\ .
3. Vaya a la carpeta Azure.Messaging.EventHubs\AnomalyDetector\ y haga doble clic en
AnomalyDetector.sln para abrir la solución en Visual Studio.
Para usar la versión anterior del ejemplo que usa el paquete antiguo Microsoft.Azure.EventHubs, abra la
solución desde la carpeta Microsoft.Azure.EventHubs\AnomalyDetector .
4. Abra Program.cs y reemplace la cadena de conexión de Event Hubs por la que guardó al ejecutar el
script.
5. Reemplace el nombre del centro de eventos por el nombre de su centro de eventos. Presione F5 para
ejecutar la aplicación. La aplicación comienza a enviar eventos al centro de eventos y continúa hasta que ha
enviado 1000 eventos. Hay algunos casos en los que la aplicación debe estar en ejecución para recuperar
datos. Estos casos se señalan en las instrucciones siguientes, donde sea necesario.

Configuración de Azure Stream Analytics


Ahora puede transmitir los datos al centro de eventos. Para usar esos datos en una visualización de Power BI,
primero configure un trabajo de Stream Analytics para recuperar los datos que luego se introducen en la
visualización de Power BI.
Creación del trabajo de Stream Analytics
1. En Azure Portal, haga clic en Crear un recurso . Escriba stream analytics en el cuadro de búsqueda y
presione Entrar . Seleccione Trabajo de Stream Analytics . Haga clic en Crear en el panel del trabajo de
Stream Analytics.
2. Escriba la siguiente información del trabajo:
Nombre del trabajo : use contosoEHjob . Este campo es el nombre del trabajo y debe ser globalmente
único.
Suscripción : Seleccione su suscripción.
Grupo de recursos : use el mismo grupo de recursos utilizado por el centro de eventos
(ContosoResourcesEH ).
Ubicación : use la misma ubicación que en el script de instalación (Oeste de EE. UU. ).

En el resto de los campos, acepte los valores predeterminados. Haga clic en Crear .
Adición de una entrada al trabajo de Stream Analytics
Si no está en el portal en el panel Trabajo de Stream Analytics , puede volver al trabajo de Stream Analytics; para
ello, haga clic en Grupos de recursos en el portal y seleccione el grupo de recursos ( ContosoResourcesEH ).
Esta acción muestra todos los recursos del grupo y ahí puede seleccionar el trabajo de Stream Analytics.
Las entradas del trabajo de Steam Analytics son las transacciones de tarjeta de crédito del centro de eventos.

NOTE
Los valores de variables que comienzan con el signo del dólar ($) se establecen en los scripts de inicio de las secciones
anteriores. Debe usar aquí los mismos valores al especificar esos campos, que son el espacio de nombres de Event Hubs y el
nombre del centro de eventos.

1. En Topología de trabajo , haga clic en Entradas .


2. En el panel Entradas , haga clic en Add stream input (Agregar entrada de flujo) y seleccione Event Hubs.
En la pantalla que aparece, rellene los campos siguientes:
Alias de entrada : use contosoinputs . Este campo es el nombre del flujo de entrada usado al definir la
consulta de los datos.
Suscripción : Seleccione su suscripción.
Espacio de nombres de Event Hubs : seleccione su espacio de nombres de Event Hubs
($eventHubNamespace ).
Nombre del centro de eventos : haga clic en Usar existente y seleccione el centro de eventos
($eventHubName ).
Directiva de Event Hubs : Seleccione RootManageSharedAccessKey .
Grupo de consumidores de Event Hubs : deje este campo en blanco para usar el grupo de consumidores
predeterminado.
En el resto de los campos, acepte los valores predeterminados.
3. Haga clic en Save (Guardar).
Adición de una salida al trabajo de Stream Analytics
1. En Topología de trabajo , haga clic en Salidas . Este campo es el nombre del flujo de salida, que se usa al
definir la consulta de los datos.
2. En el panel Salidas , haga clic en Agregar y, después, seleccione Power BI . En la pantalla que aparece,
rellene los campos siguientes:
Alias de salida : use contosooutputs . Este campo es el alias único de la salida.
Nombre del conjunto de datos : use contosoehdataset . Este campo es el nombre del conjunto de datos
que se va a usar en Power BI.
Nombre de la tabla : use contosoehtable . Este campo es el nombre de la tabla que se va a usar en Power
BI.
En el resto de los campos, acepte los valores predeterminados.
3. Haga clic en Autorizar e inicie sesión en su cuenta de Power BI.
4. En el resto de los campos, acepte los valores predeterminados.
5. Haga clic en Save (Guardar).
Configuración de la consulta del trabajo de Stream Analytics
Esta consulta se usa para recuperar los datos que finalmente se envían a la visualización de Power BI. Usa
contosoinputs y contosooutputs , que anteriormente definió al configurar el trabajo. Esta consulta recupera las
transacciones de tarjeta de crédito que parecen fraudulentas, que son las transacciones en las que el mismo
número de tarjeta de crédito tiene varias transacciones en diferentes ubicaciones en el mismo intervalo de cinco
segundos.
1. En Topología de trabajo , haga clic en Consulta .
2. Reemplace la consulta por la siguiente:
/* criteria for fraud:
credit card purchases with the same card
in different locations within 5 seconds
*/
SELECT System.Timestamp AS WindowEnd,
COUNT(*) as FraudulentUses
INTO contosooutputs
FROM contosoinputs CS1 TIMESTAMP BY [Timestamp]
JOIN contosoinputs CS2 TIMESTAMP BY [Timestamp]
/* where the credit card # is the same */
ON CS1.CreditCardId = CS2.CreditCardId
/* and time between the two is between 0 and 5 seconds */
AND DATEDIFF(second, CS1, CS2) BETWEEN 0 AND 5
/* where the location is different */
WHERE CS1.Location != CS2.Location
GROUP BY TumblingWindow(Duration(second, 1))

3. Haga clic en Save (Guardar).


Prueba de la consulta en el trabajo de Stream Analytics
1. Ejecute la aplicación de detección de anomalías para enviar datos al centro de eventos mientras se configura
y ejecuta la prueba.
2. En el panel Consulta, haga clic en los puntos que aparecen junto a la entrada contosoinputs y seleccione
Sample data from input (Muestrear datos de entrada).
3. Especifique que quiere datos correspondientes a tres minutos y haga clic en Aceptar . Espere a que se le
notifique que se ha realizado un muestreo de los datos.
4. Haga clic en Probar y asegúrese de que obtiene resultados. Los resultados se muestran en la sección
Resultados del panel inferior a la derecha en la consulta.
5. Cierre el panel Consulta.
Ejecución del trabajo de Stream Analytics
En el trabajo de Stream Analytics, haga clic en Iniciar , luego en Ahora y, finalmente, en Iniciar . Una vez que el
trabajo se inicia correctamente, su estado cambia de Detenido a En ejecución .

Configuración de las visualizaciones de Power BI


1. Ejecute la aplicación de detección de anomalías para enviar datos al centro de eventos mientras se configura
y ejecuta la visualización de Power BI. Es posible que deba ejecutarla varias veces, puesto que solo se
generan 1000 transacciones con cada ejecución.
2. Inicie sesión en su cuenta de Power BI.
3. Vaya a Mi área de trabajo .
4. Ahora haga clic en Conjuntos de datos .
Verá el conjunto de datos que especificó en el momento de crear la salida para el trabajo de Stream Analytics
(contosoehdataset ). La primera vez, el conjunto de datos puede tardar en mostrarse entre 5 y 10 minutos.
5. Haga clic en Paneles , en Crear y seleccione Panel .
6. Especifique el nombre del panel y, luego, haga clic en Crear . Use Credit Card Anomalies .

7. En la página Panel, haga clic en Agregar icono , seleccione Datos de streaming personalizados en la
sección DATOS EN TIEMPO REAL y, después, haga clic en Siguiente .
8. Seleccione el conjunto de datos (contosoehdataset ) y haga clic en Siguiente .
9. Seleccione Tarjeta como tipo de visualización. En Campos , haga clic en Agregar valor y, luego, seleccione
fraudulentuses .

Haga clic en Next .


10. Establezca el título en Fraudulent uses (Usos fraudulentos) y el subtítulo en Sum in last few minutes
(Suma en los últimos minutos). Haga clic en Aplicar . El icono se guarda en el panel.
IMPORTANT
Al ejecutar la aplicación de ejemplo y transmitir datos al centro de eventos, el número en este icono cambia
rápidamente (cada segundo). El motivo es que la consulta de Stream Analytics actualiza realmente el valor cada
segundo . Actualice la consulta a una ventana de saltos de tamaño constante de 3 minutos para ver la suma en los
últimos minutos.

11. Agregue otra visualización. Vuelva a repetir los primeros pasos:


Haga clic en Agregar icono .
Seleccione Datos de streaming personalizados .
Haga clic en Next .
Seleccione el conjunto de datos y, a continuación, haga clic en Siguiente .
12. En Tipo de visualización , seleccione Gráfico de líneas .
13. En Eje , haga clic en Agregar valor y seleccione windowend .
14. En Valores , haga clic en Agregar valor y seleccione fraudulentuses .
15. En Time window to display (Período de tiempo para mostrar), seleccione los últimos 10 minutos. Haga
clic en Next .
16. Especifique Show fraudulent uses over time (Mostrar usos fraudulentos con el tiempo) como título y
deje el subtítulo del icono en blanco; a continuación, haga clic en Aplicar . Se le redirigirá a su panel.
17. Ejecute de nuevo la aplicación de detección de anomalías para enviar algunos datos al centro de eventos.
Verá que el icono Fraudulent uses (Usos fraudulentos) cambia a medida que se analizan los datos y que el
gráfico de líneas muestra datos.

Limpieza de recursos
Si quiere quitar todos los recursos que ha creado, quite los datos de visualización de Power BI y, luego, elimine el
grupo de recursos. Al eliminar un grupo de recursos se eliminan todos los recursos contenidos en él. En este caso,
se quita el centro de eventos, el espacio de nombres de Event Hubs, el trabajo de Stream Analytics y el grupo de
recursos.
Limpieza de recursos en la visualización de Power BI
Inicie sesión en su cuenta de Power BI. Vaya a Mi área de trabajo . En la línea con el nombre del panel, haga clic en
el icono de la papelera. A continuación, vaya a Conjuntos de datos y haga clic en el icono de papelera para
eliminar el conjunto de datos (contosoehdataset ).
Limpieza de recursos mediante la CLI de Azure
Para quitar el grupo de recursos, use el comando az group delete.

az group delete --name $resourceGroup

Limpieza de recursos mediante PowerShell


Para quitar el grupo de recursos, use el comando Remove-AzResourceGroup.

Remove-AzResourceGroup -Name $resourceGroup


Pasos siguientes
En este tutorial, ha aprendido a:
Creación de un espacio de nombres de Event Hubs
Creación de un centro de eventos
Ejecutar la aplicación que simula eventos y los envía al centro de eventos
Configurar un trabajo de Stream Analytics para procesar los eventos enviados al centro
Configurar una visualización de Power BI para mostrar los resultados
Avance al siguiente artículo para más información sobre Azure Event Hubs.
Introducción al envío de mensajes a Azure Event Hubs en .NET Standard
Tutorial: Migración de datos de Event Hubs
capturados a SQL Data Warehouse mediante Event
Grid y Azure Functions
18/08/2020 • 10 minutes to read • Edit Online

Event Hubs Capture es la forma más fácil de enviar automáticamente datos en streaming de Event Hubs a Azure
Blob Storage o a Azure Data Lake Store. Posteriormente dichos datos se pueden procesar y enviar a otros destinos
de almacenamiento, como SQL Data Warehouse o Cosmos DB. En este tutorial aprenderá a capturar datos de una
instancia de Event Hubs y migrarlos a SQL Data Warehouse mediante el uso de una función de Azure
desencadenada por Event Grid.

En primer lugar, cree una instancia de Event Hubs con la característica Capture habilitada y establezca una
instancia de Azure Blob Storage como destino. Los datos que genera WindTurbineGenerator se transmiten en
secuencias a la instancia de Event Hubs y se capturan automáticamente en Azure Storage como archivos Avro.
Después, cree una suscripción a Azure Event Grid con el espacio de nombres de Event Hubs como origen y el
punto de conexión de Azure Functions como destino.
Cada vez que un archivo Avro nuevo se envía al blob de Azure Storage mediante la característica Capture de
Event Hubs, Event Grid se lo notifica a Azure Functions con el identificador URI del blob. Luego, Azure Functions
migra los datos del blob a una instancia de SQL Data Warehouse.
En este tutorial realizará lo siguiente:
Implementar la infraestructura
Publicar código en una aplicación de Functions
Crear una suscripción a Event Grid desde la aplicación de Functions
Hacer streaming de los datos de ejemplo de en un a instancia de Event Hubs.
Comprobar los datos capturados en SQL Data Warehouse

Requisitos previos
NOTE
Este artículo se ha actualizado para usar el nuevo módulo Az de Azure PowerShell. Aún puede usar el módulo de AzureRM
que continuará recibiendo correcciones de errores hasta diciembre de 2020 como mínimo. Para más información acerca del
nuevo módulo Az y la compatibilidad con AzureRM, consulte Introducing the new Azure PowerShell Az module (Presentación
del nuevo módulo Az de Azure PowerShell). Para obtener instrucciones sobre la instalación del módulo Az, consulte
Instalación de Azure PowerShell.
Visual Studio 2019. Asegúrese de que instala las siguientes con cargas de trabajo: desarrollo de escritorio
de .NET, desarrollo de Azure, desarrollo web y de ASP.NET, desarrollo de Node.js y desarrollo de Python
Descarga del Ejemplo de Git La solución de ejemplo contiene los siguientes componentes:
WindTurbineDataGenerator : un publicador simple que envía datos de turbina eólica de ejemplo a un
centro de eventos con la función Capture habilitada
FunctionDWDumper : una función de Azure que recibe una notificación de Event Grid cuando se captura
un archivo Avro en el blob de Azure Storage. Recibe la ruta de acceso, del identificador URI del blob, lee
su contenido y envía estos datos a SQL Data Warehouse.
En este ejemplo se usa el paquete Azure.Messaging.EventHubs más reciente. Puede encontrar el ejemplo
anterior que usa el paquete Microsoft.Azure.EventHubs aquí.
Implementar la infraestructura
Use Azure PowerShell o la CLI de Azure para implementar la infraestructura necesaria para este tutorial con este
plantilla de Azure Resource Manager. Esta plantilla crea los siguientes recursos:
Event Hubs con la característica Capture habilitada
Cuenta de almacenamiento de los datos de eventos capturados
Un plan de Azure App Service para hospedar la aplicación Functions
Aplicación de función para procesar archivos de eventos capturados
Un servidor SQL lógico para hospedar Data Warehouse
Un SQL Data Warehouse para almacenar los datos migrados
Las secciones siguientes proporcionan comandos de CLI de Azure y Azure PowerShell para implementar la
infraestructura necesaria para el tutorial. Actualice los nombres de los siguientes objetos antes de ejecutar los
comandos:
Grupo de recursos de Azure
Región del grupo de recursos
Espacio de nombres de Event Hubs
Centro de eventos
Servidor SQL lógico
Usuario de SQL (y contraseña)
Azure SQL Database
Azure Storage
Aplicación Azure Functions
Estos scripts tardan algún tiempo en crear todos los artefactos de Azure. Espere hasta que el script se complete
antes de continuar. Si la implementación no se realiza por alguna razón, elimine el grupo de recursos, corrija el
problema notificado y vuelva a ejecutar el comando.
Azure CLI
Para implementar la plantilla mediante la CLI de Azure, use los siguientes comandos:

az group create -l westus -n rgDataMigrationSample

az group deployment create `


--resource-group rgDataMigrationSample `
--template-uri https://raw.githubusercontent.com/Azure/azure-docs-json-samples/master/event-
grid/EventHubsDataMigration.json `
--parameters eventHubNamespaceName=<event-hub-namespace> eventHubName=hubdatamigration sqlServerName=<sql-
server-name> sqlServerUserName=<user-name> sqlServerPassword=<password> sqlServerDatabaseName=<database-name>
storageName=<unique-storage-name> functionAppName=<app-name>
Azure PowerShell
Para implementar la plantilla mediante PowerShell, use los siguientes comandos:

New-AzResourceGroup -Name rgDataMigration -Location westcentralus

New-AzResourceGroupDeployment -ResourceGroupName rgDataMigration -TemplateUri


https://raw.githubusercontent.com/Azure/azure-docs-json-samples/master/event-grid/EventHubsDataMigration.json
-eventHubNamespaceName <event-hub-namespace> -eventHubName hubdatamigration -sqlServerName <sql-server-name> -
sqlServerUserName <user-name> -sqlServerDatabaseName <database-name> -storageName <unique-storage-name> -
functionAppName <app-name>

Crear una tabla en SQL Data Warehouse


Para crear una tabla en SQL Data Warehouse ejecute el script CreateDataWarehouseTable.sql mediante Visual
Studio, SQL Server Management Studio o el Editor de consultas del portal.

CREATE TABLE [dbo].[Fact_WindTurbineMetrics] (


[DeviceId] nvarchar(50) COLLATE SQL_Latin1_General_CP1_CI_AS NULL,
[MeasureTime] datetime NULL,
[GeneratedPower] float NULL,
[WindSpeed] float NULL,
[TurbineSpeed] float NULL
)
WITH (CLUSTERED COLUMNSTORE INDEX, DISTRIBUTION = ROUND_ROBIN);

Publicación de código en la aplicación de Functions


1. Abra la solución EventHubsCaptureEventGridDemo.sln en Visual Studio 2019.
2. En el Explorador de soluciones, haga clic con el botón derecho en FunctionEGDWDumper y seleccione
Publicar .

3. Seleccione Azure Function App y Seleccionar existente . Seleccione Publicar .


4. Seleccione la aplicación de función que implementó con la plantilla. Seleccione Aceptar .

5. Cuando Visual Studio haya configurado el perfil, seleccione Publicar .


Después de publicar la función, estará listo para suscribirse al evento de captura desde Event Hubs.

Crear una suscripción a Event Grid desde la aplicación de Functions


1. Vaya a Azure Portal. Seleccione el grupo de recursos y la aplicación de función.

2. Seleccione la función.

3. Seleccione Incorporación de una suscripción de Event Grid .


4. Escriba un nombre para la suscripción de Event Grid. Use Espacios de nombres de Event Hubs como el
tipo de evento. Proporcione los valores para seleccionar la instancia del espacio de nombres de Event Hubs.
Deje el punto de conexión de suscriptor con el valor proporcionado. Seleccione Crear .

Generación de datos de ejemplo


Ya ha configurado un centro de eventos, SQL Data Warehouse, Azure Function App y una suscripción a Event Grid.
Puede ejecutar WindTurbineDataGenerator.exe para generar flujos de datos para la instancia de Event Hubs
después de actualizar la cadena de conexión y el nombre del centro de eventos en el código fuente.
1. En el portal, seleccione el espacio de nombres del centro de eventos. Seleccione Cadenas de conexión .

2. Seleccione RootManageSharedAccessKey .

3. Copie Cadena de conexión: clave principal .

4. Vuelva al proyecto de Visual Studio. En el proyecto WindTurbineDataGenerator, abra program.cs.


5. Actualice los valores de EventHubConnectionString y EventHubName con la cadena de conexión y el
nombre del centro de eventos.

private const string EventHubConnectionString =


"Endpoint=sb://demomigrationnamespace.servicebus.windows.net/...";
private const string EventHubName = "hubdatamigration";

6. Compile la solución y ejecute la aplicación WindTurbineGenerator.exe.


Comprobación de los datos capturados en Data Warehouse
Transcurridos unos minutos, realice una consulta en la tabla de SQL Data Warehouse. Observe que los datos que
ha generado WindTurbineDataGenerator se han transmitido en secuencias al centro de eventos, se han capturado
en un contenedor de Azure Storage y, después, se han migrado a la tabla de SQL Data Warehouse mediante Azure
Functions.

Pasos siguientes
Puede usar las eficaces herramientas de visualización de datos con Data Warehouse para conseguir detalles
accionables.
En este artículo se muestra cómo usar Power BI con SQL Data Warehouse
Tutorial: Procesamiento de eventos de Apache Kafka
para Event Hubs mediante Stream Analytics
18/08/2020 • 10 minutes to read • Edit Online

En este artículo se muestra cómo transmitir en secuencias datos a Event Hubs y cómo procesarlos con Azure
Stream Analytics. Estos pasos son los siguientes:
1. Cree un espacio de nombres de Event Hubs.
2. Cree un cliente de Kafka que envíe mensajes al centro de eventos.
3. Cree un trabajo de Stream Analytics que copie datos del centro de eventos en Azure Blob Storage.
No es necesario cambiar a los clientes de protocolo ni ejecutar sus propios clústeres al usar el punto de conexión
de Kafka expuesto por un centro de eventos. Azure Event Hubs admite Apache Kafka versión 1.0. y posteriores.

Prerrequisitos
Para completar esta guía de inicio rápido, asegúrese de cumplir los siguientes requisitos previos:
Suscripción a Azure. Si no tiene una, cree una cuenta gratuita antes de empezar.
Kit de desarrollo de Java (JDK) 1.7+.
Descargue e instale un archivo binario de Maven.
Git
Una cuenta de Azure Storage . Si no tiene, cree una antes de continuar. El trabajo de Stream Analytics en este
tutorial almacena los datos de salida en Azure Blob Storage.

Creación de un espacio de nombres de Event Hubs


Al crear un espacio de nombres en el nivel estándar de Event Hubs, se habilita automáticamente el punto de
conexión de Kafka para el espacio de nombres. Puede transmitir eventos desde las aplicaciones que usan el
protocolo de Kafka a instancias del nivel estándar de Event Hubs. Siga las instrucciones paso a paso de Creación de
un centro de eventos mediante Azure Portal para crear un espacio de nombres de Event Hubs de nivel estándar .

NOTE
Event Hubs para Kafka solo está disponible en los niveles estándar y dedicado . El nivel básico no es compatible con Kafka
en Event Hubs.

Envío de mensajes con Kafka en Event Hubs


1. Clone el repositorio de Azure Event Hubs para Kafka en la máquina.
2. Vaya a la carpeta azure-event-hubs-for-kafka/quickstart/java/producer .
3. Actualice los detalles de configuración para el productor en src/main/resources/producer.config . Especifique
el nombre y cadena de conexión para el espacio de nombres del centro de eventos .
bootstrap.servers={EVENT HUB NAMESPACE}.servicebus.windows.net:9093
security.protocol=SASL_SSL
sasl.mechanism=PLAIN
sasl.jaas.config=org.apache.kafka.common.security.plain.PlainLoginModule required
username="$ConnectionString" password="{CONNECTION STRING for EVENT HUB NAMESPACE}";

4. Vaya a azure-event-hubs-for-kafka/quickstart/java/producer/src/main/java/ y abra el archivo


TestDataRepor ter.java en el editor que prefiera.
5. Comente las siguientes líneas de código:

//final ProducerRecord<Long, String> record = new ProducerRecord<Long, String>(TOPIC, time,


"Test Data " + i);

6. Agregue la siguiente línea de código en lugar del código con comentarios:

final ProducerRecord<Long, String> record = new ProducerRecord<Long, String>(TOPIC, time, "{


\"eventData\": \"Test Data " + i + "\" }");

Este código envía los datos del evento en formato JSON . Al configurar la entrada para un trabajo de Stream
Analytics, especifique JSON como formato de los datos de entrada.
7. Ejecute el productor y transmítalo a Event Hubs. En un equipo Windows, al usar un símbolo del
sistema Node.js , cambie a la carpeta azure-event-hubs-for-kafka/quickstart/java/producer antes de
ejecutar estos comandos.

mvn clean package


mvn exec:java -Dexec.mainClass="TestProducer"

Compruebe que ese centro de eventos recibe los datos.


1. Seleccione Event Hubs en ENTIDADES . Confirme que ve un centro de eventos denominado prueba .

2. Confirme que ve los mensajes que entran en el centro de eventos.


Procesamiento de los datos de eventos mediante un trabajo de Stream
Analytics
En esta sección, vamos a crear un trabajo de Azure Stream Analytics. El cliente de Kafka envía eventos al centro de
eventos. Cree un trabajo de Stream Analytics que tome datos de eventos como entrada y los envíe a Azure Blob
Storage. Si no tiene una cuenta de Azure Storage , debe crear una.
La consulta en el trabajo de Stream Analytics se pasa a través de los datos sin realizar ningún análisis. Puede crear
una consulta que transforme los datos de entrada para generar datos de salida en un formato diferente o con
información obtenida.
Creación de un trabajo de Stream Analytics
1. Seleccione + Crear un recurso en Azure Portal.
2. Seleccione Analytics en el menú Azure Marketplace y, luego, seleccione Stream Analytics job (Trabajo de
Stream Analytics).
3. En la página Nuevo Stream Analytics , haga lo siguiente:
a. Escriba un nombre para el trabajo.
b. Seleccione su suscripción .
c. Seleccione Crear nuevo para el grupo de recursos y escriba el nombre. También puede usar un
grupo de recursos existente .
d. Seleccione una ubicación para el trabajo.
e. Seleccione Crear para crear el trabajo.
Configuración de la entrada del trabajo
1. En el mensaje de notificación, seleccione Ir al recurso para ver la página Trabajo de Stream Analytics .
2. Seleccione Entradas en la sección TOPOLOGÍA DE TRABAJO en el menú izquierdo.
3. Seleccione Add stream input (Agregar entrada de flujo) y, luego, seleccione Event Hub (Centro de
eventos).

4. En la página de configuración de la entrada del centro de eventos , haga lo siguiente:


a. Especifique un alias para la entrada.
b. Seleccione la suscripción de Azure .
c. Seleccione el espacio de nombres del centro de eventos que ha creado anteriormente.
d. Seleccione probar para el centro de eventos .
e. Seleccione Guardar .

Configuración de la salida del trabajo


1. Seleccione Salidas en la sección TOPOLOGÍA DE TRABAJO en el menú.
2. Seleccione + Agregar en la barra de herramientas y seleccione Blob Storage
3. Haga lo siguiente en la página de configuración de salida de Blob Storage:
a. Especifique un alias para la salida.
b. Selección la suscripción de Azure.
c. Seleccione su cuenta de Azure Storage .
d. Escriba un nombre para el contenedor que almacena los datos de salida de la consulta de Stream
Analytics.
e. Seleccione Guardar .

Definición de una consulta


Ya tiene un trabajo de Stream Analytics configurado para leer un flujo de datos de entrada. El siguiente paso
consiste en crear una transformación que analice los datos en tiempo real. Definirá la consulta de transformación
mediante el lenguaje de consulta de Stream Analytics. En este tutorial, definirá una consulta que se pasa a través de
los datos sin realizar ninguna transformación.
1. Seleccione Consulta .
2. En la ventana de consulta, reemplace [YourOutputAlias] por el alias de salida que creó anteriormente.
3. Reemplace [YourInputAlias] por el alias de entrada que creó anteriormente.
4. Seleccione Guardar en la barra de herramientas.

Ejecución del trabajo de Stream Analytics


1. Seleccione Información general en el menú de la izquierda.
2. Seleccione Inicio .
3. En la página Iniciar trabajo , seleccione Iniciar .

4. Espere hasta que el estado del trabajo cambie de Iniciando a En ejecución .

Probar el escenario
1. Vuelva a ejecutar el productor de Kafka para enviar eventos al centro de eventos.

mvn exec:java -Dexec.mainClass="TestProducer"


2. Confirme que ve que los datos de salida se generan en Azure Blob Storage . Consulte un archivo JSON
en el contenedor con 100 filas con un aspecto similar a las siguientes filas de ejemplo:

{"eventData":"Test Data 0","EventProcessedUtcTime":"2018-08-


30T03:27:23.1592910Z","PartitionId":0,"EventEnqueuedUtcTime":"2018-08-30T03:27:22.9220000Z"}
{"eventData":"Test Data 1","EventProcessedUtcTime":"2018-08-
30T03:27:23.3936511Z","PartitionId":0,"EventEnqueuedUtcTime":"2018-08-30T03:27:22.9220000Z"}
{"eventData":"Test Data 2","EventProcessedUtcTime":"2018-08-
30T03:27:23.3936511Z","PartitionId":0,"EventEnqueuedUtcTime":"2018-08-30T03:27:22.9220000Z"}

El trabajo de Azure Stream Analytics recibió los datos de entrada del centro de eventos y los almacenó en
Azure Blob Storage en este escenario.

Pasos siguientes
En este artículo se muestra cómo hacer streaming a instancias de Event Hubs sin cambiar los clientes del protocolo
o ejecutar sus propios clústeres. Para más información sobre Event Hubs para Apache Kafka, consulte Guía del
desarrollador de Apache Kafka para Azure Event Hubs.
Repositorios GIT con ejemplos para Azure Event
Hubs
18/08/2020 • 2 minutes to read • Edit Online

Puede encontrar ejemplos de Event Hubs en GitHub. Estos ejemplos muestran características clave de Azure Event
Hubs. En este artículo se categorizan y describen los ejemplos disponibles, con vínculos a cada uno.

Ejemplos de .NET
VERSIÓ N UB IC A C IÓ N DE LO S E JEM P LO S

Azure.Messaging.EventHubs, versión 5 (más reciente) Ejemplos de Event Hubs en GitHub


Ejemplos de procesador de Event Hubs en GitHub

Microsoft.Azure.EventHubs, versión 4 (heredada) Ubicación de GitHub

Ejemplos de Java
VERSIÓ N UB IC A C IÓ N DE LO S E JEM P LO S

azure-messaging-eventhubs, versión 5 (más reciente) Ubicación de GitHub

azure-eventhubs, versión 3 (heredada) Ubicación de GitHub

Ejemplos de Python
VERSIÓ N UB IC A C IÓ N DE LO S E JEM P LO S

azure-eventhub, versión 5 (más reciente) Ubicación de GitHub

azure-eventhub, versión 1 (heredada) Ubicación de GitHub

Ejemplos de JavaScript
VERSIÓ N UB IC A C IÓ N DE LO S E JEM P LO S

azure/event-hubs, versión 5 (más reciente) Ubicación de GitHub

azure/event-hubs, versión 2 (heredada) Ubicación de GitHub

Ejemplos de Go
Puede encontrar ejemplos de Go para Azure Event Hubs en el repositorio de GitHub azure-event-hubs-go.

Ejemplos de la CLI de Azure


Puede encontrar ejemplos de la CLI de Azure para Azure Event Hubs en el repositorio de GitHub azure-event-hubs.

Ejemplos de Azure PowerShell


Puede encontrar ejemplos de Azure PowerShell para Azure Event Hubs en el repositorio de GitHub azure-event-
hubs.

Ejemplos de Apache Kafka


Puede encontrar ejemplos de Event Hubs para la característica de Apache Kafka en el repositorio azure-event-
hubs-for-kafka de GitHub.

Pasos siguientes
Si desea conocer más información acerca de Event Hubs, consulte los siguientes artículos:
Información general de Event Hubs
Características de Event Hubs
Preguntas más frecuentes sobre Event Hubs
Definiciones integradas de Azure Policy para Azure
Event Hubs
18/08/2020 • 3 minutes to read • Edit Online

Esta página es un índice de las definiciones de directivas integradas de Azure Policy en Azure Event Hubs. Puede
encontrar elementos integrados adicionales de Azure Policy para otros servicios en Definiciones de elementos
integrados de Azure Policy.
El nombre de cada definición de directiva integrada se vincula a la definición de directiva en Azure Portal. Use el
vínculo de la columna Versión para ver el origen en el repositorio de GitHub de Azure Policy.

Azure Event Hubs


N O M B RE VERSIÓ N
( A ZURE PO RTA L) DESC RIP C IÓ N EF EC TO S ( GIT HUB)

Todas las reglas de Los clientes del Centro de Audit, Deny, Disabled 1.0.1
autorización, excepto eventos no deben usar una
RootManageSharedAccessKe directiva de acceso de nivel
y, se deben eliminar del de espacio de nombres que
espacio de nombres del proporciona acceso a todas
centro de eventos las colas y temas de un
espacio de nombres. Para
alinearse con el modelo de
seguridad con privilegios
mínimos, debe crear
directivas de acceso en las
entidades para que las colas
y los temas proporcionen
acceso solo a la entidad
específica.

Las reglas de autorización de Permite auditar la existencia AuditIfNotExists, Disabled 1.0.0


la instancia del centro de de reglas de autorización en
eventos deben definirse. entidades de Event Hub para
conceder acceso con
privilegios mínimos.

Implementar la Implementa la configuración DeployIfNotExists, Disabled 2.0.0


configuración de diagnóstico de diagnóstico para que
para Event Hubs en un Event Hubs se transmita a
centro de eventos un centro de eventos
regional cuando se cree o
actualice cualquier instancia
de Event Hubs a la que falte
esta configuración de
diagnóstico.
N O M B RE VERSIÓ N
DESC RIP C IÓ N EF EC TO S

Implementar la Implementa la configuración DeployIfNotExists, Disabled 1.0.0


configuración de diagnóstico de diagnóstico para que
para Event Hubs en un área Event Hubs se transmita a
de trabajo de Log Analytics un área de trabajo de Log
Analytics regional cuando se
cree o actualice cualquier
instancia de Event Hubs a la
que falte esta configuración
de diagnóstico.

Los registros de diagnóstico Permite auditar la AuditIfNotExists, Disabled 3.0.0


del centro de eventos deben habilitación de registros de
estar habilitados diagnóstico. Esto le permite
volver a crear seguimientos
de actividad con fines de
investigación en caso de
incidente de seguridad o
riesgo para la red.

El centro de eventos debe Esta directiva audita todo AuditIfNotExists, Disabled 1.0.0
usar un punto de conexión centro de eventos no
del servicio de red virtual configurado para usar un
punto de conexión del
servicio de red virtual.

Pasos siguientes
Los elementos integrados se pueden encontrar en el repositorio de GitHub de Azure Policy.
Revise la estructura de definición de Azure Policy.
Vea la Descripción de los efectos de directivas.
Características y terminología de Azure Event
Hubs
18/08/2020 • 25 minutes to read • Edit Online

Azure Event Hubs es un servicio escalable de procesamiento de eventos que recopila y procesa grandes
volúmenes de eventos y datos, con una baja latencia y una alta fiabilidad. Consulte ¿Qué es Event Hubs?
para obtener una introducción detallada.
Este artículo se basa en el contenido del artículo de información general e incluye detalles técnicos y de
implementación de las características y los componentes de Event Hubs.

Espacio de nombres
Un espacio de nombres de Event Hubs proporciona un contenedor con un único ámbito, al que hace
referencia su nombre de dominio completo, en el que puede crear uno o varios centros de eventos o temas
de Kafka.

Event Hubs para Apache Kafka


Esta característica proporciona un punto de conexión que permite a los clientes comunicarse con Event
Hubs mediante el protocolo de Kafka. Esta integración proporciona a los clientes un punto de conexión de
Kafka. Esto permite a los clientes configurar sus aplicaciones existentes de Kafka para comunicarse con
Event Hubs, lo que proporciona una alternativa a ejecutar sus propios clústeres de Kafka. Event Hubs para
Apache Kafka es compatible con el protocolo de Kafka 1.0 y versiones posterior.
Con esta integración, no es necesario ejecutar clústeres de Kafka ni administrarlos con Zookeeper. Esto
también permite trabajar con algunas de las características más exigentes de Event Hubs, como captura,
inflado automático y recuperación ante desastres geográfica.
Esta integración también permite a las aplicaciones, como Mirror Maker, o a marcos como Kafka Connect,
funcionar sin clúster con tan solo unos cambios de configuración.

Publicadores de eventos
Cualquier entidad que envíe datos a un centro de eventos es un productor de eventos o un publicador de
eventos. Los publicadores de eventos pueden publicar eventos mediante HTTPS o AMQP 1.0 o Kafka 1.0 y
versiones posteriores. Los publicadores de eventos usan un token de firma de acceso compartido (SAS)
para identificarse en un centro de eventos y pueden tener una identidad única o usar un token de SAS
común.
Publicación de un evento
Puede publicar un evento a través de AMQP 1.0, Kafka 1.0 y versiones posteriores o HTTPS. Event Hubs
ofrece bibliotecas cliente y clases para publicar eventos en un centro de eventos de clientes .NET. Para otras
plataformas y tiempos de ejecución, puede usar cualquier cliente de AMQP 1.0, como Apache Qpid. Puede
publicar eventos individualmente o por lotes. Una sola publicación (instancia de datos de eventos) tiene un
límite de 1 MB, independientemente de si es un evento único o un lote. La publicación de eventos que
superen este umbral producirá un error. Es una práctica recomendada para los publicadores desconocer las
particiones en el centro de eventos y solo especificar una clave de partición (que se presenta en la sección
siguiente), o su identidad mediante su token de SAS.
La opción de usar AMQP o HTTPS es específica para el escenario de uso. AMQP requiere el establecimiento
de un socket bidireccional persistente, además de la seguridad de nivel de transporte (TLS) o SSL/TLS.
AMQP tiene un mayor costo de red al inicializar la sesión, sin embargo, HTTPS requiere una sobrecarga de
TLS adicional para cada solicitud. AMQP tiene un mayor rendimiento para los publicadores frecuentes.

Event Hubs garantiza que todos los eventos que comparten un valor de clave de partición se entregan por
orden y en la misma partición. Si se usan claves de partición con directivas de publicador, la identidad del
publicador y el valor de la clave de partición deben coincidir. De lo contrario, se produce un error.
Directiva del publicador
Los Event Hubs permiten un control granular sobre los publicadores de eventos a través de las directivas de
publicador. Las directivas de publicador son características de tiempo de ejecución diseñadas para facilitar
grandes números de publicadores de eventos independientes. Con las directivas de publicador, cada
publicador usa su propio identificador único al publicar los eventos en un centro de eventos mediante el
mecanismo siguiente:

//<my namespace>.servicebus.windows.net/<event hub name>/publishers/<my publisher name>

No tiene que crear nombres de publicador con antelación, pero deben coincidir con el token de SAS que se
usa al publicar un evento, con el fin de garantizar las identidades de publicador independientes. Al usar
directivas de publicador, el valor Par titionKey se establece como el nombre del publicador. Para que
funcione correctamente, estos valores deben coincidir.

Capturar
Event Hubs Capture permite capturar automáticamente los datos de transmisión de Event Hubs y
guardarlos en una cuenta de Blob Storage o en una cuenta de servicio de Azure Data Lake. Puede habilitar
Capture desde Azure Portal y especificar una ventana de tiempo y de tamaño mínimos para realizar la
captura. Event Hubs Capture permite especificar una cuenta y un contenedor propios de Azure Blob Storage,
o una cuenta de servicio de Azure Data Lake, uno de los cuales se usa para almacenar los datos capturados.
Los datos capturados se escriben en el formato de Apache Avro.

Particiones
Event Hubs proporciona streaming de mensajes mediante un patrón de consumidor con particiones en el
que cada consumidor lee solo un subconjunto específico o una partición del flujo de mensajes. Este patrón
permite un escalado horizontal para el procesamiento de eventos y ofrece otras características centradas en
los flujos que no están disponibles en las colas y los temas.
Una partición es una secuencia ordenada de eventos que se mantiene en un centro de eventos. A medida
que llegan eventos más recientes, se agregan al final de esta secuencia. Una partición puede considerarse
como un "registro de confirmación".
Event Hubs retiene datos durante un tiempo de retención configurado que se aplica a todas las particiones
del centro de eventos. Los eventos expiran en función del tiempo; no se pueden eliminar explícitamente.
Dado que las particiones son independientes y contienen sus propias secuencias de datos, a menudo crecen
a velocidades diferentes.

El número de particiones se especifica en el momento de la creación y debe estar comprendido entre 2 y 32.
El número de particiones no es modificable, por lo que debería tener en cuenta la escala a largo plazo a la
hora de configurar este número. Las particiones son un mecanismo de organización de datos relacionado
con el paralelismo de bajada necesario para consumir las aplicaciones. El número de particiones de un
centro de eventos está directamente relacionado con el número de lectores simultáneos que espera tener.
Puede aumentar el número de particiones más allá de 32 poniéndose en contacto con el equipo de Event
Hubs.
Es posible que quiera establecer el valor lo más alto posible, que es 32, en el momento de la creación.
Recuerde que, si hay más de una partición, los eventos se enviarán a varias particiones sin conservar el
orden, a menos que configure los remitentes para que solo realicen el envío a una única partición de las 32,
lo que hará que las 31 restantes sean redundantes. En el primer caso, tendrá que leer eventos en las 32
particiones. En el último caso, no hay ningún costo adicional obvio aparte de la configuración adicional que
debe realizar en el host del procesador de eventos.
Aunque las particiones son identificables y se pueden realizar envíos a estas directamente, no se
recomienda hacerlo. En su lugar, puede usar las construcciones de nivel superior que se presentan en la
sección Publicador de eventos.
Las particiones se rellenan con una secuencia de datos de eventos que contienen el cuerpo del evento, un
contenedor de propiedades definidas por el usuario y diversos metadatos, como su desplazamiento en la
partición y su número en la secuencia de streaming.
Se recomienda equilibrar las unidades de procesamiento y las particiones 1:1 para lograr una escalabilidad
óptima. Una sola partición tiene una entrada y una salida garantizadas de hasta una unidad de
procesamiento. Aunque puede lograr un mayor procesamiento en una partición, no se garantiza el
rendimiento. Por este motivo, se recomienda encarecidamente que el número de particiones en un centro
de eventos sea mayor o igual que el número de unidades de procesamiento.
Dado el procesamiento total que planea necesitar, conoce el número de unidades de procesamiento que
precisa y el número mínimo de particiones, pero, ¿cuántas particiones debería tener? Elija el número de
particiones en función del paralelismo de bajada que quiere conseguir, así como de las futuras necesidades
de procesamiento. No hay ningún cargo por el número de particiones que tiene dentro de un centro de
eventos.
Para más información acerca de particiones y el equilibrio entre disponibilidad y confiabilidad, consulte los
artículos Guía de programación de Event Hubs y Disponibilidad y coherencia en Event Hubs.

Tokens de SAS
Event Hubs usa firmas de acceso compartido que están disponibles en el nivel del espacio de nombres y del
centro de eventos. Un token de SAS se genera a partir de una clave de SAS y es un hash SHA de una
dirección URL, codificado en un formato concreto. Con el nombre de la clave (directiva) y el token, Event
Hubs puede volver a generar el hash y así autenticar al remitente. Normalmente, los tokens de SAS para
publicadores de eventos se crean solo con privilegios de envío en un centro de eventos concreto. Este
mecanismo de dirección URL del token de SAS es la base para la identificación del publicador introducida en
la directiva del publicador. Para obtener más información sobre el funcionamiento con SAS, consulte
Autenticación con firma de acceso compartido en Service Bus.

Consumidores de eventos
Cualquier entidad que lea datos de eventos de un centro de eventos es un consumidor de eventos. Todos los
consumidores de Event Hubs se conectan a través de la sesión de AMQP 1.0, y los eventos se entregan a
través de la sesión a medida que están disponibles. El cliente no necesita realizar un sondeo de
disponibilidad de los datos.
Grupos de consumidores
El mecanismo de publicación y suscripción de Event Hubs se habilita a través de los grupos de
consumidores. Un grupo de consumidores es una vista (estado, posición o desplazamiento) de un centro de
eventos completo. Los grupos de consumidores habilitan varias aplicaciones consumidoras para que cada
una tenga una vista separada del flujo de eventos y para que lean el flujo de forma independiente a su
propio ritmo y con sus propios desplazamientos.
En una arquitectura de procesamiento de flujos, cada aplicación de bajada se corresponde con un grupo de
consumidores. Si quiere escribir datos de eventos para el almacenamiento a largo plazo, esa aplicación de
escritura de almacenamiento es un grupo de consumidores. Otro grupo de consumidores independiente
puede realizar el procesamiento de eventos complejos. Solo puede obtener acceso a las particiones a través
de un grupo de consumidores. Siempre hay un grupo de consumidores predeterminado en un centro de
eventos y puede crear hasta 20 grupos de consumidores para un centro de eventos de nivel Estándar.
Como máximo, puede haber cinco lectores simultáneos en una partición por grupo de consumidores; pero
se recomienda que solo haya un receptor activo en una par tición por grupo de consumidores .
Cada lector recibe todos los mensajes dentro de una sola partición. Si tiene varios lectores en la misma
partición, procesará los mensajes duplicados. Debe controlar esto en su código, pues no puede ser trivial.
Sin embargo, es un enfoque válido en algunos escenarios.
Algunos clientes que ofrecen los SDK de Azure son agentes de consumidor inteligentes que administran
automáticamente los detalles para asegurarse de que cada partición tenga un lector único y que se estén
leyendo todas las particiones para un centro de eventos. Esto permite que el código se centre en el
procesamiento de los eventos que se leen desde el centro de eventos de modo que pueda omitir muchos
detalles de las particiones. Para más información, consulte Conexión a una partición.
A continuación se muestran ejemplos de la convención de URI del grupo de consumidores:

//<my namespace>.servicebus.windows.net/<event hub name>/<Consumer Group #1>


//<my namespace>.servicebus.windows.net/<event hub name>/<Consumer Group #2>

La siguiente ilustración muestra la arquitectura de procesamiento del flujo de Event Hubs:

Desplazamientos de los flujos


Un desplazamiento es la posición de un evento dentro de una partición. Puede pensar en un
desplazamiento como un cursor de lado cliente. El desplazamiento es una numeración de byte del evento.
Este desplazamiento permite que un consumidor de eventos (lector) especifique un punto en el flujo de
eventos desde el que quiere empezar a leer los eventos. Puede especificar el desplazamiento como una
marca de tiempo o como un valor de desplazamiento. Los consumidores son responsables de almacenar
sus propios valores de desplazamiento fuera del servicio de Event Hubs. Dentro de una partición, cada
evento incluye un desplazamiento.

Puntos de control
Puntos de control es un proceso en el que los lectores marcan o confirman su posición dentro de la
secuencia de eventos de una partición. La creación de puntos de comprobación es responsabilidad del
consumidor y se realiza por partición dentro de un grupo de consumidores. Esta responsaibilidad significa
que por cada grupo de consumidores, cada lector de la partición debe realizar un seguimiento de su
posición actual en el flujo del evento y puede informar al servicio cuando considere que el flujo de datos se
ha completado.
Si se desconecta un lector de una partición, cuando se vuelve a conectar comienza a leer en el punto de
comprobación que envió previamente el último lector de esa partición en ese grupo de consumidores.
Cuando se conecta el lector, pasa este desplazamiento al centro de eventos para especificar la ubicación en
la que se va a empezar a leer. De este modo, puede usar puntos de comprobación para marcar eventos
como "completados" por las aplicaciones de bajada y para ofrecer resistencia en caso de que se produzca
una conmutación por error entre lectores que se ejecutan en máquinas distintas. Es posible volver a los
datos más antiguos especificando un desplazamiento inferior desde este proceso de puntos de
comprobación. Mediante este mecanismo, los puntos de comprobación permiten una resistencia a la
conmutación por error y una reproducción del flujo de eventos.

NOTE
Si usa Azure Blob Storage como el almacén de puntos de comprobación en un entorno que admite una versión
diferente del SDK de blobs de almacenamiento que las que normalmente están disponibles en Azure, tendrá que
utilizar código para cambiar la versión de la API del servicio de almacenamiento a la versión admitida por ese
entorno. Por ejemplo, si ejecuta Event Hubs en una instancia de Azure Stack Hub versión 2002, la versión más alta
disponible para el servicio Storage es 2017-11-09. En este caso, tendrá que usar código para establecer como
destino la versión de la API del servicio Storage en 2017-11-09. Para obtener un ejemplo de cómo establecer como
destino una versión específica de la API de Storage, vea estos ejemplos en GitHub:
.NET
Java
JavaScript o TypeScript
Python

Tareas comunes del consumidor


Todos los consumidores de Event Hubs se conectan a través de una sesión de AMQP 1.0, un canal de
comunicación bidireccional con estado. Cada partición tiene una sesión de AMQP 1.0 que facilita el
transporte de eventos que deben separarse por partición.
Conexión a una partición
Es una práctica habitual al conectarse a particiones usar un mecanismo de concesiones para coordinar las
conexiones del lector a particiones concretas. De este modo, es posible que cada partición de un grupo de
consumidores solo tenga un lector activo. Los puntos de comprobación, la concesión y la administración de
lectores se simplifican mediante el uso de los clientes de los SDK de Event Hubs, que actúan como agentes
de consumidor inteligentes. Dichos componentes son:
EventProcessorClient para .NET
EventProcessorClient para Java
EventHubConsumerClient para Python
EventHubSoncumerClient para JavaScript o TypeScript
Lectura de eventos
Después de abrir una sesión de AMQP 1.0 y el vínculo de una partición específica, el servicio de Centros de
eventos entrega los eventos al cliente de AMQP 1.0. Este mecanismo de entrega permite un mayor
procesamiento y una menor latencia que los mecanismos basados en extracción como HTTP GET. Los
eventos se envían al cliente, cada instancia de datos de eventos contiene metadatos importantes, como el
número de secuencia y el desplazamiento que se usan para facilitar la creación de puntos de comprobación
en la secuencia de eventos.
Datos de evento:
Offset
Número de secuencia
Body
Propiedades de usuario
Propiedades del sistema
Es su responsabilidad administrar el desplazamiento.

Pasos siguientes
Para obtener más información acerca de Event Hubs, visite los vínculos siguientes:
Introducción a Event Hubs
.NET
Java
Python
JavaScript
Guía de programación de Event Hubs
Disponibilidad y coherencia en Event Hubs
Preguntas más frecuentes sobre Event Hubs
Ejemplos de Event Hubs
Host del procesador de eventos
18/08/2020 • 27 minutes to read • Edit Online

NOTE
Este artículo se aplica a la versión anterior del SDK de Azure Event Hubs. Para aprender a migrar el código a la versión
más reciente del SDK, consulte estas guías de migración.
.NET
Java
Python
Script de Java
Consulte también Equilibrio de la carga de particiones entre varias instancias de la aplicación.

Azure Event Hubs es un eficaz servicio de ingesta de telemetría que se puede usar para hacer streaming de
millones de eventos a un bajo costo. En este artículo se describe cómo usar eventos ingeridos mediante el
host del procesador de eventos (EPH), un agente de consumidor inteligente que simplifica la administración
de la creación de puntos de comprobación, la concesión y los lectores de eventos paralelos.
La clave del escalado de Event Hubs es el concepto de consumidores con particiones. En contraposición al
patrón de consumidores de la competencia, el patrón de consumidores con particiones permite una alta
escalabilidad mediante la eliminación de cuellos de botella de contención y la facilitación del paralelismo de
principio a fin.

Escenario de seguridad en el hogar


Como caso de ejemplo, considere una empresa de seguridad en el hogar que supervisa 100 000 casas. Cada
minuto obtiene los datos de los diversos sensores como el detector de movimiento, el sensor de apertura de
puertas y ventanas, el detector de rotura de cristales, etc, instalados en cada casa. La empresa proporciona un
sitio web para que los residentes supervisen la actividad de su casa casi en tiempo real.
Cada sensor inserta datos en un centro de eventos. El centro de eventos está configurado con 16 particiones.
En el extremo de consumo, necesita un mecanismo que pueda leer estos eventos, consolidarlos (filtrarlos,
agregarlos, etc.) y volcar el agregado a un blob de almacenamiento que, a continuación, se proyecta en una
página web fácil de usar.

Escritura de la aplicación de consumidor


Al diseñar el consumidor en un entorno distribuido, el escenario debe controlar los siguientes requisitos:
1. Escalado: cree varios consumidores y que cada consumidor tome posesión de la lectura desde varias
particiones de Event Hubs.
2. Equilibrio de carga: aumente o reduzca dinámicamente los consumidores. Por ejemplo, si se agrega un
nuevo tipo de sensor (por ejemplo, un detector de monóxido de carbono) a cada casa, aumenta el número
de eventos. En ese caso, el operador (una persona) aumenta el número de instancias de consumidor. A
continuación, el grupo de consumidores puede volver a equilibrar el número de particiones que poseen
para compartir la carga con los consumidores recién agregados.
3. Reanudación sin problemas después de los errores: si un consumidor (consumidor A ) genera un
error (por ejemplo, la máquina virtual que hospeda al consumidor, de repente, se bloquea), otros
consumidores deben poder recopilar las particiones que posee el consumidor A y continuar. Además, el
punto de continuación, llamado punto de comprobación o de desplazamiento, debe estar en el punto
exacto en el que se produjo el error del consumidor A o ligeramente antes.
4. Consumo de eventos: mientras que los tres puntos anteriores trataban sobre la administración del
consumidor, también tiene que haber código para consumir los eventos y hacer algo útil con ellos como,
por ejemplo, agregarlos y cargarlos en Blob Storage.
En lugar de compilar su propia solución para esto, Event Hubs ofrece esta funcionalidad mediante la interfaz
de IEventProcessor y la clase EventProcessorHost.

Interfaz de IEventProcessor
En primer lugar, las aplicaciones de consumo implementan la interfaz de IEventProcessor, que tiene cuatro
métodos: OpenAsync, CloseAsync, ProcessErrorAsync y ProcessEventsAsync. Esta interfaz contiene el código
real para consumir los eventos que envía Event Hubs. El código siguiente muestra una implementación
sencilla:

public class SimpleEventProcessor : IEventProcessor


{
public Task CloseAsync(PartitionContext context, CloseReason reason)
{
Console.WriteLine($"Processor Shutting Down. Partition '{context.PartitionId}', Reason:
'{reason}'.");
return Task.CompletedTask;
}

public Task OpenAsync(PartitionContext context)


{
Console.WriteLine($"SimpleEventProcessor initialized. Partition: '{context.PartitionId}'");
return Task.CompletedTask;
}

public Task ProcessErrorAsync(PartitionContext context, Exception error)


{
Console.WriteLine($"Error on Partition: {context.PartitionId}, Error: {error.Message}");
return Task.CompletedTask;
}

public Task ProcessEventsAsync(PartitionContext context, IEnumerable<EventData> messages)


{
foreach (var eventData in messages)
{
var data = Encoding.UTF8.GetString(eventData.Body.Array, eventData.Body.Offset,
eventData.Body.Count);
Console.WriteLine($"Message received. Partition: '{context.PartitionId}', Data: '{data}'");
}
return context.CheckpointAsync();
}
}

A continuación, cree una instancia de una instancia de EventProcessorHost. Según la sobrecarga, al crear la
instancia de EventProcessorHost en el constructor, se usan los siguientes parámetros:
hostName: el nombre de cada instancia de consumidor. Cada instancia de EventProcessorHost debe
tener un valor único para esta variable dentro de un grupo de consumidores, así que no codifique de forma
rígida este valor.
eventHubPath: El nombre del centro de eventos.
consumerGroupName: Event Hubs usa $Default como nombre del grupo de consumidores
predeterminado, pero es recomendable crear un grupo de consumidores para sus necesidades específicas
de procesamiento.
eventHubConnectionString: la cadena de conexión al centro de eventos que se puede recuperar desde
Azure Portal. Esta cadena de conexión debe tener permisos de escucha en el centro de eventos.
storageConnectionString: la cuenta de almacenamiento que se usa para la administración de recursos
internos.
Por último, los consumidores registran la instancia de EventProcessorHost con el servicio Event Hubs. Al
registrar una clase de procesador de eventos con una instancia de EventProcessorHost, se inicia el
procesamiento de eventos. El proceso de registro indica al servicio Event Hubs que debe esperar que la
aplicación del consumidor consuma eventos de algunas de sus particiones y que debe invocar el código de
implementación de IEventProcessor siempre que envíe eventos para su consumo.
Ejemplo
Por ejemplo, imagine que hay 5 máquinas virtuales dedicadas a consumir eventos y una aplicación de consola
simple en cada máquina virtual que es la que realiza el trabajo de consumo real. Cada aplicación de consola
crea una instancia de EventProcessorHost y la registra con el servicio Event Hubs.
En este escenario de ejemplo, supongamos que se asignan 16 particiones a las 5 instancias de
EventProcessorHost . Algunas instancias de EventProcessorHost pueden disponer de algunas particiones
más que otras. Para cada partición que posee una instancia de EventProcessorHost esta crea una instancia
de la clase SimpleEventProcessor . Por tanto, hay 16 instancias de SimpleEventProcessor en total, con una de
ellas asignada a cada partición.
En la siguiente lista se resume este ejemplo:
16 particiones de Event Hubs.
5 máquinas virtuales, 1 aplicación de consumidor (por ejemplo, Consumer.exe) en cada máquina virtual.
5 instancias del host del procesador de eventos, 1 en cada máquina virtual con Consumer.exe.
16 objetos SimpleEventProcessor que crean las 5 instancias del host del procesador de eventos.
1 aplicación Consumer.exe puede contener 4 objetos SimpleEventProcessor , ya que 1 instancia del host del
procesador de eventos puede poseer 4 particiones.

Seguimiento de la propiedad de una partición


Se puede realizar un seguimiento de la propiedad de una partición en una instancia del host del procesador
de eventos (o un consumidor) mediante la cuenta de Azure Storage que se proporciona para tal fin. Puede
visualizar el seguimiento en una sencilla tabla como se indica a continuación. Puede ver la implementación
real examinando los blobs en la cuenta de Storage proporcionada:

DESP L A Z A M IEN TO
N O M B RE DEL T IEM P O A DQ UIRIDO EN L A PA RT IC IÓ N
GRUP O DE IDEN T IF IC A DO R DE N O M B RE DE H O ST DE C O N C ESIÓ N ( O ( P UN TO DE
C O N SUM IDO RES L A PA RT IC IÓ N ( P RO P IETA RIO ) P RO P IEDA D) C O M P RO B A C IÓ N )

$Default 0 Consumer_VM3 2018-04- 156


15T01:23:45

$Default 1 Consumer_VM4 2018-04- 734


15T01:22:13

$Default 2 Consumer_VM0 2018-04- 122


15T01:22:56

:
DESP L A Z A M IEN TO
N O M B RE DEL T IEM P O A DQ UIRIDO EN L A PA RT IC IÓ N
GRUP O DE IDEN T IF IC A DO R DE N O M B RE DE H O ST DE C O N C ESIÓ N ( O ( P UN TO DE
C O N SUM IDO RES L A PA RT IC IÓ N ( P RO P IETA RIO ) P RO P IEDA D) C O M P RO B A C IÓ N )

$Default 15 Consumer_VM3 2018-04- 976


15T01:22:56

En este caso, cada host adquiere la propiedad de una partición durante un determinado período de tiempo (la
duración de la concesión). Si se produce un error en un host (se apaga la máquina virtual), la concesión expira.
Otros hosts intentan obtener la propiedad de la partición y uno de ellos lo consigue. Este proceso restablece la
concesión de la partición con un nuevo propietario. De este modo, solo un lector a la vez puede leer en una
determinada partición de un grupo de consumidores.

Recepción de mensajes
Cada llamada a ProcessEventsAsync ofrece una colección de eventos. Es su responsabilidad administrar estos
eventos. Si desea asegurarse de que el host del procesador procesa cada mensaje al menos una vez, deberá
escribir su propio código de reintento. Pero tenga cuidado con los mensajes dudosos.
Se recomienda que el proceso se realice relativamente rápido, es decir, con el menor procesamiento posible.
En su lugar, utilice grupos de consumidores. Si tiene que escribir en el almacenamiento y hacer algo de
enrutamiento, es mejor usar dos grupos de consumidores y tener dos implementaciones de IEventProcessor
que se ejecuten por separado.
En algún momento durante el procesamiento, es posible que desee realizar un seguimiento de lo que ha leído
y completado. Es fundamental realizar un seguimiento si debe reiniciar la lectura, para no tener que volver al
principio de la transmisión. EventProcessorHost simplifica este seguimiento mediante el uso de puntos de
comprobación. Un punto de comprobación es una ubicación o desplazamiento, de una partición determinada,
dentro de un grupo de consumidores determinado, en el que está satisfecho con los mensajes que se han
procesado. Para marcar un punto de comprobación en EventProcessorHost llame al método
CheckpointAsync en el objeto PartitionContext. Esta operación se realiza en el método ProcessEventsAsync
pero también se puede realizar en CloseAsync.

Puntos de control
El método CheckpointAsync tiene dos sobrecargas: la primera, sin parámetros, crea un punto de
comprobación en el desplazamiento del evento más alto de la colección que devuelve ProcessEventsAsync.
Este desplazamiento es una marca de "límite superior" que supone que ha procesado todos los eventos
recientes cuando lo llama. Si usa este método de esta manera, tenga en cuenta que se espera que lo llame una
vez que ha devuelto el otro código de procesamiento de eventos. La segunda sobrecarga le permite
especificar una instancia de EventData para crear un punto de comprobación. Este método le permite usar un
tipo diferente de marca de agua para crear un punto de comprobación Con esta marca de agua, puede
implementar una marca "de límite inferior": el evento más bajo de la secuencia que está seguro de haber
procesado. Esta sobrecarga se proporciona para ofrecer flexibilidad en la administración de desplazamientos.
Cuando se realiza la creación de un punto de comprobación, se escribe un archivo JSON con información
específica de la partición en la cuenta de almacenamiento que se proporcionó en el constructor de
EventProcessorHost. Este archivo se actualiza continuamente. Es fundamental considerar la creación de puntos
de comprobación en contexto. No es recomendable crear un punto de comprobación en cada mensaje. La
cuenta de almacenamiento que se utilizó para la creación de puntos de comprobación no podrá administrar
esta carga y, lo que es aún más importante, la creación de puntos de comprobación para todos los eventos
puede indicar un patrón de mensajería en cola para el que una cola de Service Bus sería una opción mejor que
un centro de eventos. La ventaja de Event Hubs es que obtiene al menos una entrega a gran escala. Al hacer
los sistemas de nivel final idempotentes, es fácil recuperarse de errores o reinicios que hacen que los eventos
se reciban múltiples veces.

Seguridad para subprocesos e instancias de procesador


De forma predeterminada, EventProcessorHost es un subproceso seguro y se comporta de una forma
sincrónica con respecto a la instancia de IEventProcessor. Cuando llegan eventos para una partición, se llama a
ProcessEventsAsync en la instancia de IEventProcessor de esa partición y se bloquean el resto de llamadas a
ProcessEventsAsync de la partición. Los siguientes mensajes y llamadas a ProcessEventsAsync se ponen
en cola en segundo plano ya que el suministro de mensajes continúa ejecutándose en segundo plano en otros
subprocesos. Esta seguridad para subprocesos elimina la necesidad de colecciones seguras para subprocesos
y aumenta considerablemente el rendimiento.

Cierre correcto
Por último, EventProcessorHost.UnregisterEventProcessorAsync permite un cierre correcto de todos los
lectores de partición y se le debería llamar siempre al cerrar una instancia de EventProcessorHost. Si no lo
hace, puede provocar retrasos al iniciar otras instancias de EventProcessorHost debido a conflictos de época
y de expiración de concesión. La administración de épocas se trata detalladamente en la sección Época del
artículo.

Administración de concesiones
Al registrar una clase de procesador de eventos con una instancia de EventProcessorHost, se inicia el
procesamiento de eventos. La instancia de host obtiene las concesiones sobre algunas particiones del centro
de eventos, posiblemente al tomar algunas de otras instancias, de una forma que converge en una
distribución uniforme de particiones mediante todas las instancias de host. Para cada partición de la
concesión, la instancia de host crea una instancia de la clase de procesador de eventos proporcionada,
después, recibe eventos de esa partición y los pasa a la instancia de procesador de eventos. A medida que más
casos se agregan y más concesiones se toman, EventProcessorHost equilibra finalmente la carga entre todos
los consumidores.
Como se explicó anteriormente, la tabla de seguimiento simplifica en gran medida la naturaleza de
escalabilidad automática de EventProcessorHost.UnregisterEventProcessorAsync. Cuando se inicia una
instancia de EventProcessorHost , esta adquiere el mayor número de concesiones posible y empieza a leer
eventos. A medida que la concesión se acerca a su fin, EventProcessorHost intenta renovarla realizando una
reserva. Si la concesión está disponible para la renovación, el procesador continúa la lectura, pero si no es así,
el lector se cierra y se realiza una llamada a CloseAsync. CloseAsync es una buena oportunidad para realizar
cualquier tarea de limpieza final para esa partición.
EventProcessorHost incluye una propiedad PartitionManagerOptions. Esta propiedad habilita el control
sobre la administración de concesiones. Establezca estas opciones antes de registrar la implementación de
IEventProcessor.

Control de las opciones del host del procesador de eventos


Además, una sobrecarga de RegisterEventProcessorAsync toma un objeto EventProcessorOptions como
parámetro. Utilice este parámetro para controlar el comportamiento del propio
EventProcessorHost.UnregisterEventProcessorAsync. EventProcessorOptions define cuatro propiedades y un
evento:
MaxBatchSize: el tamaño máximo de la colección que desea recibir en una invocación de
ProcessEventsAsync. Este tamaño no incluye el tamaño mínimo, solo el máximo. Si hay menos mensajes
que recibir, ProcessEventsAsync se ejecuta con tantos como haya disponibles.
PrefetchCount: un valor utilizado por el canal AMQP subyacente para determinar el límite superior de
mensajes que debe recibir el cliente. Este valor debe ser superior o igual a MaxBatchSize.
InvokeProcessorAfterReceiveTimeout: si este parámetro es true , se realizará una llamada a
ProcessEventsAsync cuando se agote el tiempo de espera de la llamada subyacente para recibir eventos en
una partición. Este método es útil para adoptar acciones basadas en tiempo durante los períodos de
inactividad de la partición.
InitialOffsetProvider: permite que se establezca un puntero de función o expresión lambda que se usa para
proporcionar el desplazamiento inicial cuando un lector comienza la lectura de una partición. Si no se
especifica este desplazamiento, el lector se iniciará en el evento más antiguo, a menos que ya se haya
guardado un archivo JSON con un desplazamiento en la cuenta de almacenamiento que se proporcionó al
constructor de EventProcessorHost. Este método es útil cuando desea cambiar el comportamiento de inicio
del lector. Cuando se invoca este método, el parámetro de objeto contiene el identificador de partición para
el que se inicia el lector.
ExceptionReceivedEventArgs: le permite recibir notificaciones sobre cualquier excepción subyacente que se
produzca en EventProcessorHost. Si las cosas no funcionan según lo esperado, este evento es un buen
lugar para empezar a buscar.

Época
Así es cómo funciona la época de recepción:
Con época
La época es un identificador único (valor de tiempo) que usa el servicio para aplicar la propiedad de la
partición o de la concesión. Para crear un receptor de época se usa el método CreateEpochReceiver. Este
método crea un receptor basado en época. El receptor se crea para una partición de centro de eventos
específica desde el grupo de consumidores especificado.
La característica de época ofrece a los usuarios la posibilidad de garantizar que solo hay un receptor en un
grupo de consumidores en cualquier momento dado, con las siguientes reglas:
Si no hay ningún receptor existente en un grupo de consumidores, el usuario puede crear uno con
cualquier valor de época.
Si hay un receptor con un valor de época de e1 y se crea un receptor con un valor de época de e2 donde e1
< = e2, el receptor con e1 se desconectará automáticamente si el receptor con e2 se crea correctamente.
Si hay un receptor con un valor de época de e1 y se crea un receptor con un valor de época de e2 donde e1
> e2 y, a continuación, la creación de e2 generará un error que indica que ya existe un receptor con la
época e1.
No hay época
Creará un receptor no basado en época mediante el método CreateReceiver.
Hay algunos escenarios en el procesamiento de streaming en los que a los usuarios les gustaría crear varios
receptores en un solo grupo de consumidores. Para admitir estos escenarios, tenemos la posibilidad de crear
un receptor sin época y, en este caso, se permiten hasta cinco receptores simultáneos en el grupo de
consumidores.
Modo mixto
No recomendamos el uso de aplicaciones donde crea un receptor con época y, luego, cambia a sin época o
viceversa, en el mismo grupo de consumidores. Sin embargo, cuando se produce este comportamiento, el
servicio lo controla mediante las reglas siguientes:
Si hay un receptor ya ha creado con época e1 y está recibiendo eventos activamente y se crea un receptor
sin época, se producirá un error en la creación del receptor. Los receptores de época siempre tienen
prioridad en el sistema.
Si hubiera un receptor ya ha creado con época e1 y se desconectara y se creara un receptor sin época en
una nueva instancia de MessagingFactory, la creación del receptor se realizaría correctamente. Hay una
salvedad aquí y es que nuestro sistema detectará la "desconexión del receptor" al cabo de unos 10
minutos.
Si hay uno o varios receptores creados sin época y se crea uno con época e1, se desconectan todos los
receptores antiguos.

NOTE
Se recomienda el uso de diferentes grupos de consumidores para las aplicaciones que usan épocas y para aquellos que
no usan épocas para evitar errores.

Pasos siguientes
Ahora que está familiarizado con el host del procesador de eventos, consulte los artículos siguientes para más
información acerca de Event Hubs:
Introducción a Event Hubs
.NET Core
Java
Python
JavaScript
Guía de programación de Event Hubs
Disponibilidad y coherencia en Event Hubs
Preguntas más frecuentes sobre Event Hubs
Ejemplos de Event Hubs en GitHub
Equilibrio de carga de particiones entre varias
instancias de una aplicación
18/08/2020 • 16 minutes to read • Edit Online

Para escalar la aplicación de procesamiento de eventos, puede ejecutar varias instancias de la aplicación y
equilibrar la carga entre ellas. En las versiones anteriores, EventProcessorHost permitía equilibrar la carga entre
varias instancias del programa y eventos de punto de comprobación en la recepción. En las versiones más
recientes (5.0 y posteriores), EventProcessorClient (.NET y Java) o EventHubConsumerClient (Python y
JavaScript) le permiten hacer lo mismo. El modelo de desarrollo se simplifica mediante el uso de eventos. Para
suscribirse a los eventos que le interesen, registre un controlador de eventos.
En este artículo se describe un escenario de ejemplo para el uso de varias instancias para leer eventos desde un
centro de eventos y, a continuación, se proporcionan detalles sobre las características del cliente del procesador
de eventos, que permite recibir eventos de varias particiones a la vez y equilibrar la carga con otros consumidores
que usan el mismo centro de eventos y el mismo grupo de consumidores.

NOTE
La clave del escalado de Event Hubs es el concepto de consumidores con particiones. En contraposición al patrón de
consumidores de la competencia, el patrón de consumidores con particiones permite una alta escalabilidad mediante la
eliminación de cuellos de botella de contención y la facilitación del paralelismo de principio a fin.

Escenario de ejemplo
Como caso de ejemplo, considere una empresa de seguridad en el hogar que supervisa 100 000 casas. Cada
minuto, obtiene los datos de los diversos sensores como el detector de movimiento, el sensor de apertura de
puertas y ventanas, el detector de rotura de cristales, etc., instalados en cada casa. La empresa proporciona un
sitio web para que los residentes supervisen la actividad de su casa casi en tiempo real.
Cada sensor inserta datos en un centro de eventos. El centro de eventos está configurado con 16 particiones. En
el extremo de consumo, necesita un mecanismo que pueda leer estos eventos, consolidarlos (filtrarlos, agregarlos,
etc.) y volcar el agregado a un blob de almacenamiento que, a continuación, se proyecta en una página web fácil
de usar.

Escritura de la aplicación de consumidor


Al diseñar el consumidor en un entorno distribuido, el escenario debe controlar los siguientes requisitos:
1. Escalado: cree varios consumidores y que cada consumidor tome posesión de la lectura desde varias
particiones de Event Hubs.
2. Equilibrio de carga: aumente o reduzca dinámicamente los consumidores. Por ejemplo, si se agrega un
nuevo tipo de sensor (por ejemplo, un detector de monóxido de carbono) a cada casa, aumenta el número de
eventos. En ese caso, el operador (una persona) aumenta el número de instancias de consumidor. A
continuación, el grupo de consumidores puede volver a equilibrar el número de particiones que poseen para
compartir la carga con los consumidores recién agregados.
3. Reanudación sin problemas después de los errores: si un consumidor (consumidor A ) genera un error
(por ejemplo, la máquina virtual que hospeda al consumidor se bloquea de repente), otros consumidores
pueden recopilar las particiones que posee el consumidor A y continuar. Además, el punto de continuación,
llamado punto de comprobación o de desplazamiento, debe estar en el punto exacto en el que se produjo el
error del consumidor A o ligeramente antes.
4. Consumo de eventos: mientras que los tres puntos anteriores trataban sobre la administración del
consumidor, también tiene que haber código para consumir los eventos y hacer algo útil con él. Por ejemplo,
agréguelo y cárguelo en el almacenamiento de blobs.

Cliente de consumidor o procesador de eventos


No es necesario que cree su propia solución para cumplir estos requisitos. Los SDK de Azure Event Hubs
proporcionan esta funcionalidad. En los SDK para .NET o Java, se usa un cliente de procesador de eventos
(EventProcessorClient) y en los SDK para JavaScript y Python, se usa EventHubConsumerClient. En la versión
anterior del SDK, era el host del procesador de eventos (EventProcessorHost) el que admitía estas características.
En la mayoría de los escenarios de producción, se recomienda usar el cliente del procesador de eventos para leer
y procesar eventos. El cliente del procesador está diseñado para proporcionar una experiencia sólida para
procesar eventos en todas las particiones de un centro de eventos de un modo eficaz y tolerante a errores, a la
vez que permite comprobar el progreso. Los clientes del procesador de eventos también pueden trabajar de
forma cooperativa en el contexto de un grupo de consumidores para un centro de eventos determinado. Los
clientes administrarán de forma automática la distribución y el equilibrio del trabajo a medida que las instancias
estén disponibles o no para el grupo.

Seguimiento de la propiedad de una partición


Por lo general, una instancia de procesador de eventos posee y procesa los eventos de una o de varias
particiones. La propiedad de las particiones se distribuye uniformemente entre todas las instancias del
procesador de eventos activas asociadas a una combinación de centro de eventos y grupo de consumidores.
Cada procesador de eventos recibe un identificador único y notifica la propiedad de las particiones mediante la
adición o actualización de una entrada en un almacén de puntos de control. Todas las instancias del procesador de
eventos se comunican con este almacén periódicamente para actualizar su propio estado de procesamiento, así
como para obtener información sobre otras instancias activas. Después, estos datos se usan para equilibrar la
carga entre los procesadores activos. Para escalar verticalmente, se pueden unir instancias nuevas al grupo de
procesamiento. Cuando las instancias se quedan fuera de servicio, ya sea debido a errores o a una reducción
vertical, la propiedad de la partición se transfiere correctamente a otros procesadores activos.
Los registros de propiedad de la partición en el almacén de puntos de control realizan un seguimiento del espacio
de nombres de Event Hubs, nombre del centro de eventos, grupo de consumidores, identificador de procesador
de eventos (también conocido como propietario), id. de partición y hora de la última modificación.

ESPA C IO DE N O M B RE DEL H O RA DE L A
N O M B RES DE C EN T RO DE GRUP O DE ID. DE ÚLT IM A
EVEN T H UB S EVEN TO S C O N SUM IDO RES P RO P IETA RIO PA RT IC IÓ N M O DIF IC A C IÓ N

mynamespace.se myeventhub myconsumergro 3be3f9d3-9d9e- 0 2020-01-


rvicebus.windows up 4c50-9491- 15T01:22:15
.net 85ece8334ff6

mynamespace.se myeventhub myconsumergro f5cc5176-ce96- 1 2020-01-


rvicebus.windows up 4bb4-bbaa- 15T01:22:17
.net a0e3a9054ecf

mynamespace.se myeventhub myconsumergro 72b980e9-2efc- 2 2020-01-


rvicebus.windows up 4ca7-ab1b- 15T01:22:10
.net ffd7bece8472

:
ESPA C IO DE N O M B RE DEL H O RA DE L A
N O M B RES DE C EN T RO DE GRUP O DE ID. DE ÚLT IM A
EVEN T H UB S EVEN TO S C O N SUM IDO RES P RO P IETA RIO PA RT IC IÓ N M O DIF IC A C IÓ N

mynamespace.se myeventhub myconsumergro 844bd8fb-1f3a- 15 2020-01-


rvicebus.windows up 4580-984d- 15T01:22:00
.net 6324f9e208af

Cada instancia del procesador de eventos adquiere la propiedad de una partición y empieza el procesamiento de
la misma desde el último [punto de control](# Checkpointing) conocido. Si se produce un error en un procesador
(la máquina virtual se apaga), otras instancias lo detectan al examinar la hora de la última modificación. Otras
instancias intentan obtener la propiedad de las particiones que antes pertenecían a la instancia inactiva, y el
almacén de puntos de control garantiza que solo una de las instancias tenga éxito al reclamar la propiedad de una
partición. Por lo tanto, en un momento dado, hay, a lo sumo, un procesador que reciba eventos de una partición.

Recepción de mensajes
Cuando se crea un procesador de eventos, se especifican las funciones que van a procesar los eventos y los
errores. Cada llamada a la función que procesa los eventos entrega un solo evento de una partición específica. Es
su responsabilidad administrar este evento. Si desea asegurarse de que el consumidor procesa cada mensaje al
menos una vez, debe escribir su propio código con lógica de reintento. Pero tenga cuidado con los mensajes
dudosos.
Se recomienda que lo haga relativamente rápido. Es decir, use el menor procesamiento posible. Si tiene que
escribir en el almacenamiento y llevar a cabo cierto enrutamiento, es mejor usar dos grupos de consumidores y
tener dos procesadores de eventos.

Puntos de control
El punto de control es un proceso por el que un procesador de eventos marca o confirma la posición del último
evento procesado correctamente en una partición. Por lo general, el marcado de un punto de control se realiza en
la función que procesa los eventos y se produce en cada partición de un grupo de consumidores.
Si un procesador de eventos se desconecta de una partición, otra instancia puede reanudar el procesamiento de
la partición en el punto de control confirmado previamente por el último procesador de esa partición en ese
grupo de consumidores. Cuando se conecta el procesador, pasa el desplazamiento al centro de eventos para
especificar la ubicación en la que se va a empezar a leer. De este modo, puede usar puntos de control para que las
aplicaciones de nivel inferior marquen los eventos como "completados" y para ofrecer resistencia cuando un
procesador de eventos quede fuera de servicio. Es posible volver a los datos más antiguos especificando un
desplazamiento inferior desde este proceso de puntos de comprobación.
Cuando se realiza el punto de control para marcar un evento como procesado, se agrega o se actualiza una
entrada en el almacén de puntos de control con el desplazamiento del evento y el número de secuencia. Los
usuarios deben decidir la frecuencia de actualización del punto de control. La actualización después de cada
evento procesado correctamente puede tener implicaciones en el rendimiento y el costo cuando desencadena una
operación de escritura en el almacén de puntos de control subyacente. Además, el punto de control de cada
evento único es indicativo de un patrón de mensajería en cola para el que una cola de Service Bus podría ser una
opción mejor que un centro de eventos. La ventaja de Event Hubs es que obtiene al menos una entrega a gran
escala. Al hacer los sistemas de nivel final idempotentes, es fácil recuperarse de errores o reinicios que hacen que
los eventos se reciban múltiples veces.
NOTE
Si usa Azure Blob Storage como el almacén de puntos de comprobación en un entorno que admite una versión diferente
del SDK de blobs de almacenamiento que las que normalmente están disponibles en Azure, tendrá que utilizar código para
cambiar la versión de la API del servicio Storage a la versión que admita ese entorno. Por ejemplo, si ejecuta Event Hubs en
una instancia de Azure Stack Hub versión 2002, la versión más alta disponible para el servicio Storage es 2017-11-09. En
este caso, tendrá que usar código para establecer como destino la versión de la API del servicio Storage en 2017-11-09.
Para obtener un ejemplo de cómo establecer como destino una versión específica de la API de Storage, vea estos ejemplos
en GitHub:
.NET
Java
JavaScript o TypeScript
Python

Seguridad para subprocesos e instancias de procesador


De forma predeterminada, se llama de forma secuencial a la función que procesa los eventos para una partición
determinada. Los siguientes eventos y llamadas a esta función desde la misma partición se ponen en cola en
segundo plano mientras el suministro de eventos continúa ejecutándose en segundo plano en otros subprocesos.
Tenga en cuenta que los eventos de diferentes particiones se pueden procesar simultáneamente y cualquier
estado compartido al que se tenga acceso desde varias particiones se debe sincronizar.

Pasos siguientes
Consulte las siguientes guías de inicio rápido:
.NET Core
Java
Python
JavaScript
Disponibilidad y coherencia en Event Hubs
18/08/2020 • 8 minutes to read • Edit Online

Información general
Azure Event Hubs usa un modelo de creación de particiones para mejorar la disponibilidad y paralelización
dentro de un solo centro de eventos. Por ejemplo, si un centro de eventos tiene cuatro particiones y una de ellas
se mueve de un servidor a otro en una operación de equilibrio de carga, se puede enviar y recibir desde las otras
tres. Además, tener un mayor número de particiones permite que más lectores simultáneos procesen los datos,
lo que mejora el rendimiento agregado. Conocer las implicaciones de la creación de particiones y la ordenación
de un sistema distribuido es un aspecto fundamental del diseño de soluciones.
Para ayudar a explicar el equilibrio entre ordenación y disponibilidad, consulte el teorema CAP, que también se
conoce como teorema de Brewer. Dicho teorema trata la elección entre coherencia, disponibilidad y tolerancia a la
partición. Indica que para los sistemas con particiones por red siempre hay correlación entre coherencia y
disponibilidad.
El teorema de Brewer define la coherencia y la disponibilidad de la forma siguiente:
Tolerancia a la partición: la capacidad de un sistema de procesamiento de datos de continuar procesando
datos aunque se produzcan errores en una partición.
Disponibilidad: un nodo sin error devuelve una respuesta razonable en un plazo prudente (sin errores ni
tiempos de espera).
Coherencia: se garantiza que una lectura devuelva la última escritura de un cliente determinado.

Tolerancia a la partición
Event Hubs se basa en un modelo de datos con particiones. Se puede configurar el número de particiones en el
centro de eventos durante la instalación, pero no se puede cambiar este valor más adelante. Puesto que se deben
utilizar particiones con Event Hubs, debe tomar una decisión con respecto a la disponibilidad y la coherencia de la
aplicación.

Disponibilidad
La manera más sencilla de empezar a trabajar con Event Hubs es usar el comportamiento predeterminado.
Azure.Messaging.EventHubs (5.0.0 o posterior)
Microsoft.Azure.EventHubs (4.1.0 o anterior)
Si crea un objeto EventHubProducerClient y usa el método SendAsync , los eventos se distribuyen
automáticamente entre las particiones del centro de eventos. Este comportamiento permite disfrutar del máximo
tiempo de actividad.
Para los casos de uso que requieren el máximo tiempo de actividad, se prefiere este modelo.

Coherencia
En algunos escenarios, el orden de los eventos puede ser importante. Por ejemplo, puede que prefiera el sistema
back-end para procesar un comando de actualización antes que un comando de eliminación. En este caso, puede
establecer la clave de partición en un evento, o usar un objeto PartitionSender (si usa la biblioteca antigua
Microsoft.Azure.Messaging) para enviar eventos solo a una determinada partición. De esta forma, se garantiza
que, cuando se lean eventos de la partición, la lectura siga un orden. Si usa la biblioteca
Azure.Messaging.EventHubs y quiere obtener más información, vea Migración de código de PartitionSender a
EventHubProducerClient para publicar eventos en una partición.
Azure.Messaging.EventHubs (5.0.0 o posterior)
Microsoft.Azure.EventHubs (4.1.0 o anterior)

var connectionString = "<< CONNECTION STRING FOR THE EVENT HUBS NAMESPACE >>";
var eventHubName = "<< NAME OF THE EVENT HUB >>";

await using (var producerClient = new EventHubProducerClient(connectionString, eventHubName))


{
var batchOptions = new CreateBatchOptions() { PartitionId = "my-partition-id" };
using EventDataBatch eventBatch = await producerClient.CreateBatchAsync(batchOptions);
eventBatch.TryAdd(new EventData(Encoding.UTF8.GetBytes("First")));
eventBatch.TryAdd(new EventData(Encoding.UTF8.GetBytes("Second")));

await producerClient.SendAsync(eventBatch);
}

Con esta configuración, tenga en cuenta que si la partición concreta a la que se realiza el envío no se encuentra
disponible, recibirá una respuesta de error. Como punto de comparación, si no tiene una afinidad para una sola
partición, el servicio Event Hubs envía el evento a la siguiente partición disponible.
Una posible solución para garantizar el orden, mientras también se maximiza el tiempo de actividad, sería
agregar eventos como parte de la aplicación de procesamiento de eventos. La manera más fácil de lograr esto es
marcar el evento con una propiedad de número de secuencia personalizada. El código siguiente muestra un
ejemplo:
Azure.Messaging.EventHubs (5.0.0 o posterior)
Microsoft.Azure.EventHubs (4.1.0 o anterior)

// create a producer client that you can use to send events to an event hub
await using (var producerClient = new EventHubProducerClient(connectionString, eventHubName))
{
// get the latest sequence number from your application
var sequenceNumber = GetNextSequenceNumber();

// create a batch of events


using EventDataBatch eventBatch = await producerClient.CreateBatchAsync();

// create a new EventData object by encoding a string as a byte array


var data = new EventData(Encoding.UTF8.GetBytes("This is my message..."));

// set a custom sequence number property


data.Properties.Add("SequenceNumber", sequenceNumber);

// add events to the batch. An event is a represented by a collection of bytes and metadata.
eventBatch.TryAdd(data);

// use the producer client to send the batch of events to the event hub
await producerClient.SendAsync(eventBatch);
}

Este ejemplo envía el evento a una de las particiones disponibles en el centro de eventos y establece el número
de secuencia correspondiente a partir de la aplicación. Esta solución requiere que la aplicación de procesamiento
conserve el estado, pero proporciona a los remitentes un punto de conexión con más probabilidades de estar
disponible.
Pasos siguientes
Para más información acerca de Event Hubs, visite los vínculos siguientes:
Información general sobre el servicio Event Hubs
Creación de un centro de eventos
Escalado con Event Hubs
18/08/2020 • 10 minutes to read • Edit Online

Hay dos factores que influyen en el escalado con Event Hubs.


Unidades de procesamiento
Particiones

Unidades de procesamiento
La capacidad de rendimiento de Event Hubs se controla mediante unidades de rendimiento. Las unidades de
procesamiento son unidades de capacidad adquiridas previamente. Un único procesamiento le permite:
Entrada: hasta 1 MB por segundo o 1000 eventos por segundo, lo que ocurra primero.
Salida: hasta 2 MB por segundo o 4096 eventos por segundo.
Si supera la capacidad de las unidades de rendimiento adquiridas, la entrada se limitará y se devolverá una
excepción ServerBusyException. La salida no produce excepciones de limitación, pero sigue estando limitada a la
capacidad de las unidades de rendimiento adquiridas. Si recibe excepciones de tasa de publicación o espera ver una
salida superior, compruebe cuántas unidades de rendimiento adquirió para el espacio de nombres. Puede
administrar las unidades de procesamiento en la hoja Escala de los espacios de nombres en Azure Portal. También
puede administrar unidades de procesamiento mediante programación con las API de Event Hubs.
Las unidades de procesamiento se adquieren previamente y se facturan por hora. Cuando se adquieren, las
unidades de procesamiento se facturan durante un período mínimo de una hora. Se pueden adquirir hasta 20
unidades de procesamiento para un espacio de nombres de Event Hubs y compartir entre todos los centros de
eventos del espacio de nombres.
La característica de inflado automático de Event Hubs escala verticalmente y de forma automática mediante el
aumento del número de unidades de procesamiento para responder a las necesidades de utilización. Al aumentar
las unidades de rendimiento, se evitan escenarios de limitación en los que nos encontramos con:
Velocidades de entrada de datos que superan las unidades de rendimiento establecidas.
Velocidades de solicitud de salida de datos que superan las unidades de rendimiento establecidas.
El servicio Event Hubs aumenta el rendimiento cuando la carga aumenta más allá del umbral mínimo, sin que se
produzca ningún problema de las solicitudes con errores de ServerBusy.
Para más información sobre la característica de inflado automático, consulte Escalado automático de las unidades
de rendimiento.

Particiones
Event Hubs proporciona streaming de mensajes mediante un patrón de consumidor con particiones en el que cada
consumidor lee solo un subconjunto específico o una partición del flujo de mensajes. Este patrón permite un
escalado horizontal para el procesamiento de eventos y ofrece otras características centradas en los flujos que no
están disponibles en las colas y los temas.
Una partición es una secuencia ordenada de eventos que se mantiene en un centro de eventos. A medida que
llegan eventos más recientes, se agregan al final de esta secuencia. Una partición puede considerarse como un
"registro de confirmación".
Event Hubs retiene datos durante un tiempo de retención configurado que se aplica a todas las particiones del
centro de eventos. Los eventos expiran en función del tiempo; no se pueden eliminar explícitamente. Dado que las
particiones son independientes y contienen sus propias secuencias de datos, a menudo crecen a velocidades
diferentes.

El número de particiones se especifica en el momento de la creación y debe estar comprendido entre 2 y 32. El
número de particiones no es modificable, por lo que debería tener en cuenta la escala a largo plazo a la hora de
configurar este número. Las particiones son un mecanismo de organización de datos relacionado con el
paralelismo de bajada necesario para consumir las aplicaciones. El número de particiones de un centro de eventos
está directamente relacionado con el número de lectores simultáneos que espera tener. Puede aumentar el número
de particiones más allá de 32 poniéndose en contacto con el equipo de Event Hubs.
Es posible que quiera establecer el valor lo más alto posible, que es 32, en el momento de la creación. Recuerde
que, si hay más de una partición, los eventos se enviarán a varias particiones sin conservar el orden, a menos que
configure los remitentes para que solo realicen el envío a una única partición de las 32, lo que hará que las 31
restantes sean redundantes. En el primer caso, tendrá que leer eventos en las 32 particiones. En el último caso, no
hay ningún costo adicional obvio aparte de la configuración adicional que debe realizar en el host del procesador
de eventos.
Aunque las particiones son identificables y se pueden realizar envíos a estas directamente, no se recomienda
hacerlo. En su lugar, puede usar las construcciones de nivel superior que se presentan en la sección Publicador de
eventos.
Las particiones se rellenan con una secuencia de datos de eventos que contienen el cuerpo del evento, un
contenedor de propiedades definidas por el usuario y diversos metadatos, como su desplazamiento en la partición
y su número en la secuencia de streaming.
Se recomienda equilibrar las unidades de procesamiento y las particiones 1:1 para lograr una escalabilidad óptima.
Una sola partición tiene una entrada y una salida garantizadas de hasta una unidad de procesamiento. Aunque
puede lograr un mayor procesamiento en una partición, no se garantiza el rendimiento. Por este motivo, se
recomienda encarecidamente que el número de particiones en un centro de eventos sea mayor o igual que el
número de unidades de procesamiento.
Dado el procesamiento total que planea necesitar, conoce el número de unidades de procesamiento que precisa y el
número mínimo de particiones, pero, ¿cuántas particiones debería tener? Elija el número de particiones en función
del paralelismo de bajada que quiere conseguir, así como de las futuras necesidades de procesamiento. No hay
ningún cargo por el número de particiones que tiene dentro de un centro de eventos.
Para más información acerca de particiones y el equilibrio entre disponibilidad y confiabilidad, consulte los
artículos Guía de programación de Event Hubs y Disponibilidad y coherencia en Event Hubs.
Clave de partición
Puede usar una clave de partición para asignar datos de eventos entrantes a particiones concretas con fines de
organización de los datos. La clave de partición es un valor proporcionado por el remitente que se pasa a un centro
de eventos. Se procesa a través de una función hash estática que crea la asignación de la partición. Si no especifica
una clave de partición cuando se publica un evento, se usa una asignación de tipo round robin.
El publicador de eventos solo conoce su clave de partición, no la partición en la que se publican los eventos. Este
desacoplamiento de la clave y la partición evita al remitente la necesidad de conocer demasiado sobre el
procesamiento de bajada. Una identidad única por cada dispositivo o usuario es una buena clave de partición, pero
otros atributos como la geografía también pueden usarse para agrupar eventos relacionados en una única
partición.

Pasos siguientes
Para más información acerca de Event Hubs, visite los vínculos siguientes:
Escalado automático de las unidades de rendimiento
Información general sobre el servicio Event Hubs
Azure Event Hubs: recuperación ante desastres
geográfica
18/08/2020 • 19 minutes to read • Edit Online

Cuando hay regiones de Azure completas o centros de datos (si no se utilizan zonas de disponibilidad) que
experimentan un tiempo de inactividad, es crucial que el procesamiento de datos siga funcionando en otra región
o centro de datos. De esta forma, la recuperación ante desastres con localización geográfica y la replicación
geográfica son características importantes para cualquier empresa. Azure Event Hubs admite tanto la
recuperación ante desastres con localización geográfica como la replicación geográfica, en el nivel de espacio de
nombres.

NOTE
La característica de recuperación ante desastres geográfica solo está disponible para las SKU estándar y dedicadas.

Interrupciones y desastres
Es importante tener en cuenta la distinción entre "interrupciones" y "desastres". Una interrupción es la falta de
disponibilidad temporal de Azure Event Hubs y puede afectar a algunos componentes del servicio, como un
almacén de mensajes o incluso todo el centro de datos. Sin embargo, después de corregir el problema, Event
Hubs está de nuevo disponible. Normalmente, una interrupción no provoca la pérdida de mensajes ni otros datos.
Un ejemplo de una interrupción de este tipo podría ser un error de corriente en el centro de datos. Algunas
interrupciones son solo breves pérdidas de conexión debido a problemas transitorios o de red.
Un desastre se define como la pérdida permanente o a largo plazo de un clúster de Event Hubs, una región de
Azure o un centro de datos. La región o el centro de datos no volverá necesariamente a estar disponible, o puede
que esté fuera de servicio durante horas o días. Algunos ejemplos de esos desastres son los incendios, las
inundaciones o los terremotos. Un desastre que se convierte en permanente podría provocar la pérdida de
algunos mensajes, eventos u otros datos. Sin embargo, en la mayoría de los casos, no debe producirse una
pérdida de datos y se pueden recuperar los mensajes una vez que se realiza la copia de seguridad del centro de
datos.
La característica de recuperación ante desastres con localización geográfica de Azure Event Hubs es una solución
de recuperación ante desastres. Los conceptos y el flujo de trabajo descritos en este artículo se aplican a
situaciones catastróficas y no a interrupciones transitorias o temporales. Para obtener una explicación detallada de
la recuperación ante desastres en Microsoft Azure, consulte este artículo.

Términos y conceptos básicos


La característica de recuperación ante desastres implementa la recuperación ante desastres de metadatos y
depende de espacios de nombres de recuperación ante desastres principales y secundarios.
La característica de recuperación ante desastres geográfica solo está disponible para las SKU estándar y
dedicadas. No es necesario realizar ningún cambio de la cadena de conexión, ya que la conexión se realiza a través
de un alias.
Los siguientes términos se utilizan en este artículo:
Alias: el nombre para una configuración de recuperación ante desastres que ha configurado. El alias
proporciona una sola cadena de conexión estable de nombre de dominio completo (FQDN). Las
aplicaciones usan esta cadena de conexión de alias para conectarse a un espacio de nombres.
Espacio de nombres principal o secundario: los espacio de nombres que corresponden al alias. El espacio
de nombres principal está "activo" y recibe mensajes (puede ser un espacio de nombres existente o uno
nuevo). El espacio de nombres secundario es "pasivo" y no recibe mensajes. Los metadatos entre ambos
están sincronizados, por lo que ambos pueden aceptar sin problemas mensajes sin ningún cambio de
código de la aplicación o cadena de conexión. Para asegurarse de que solo el espacio de nombres activo
recibe mensajes, tiene que utilizar el alias.
Metadatos: entidades como centros de eventos y grupos de consumidores; y sus propiedades del servicio
que están asociadas con el espacio de nombres. Solo las entidades y sus valores se replican
automáticamente. No se replican los mensajes ni los eventos.
Conmutación por error: el proceso de activación del espacio de nombres secundario.

Pares de espacios de nombres admitidos


Se admiten las siguientes combinaciones de espacios de nombres principales y secundarios:

ESPA C IO DE N O M B RES P RIN C IPA L ESPA C IO DE N O M B RES SEC UN DA RIO C O M PAT IB L E

Estándar Estándar Sí

Estándar Dedicado Sí

Dedicado Dedicado Sí

Dedicado Estándar No

NOTE
No se pueden emparejar espacios de nombres que se encuentran en el mismo clúster dedicado. Puede emparejar espacios
de nombres que se encuentran en clústeres independientes.

Flujo de conmutación por error y configuración


La siguiente sección contiene información general del proceso de conmutación por error y explica cómo
configurar la conmutación por error inicial.

Configurar
En primer lugar cree un espacio de nombres principal o use uno ya existente, y un nuevo espacio de nombres
secundario, luego emparéjelos. Este emparejamiento le proporciona un alias que puede usar para conectarse. Al
usar un alias, no es necesario que cambie las cadenas de conexión. Solo pueden agregarse nuevos espacios de
nombres al emparejamiento de la conmutación por error. Por último, debe agregar alguna supervisión para
detectar si es necesario realizar una conmutación por error. En la mayoría de los casos, el servicio forma parte de
un ecosistema mayor, por lo que las conmutaciones por error automáticas raramente son posibles, ya que, a
menudo, las conmutaciones por error tienen que realizarse en sincronía con el subsistema o infraestructura
restantes.
Ejemplo
En un ejemplo de este escenario, se considera una solución de punto de venta (POS) que emite mensajes o
eventos. Event Hubs pasa esos eventos a alguna solución de asignación o formato, que reenvía los datos
asignados a otros sistema para continuar el procesamiento. En ese momento, todos estos sistemas se pueden
hospedar en la misma región de Azure. La decisión sobre cuándo y en qué parte se realizará la conmutación por
error depende del flujo de datos en su infraestructura.
Puede automatizar la conmutación por error con la supervisión de sistemas, o con soluciones de supervisión
personalizadas. Sin embargo, dicha automatización necesita planeamiento y trabajo extra que se encuentran fuera
del ámbito de este artículo.
Flujo de conmutación por error
Si inicia la conmutación por error, se requieren dos pasos:
1. En caso de otra interrupción, tiene que poder volver a realizar la conmutación por error. Por lo tanto,
configure un segundo espacio de nombres pasivo y actualice el emparejamiento.
2. Extraiga mensajes del anterior espacio de nombres primario una vez que vuelva a estar disponible.
Después de eso, utilice ese espacio de nombres para la mensajería regular fuera de la configuración de
recuperación con localización geográfica, o elimine el espacio de nombres principal antiguo.

NOTE
Se admite solo la semántica de conmutación de reenvío. En este escenario, se realiza la conmutación por error y, a
continuación, se vuelve a emparejar con un nuevo espacio de nombres. No se admite la conmutación por recuperación, por
ejemplo en un clúster de SQL.

Administración
Si ha cometido algún error; por ejemplo, ha emparejado regiones incorrectas durante la configuración inicial,
puede interrumpir el emparejamiento de los dos espacios de nombres en cualquier momento. Si desea usar los
espacios de nombres emparejados como espacios de nombres normales, elimine el alias.

Ejemplos
En el ejemplo de GitHub se muestra cómo configurar e iniciar una conmutación por error. En este ejemplo se
demuestran los siguientes conceptos:
La configuración necesaria en Azure Active Directory para usar Azure Resource Manager con Event Hubs.
Pasos necesarios para ejecutar el código de ejemplo.
Envío y recepción desde el espacio de nombres principal actual.

Consideraciones
Tenga en cuenta y recuerde las siguientes consideraciones para esta versión:
1. Por motivos de diseño, la recuperación ante desastres geográfica de Event Hubs no replica datos y, por lo tanto,
no se puede volver a usar el valor de desplazamiento anterior del centro de eventos principal en el centro de
eventos secundario. Se recomienda reiniciar el receptor de eventos con uno de los siguientes métodos:
EventPosition.FromStart() : si quiere leer todos los datos en el centro de eventos secundario.
EventPosition.FromEnd() : si quiere leer todos los datos nuevos desde el momento de conexión con el centro de
eventos secundario.
EventPosition.FromEnqueuedTime(dateTime) : si quiere leer todos los datos recibidos en el centro de eventos
secundario a partir de una hora y fecha determinadas.
2. En el planeamiento de la conmutación por error, también debe considerar el factor de tiempo. Por ejemplo,
si se pierde la conectividad durante más de 15 a 20 minutos, puede decidir iniciar la conmutación por error.
3. El hecho de que no se replican datos significa que las sesiones activas en la actualidad no se replican.
Además, la detección de duplicados y mensajes programados puede no funcionar. Funcionarán las nuevas
sesiones, los mensajes programados y los duplicados nuevos.
4. Conmutar por error una compleja infraestructura distribuida debe ensayarse al menos una vez.
5. La sincronización de entidades puede tardar algún tiempo, aproximadamente 50-100 entidades por
minuto.

Zonas de disponibilidad
La SKU de Event Hubs estándar es compatible con Availability Zones, lo que proporciona ubicaciones con
aislamiento de errores dentro de una región de Azure.

NOTE
La compatibilidad de Availability Zones con Azure Event Hubs estándar solo está disponible en aquellas regiones de Azure
en las que hay zonas de disponibilidad.

Solo puede habilitar Availability Zones en los espacios de nombres nuevos mediante Azure Portal. Event Hubs no
admite la migración de espacios de nombres existentes. No se puede deshabilitar la redundancia de zona después
de habilitarla en el espacio de nombres.
Puntos de conexión privados
En esta sección se proporcionan consideraciones adicionales cuando se usa la recuperación ante desastres
geográfica con espacios de nombres que usan puntos de conexión privados. Para obtener información sobre el
uso de puntos de conexión privados con Event Hubs en general, consulte Configuración de puntos de conexión
privados.
Nuevos emparejamientos
Si intenta crear un emparejamiento entre un espacio de nombres primario con un punto de conexión privado y un
espacio de nombres secundario sin un punto de conexión privado, se producirá un error. El emparejamiento solo
se realizará correctamente si los espacios de nombres primario y secundario tienen puntos de conexión privados.
Se recomienda utilizar las mismas configuraciones en los espacios de nombres principal y secundario y en las
redes virtuales en las que se creen los puntos de conexión privados.

NOTE
Al intentar emparejar el espacio de nombres principal con un punto de conexión privado y un espacio de nombres
secundario, el proceso de validación solo comprueba si existe un punto de conexión privado en el espacio de nombres
secundario. No comprueba si el punto de conexión funciona ahora o funcionará después de la conmutación por error. Es su
responsabilidad asegurarse de que el espacio de nombres secundario con el punto de conexión privado funcionará según lo
esperado después de la conmutación por error.
Para probar que las configuraciones de punto de conexión privado son iguales en los espacios de nombres primario y
secundario, envíe una solicitud de lectura (por ejemplo: Get Event Hub) al espacio de nombres secundario desde fuera de la
red virtual y compruebe que recibe un mensaje de error del servicio.

Emparejamientos existentes
Si ya existe un emparejamiento entre el espacio de nombres primario y el secundario, se producirá un error en la
creación del punto de conexión privado en el espacio de nombres primario. Para resolverlo, cree primero un
punto de conexión privado en el espacio de nombres secundario y, a continuación, cree uno para el espacio de
nombres primario.
NOTE
Aunque se permite el acceso de solo lectura al espacio de nombres secundario, no se permiten las actualizaciones de las
configuraciones de punto de conexión privado.

Configuración recomendada
Al crear una configuración de recuperación ante desastres para la aplicación y los espacios de nombres de Event
Hubs, debe crear puntos de conexión privados para los espacios de nombres de Event Hubs primario y secundario
en las redes virtuales que hospeden las instancias primarias y secundarias de la aplicación.
Supongamos que tiene dos redes virtuales, VNET-1 y VNET-2, y estos espacios de nombres primario y secundario:
EventHubs-Namespace1-Primary, EventHubs-Namespace2-Secondary. Debe seguir estos pasos:
En EventHubs-Namespace1-Primary, cree dos puntos de conexión privados que usen subredes de VNET-1 y
VNET-2.
En EventHubs-Namespace2-Secondary, cree dos puntos de conexión privados que usen las mismas subredes
de VNET-1 y VNET-2.

La ventaja de este enfoque es que la conmutación por error puede producirse en el nivel de aplicación
independiente del espacio de nombres de Event Hubs. Considere los casos siguientes:
Conmutación por error solo de la aplicación: En este caso, la aplicación no existirá en VNET-1, sino que se
moverá a VNET-2. Como ambos puntos de conexión privados están configurados tanto en VNET-1 como en
VNET-2 para los espacios de nombres primario y secundario, la aplicación funcionará.
Conmutación por error solo del espacio de nombres de Event Hubs : en este caso, dado que los dos
puntos de conexión privados están configurados en ambas redes virtuales para los espacios de nombres primario
y secundario, la aplicación funcionará.

NOTE
Para obtener instrucciones sobre la recuperación ante desastres con localización geográfica de una red virtual, consulte
Virtual Network: continuidad del negocio.

Pasos siguientes
El ejemplo en GitHub le guía a través de un flujo de trabajo simple que crea un emparejamiento geográfico e
inicia una conmutación por error para un escenario de recuperación ante desastres.
La referencia de la API de REST describe las API para llevar a cabo la configuración de recuperación de
desastres con localización geográfica.
Para obtener más información acerca de Event Hubs, visite los vínculos siguientes:
Introducción a Event Hubs
.NET Core
Java
Python
JavaScript
Preguntas más frecuentes sobre Event Hubs
Aplicaciones de ejemplo que usan Event Hubs
Autorización del acceso a Azure Event Hubs
18/08/2020 • 4 minutes to read • Edit Online

Cada vez que se publican o consumen eventos o datos de un centro de eventos, el cliente intenta obtener acceso a
recursos de Event Hubs. Todas las solicitudes a un recurso seguro deben estar autorizadas para que el servicio
pueda garantizar que el cliente tenga los permisos necesarios para publicar o consumir los datos.
Azure Event Hubs ofrece las siguientes opciones para autorizar el acceso a los recursos seguros:
Azure Active Directory
Firma de acceso compartido

NOTE
Este artículo se aplica a los escenarios de Event Hubs y Apache Kafka.

Azure Active Directory


La integración de Azure Active Directory (Azure AD) para recursos de Event Hubs proporciona control de acceso
basado en rol (RBAC) para un control específico de acceso de los clientes a los recursos. Puede usar el control de
acceso basado en rol (RBAC) para conceder permisos a una entidad de seguridad, que puede ser un usuario, un
grupo o una entidad de servicio de aplicación. Azure AD autentica la entidad de seguridad para devolver un token
de OAuth 2.0. El token se puede usar a fin de autorizar una solicitud para acceder a un recurso de Event Hubs.
Consulte los siguientes artículos para más información sobre la autenticación con Azure AD:
Autenticación de solicitudes para Azure Event Hubs mediante Azure Active Directory
Autorización del acceso a recursos de Event Hubs mediante Azure Active Directory

Firmas de acceso compartido


Las firmas de acceso compartido (SAS) para recursos de Event Hubs proporcionan un acceso delegado limitado a
recursos de Event Hubs. Agregar restricciones al período de validez de la firma o a los permisos que concede
proporciona flexibilidad para administrar los recursos. Para más información, consulte Autenticación de firmas de
acceso compartido (SAS).
La autorización de usuarios o aplicaciones mediante un token de OAuth 2.0 devuelto por Azure AD proporciona
una seguridad superior y facilidad de uso sobre las firmas de acceso compartido (SAS). Con Azure AD, no hay
necesidad de almacenar tokens de acceso con su código y arriesgarse a posibles puntos vulnerables de seguridad.
Aunque puede seguir usando firmas de acceso compartido (SAS) para conceder acceso específico a los recursos de
Event Hubs, Azure AD ofrece funcionalidades similares sin necesidad de administrar tokens de SAS ni preocuparse
sobre cómo revocar una SAS en peligro.
De forma predeterminada, todos los recursos de Event Hubs están protegidos y solo están disponibles para el
propietario de la cuenta. No obstante, puede usar cualquiera de las estrategias de autorización descritas
anteriormente para conceder a los clientes acceso a recursos de Event Hubs. Microsoft recomienda usar Azure AD
siempre que sea posible para una mayor seguridad y facilidad de uso.
Para más información sobre la autorización mediante SAS, consulte Autorización del acceso a recursos de Event
Hubs mediante firmas de acceso compartido.
Pasos siguientes
Revise los ejemplos de RBAC publicados en nuestro repositorio de GitHub.
Vea los artículos siguientes:
Autenticación de solicitudes a Azure Event Hubs desde una aplicación mediante Azure Active Directory
Autenticación de una identidad administrada con Azure Active Directory para acceder a recursos de
Event Hubs
Autenticación de solicitudes para Azure Event Hubs mediante firmas de acceso compartido
Autorización del acceso a recursos de Event Hubs mediante Azure Active Directory
Autorización del acceso a recursos de Event Hubs mediante firmas de acceso compartido
Autorización del acceso a recursos de Event Hubs
mediante Azure Active Directory
18/08/2020 • 9 minutes to read • Edit Online

Azure Event Hubs admite la autorización de solicitudes a recursos de Event Hubs mediante
Azure Active Directory (Azure AD). Con Azure AD, puede usar el control de acceso basado en rol (RBAC) para
conceder permisos a una entidad de seguridad, que puede ser un usuario o una entidad de servicio de
aplicación. Para más información sobre los roles y las asignaciones de roles, consulte Descripción de los
distintos roles.

Información general
Cuando una entidad de seguridad (un usuario o una aplicación) intenta acceder a un recurso de Event Hubs, la
solicitud debe estar autorizada. Con Azure AD, el acceso a un recurso es un proceso de dos pasos.
1. En primer lugar, se autentica la identidad de la entidad de seguridad y se devuelve un token de OAuth 2.0. El
nombre del recurso para solicitar un token es https://eventhubs.azure.net/ . En el caso de los clientes de
Kafka, el recurso para solicitar un token es https://<namespace>.servicebus.windows.net .
2. Luego, el token se pasa como parte de una solicitud al servicio Event Hubs para autorizar el acceso al recurso
especificado.
El paso de autenticación exige que una solicitud de aplicación contenga un token de acceso de OAuth 2.0 en
tiempo de ejecución. Si una aplicación se está ejecutando dentro de una entidad de Azure, como puede ser una
máquina virtual de Azure, un conjunto de escalado de máquinas virtuales o una aplicación de Azure Functions,
puede usar una identidad administrada para acceder a los recursos. Para más información sobre cómo
autenticar solicitudes realizadas por una identidad administrada al servicio Event Hubs, vea Autenticación del
acceso a recursos de Azure Event Hubs con Azure Active Directory e identidades administradas para recursos de
Azure.
El paso de autorización exige que se asignen uno o varios roles RBAC a la entidad de seguridad. Azure Event
Hubs proporciona roles RBAC que abarcan conjuntos de permisos para recursos de Event Hubs. Los roles que se
asignan a una entidad de seguridad determinan los permisos que tiene esa entidad de seguridad. Para más
información sobre los roles RBAC, consulte Roles integrados de Azure para Azure Event Hubs.
Las aplicaciones nativas y las aplicaciones web que realizan solicitudes a Event Hubs también pueden autorizar
con Azure AD. Para obtener información sobre cómo solicitar un token de acceso y usarlo para autorizar
solicitudes para recursos de Event Hubs, vea Autenticación del acceso a Azure Event Hubs con Azure AD desde
una aplicación.

Asignación de roles RBAC para derechos de acceso


Azure Active Directory (Azure AD) autoriza derechos de acceso a los recursos protegidos mediante el control de
acceso basado en rol (RBAC). Azure Event Hubs define un conjunto de roles integrados de Azure que abarcan
conjuntos de permisos comunes utilizados para acceder a los datos del centro de eventos y también puede
definir roles personalizados para acceder a los datos.
Cuando un rol RBAC se asigna a una entidad de seguridad de Azure AD, Azure concede acceso a esos recursos a
esa entidad de seguridad. El acceso puede tener como ámbito el nivel de suscripción, el grupo de recursos, el
espacio de nombres de Event Hubs o cualquier recurso que haya en él. Una entidad de seguridad de Azure AD
puede ser un usuario, una entidad de servicio de aplicación o una identidad de servicio administrada para
recursos de Azure.

Roles integrados de Azure para Azure Event Hubs


Azure proporciona los siguientes roles integrados de Azure para autorizar el acceso a datos de Event Hubs con
Azure AD y OAuth:
Propietario de los datos de Azure Event Hubs: use este rol para proporcionar acceso completo a los recursos
de Event Hubs.
Emisor de datos de Azure Event Hubs: use este rol para proporcionar acceso de emisión a los recursos de
Event Hubs.
Receptor de datos de Azure Event Hubs: use este rol para proporcionar acceso de consumo/recepción a los
recursos de Event Hubs.

Ámbito de recursos
Antes de asignar un rol RBAC a una entidad de seguridad, determine el ámbito de acceso que debería tener la
entidad de seguridad. Los procedimientos recomendados dictan que siempre es mejor conceder únicamente el
ámbito más restringido posible.
En la lista siguiente se describen los niveles en los que puede definir el ámbito de acceso a recursos de Event
Hubs, empezando por el ámbito más restringido:
Grupo de consumidores : en este ámbito, la asignación de roles solo se aplica a esta entidad. Actualmente,
Azure Portal no admite la asignación de un rol RBAC a una entidad de seguridad en este nivel.
Centro de eventos: la asignación de roles se aplica a la entidad de Event Hubs y al grupo de consumidores
que hay en ella.
Espacio de nombres : la asignación de roles abarca toda la topología de Event Hubs en el espacio de
nombres y el grupo de consumidores que tiene asociado.
Grupo de recursos : la asignación de roles se aplica a todos los recursos de Event Hubs del grupo de
recursos.
Suscripción : la asignación de roles se aplica a todos los recursos de Event Hubs de todos los grupos de
recursos de la suscripción.

NOTE
Tenga en cuenta que las asignaciones de roles RBAC pueden tardar hasta cinco minutos en propagarse.
Este contenido se aplica a Event Hubs y a Event Hubs para Apache Kafka. Para más información sobre la compatibilidad
con Event Hubs para Kafka, consulte Event Hubs para Kafka: seguridad y autenticación.

Para más información sobre cómo se definen los roles integrados, consulte Descripción de definiciones de roles.
Para más información acerca de la creación de roles personalizados de Azure, consulte Roles personalizados de
Azure.

Ejemplos
Ejemplos de Microsoft.Azure.EventHubs.
En estos ejemplos se usa la biblioteca anterior Microsoft.Azure.EventHubs , pero se puede actualizar
fácilmente para usar la biblioteca Azure.Messaging.EventHubs más reciente. Para que los ejemplos
usen la biblioteca nueva en lugar de la anterior, consulte la Guía para migrar de
Microsoft.Azure.EventHubs a Azure.Messaging.EventHubs.
Ejemplos de Azure.Messaging.EventHubs
Este ejemplo se ha actualizado para usar la biblioteca Azure.Messaging.EventHubs más reciente.
Event Hubs para Kafka: ejemplos de OAuth.

Pasos siguientes
Para obtener información sobre cómo asignar un rol RBAC integrado a una entidad de seguridad, consulte
Autenticación del acceso a recursos de Event Hubs mediante Azure Active Directory.
Obtenga información sobre cómo crear roles personalizados con RBAC.
Obtenga información sobre cómo usar Azure Active Directory con EH.
Consulte los artículos relacionados siguientes:
Autenticación de solicitudes a Azure Event Hubs desde una aplicación mediante Azure Active Directory
Autenticación de una identidad administrada con Azure Active Directory para acceder a recursos de Event
Hubs
Autenticación de solicitudes para Azure Event Hubs mediante firmas de acceso compartido
Autorización del acceso a recursos de Event Hubs mediante firmas de acceso compartido
Autorización del acceso a recursos de Event Hubs
mediante firmas de acceso compartido
18/08/2020 • 15 minutes to read • Edit Online

Una firma de acceso compartido (SAS) le proporciona una manera de conceder acceso limitado a los recursos en
el espacio de nombres de Event Hubs. La firma de acceso compartido protege el acceso a los recursos de Event
Hubs en función de las reglas de autorización. Estas reglas se configuran en un espacio de nombres o en una
entidad (centro de eventos o tema). En este artículo se proporciona información general sobre el modelo SAS y
se revisan los procedimientos recomendados de SAS.

¿Qué son las firmas de acceso compartido?


Una firma de acceso compartido (SAS) proporciona acceso delegado a los recursos de Event Hubs en función de
las reglas de autorización. Una regla de autorización tiene un nombre, se asocia con unos derechos específicos e
incluye un par de claves criptográficas. Para generar tokens de SAS, debe usar el nombre y la clave de la regla a
través de los clientes de Event Hubs o en su propio código. A continuación, el cliente puede pasar el token a Event
Hubs para demostrar la autorización para la operación solicitada.
La firma de acceso compartido es un mecanismo de autorización basado en notificaciones que utiliza tokens
simples. Si utiliza SAS, las claves nunca se pasan en la conexión. Las claves se utilizan para firmar
criptográficamente información que más adelante pueda verificar el servicio. El uso de SAS es similar a un
esquema de nombre de usuario y contraseña donde el cliente está en posesión inmediata de un nombre de regla
de autorización y una clave coincidente. SAS puede utilizarse de manera similar a un modelo de seguridad
federado, donde el cliente recibe un token de acceso firmado y de tiempo limitado de un servicio de token de
seguridad sin poseer en ningún momento la clave de firma.

NOTE
Azure Event Hubs admite la autorización de los recursos de Event Hubs mediante Azure Active Directory (Azure AD). La
autorización de usuarios o aplicaciones mediante un token de OAuth 2.0 devuelto por Azure AD proporciona una
seguridad superior y facilidad de uso sobre las firmas de acceso compartido (SAS). Con Azure AD, no hay ninguna
necesidad de almacenar los tokens en su código y arriesgarse a posibles vulnerabilidades de seguridad.
Microsoft recomienda usar Azure AD con las aplicaciones de Azure Event Hubs cuando sea posible. Para más información,
consulte Autenticación del acceso al recurso de Azure Event Hubs con Azure Active Directory.

IMPORTANT
Los tokens de SAS (firmas de acceso compartido) son fundamentales para proteger los recursos. A la vez que proporciona
granularidad, SAS concede a los clientes acceso a los recursos de Event Hubs. No se deben compartir públicamente. Si
resulta necesario compartirla para solucionar problemas, considere la posibilidad de usar una versión reducida de los
archivos de registro o eliminar los tokens de SAS (si existen) de dichos archivos, y asegúrese de que las capturas de pantalla
tampoco incluyan información de SAS.

Directivas de autorización de acceso compartido


Cada espacio de nombres y entidad de Event Hubs (una instancia de centro de eventos o un tema de Kafka) tiene
una directiva de autorización de acceso compartido que se compone de reglas. La directiva a nivel de espacio de
nombres se aplica a todas las entidades del espacio de nombres, independientemente de su configuración de
directiva individual. Para cada regla de directiva de autorización, decida tres tipos de información: nombre,
ámbito y derechos. El nombre es un nombre único en ese ámbito. El ámbito es el URI del recurso en cuestión.
Para un espacio de nombres de Event Hubs, el ámbito es el nombre de dominio completo (FQDN), como
https://<yournamespace>.servicebus.windows.net/ .

Los derechos proporcionados por la regla de directiva pueden ser una combinación de:
Enviar : otorga el derecho a enviar mensajes a la entidad.
Escuchar : otorga el derecho a escuchar o recibir a la entidad.
Administrar : otorga el derecho a administrar la topología del espacio de nombres, incluidas la creación y la
eliminación de entidades.

NOTE
El derecho Administrar incluye los derechos Enviar y Escuchar .

Una directiva de espacio de nombres o entidad puede contener hasta 12 reglas de autorización de acceso
compartido, lo que proporciona espacio para tres conjuntos de reglas, y cada una de ellas cubre los derechos
básicos y la combinación de Enviar y Escuchar. Este límite subraya que el almacén de directivas de SAS no
pretende ser un almacén de la cuenta de usuario o servicio. Si la aplicación necesita conceder acceso a Event
Hubs en función de las identidades de usuario o servicio, debe implementar un servicio de token de seguridad
que emita tokens de SAS después de una comprobación de acceso y autenticación.
A la regla de autorización se le asigna una clave principal y una clave secundaria . Estas claves son claves de
alta seguridad criptográfica. No las pierda ni las filtre. Siempre estarán disponibles en Azure Portal. Puede usar
cualquiera de las claves generadas y regenerarlas en cualquier momento. Si vuelve a generar o cambia una clave
en la directiva, todos los tokens emitidos previamente en base a esa clave dejan de ser válidos inmediatamente.
Sin embargo, las conexiones continuas creadas de acuerdo con esos tokens seguirán funcionando hasta que el
token expire.
Cuando se crea un espacio de nombres de Event Hubs, se crea automáticamente una regla de directiva
denominada RootManageSharedAccessKey para el espacio de nombres. Esta directiva tiene permisos de
administración para todo el espacio de nombres. Se recomienda tratar esta regla como una cuenta raíz
administrativa, así que no la use en la aplicación. Puede crear reglas de directivas adicionales en la pestaña
Configurar para el espacio de nombres en el portal, a través de PowerShell o la CLI de Azure.

Procedimientos recomendados al usar SAS


Cuando use firmas de acceso compartido en sus aplicaciones, debe tener en cuenta dos posibles riesgos:
Si se filtró una SAS, cualquier persona que la consiga puede usarla, lo que puede poner en riesgo sus recursos
de Event Hubs.
Si una SAS proporcionada para una aplicación cliente expira y la aplicación no puede recuperar una nueva
SAS del servicio y, luego, la funcionalidad de la aplicación puede verse afectada.
Las siguientes recomendaciones para el uso de firmas de acceso compartido pueden ayudar a mitigar estos
riesgos:
Haga que los clientes renueven automáticamente la SAS si fuese necesario : los clientes deben
renovar la SAS correctamente antes de la expiración para que exista tiempo para los reintentos si el servicio
que ofrece la SAS no está disponible. Si la SAS se ha creado para usarse en un número reducido de
operaciones de corta duración e inmediatas, que se espera que se va a completar dentro del tiempo de
expiración determinado, es posible que no sea necesario ese procedimiento, ya que no se espera que la SAS
se renueve. Sin embargo, si dispone de un cliente que realice solicitudes de forma rutinaria a través de la SAS,
existe la posibilidad de la expiración. La consideración clave es equilibrar la necesidad de que la SAS sea de
corta duración (como se indicó anteriormente) con el requisito de garantizar que el cliente solicitan la
renovación con la suficiente antelación como para evitar la interrupción debida a la expiración de SAS antes
de una renovación correcta.
Tenga cuidado con la hora de inicio de la SAS : si establece la hora de inicio de la SAS en now , pueden
producirse errores intermitentes durante los primeros minutos debido al desplazamiento del reloj (diferencias
en la hora actual según las distintas máquinas). En general, establezca la hora de inicio sea al menos 15
minutos en el pasado. O, no establezca esta opción en absoluto, lo que hará que sea válido inmediatamente en
todos los casos. Lo mismo suele aplicarse también a la hora de expiración. Recuerde que es posible observar
hasta 15 minutos de distorsión del reloj en cualquier dirección en cualquier solicitud.
Sea específico con el recurso al que se va a tener acceso : un procedimiento recomendado de
seguridad es proporcionar al usuario los privilegios mínimos necesarios. Si un usuario solo necesita acceso de
lectura en una única entidad, concédale acceso de lectura a esa única entidad y no acceso de lectura, escritura
o eliminación a todas las entidades. También ayuda a reducir los daños si se pone en peligro una SAS porque
la SAS tiene menos poder en manos de un atacante.
No use siempre la SAS : en algunas ocasiones, los riesgos asociados a una operación determinada en Event
Hubs superan a las ventajas del uso de la SAS. Para esas operaciones, cree un servicio de nivel intermedio que
escriba en la instancia de Event Hubs después de llevar a cabo una auditoría, autenticación o validación de la
regla de negocio.
Siempre use HTTPS : use siempre HTTPS para crear una SAS o distribuirla. Si se pasa una SAS a través de
HTTP y se intercepta, un atacante que realice un ataque de tipo "Man in the middle" puede leer la SAS y, luego,
usarla como lo podría hacer el usuario previsto. Esto puede poner en riesgo la información confidencial o
permitir que un usuario malintencionado provoque daños en los datos.

Conclusión
Las firmas de acceso compartido son útiles para proporcionar permisos limitados para los recursos de Event
Hubs a los clientes. Son parte fundamental del modelo de seguridad de cualquier aplicación que usa Azure Event
Hubs. Si sigue los procedimientos recomendados que se describen en este artículo, puede usar SAS para ofrecer
una mayor flexibilidad de acceso a los recursos sin que se ponga en riesgo la seguridad de la aplicación.

Pasos siguientes
Consulte los artículos relacionados siguientes:
Autenticación de solicitudes a Azure Event Hubs desde una aplicación mediante Azure Active Directory
Autenticación de una identidad administrada con Azure Active Directory para acceder a recursos de Event
Hubs
Autenticación de solicitudes para Azure Event Hubs mediante firmas de acceso compartido
Autorización del acceso a recursos de Event Hubs mediante Azure Active Directory
Autenticación de una identidad administrada con
Azure Active Directory para acceder a recursos de
Event Hubs
18/08/2020 • 11 minutes to read • Edit Online

Azure Event Hubs admite la autenticación de Azure Active Directory (Azure AD) con identidades administradas
para los recursos de Azure. Las identidades administradas para recursos de Azure pueden autorizar el acceso a
los recursos de Event Hubs con credenciales de Azure AD desde aplicaciones que se ejecutan en máquinas
virtuales (VM) de Azure, aplicaciones de función, conjuntos de escalado de máquinas virtuales y otros servicios.
Si usa identidades administradas para recursos de Azure junto con autenticación de Azure AD, puede evitar el
almacenamiento de credenciales con las aplicaciones que se ejecutan en la nube.
En este artículo se muestra cómo autorizar el acceso a un centro de eventos con una identidad administrada
desde una máquina virtual de Azure.

Habilitación de identidades administradas en una máquina virtual


Para poder usar identidades administradas para recursos de Azure a fin de autorizar los recursos de Event Hubs
desde la máquina virtual, primero debe habilitar las identidades administradas para los recursos de Azure en la
máquina virtual. Para aprender a habilitar las identidades administradas para los recursos de Azure, consulte uno
de estos artículos:
Azure Portal
Azure PowerShell
CLI de Azure
Plantilla de Azure Resource Manager
Bibliotecas cliente de Azure Resource Manager

Concesión de permisos a una identidad administrada en Azure AD


Para autorizar una solicitud al servicio Event Hubs desde una identidad administrada de la aplicación, primero
configure los valores del control de acceso basado en roles (RBAC) de esa identidad administrada. Azure Event
Hubs define los roles de Azure que abarcan los permisos para enviar y leer desde Event Hubs. Cuando el rol de
Azure se asigna a una identidad administrada, a esta se le concede acceso a los datos de Event Hubs en el ámbito
adecuado.
Para más información sobre la asignación de roles de Azure, consulte Autenticación con Azure Active Directory
para el acceso a recursos de Event Hubs.

Uso de Event Hubs con identidades administradas


Para usar Event Hubs con identidades administradas, debe asignar la identidad del rol y el ámbito adecuado. En el
procedimiento de esta sección se usa una aplicación sencilla que se ejecuta en una identidad administrada y
accede a los recursos de Event Hubs.
A continuación, usaremos una aplicación web de ejemplo hospedada en Azure App Service. Para instrucciones
paso a paso sobre cómo crear una aplicación web, consulte Creación de una aplicación web de ASP.NET Core en
Azure.
Una vez creada la aplicación, siga estos pasos:
1. Vaya a Configuración y seleccione Identidad .
2. Seleccione el Estado que va a estar Activado .
3. Seleccione Guardar para guardar la configuración.

Una vez habilitada esta configuración, se crea una identidad de servicio en Azure Active Directory (Azure AD) y se
configura en el host de App Service.
Ahora, asigne esta identidad de servicio a un rol en el ámbito requerido en los recursos de Event Hubs.
Para asignar roles de Azure mediante Azure Portal
Para asignar un rol a los recursos de Event Hubs, vaya a ese recurso en Azure Portal. Acceda a la configuración
Access Control (IAM) del recurso y siga estas instrucciones para administrar las asignaciones de roles:

NOTE
En los pasos siguientes se asigna un rol de identidad de servicio a los espacios de nombres de Event Hubs. Puede seguir los
mismos pasos para asignar un rol con ámbito a cualquier recurso de Event Hubs.

1. En Azure Portal, vaya al espacio de nombres de Event Hubs y muestre la información general del
espacio de nombres.
2. Seleccione Access Control (IAM) en el menú de la izquierda para mostrar la configuración de control de
acceso para el centro de eventos.
3. Seleccione la pestaña Asignaciones de roles para ver la lista de asignaciones de roles.
4. Seleccione Agregar para agregar un rol nuevo.
5. En la página Agregar asignación de roles , seleccione los roles de Event Hubs que quiere asignar. A
continuación, busque la identidad del servicio que ha registrado para asignar el rol.
6. Seleccione Guardar . La identidad a la que ha asignado el rol aparece enumerada debajo de ese rol. Por
ejemplo, la siguiente imagen muestra que la identidad del servicio tiene al propietario de los datos de
Event Hubs.

Una vez que haya asignado el rol, la aplicación web tendrá acceso a los recursos de Event Hubs en el ámbito
definido.
Prueba de la aplicación web
1. Cree un espacio de nombres de Event Hubs y un centro de eventos.
2. Implemente la aplicación web en Azure. Vea la siguiente sección con pestañas para obtener vínculos a la
aplicación web en GitHub.
3. Asegúrese de que SendReceive.aspx esté establecido como documento predeterminado de la aplicación web.
4. Habilite una identidad para la aplicación web.
5. Asigne esta identidad al rol Propietario de datos de Event Hubs en el nivel del espacio de nombres o en el
del centro de eventos.
6. Ejecute la aplicación web, escriba los nombres del espacio de nombres y del centro de eventos y un mensaje y
seleccione Enviar . Para recibir el evento, seleccione Recibir .
Azure.Messaging.EventHubs (más reciente)
Microsoft.Azure.EventHubs (heredado)
Ahora puede iniciar la aplicación web y apuntar el explorador a la página aspx de ejemplo. Puede encontrar la
aplicación web de ejemplo que envía y recibe datos de los recursos de Event Hubs en el repositorio de GitHub.
Instale el paquete más reciente de NuGet y empiece a enviar eventos a Event Hubs con
EventHubProducerClient y a recibirlos con EventHubConsumerClient .
NOTE
Para ver un ejemplo de Java que usa una identidad administrada para publicar eventos en un centro de eventos, consulte la
publicación de eventos con in ejemplo de identidad de Azure en GitHub.

protected async void btnSend_Click(object sender, EventArgs e)


{
await using (EventHubProducerClient producerClient = new EventHubProducerClient(txtNamespace.Text,
txtEventHub.Text, new DefaultAzureCredential()))
{
// create a batch
using (EventDataBatch eventBatch = await producerClient.CreateBatchAsync())
{

// add events to the batch. only one in this case.


eventBatch.TryAdd(new EventData(Encoding.UTF8.GetBytes(txtData.Text)));

// send the batch to the event hub


await producerClient.SendAsync(eventBatch);
}

txtOutput.Text = $"{DateTime.Now} - SENT{Environment.NewLine}{txtOutput.Text}";


}
}
protected async void btnReceive_Click(object sender, EventArgs e)
{
await using (var consumerClient = new
EventHubConsumerClient(EventHubConsumerClient.DefaultConsumerGroupName, $"
{txtNamespace.Text}.servicebus.windows.net", txtEventHub.Text, new DefaultAzureCredential()))
{
int eventsRead = 0;
try
{
using CancellationTokenSource cancellationSource = new CancellationTokenSource();
cancellationSource.CancelAfter(TimeSpan.FromSeconds(5));

await foreach (PartitionEvent partitionEvent in


consumerClient.ReadEventsAsync(cancellationSource.Token))
{
txtOutput.Text = $"Event Read: { Encoding.UTF8.GetString(partitionEvent.Data.Body.ToArray())
}{ Environment.NewLine}" + txtOutput.Text;
eventsRead++;
}
}
catch (TaskCanceledException ex)
{
txtOutput.Text = $"Number of events read: {eventsRead}{ Environment.NewLine}" + txtOutput.Text;
}
}
}

Event Hubs para Kafka


Puede usar aplicaciones de Apache Kafka para enviar y recibir mensajes en Azure Event Hubs mediante la
autorización OAuth de identidad administrada. Consulte el siguiente ejemplo en GitHub: Event Hubs para Kafka:
envío y recepción de mensajes mediante la autorización OAuth de identidad administrada.

Ejemplos
Ejemplos de Azure.Messaging.EventHubs
.NET
Java
Ejemplos de Microsoft.Azure.EventHubs.
En estos ejemplos se usa la biblioteca anterior Microsoft.Azure.EventHubs , pero se puede actualizar
fácilmente para usar la biblioteca Azure.Messaging.EventHubs más reciente. Para que los ejemplos
usen la biblioteca nueva en lugar de la anterior, consulte la Guía para migrar de Microsoft.Azure.EventHubs
a Azure.Messaging.EventHubs. Este ejemplo se ha actualizado para usar la biblioteca
Azure.Messaging.EventHubs más reciente.
Event Hubs para Kafka: envío y recepción de mensajes mediante la autorización OAuth de identidad
administrada

Pasos siguientes
Consulte el artículo siguiente para información sobre las identidades administradas para los recursos de
Azure: ¿Qué son las identidades administradas de los recursos de Azure?
Consulte los artículos relacionados siguientes:
Autenticación de solicitudes a Azure Event Hubs desde una aplicación mediante Azure Active Directory
Autenticación de solicitudes para Azure Event Hubs mediante firmas de acceso compartido
Autorización del acceso a recursos de Event Hubs mediante Azure Active Directory
Autorización del acceso a recursos de Event Hubs mediante firmas de acceso compartido
Autenticación de una aplicación con
Azure Active Directory para acceder a recursos de
Event Hubs
18/08/2020 • 14 minutes to read • Edit Online

Microsoft Azure proporciona una administración integrada del control de acceso para recursos y aplicaciones
basados en Azure Active Directory (Azure AD). Una ventaja clave de usar Azure AD con Azure Event Hubs es que
ya no es necesario almacenar las credenciales en el código. En su lugar, puede solicitar un token de acceso de
OAuth 2.0 desde la Plataforma de identidad de Microsoft. El nombre del recurso para solicitar un token es
https://eventhubs.azure.net/ (para los clientes de Kafka, el recurso para solicitar un token es
https://<namespace>.servicebus.windows.net ). Azure AD autentica la entidad de seguridad (un usuario, grupo o
entidad de servicio) ejecutando la aplicación. Si la autenticación se realiza correctamente, Azure AD devuelve un
token de acceso a la aplicación y la aplicación puede entonces usar el token de acceso para autorizar una
solicitud de los recursos de Azure Event Hubs.
Cuando un rol se asigna a una entidad de seguridad de Azure AD, Azure concede acceso a esos recursos a esa
entidad de seguridad. El acceso puede tener como ámbito el nivel de suscripción, el grupo de recursos, el
espacio de nombres de Event Hubs o cualquier recurso que haya en él. Una entidad de seguridad de Azure AD
puede asignar roles a un usuario, un grupo, una entidad de servicio de aplicación o una identidad administrada
para recursos de Azure.

NOTE
Una definición de roles es una colección de permisos. El control de acceso basado en rol (RBAC) controla cómo se aplican
estos permisos a través de la asignación de roles. Una asignación de roles consta de tres elementos: entidad de seguridad,
definición de rol y ámbito. Para más información, consulte Descripción de los distintos roles.

Roles integrados de Azure Event Hubs


Azure proporciona los siguientes roles integrados de Azure para autorizar el acceso a datos de Event Hubs con
Azure AD y OAuth:
Propietario de los datos de Azure Event Hubs: use este rol para proporcionar acceso completo a los recursos
de Event Hubs.
Emisor de datos de Azure Event Hubs: use este rol para proporcionar acceso de envío a los recursos de Event
Hubs.
Receptor de datos de Azure Event Hubs: use este rol para proporcionar acceso de recepción a los recursos de
Event Hubs.

IMPORTANT
Nuestra versión preliminar permite agregar privilegios de acceso a datos de Event Hubs al rol Propietario o Colaborador,
pero los privilegios de acceso a datos de los roles Propietario y Colaborador ya no están en vigor. Si está usando el rol
Propietario o Colaborador, cambie al rol Propietario de los datos de Azure Event Hubs.

Asignación de roles de Azure mediante Azure Portal


Para más información sobre cómo administrar el acceso a los recursos de Azure con RBAC y Azure Portal,
consulte este artículo.
Después de determinar el ámbito adecuado de una asignación de roles, vaya a ese recurso en Azure Portal.
Acceda a la configuración Control de acceso (IAM) del recurso y siga estas instrucciones para administrar las
asignaciones de roles:

NOTE
Los pasos que se describen a continuación asignan un rol al centro de eventos en los espacios de nombres de Event Hubs,
pero puede seguir los mismos pasos para asignar un rol con ámbito a cualquier recurso de Event Hubs.

1. En Azure Portal, vaya al espacio de nombres de Event Hubs.


2. En la página Información general , seleccione el centro de eventos para el que desea asignar un rol.

3. Seleccione Access Control (IAM) para mostrar la configuración del control de acceso del centro de
eventos.
4. Seleccione la pestaña Asignaciones de roles para ver la lista de asignaciones de roles. Seleccione el
botón Agregar de la barra de herramientas y luego seleccione Agregar asignación de roles .
5. En la página Agregar asignación de roles , siga estos pasos:
a. Seleccione el rol Event Hubs que quiere asignar.
b. Realice una búsqueda para localizar la entidad de seguridad (usuario, grupo, entidad de
servicio) a la que quiere asignar el rol.
c. Seleccione Guardar para guardar la asignación de roles.

d. La identidad a la que ha asignado el rol aparece enumerada debajo de ese rol. Por ejemplo, en la
imagen siguiente se muestra que Azure-users está en el rol Propietario de los datos de Azure Event
Hubs.
Puede realizar este mismo procedimiento para asignar un rol que tenga como ámbito un espacio de nombre de
Event Hubs, un grupo de recursos o una suscripción. Una vez que defina el rol y su ámbito, puede probar este
comportamiento con ejemplos en esta ubicación de GitHub.

Autenticación desde una aplicación


Una ventaja clave del uso de Azure AD con Event Hubs es que ya no necesita almacenar las credenciales en el
código. En su lugar, puede solicitar un token de acceso de OAuth 2.0 desde la Plataforma de identidad de
Microsoft. Azure AD autentica la entidad de seguridad (un usuario, grupo o entidad de servicio) ejecutando la
aplicación. Si la autenticación se realiza correctamente, Azure AD devuelve el token de acceso a la aplicación y la
aplicación puede entonces usar el token de acceso para autorizar las solicitudes de Azure Event Hubs.
En las secciones siguientes se muestra cómo configurar su aplicación web o aplicación nativa para la
autenticación con la Plataforma de identidad de Microsoft 2.0. Para obtener más información sobre la
Plataforma de identidad de Microsoft 2.0, consulte la Introducción a la Plataforma de identidad de Microsoft
(v2.0).
Para información general sobre el flujo de concesión de código OAuth 2.0, consulte Autorización del acceso a
aplicaciones web de Azure Active Directory mediante el flujo de concesión de código OAuth 2.0.
Registro de la aplicación con un inquilino de Azure AD
El primer paso para usar Azure AD con el fin de autorizar los recursos de Event Hubs es registrar la aplicación
cliente con un inquilino de Azure AD desde Azure Portal. Al registrar la aplicación cliente, facilita información
sobre la aplicación a AD. Azure AD proporciona un id. de cliente (también denominado id. de aplicación) que se
puede usar para asociar la aplicación con el runtime de Azure AD. Para más información sobre el identificador de
cliente, consulte Objetos de aplicación y de entidad de servicio de Azure Active Directory.
En las imágenes siguientes se muestran los pasos para registrar una aplicación web:
NOTE
Si registra la aplicación como una aplicación nativa, puede especificar cualquier URI válido para el URI de redirección. Para
las aplicaciones nativas, no es necesario que este valor sea una dirección URL real. Para las aplicaciones web, el URI de
redirección debe ser un URI válido, ya que especifica la dirección URL a la que se proporcionan los tokens.

Una vez que ha registrado su aplicación, verá el id. de la aplicación (o id. de cliente) en Configuración :
Para más información sobre cómo registrar una aplicación con Azure AD, consulte Integración de aplicaciones
con Azure Active Directory.
Creación de un secreto de cliente
La aplicación necesita un secreto de cliente para demostrar su identidad al solicitar un token. Para agregar el
secreto de cliente, siga estos pasos.
1. Vaya a su registro de aplicaciones en Azure Portal.
2. Seleccione la configuración de Cer tificados y secretos .
3. En Secretos de cliente , seleccione Nuevo secreto de cliente para crear un nuevo secreto.
4. Proporcione una descripción para el secreto y elija el intervalo de expiración deseado.
5. Copie inmediatamente el valor del nuevo secreto en una ubicación segura. El valor completo se le
muestra solo una vez.

Bibliotecas cliente para la adquisición de tokens


Una vez que haya registrado su aplicación y le haya concedido permisos para enviar/recibir datos en Azure
Event Hubs, podrá agregar código a su aplicación para autenticar una entidad de seguridad y adquirir un token
de OAuth 2.0. Para autenticar y adquirir el token, puede usar una de las bibliotecas de autenticación de la
Plataforma de identidad de Microsoft u otra biblioteca de código abierto que admita OpenID o Connect 1.0. A
continuación, su aplicación puede usar el token de acceso para autorizar una solicitud en Azure Event Hubs.
Para ver una lista de escenarios en los que se admite la adquisición de tokens, consulte la sección Escenarios del
repositorio de GitHub Biblioteca de autenticación de Microsoft (MSAL) para .NET.

Ejemplos
Ejemplos de Microsoft.Azure.EventHubs.
En estos ejemplos se usa la biblioteca anterior Microsoft.Azure.EventHubs , pero se puede actualizar
fácilmente para usar la biblioteca Azure.Messaging.EventHubs más reciente. Para que los ejemplos
usen la biblioteca nueva en lugar de la anterior, consulte la Guía para migrar de
Microsoft.Azure.EventHubs a Azure.Messaging.EventHubs.
Ejemplos de Azure.Messaging.EventHubs
Este ejemplo se ha actualizado para usar la biblioteca Azure.Messaging.EventHubs más reciente.

Pasos siguientes
Para más información acerca de RBAC, consulte ¿Qué es el control de acceso basado en rol (RBAC) de Azure?.
Para información sobre cómo asignar y administrar las asignaciones de roles de Azure con Azure PowerShell,
la CLI de Azure o la API de REST, consulte estos artículos:
Administración del control de acceso basado en rol (RBAC) con Azure PowerShell
Administración del control de acceso basado en rol (RBAC) con la CLI de Azure
Administración del control de acceso basado en rol (RBAC) con la API de REST
Administración del acceso a los recursos de Azure mediante RBAC y plantillas de
Azure Resource Manager
Consulte los artículos relacionados siguientes:
Autenticación de una identidad administrada con Azure Active Directory para acceder a recursos de Event
Hubs
Autenticación de solicitudes para Azure Event Hubs mediante firmas de acceso compartido
Autorización del acceso a recursos de Event Hubs mediante Azure Active Directory
Autorización del acceso a recursos de Event Hubs mediante firmas de acceso compartido
Autenticación del acceso a recursos de Event Hubs
mediante firmas de acceso compartido (SAS)
18/08/2020 • 16 minutes to read • Edit Online

La firma de acceso compartido (SAS) le ofrece un control pormenorizado sobre el tipo de acceso que se concede
a los clientes que la tienen. Estos son algunos de los controles que puede establecer en una SAS:
El intervalo durante el que la SAS es válida, incluida la hora de inicio y la hora de expiración.
Los permisos concedidos por la SAS. Por ejemplo, una SAS para un espacio de nombres de Event Hubs
podría conceder el permiso de escucha, pero no el permiso de envío.
Solo los clientes que tengan credenciales válidas pueden enviar datos a un centro de eventos.
Un cliente no puede suplantar a otro cliente.
Se puede bloquear el envío de datos por parte de un cliente no autorizado a un centro de eventos.
En este artículo se explica cómo autenticar el acceso a los recursos de Event Hubs mediante SAS. Para más
información sobre la autorización del acceso a recursos de Event Hubs mediante SAS, consulte este artículo.

NOTE
Microsoft recomienda usar credenciales de Azure AD cuando sea posible como procedimiento recomendado de seguridad,
en lugar de usar las firmas de acceso compartido, que se pueden exponer más fácilmente a riesgos. Aunque puede seguir
usando firmas de acceso compartido (SAS) para conceder acceso específico a los recursos en su instancia de Event Hubs,
Azure AD ofrece funcionalidades similares sin necesidad de administrar tokens de SAS ni preocuparse sobre cómo revocar
una SAS en peligro.
Para más información sobre la integración de Azure AD en Azure Event Hubs, consulte Autorización del acceso a Event
Hubs con Azure AD.

Configuración de la autenticación de SAS


Puede configurar la regla de autorización de acceso compartido de EventHubs en un espacio de nombres de
Event Hubs o una entidad (instancia de centro de eventos o tema de Kafka en un centro de eventos).
Actualmente no se admite la configuración de una regla de autorización de acceso compartido en un grupo de
consumidores, pero puede usar reglas configuradas en un espacio de nombres o una entidad para proteger el
acceso a dicho grupo.
En la imagen siguiente se muestra cómo se aplican las reglas de autorización en las entidades de ejemplo.
En este ejemplo, el espacio de nombres de Event Hubs (ExampleNamespace) tiene dos entidades: eh1 y topic1.
Las reglas de autorización se definen en el nivel de entidad y también en el nivel de espacio de nombres.
Las reglas de autorización manageRuleNS, sendRuleNS y listenRuleNS se aplican al centro de eventos eh1 y al
tema t1. Las reglas de autorización listenRule-eh y sendRule-eh se aplican únicamente a la instancia del centro
de eventos eh1, y la regla de autorización sendRuleT se aplica solo al tema topic1.
Al usar una regla de autorización sendRuleNS, las aplicaciones cliente pueden enviar a eh1 y topic1. Cuando se
usa la regla de autorización sendRuleT, solo se aplica el acceso granular a topic1 y, por lo tanto, las aplicaciones
cliente que usan esta regla para el acceso ahora no pueden enviar a eh1, sino solo a topic1.

Generación de un token de Firmas de acceso compartido


Cualquier cliente que tenga acceso al nombre de una regla de autorización y una de sus claves de firma puede
generar un token de SAS. El token se genera diseñando una cadena con el siguiente formato:
se : instante de expiración del token. Entero que refleja los segundos transcurridos desde la época 00:00:00
UTC el 1 de enero de 1970 (época de UNIX) cuando expira el token.
skn : nombre de la regla de autorización, que es el nombre de la clave SAS.
sr : URI del recurso al que se accede.
sig : firma.

La cadena de firma es el hash SHA-256 calculado sobre el URI del recurso (ámbito tal y como se describe en la
sección anterior) y la representación de cadenas del instante de expiración del token, separados por CRLF.
El cálculo del hash es similar al siguiente pseudocódigo y devuelve un valor de hash de 256 bits/32 bytes.

SHA-256('https://<yournamespace>.servicebus.windows.net/'+'\n'+ 1438205742)

El token contiene los valores sin el hash para que el destinatario pueda volver a calcular el hash con los mismos
parámetros y verificar que el emisor posee una clave de firma válida.
El URI de recurso es el URI completo del recurso de Service Bus al que se solicita el acceso. Por ejemplo,
http://.servicebus.windows.net/ o sb://<namespace>.servicebus.windows.net/<entityPath>; , es decir,
http://contoso.servicebus.windows.net/eventhubs/eh1 .

El URI debe estar codificado por porcentaje.


La regla de autorización de acceso compartido usada para firmar debe configurarse en la entidad especificada
por este URI, o uno de sus primarios jerárquicos. Por ejemplo,
http://contoso.servicebus.windows.net/eventhubs/eh1 o http://contoso.servicebus.windows.net en el ejemplo
anterior.
Un token SAS es válido en todos los recursos con el prefijo usado en la cadena de firma.

NOTE
El token de acceso para Event Hubs se genera mediante la directiva de acceso compartido. Para más información, consulte
Directiva de autorización de acceso compartido.

Generación de una firma (token) a partir de una directiva


En la sección siguiente se muestra cómo generar un token de SAS mediante directivas de firma de acceso
compartido.
NodeJS

function createSharedAccessToken(uri, saName, saKey) {


if (!uri || !saName || !saKey) {
throw "Missing required parameter";
}
var encoded = encodeURIComponent(uri);
var now = new Date();
var week = 60*60*24*7;
var ttl = Math.round(now.getTime() / 1000) + week;
var signature = encoded + '\n' + ttl;
var signatureUTF8 = utf8.encode(signature);
var hash = crypto.createHmac('sha256', saKey).update(signatureUTF8).digest('base64');
return 'SharedAccessSignature sr=' + encoded + '&sig=' +
encodeURIComponent(hash) + '&se=' + ttl + '&skn=' + saName;

Java
private static String GetSASToken(String resourceUri, String keyName, String key)
{
long epoch = System.currentTimeMillis()/1000L;
int week = 60*60*24*7;
String expiry = Long.toString(epoch + week);

String sasToken = null;


try {
String stringToSign = URLEncoder.encode(resourceUri, "UTF-8") + "\n" + expiry;
String signature = getHMAC256(key, stringToSign);
sasToken = "SharedAccessSignature sr=" + URLEncoder.encode(resourceUri, "UTF-8") +"&sig=" +
URLEncoder.encode(signature, "UTF-8") + "&se=" + expiry + "&skn=" + keyName;
} catch (UnsupportedEncodingException e) {

e.printStackTrace();
}

return sasToken;
}

public static String getHMAC256(String key, String input) {


Mac sha256_HMAC = null;
String hash = null;
try {
sha256_HMAC = Mac.getInstance("HmacSHA256");
SecretKeySpec secret_key = new SecretKeySpec(key.getBytes(), "HmacSHA256");
sha256_HMAC.init(secret_key);
Encoder encoder = Base64.getEncoder();

hash = new String(encoder.encode(sha256_HMAC.doFinal(input.getBytes("UTF-8"))));

} catch (InvalidKeyException e) {
e.printStackTrace();
} catch (NoSuchAlgorithmException e) {
e.printStackTrace();
} catch (IllegalStateException e) {
e.printStackTrace();
} catch (UnsupportedEncodingException e) {
e.printStackTrace();
}

return hash;
}

PHP

function generateSasToken($uri, $sasKeyName, $sasKeyValue)


{
$targetUri = strtolower(rawurlencode(strtolower($uri)));
$expires = time();
$expiresInMins = 60;
$week = 60*60*24*7;
$expires = $expires + $week;
$toSign = $targetUri . "\n" . $expires;
$signature = rawurlencode(base64_encode(hash_hmac('sha256',
$toSign, $sasKeyValue, TRUE)));

$token = "SharedAccessSignature sr=" . $targetUri . "&sig=" . $signature . "&se=" . $expires .


"&skn=" . $sasKeyName;
return $token;
}

C#
private static string createToken(string resourceUri, string keyName, string key)
{
TimeSpan sinceEpoch = DateTime.UtcNow - new DateTime(1970, 1, 1);
var week = 60 * 60 * 24 * 7;
var expiry = Convert.ToString((int)sinceEpoch.TotalSeconds + week);
string stringToSign = HttpUtility.UrlEncode(resourceUri) + "\n" + expiry;
HMACSHA256 hmac = new HMACSHA256(Encoding.UTF8.GetBytes(key));
var signature = Convert.ToBase64String(hmac.ComputeHash(Encoding.UTF8.GetBytes(stringToSign)));
var sasToken = String.Format(CultureInfo.InvariantCulture, "SharedAccessSignature sr={0}&sig={1}&se=
{2}&skn={3}", HttpUtility.UrlEncode(resourceUri), HttpUtility.UrlEncode(signature), expiry, keyName);
return sasToken;
}

Autenticación de los publicadores de Event Hubs con SAS


Un publicador de eventos define un punto de conexión virtual para un centro de eventos. El publicador solo
puede usarse para enviar mensajes a un centro de eventos, no para recibirlos.
Normalmente, un centro de eventos emplea a un publicador por cliente. Todos los mensajes que se envíen a
cualquiera de los publicadores de un centro de eventos se ponen en cola dentro de ese centro de eventos. Los
publicadores permiten control de acceso pormenorizado.
A cada cliente de Event Hubs se le asigna un token único, que se carga en el cliente. Los tokens se generan de
forma que cada token único concede acceso a un publicador único diferente. Un cliente que posea un token solo
puede enviar a un publicador y a ningún otro. Si varios clientes comparten el mismo token, cada uno de estos
clientes comparte el publicador.
Todos los tokens se asignan con claves SAS. Normalmente, todos los tokens se firman con la misma clave. Los
clientes no conocen la clave, lo que evita que los clientes produzcan tokens. Los clientes operan en los mismos
tokens hasta que expiran.
Por ejemplo, para definir reglas de autorización cuyo ámbito sea solo enviar o publicar en Event Hubs, debe
definir una regla de autorización de envío. Esto se puede hacer en un nivel de espacio de nombres o
proporcionar un ámbito más específico a una entidad determinada (una instancia de Event Hubs o un tema). A
un cliente o una aplicación que estén limitados con este acceso específico se les conoce como publicador de
Event Hubs. Para hacerlo, siga estos pasos:
1. Cree una clave SAS en la entidad que quiera publicar para asignarle el ámbito de envío . Para más
información, consulte Directivas de autorización de acceso compartido.
2. Genere un token de SAS con una hora de expiración para un publicador específico mediante la clave
generada en paso 1.

var sasToken = SharedAccessSignatureTokenProvider.GetPublisherSharedAccessSignature(


new Uri("Service-Bus-URI"),
"eventub-name",
"publisher-name",
"sas-key-name",
"sas-key",
TimeSpan.FromMinutes(30));

3. Proporcione el token al cliente del publicador, que solo puede enviar a la entidad y al publicador a los que
el token concede acceso.
Una vez que el token expira, el cliente pierde su acceso para enviar o publicar en la entidad.
NOTE
Aunque no se recomienda, es posible equipar a los dispositivos con tokens que concedan acceso directo a un centro de
eventos o espacio de nombres. Cualquier dispositivo que contenga un token de ese tipo puede enviar mensajes
directamente a ese centro de eventos. Además, el dispositivo no puede estar en la lista negra que impide el envío a ese
centro de eventos.
Siempre se recomienda proporcionar ámbitos específicos y pormenorizados.

IMPORTANT
Cuando se han creado los tokens, cada cliente se aprovisiona con su propio token único.
Cuando el cliente envía datos a un centro de eventos, la solicitud se etiqueta con el token. Para evitar que un atacante use
la técnica de eavesdropping y robe el token, la comunicación entre el cliente y el centro de eventos debe realizarse a través
de un canal cifrado.
Si un atacante roba un token, el atacante puede suplantar el cliente al que se ha robado el token. Al incorporar un
publicador a la lista de no permitidos, ese cliente se representa como inutilizable hasta que recibe un token nuevo que usa
un publicador diferente.

Autenticación de consumidores de Event Hubs con SAS


Para autenticar las aplicaciones back-end que consumen los datos generados por los productores de Event Hubs,
la autenticación de tokens de Event Hubs requiere que sus clientes tengan asignados los derechos de
administración o los privilegios de escucha a su espacio de nombres de Event Hubs o instancia o tema del
centro de eventos. Los datos se consumen de Event Hubs mediante grupos de consumidores. Aunque la
directiva SAS proporciona un ámbito granular, este ámbito solo se define en el nivel de entidad, no en el nivel de
consumidor. Significa que los privilegios definidos en el nivel de espacio de nombres o en el nivel de instancia o
tema de centro de eventos se aplicarán a los grupos de consumidores de esa entidad.

Pasos siguientes
Vea los artículos siguientes:
Autorización del uso de SAS
Autorización mediante el control de acceso basado en rol (RBAC)
Más información sobre Event Hubs
Consulte los artículos relacionados siguientes:
Autenticación de solicitudes a Azure Event Hubs desde una aplicación mediante Azure Active Directory
Autenticación de una identidad administrada con Azure Active Directory para acceder a recursos de Event
Hubs
Autorización del acceso a recursos de Event Hubs mediante Azure Active Directory
Autorización del acceso a recursos de Event Hubs mediante firmas de acceso compartido
Seguridad de red para Azure Event Hubs
18/08/2020 • 12 minutes to read • Edit Online

En este artículo se describe cómo usar las siguientes características de seguridad con Azure Event Hubs:
Etiquetas de servicio
Reglas de firewall de IP
Puntos de conexión de servicio de red
Puntos de conexión privados (versión preliminar)

Etiquetas de servicio
Una etiqueta de servicio representa un grupo de prefijos de direcciones IP de un servicio de Azure determinado.
Microsoft administra los prefijos de direcciones que la etiqueta de servicio incluye y actualiza automáticamente
dicha etiqueta a medida que las direcciones cambian, lo que minimiza la complejidad de las actualizaciones
frecuentes en las reglas de seguridad de red. Para más información sobre las etiquetas de servicio, consulte
Introducción a las etiquetas de servicio.
Puede usar etiquetas de servicio para definir controles de acceso a la red en grupos de seguridad de red o
Azure Firewall. Utilice etiquetas de servicio en lugar de direcciones IP específicas al crear reglas de seguridad. Al
especificar el nombre de la etiqueta de servicio (por ejemplo, EventHub ) en el campo de origen o destino
apropiado de una regla, puede permitir o denegar el tráfico para el servicio correspondiente.

¿SE P UEDE USA R


PA RA T RÁ F IC O
ET IQ UETA DE EN T RA N T E O ¿P UEDE SER ¿SE P UEDE USA R C O N
SERVIC IO P RO P Ó SITO SA L IEN T E? REGIO N A L? A Z URE F IREWA L L?

EventHub Azure Event Hubs. Salida Sí Sí

Firewall de dirección IP
De forma predeterminada, los espacios de nombres de Azure Event Hubs son accesibles desde Internet, siempre
que la solicitud venga con una autenticación y una autorización válidas. Con el firewall de IP, puede restringirlo aún
más a solo un conjunto de direcciones o intervalos de direcciones IPv4 en notación CIDR (Enrutamiento de
interdominios sin clases).
Esta característica es útil en escenarios en los que Azure Event Hubs debe ser accesible únicamente desde ciertos
sitios conocidos. Las reglas de firewall permiten configurar reglas para aceptar el tráfico procedente de direcciones
IPv4 concretas. Por ejemplo, si usa Event Hubs con Azure ExpressRoute, puede crear una regla de firewall para
permitir el tráfico procedente única y exclusivamente de las direcciones IP de la infraestructura local.
Las reglas de firewall de IP se aplican en el nivel del espacio de nombres de Event Hubs. Por lo tanto, las reglas se
aplican a todas las conexiones de clientes que usan cualquier protocolo admitido. Cualquier intento de conexión
desde una dirección IP que no coincida con una regla IP admitida en el espacio de nombres de Event Hubs se
rechaza como no autorizado. La respuesta no menciona la regla IP. Las reglas de filtro IP se aplican en orden y la
primera regla que coincida con la dirección IP determina la acción de aceptar o rechazar.
Para más información, consulte Configuración del firewall de IP para un centro de eventos.

Puntos de conexión de servicio de red


La integración de Event Hubs con los puntos de conexión de servicio de red virtual (VNet) permite el acceso seguro
a las funcionalidades de mensajería desde cargas de trabajo tales como máquinas virtuales que están enlazadas a
redes virtuales, con una ruta de acceso del tráfico de red que está protegida en ambos extremos.
Una vez realizada la configuración para enlazarse con al menos un punto de conexión de servicio de subred de red
virtual, el espacio de nombres respectivo de Event Hubs ya solo aceptará el tráfico procedente de redes virtuales
autorizadas. Desde la perspectiva de la red virtual, el enlace de un espacio de nombres de Event Hubs a un punto
de conexión de servicio configura un túnel de redes aislado desde la subred de la red virtual al servicio de
mensajería.
El resultado es una relación privada y aislada entre las cargas de trabajo enlazadas a la subred y el espacio de
nombres respectivo de Event Hubs, a pesar de que la dirección de red que se puede observar en el punto de
conexión de servicio de mensajería esté en un intervalo IP público. Hay una excepción a este comportamiento. Al
habilitar un punto de conexión de servicio, de forma predeterminada, se habilita la regla denyall en el firewall de
IP asociado a la red virtual. Puede agregar direcciones IP específicas en el firewall de IP para habilitar el acceso al
punto de conexión público del centro de eventos.

IMPORTANT
Las redes virtuales se admiten en los niveles estándar y dedicado de Event Hubs. No se admiten en el nivel básico .

Escenarios de seguridad avanzados que habilita la integración de VNet


En el caso de soluciones que requieren una estricta seguridad compartimentalizada y en las que las subredes de
redes virtuales proporcionan la segmentación entre los servicios compartimentalizados, estas siguen necesitando
rutas de comunicación entre los servicios que residen en esos compartimentos.
Cualquier ruta IP inmediata entre compartimientos, incluidos aquellos que transportan HTTPS a través de TCP/IP,
tienen el riesgo de sufrir ataques por puntos vulnerables en la capa de red o en capas superiores. Los servicios de
mensajería proporcionan rutas de comunicación aisladas, donde los mensajes incluso se escriben en discos cuando
se trasladan entre entidades. Las cargas de trabajo de dos redes virtuales distintas enlazadas a la misma instancia
de Event Hubs pueden comunicarse de forma eficaz y fiable mediante mensajes, al tiempo que se preserva la
integridad de los respectivos límites de aislamiento de red.
Esto significa que sus soluciones confidenciales en la nube no solo obtienen acceso a las funcionalidades de
mensajería asíncrona de Azure (líderes del sector en fiabilidad y escalabilidad), sino que también pueden usar la
mensajería para crear rutas de comunicación entre compartimentos seguros de la solución, que son
intrínsecamente más seguros de lo que se puede lograr con cualquier otro modo de comunicación entre iguales,
incluyendo en protocolo HTTPS y los protocolos de socket protegidos por TLS.
Enlace de centros de eventos a redes virtuales
Las reglas de red vir tual son una característica de firewall que controla si el espacio de nombres de Azure Event
Hubs acepta las conexiones de una subred determinada de una red virtual.
Enlazar un espacio de nombres de Event Hubs a una red virtual es un proceso de dos pasos. Primero debe crear un
punto de conexión de ser vicio de red vir tual en una subred de red virtual y habilitarlo para
Microsoft.EventHub , tal como se explica en el artículo de introducción a los puntos de conexión de servicio. Una
vez que haya agregado el punto de conexión de servicio, enlácelo con el espacio de nombres de Event Hubs con
una regla de red vir tual .
La regla de red virtual es una asociación del espacio de nombres de Event Hubs con una subred de red virtual.
Mientras exista la regla, se les concederá acceso a todas las cargas de trabajo que estén enlazadas a la subred, al
espacio de nombres de Event Hubs. Event Hubs no establece nunca por sí mismo conexiones de salida, no necesita
obtener acceso y, por tanto, nunca se le concede acceso a la subred habilitando esta regla.
Para más información, consulte Configuración de puntos de conexión de servicio de red virtual para un centro de
eventos.

Puntos de conexión privados


El servicio Azure Private Link le permite acceder a los servicios de Azure (por ejemplo, Azure Event Hubs, Azure
Storage y Azure Cosmos DB) y a los servicios de asociados o clientes hospedados por Azure mediante un punto
de conexión privado de la red virtual.
Un punto de conexión privado es una interfaz de red que le conecta de forma privada y segura a un servicio con la
tecnología de Azure Private Link. El punto de conexión privado usa una dirección IP privada de la red virtual para
incorporar el servicio de manera eficaz a su red virtual. Todo el tráfico dirigido al servicio se puede enrutar
mediante el punto de conexión privado, por lo que no se necesita ninguna puerta de enlace, dispositivos NAT,
conexiones de ExpressRoute o VPN ni direcciones IP públicas. El tráfico entre la red virtual y el servicio atraviesa la
red troncal de Microsoft, eliminando la exposición a la red pública de Internet. Puede conectarse a una instancia de
un recurso de Azure, lo que le otorga el nivel más alto de granularidad en el control de acceso.

NOTE
Esta característica solo se admite con el nivel Dedicado . Para más información acerca del nivel Dedicado, consulte
Introducción a Event Hubs dedicado.
Esta funcionalidad actualmente está en su versión preliminar .

Para más información, consulte Configuración de puntos de conexión privados para un centro de eventos.

Pasos siguientes
Vea los artículos siguientes:
Configuración del firewall de IP para un centro de eventos
Configuración de puntos de conexión de servicio de red virtual para un centro de eventos
Configuración de puntos de conexión privados para un centro de eventos
Controles de seguridad para Azure Event Hubs
18/08/2020 • 3 minutes to read • Edit Online

En este artículo se explican los controles de seguridad integrados en Azure Event Hubs.
Un control de seguridad es una cualidad o característica de un servicio de Azure que ayuda a dicho servicio a
prevenir y detectar vulnerabilidades de seguridad, así como a responder a ellas.
En cada control, utilizamos "Sí" o "No" para indicar si dicho control está habilitado o no en el servicio, y "N/D" si no
está disponible para el servicio. También se puede incluir una nota o un vínculo para aportar más información
sobre un atributo.

Red
C O N T RO L DE SEGURIDA D SÍ/ N O N OTA S DO C UM EN TA C IÓ N

Compatibilidad con punto Sí


de conexión de servicio

Compatibilidad con la No
inserción de redes virtuales

Compatibilidad con el Sí
aislamiento de red y los
firewalls

Compatibilidad con la No
tunelización forzada

Supervisión y registro
C O N T RO L DE SEGURIDA D SÍ/ N O N OTA S DO C UM EN TA C IÓ N

Compatibilidad con la Sí
supervisión de Azure (Log
Analytics, Application
Insights, etc.)

Registro y auditoría del Sí


plano de administración y de
control

Registro y auditoría del Sí


plano de datos

Identidad
C O N T RO L DE SEGURIDA D SÍ/ N O N OTA S DO C UM EN TA C IÓ N
C O N T RO L DE SEGURIDA D SÍ/ N O N OTA S DO C UM EN TA C IÓ N

Authentication Sí Autorización del acceso a


Azure Event Hubs,
Autorización del acceso a
recursos de Event Hubs
mediante
Azure Active Directory,
Autorización del acceso a
recursos de Event Hubs
mediante firmas de acceso
compartido

Authorization Sí Autenticación de una


identidad administrada con
Azure Active Directory para
acceder a recursos de Event
Hubs, Autenticación de una
aplicación con
Azure Active Directory para
acceder a recursos de Event
Hubs, Autenticación del
acceso a recursos de Event
Hubs mediante firmas de
acceso compartido (SAS)

Protección de los datos


C O N T RO L DE SEGURIDA D SÍ/ N O N OTA S DO C UM EN TA C IÓ N

Cifrado del lado servidor en Sí


reposo: Claves administradas
por Microsoft

Cifrado del lado servidor en Sí. Disponible para clústeres Se puede usar una clave Configuración de claves
reposo: claves administradas dedicados. administrada por el cliente administradas por el cliente
por el cliente (BYOK) en Azure Key Vault para para cifrar datos en reposo
cifrar los datos en el centro de Azure Event Hubs
de eventos en reposo. mediante Azure Portal

Cifrado de nivel de columna N/D


(Azure Data Services)

Cifrado en tránsito (por Sí


ejemplo, cifrado de
ExpressRoute, cifrado en la
red virtual y cifrado de red
virtual a red virtual)

Llamadas a API cifradas Sí

Administración de configuración
C O N T RO L DE SEGURIDA D SÍ/ N O N OTA S DO C UM EN TA C IÓ N

Compatibilidad con la Sí
administración de
configuración (control de
versiones de configuración,
etc.)

Pasos siguientes
Más información sobre los controles de seguridad integrados en los servicios de Azure.
Controles de Cumplimiento normativo de Azure
Policy para Azure Event Hubs
18/08/2020 • 3 minutes to read • Edit Online

Cumplimiento normativo de Azure Policy proporciona definiciones de iniciativas creadas y administradas por
Microsoft, conocidas como integraciones, para los dominios de cumplimiento y los controles de seguridad
relativos a distintos estándares de cumplimiento. En esta página se enumeran los dominios de cumplimiento y
los controles de seguridad para Azure Event Hubs. Para que los recursos de Azure cumplan con el estándar
específico, puede asignar las integraciones de un control de seguridad de manera individual.
El título de cada definición de directiva integrada se vincula a la definición de directiva en Azure Portal. Use el
vínculo de la columna Versión de directiva para ver el origen en el repositorio de GitHub de Azure Policy.

IMPORTANT
Cada control que se muestra a continuación está asociado a una o varias definiciones de Azure Policy. Estas directivas pueden
ayudarle a evaluar el cumplimiento del control; sin embargo, a menudo no hay una coincidencia 1:1 o completa entre un
control y una o varias directivas. Como tal, el cumplimiento con Azure Policy solo se refiere a las propias directivas; esto no
garantiza que sea totalmente compatible con todos los requisitos de un control. Además, el estándar de cumplimiento incluye
controles que no se abordan con las definiciones de Azure Policy en este momento. Por lo tanto, el cumplimiento en
Azure Policy es solo una vista parcial del estado general de cumplimiento. Las asociaciones entre los controles y las
definiciones de cumplimiento normativo de Azure Policy para estos estándares de cumplimiento pueden cambiar con el
tiempo.

Prueba comparativa de la seguridad de Azure


Azure Security Benchmark proporciona recomendaciones sobre cómo proteger las soluciones de nube en Azure.
Para ver cómo se asigna completamente este servicio a Azure Security Benchmark, consulte los archivos de
asignación de Azure Security Benchmark.
Para revisar el modo en que las integraciones de Azure Policy disponibles para todos los servicios de Azure se
asignan a este estándar de cumplimiento, consulte Cumplimiento normativo de Azure Policy: Azure Security
Benchmark.

VERSIÓ N DE L A
DIREC T IVA DIREC T IVA
DO M A IN ID. DE C O N T RO L T ÍT ULO DE C O N T RO L ( A ZURE PO RTA L) ( GIT HUB)

Seguridad de redes 1.1 Proteja los recursos El centro de eventos 1.0.0


mediante grupos de debe usar un punto
seguridad de red o de conexión del
Azure Firewall en su servicio de red virtual
red virtual

Registro y supervisión 2.3 Habilitación del Los registros de 3.0.0


registro de auditoría diagnóstico del centro
para recursos de de eventos deben
Azure estar habilitados

Pasos siguientes
Más información al respecto en Cumplimiento normativo de Azure Policy.
Los elementos integrados se pueden encontrar en el repositorio de GitHub de Azure Policy.
Línea de base de seguridad de Azure para Event
Hubs
18/08/2020 • 67 minutes to read • Edit Online

La línea de base de seguridad de Azure para Event Hubs contiene recomendaciones que lo ayudarán a mejorar la
posición de seguridad de la implementación.
La base de referencia de este servicio se extrae de la versión 1.0 de Azure Security Benchmark, que proporciona
recomendaciones sobre cómo puede proteger las soluciones en la nube en Azure con nuestra guía de
procedimientos recomendados.
Para obtener más información, consulte Introducción a las líneas de base de seguridad de Azure.

Seguridad de redes
Para obtener más información, consulte Control de seguridad: seguridad de red.
1.1: Proteja los recursos mediante grupos de seguridad de red o Azure Firewall en su red virtual
Guía : La integración de Event Hubs en puntos de conexión de servicio de red virtual permite el acceso seguro a las
funcionalidades de mensajería desde cargas de trabajo, tales como máquinas virtuales que están enlazadas a redes
virtuales, con una ruta de acceso del tráfico de red que está protegida en ambos extremos.
Una vez que se enlaza con al menos un punto de conexión de servicio de subred de red virtual, el espacio de
nombres respectivo de Event Hubs ya solo aceptará el tráfico procedente de redes virtuales autorizadas. Desde la
perspectiva de la red virtual, el enlace del espacio de nombres de Event Hubs a un punto de conexión de servicio
configura un túnel de redes aislado desde la subred de la red virtual al servicio de mensajería.
También puede crear un punto de conexión privado, que es una interfaz de red que lo conecta de forma privada y
segura al servicio de Azure Event Hubs mediante el servicio de Azure Private Link. El punto de conexión privado
usa una dirección IP privada de la red virtual para incorporar el servicio de manera eficaz a su red virtual. Todo el
tráfico dirigido al servicio se puede enrutar mediante el punto de conexión privado, por lo que no se necesita
ninguna puerta de enlace, dispositivos NAT, conexiones de ExpressRoute o VPN ni direcciones IP públicas.
También puede proteger el espacio de nombres de Azure Event Hubs mediante firewalls. Azure Event Hubs admite
controles de acceso basado en IP para la compatibilidad con el firewall de entrada. Puede establecer reglas de
firewall mediante Azure Portal, plantillas de Azure Resource Manager, o a través de la CLI de Azure o Azure
PowerShell.
Procedimiento para usar puntos de conexión de servicio de red virtual con Azure Event Hubs:
https://docs.microsoft.com/azure/event-hubs/event-hubs-service-endpoints
Para más información, consulte Integración de Azure Event Hubs en Azure Private Link:
https://docs.microsoft.com/azure/event-hubs/private-link-service.
Habilitación de la integración y los firewalls de redes virtuales en el espacio de nombres de Event Hubs:
https://docs.microsoft.com/azure/event-hubs/event-hubs-tutorial-virtual-networks-firewalls
Procedimiento para configurar reglas de firewall de IP para espacios de nombres de Azure Event Hubs:
https://docs.microsoft.com/azure/event-hubs/event-hubs-ip-filtering
Super visión de Azure Security Center : Sí
Responsabilidad : Customer
1.2: Supervise y registre la configuración y el tráfico de redes virtuales, subredes y NIC
Instrucciones : Use Azure Security Center y siga las recomendaciones de protección de redes para ayudar a
proteger sus recursos de Event Hubs en Azure. Si usa máquinas virtuales de Azure para obtener acceso a los
centros de eventos, habilite los registros de flujo de grupos de seguridad de red (NSG) y envíe los registros a una
cuenta de almacenamiento para la auditoría de tráfico.
Cómo habilitar los registros de flujo de NSG: https://docs.microsoft.com/azure/network-watcher/network-watcher-
nsg-flow-logging-portal
Descripción de la seguridad de red proporcionada por Azure Security Center:
https://docs.microsoft.com/azure/security-center/security-center-network-recommendations
Super visión de Azure Security Center : Sí
Responsabilidad : Customer
1.3: Proteja las aplicaciones web críticas
Instrucciones : No aplicable; esta recomendación está pensada para las aplicaciones web que se ejecutan en Azure
App Service o en recursos de proceso.
Super visión de Azure Security Center : No aplicable
Responsabilidad : No aplicable
1.4: Deniegue las comunicaciones con direcciones IP malintencionadas conocidas
Instrucciones : Habilite el estándar de DDoS Protection en las redes virtuales asociadas a los centros de eventos
para protegerse de los ataques por denegación de servicio distribuidos (DDoS). Use la inteligencia sobre amenazas
integrada de Azure Security Center para denegar las comunicaciones con direcciones IP malintencionadas
conocidas o no utilizadas.
Cómo configurar la protección contra DDoS: https://docs.microsoft.com/azure/virtual-network/manage-ddos-
protection
Para obtener más información sobre la inteligencia sobre amenazas integrada de Azure Security Center:
https://docs.microsoft.com/azure/security-center/security-center-alerts-service-layer
Super visión de Azure Security Center : Sí
Responsabilidad : Customer
1.5: Registre los paquetes de red y registros de flujo
Guía : Si usa máquinas virtuales de Azure para obtener acceso a los centros de eventos, habilite los registros de
flujo de grupos de seguridad de red (NSG) y envíe los registros a una cuenta de almacenamiento para la auditoría
de tráfico. También puede enviar registros de flujo de grupo de seguridad de red a un área de trabajo de
Log Analytics y usar el Análisis de tráfico para proporcionar información detallada sobre el flujo de tráfico en la
nube de Azure. Algunas de las ventajas del Análisis de tráfico son la capacidad de visualizar la actividad de la red e
identificar las zonas activas, identificar las amenazas de seguridad, comprender los patrones de flujo de tráfico y
detectar configuraciones de red incorrectas.
Si es necesario para investigar actividades anómalas, habilite la captura de paquetes de Network Watcher.
Cómo habilitar los registros de flujo de NSG: https://docs.microsoft.com/azure/network-watcher/network-watcher-
nsg-flow-logging-portal
Habilitación y uso del Análisis de tráfico: https://docs.microsoft.com/azure/network-watcher/traffic-analytics
Cómo habilitar Network Watcher: https://docs.microsoft.com/azure/network-watcher/network-watcher-create
Super visión de Azure Security Center : Sí
Responsabilidad : Customer
1.6: Implemente sistemas de prevención de intrusiones y detección de intrusiones (IDS/IPS ) basados en la red
Instrucciones : Si usa máquinas virtuales de Azure para obtener acceso a los centros de eventos, seleccione una
oferta de Azure Marketplace que admita la funcionalidad de IDS/IPS con funcionalidades de inspección de carga. Si
la detección o prevención de intrusiones basadas en la inspección de la carga no es necesaria en su organización,
puede usar la característica de firewall integrada de Azure Event Hubs. Puede restringir el acceso al espacio de
nombres de Event Hubs para un intervalo limitado de direcciones IP o una dirección IP específica mediante reglas
de firewall.
Azure Marketplace:
https://azuremarketplace.microsoft.com/marketplace/?term=Firewall
Procedimiento para agregar una regla de firewall en Event Hubs para una dirección IP especificada:
https://docs.microsoft.com/azure/event-hubs/event-hubs-ip-filtering
Super visión de Azure Security Center : No disponible todavía
Responsabilidad : Customer
1.7: Administre el tráfico a las aplicaciones web
Instrucciones : No aplicable; esta recomendación está pensada para las aplicaciones web que se ejecutan en Azure
App Service o en recursos de proceso.
Super visión de Azure Security Center : No aplicable
Responsabilidad : No aplicable
1.8: Minimice la complejidad y la sobrecarga administrativa de las reglas de seguridad de red
Guía : No aplicable, esta recomendación está pensada para las aplicaciones web que se ejecutan en Azure App
Service o en recursos de proceso.
Super visión de Azure Security Center : No aplicable
Responsabilidad : No aplicable
1.9: Mantenga las configuraciones de seguridad estándar para dispositivos de red
Guía : Defina e implemente configuraciones de seguridad estándar para los recursos de red asociados a los
espacios de nombres de Azure Event Hubs con Azure Policy. Use alias de Azure Policy en los espacios de nombres
"Microsoft.EventHub" y "Microsoft.Network" para crear directivas personalizadas con el fin de auditar o aplicar la
configuración de red de los espacios de nombres de Event Hubs. También puede usar definiciones de directivas
integradas relacionadas con Azure Event Hubs, como:
El centro de eventos debe usar un punto de conexión del servicio de red virtual.
Cómo configurar y administrar Azure Policy: https://docs.microsoft.com/azure/governance/policy/tutorials/create-
and-manage
Directiva integrada de Azure para espacio de nombres de Event Hubs:
https://docs.microsoft.com/azure/governance/policy/samples/built-in-policies#event-hub
Ejemplos de Azure Policy para redes: https://docs.microsoft.com/azure/governance/policy/samples/built-in-
policies#network
Creación de un plano técnico de Azure: https://docs.microsoft.com/azure/governance/blueprints/create-blueprint-
portal
Super visión de Azure Security Center : No aplicable
Responsabilidad : Customer
1.10: Documente las reglas de configuración de tráfico
Guía : Use etiquetas para redes virtuales y otros recursos relacionados con la seguridad de red y el flujo de tráfico
que están asociados a los centros de eventos.
Creación y uso de etiquetas: https://docs.microsoft.com/azure/azure-resource-manager/resource-group-using-tags
Super visión de Azure Security Center : No aplicable
Responsabilidad : Customer
1.11: Use herramientas automatizadas para supervisar las configuraciones de recursos de red y detectar cambios
Guía : Use el registro de actividad de Azure para supervisar las configuraciones de los recursos de red y detectar
cambios en los recursos de red relacionados con Azure Event Hubs. Cree alertas en Azure Monitor que se
desencadenarán cuando se produzcan cambios en los recursos de red críticos.
Visualización y recuperación de eventos del registro de actividad de Azure: https://docs.microsoft.com/azure/azure-
monitor/platform/activity-log-view
Creación de alertas en Azure Monitor: https://docs.microsoft.com/azure/azure-monitor/platform/alerts-activity-log
Super visión de Azure Security Center : No aplicable
Responsabilidad : Customer

Registro y supervisión
Para obtener más información, consulte Control de seguridad: registro y supervisión.
2.1: Uso de orígenes de sincronización de hora aprobados
Guía : No aplicable; Microsoft mantiene el origen de la hora usado en los recursos de Azure, como Azure Event
Hubs, para las marcas de tiempo de los registros.
Super visión de Azure Security Center : No aplicable
Responsabilidad : Microsoft
2.2: Configuración de la administración central de registros de seguridad
Instrucciones : Dentro de Azure Monitor, configure los registros relacionados con Event Hubs en el registro de
actividad y la configuración de diagnóstico de Event Hubs para enviar los registros a un área de trabajo de Log
Analytics que se va a consultar o a una cuenta de almacenamiento para el almacenamiento de archivo a largo
plazo.
Procedimiento para establecer la configuración de diagnóstico para Azure Event Hubs:
https://docs.microsoft.com/azure/event-hubs/event-hubs-diagnostic-logs
Descripción del registro de actividad de Azure: https://docs.microsoft.com/azure/azure-monitor/platform/platform-
logs-overview
Super visión de Azure Security Center : Sí
Responsabilidad : Customer
2.3: Habilitación del registro de auditoría para recursos de Azure
Guía : Habilite la configuración de diagnóstico para el espacio de nombres de Azure Event Hubs. Existen tres
categorías de configuración de diagnóstico para Azure Event Hubs: Registros de archivo, registros operativos y
registros de escalabilidad automática. Habilite los registros operativos para capturar información sobre lo que
sucede durante las operaciones de Event Hubs, en concreto, el tipo de operación, como la creación del centro de
eventos, los recursos usados y el estado de la operación.
Además, puede habilitar la configuración de diagnóstico del registro de actividad de Azure y enviarla a una cuenta
de Azure Storage, un centro de eventos o un área de trabajo de Log Analytics. Los registros de actividades
proporcionan información sobre las operaciones llevadas a cabo en Azure Event Hubs y otros recursos. Con los
registros de actividades, se puede responder a las preguntas "qué, quién y cuándo" de las operaciones de escritura
(PUT, POST, DELETE) llevadas a cabo en los espacios de nombres de Azure Event Hubs.
Procedimiento para habilitar la configuración de diagnóstico para Azure Event Hubs:
https://docs.microsoft.com/azure/event-hubs/event-hubs-diagnostic-logs
Procedimiento para habilitar la configuración de diagnóstico para el registro de actividad de Azure:
https://docs.microsoft.com/azure/azure-monitor/platform/diagnostic-settings-legacy
Super visión de Azure Security Center : Sí
Responsabilidad : Customer
2.4: Recopilación de registros de seguridad de sistemas operativos
Instrucciones : No aplicable; esta recomendación está pensada para los recursos de proceso.
Super visión de Azure Security Center : No aplicable
Responsabilidad : No aplicable
2.5: Configuración de la retención del almacenamiento de registros de seguridad
Guía : En Azure Monitor, establezca el período de retención del área de trabajo de Log Analytics de acuerdo con la
normativa de cumplimiento de su organización, con el fin de capturar y revisar los incidentes relacionados con los
centros de eventos.
Configuración de parámetros de retención de registros de áreas de trabajo de Log Analytics:
https://docs.microsoft.com/azure/azure-monitor/platform/manage-cost-storage#change-the-data-retention-period
Super visión de Azure Security Center : No aplicable
Responsabilidad : Customer
2.6: Supervisión y registros de revisión
Guía : Analice y supervise los registros en busca de comportamientos anómalos y revise periódicamente los
resultados relacionados con los centros de eventos. Use Log Analytics de Azure Monitor para revisar los registros y
realizar consultas en los datos del registro. Como alternativa, puede habilitar e incorporar datos en Azure Sentinel o
en una herramienta SIEM de terceros.
Para obtener más información acerca del área de trabajo de Log Analytics, consulte:
https://docs.microsoft.com/azure/azure-monitor/log-query/get-started-portal
Procedimiento para realizar consultas personalizadas en Azure Monitor: https://docs.microsoft.com/azure/azure-
monitor/log-query/get-started-queries
Procedimiento de incorporación de Azure Sentinel: https://docs.microsoft.com/azure/sentinel/quickstart-onboard
Super visión de Azure Security Center : No aplicable
Responsabilidad : Customer
2.7: Habilitación de alertas para actividades anómalas
Guía : Dentro de Azure Monitor, configure los registros relacionados con Azure Event Hubs en el registro de
actividad y la configuración de diagnóstico de Event Hubs para enviar los registros a un área de trabajo de Log
Analytics que se va a consultar o a una cuenta de almacenamiento para el almacenamiento de archivo a largo
plazo. Use el área de trabajo de Log Analytics para crear alertas para actividades anómalas que se encuentren en
registros y eventos de seguridad.
Como alternativa, puede habilitar e incorporar datos en Azure Sentinel.
Introducción al registro de actividad de Azure: https://docs.microsoft.com/azure/azure-monitor/platform/platform-
logs-overview
Procedimiento para establecer la configuración de diagnóstico para Azure Event Hubs:
https://docs.microsoft.com/azure/event-hubs/event-hubs-diagnostic-logs
Alertas sobre datos de registro del área de trabajo de Log Analytics: https://docs.microsoft.com/azure/azure-
monitor/learn/tutorial-response
Incorporación de Azure Sentinel: https://docs.microsoft.com/azure/sentinel/quickstart-onboard
Super visión de Azure Security Center : No disponible todavía
Responsabilidad : Customer
2.8: Centralización del registro antimalware
Guía : No aplicable; Event Hubs no procesa el registro antimalware.
Super visión de Azure Security Center : No aplicable
Responsabilidad : No aplicable
2.9: Habilitación del registro de consultas DNS
Guía : No aplicable; Event Hubs no procesa ni genera registros relacionados con DNS.
Super visión de Azure Security Center : No aplicable
Responsabilidad : No aplicable
2.10: Habilitación del registro de auditoría de la línea de comandos
Guía : No aplicable; esta guía está pensada para recursos de proceso.
Super visión de Azure Security Center : No aplicable
Responsabilidad : No aplicable

Identidad y Access Control


Para obtener más información, consulte Control de seguridad: identidad y control de acceso.
3.1: Mantenga un inventario de cuentas administrativas
Instrucciones : Azure Active Directory (AD) tiene roles integrados que se deben asignar explícitamente y son
consultables. Use el módulo de PowerShell de Azure AD para realizar consultas ad hoc para detectar cuentas que
son miembros de grupos administrativos.
Obtención de un rol de directorio en Azure AD con PowerShell:
https://docs.microsoft.com/powershell/module/azuread/get-azureaddirectoryrole?view=azureadps-2.0
Obtención de los miembros de un rol de directorio en Azure AD con PowerShell:
https://docs.microsoft.com/powershell/module/azuread/get-azureaddirectoryrolemember?view=azureadps-2.0
Super visión de Azure Security Center : Sí
Responsabilidad : Customer
3.2: Cambie las contraseñas predeterminadas cuando proceda
Guía : El acceso del plano de control a Event Hubs se controla a través de Azure Active Directory (AD). Azure AD no
tiene el concepto de contraseñas predeterminadas.
El acceso del plano de datos a Event Hubs se controla a través de Azure AD con Identidades administradas o
Registros de aplicaciones, así como con firmas de acceso compartido. Los clientes que se conectan a los centros de
eventos usan las firmas de acceso compartido, que se pueden volver a generar en cualquier momento.
Introducción a las firmas de acceso compartido para Event Hubs: https://docs.microsoft.com/azure/event-
hubs/authenticate-shared-access-signature
Super visión de Azure Security Center : No aplicable
Responsabilidad : Customer
3.3: Use cuentas administrativas dedicadas
Guía : Cree procedimientos operativos estándar en torno al uso de cuentas administrativas dedicadas. Use la
administración de identidad y acceso de Azure Security Center para supervisar el número de cuentas
administrativas.
Además, para ayudarle a realizar un seguimiento de las cuentas administrativas dedicadas, puede seguir las
recomendaciones de Azure Security Center o las directivas integradas de Azure Policy, por ejemplo:
Debe haber más de un propietario asignado a su suscripción
Las cuentas en desuso con permisos de propietario deben quitarse de la suscripción
Las cuentas externas con permisos de propietario deben quitarse de la suscripción
Uso de Azure Security Center para supervisar la identidad y el acceso (versión preliminar):
https://docs.microsoft.com/azure/security-center/security-center-identity-access
Uso de Azure Policy: https://docs.microsoft.com/azure/governance/policy/tutorials/create-and-manage
Super visión de Azure Security Center : Sí
Responsabilidad : Customer
3.4: Use el inicio de sesión único (SSO ) con Azure Active Directory
Guía : Microsoft Azure proporciona una administración integrada del control de acceso para recursos y aplicaciones
basados en Azure Active Directory (AD). Una ventaja clave de usar Azure AD con Azure Event Hubs es que ya no es
necesario almacenar las credenciales en el código. En su lugar, puede solicitar un token de acceso de OAuth 2.0
desde la Plataforma de identidad de Microsoft. El nombre del recurso para solicitar un token es
https://eventhubs.azure.net/. Azure AD autentica la entidad de seguridad (un usuario, grupo o entidad de servicio)
ejecutando la aplicación. Si la autenticación se realiza correctamente, Azure AD devuelve un token de acceso a la
aplicación y la aplicación puede entonces usar el token de acceso para autorizar una solicitud de los recursos de
Azure Event Hubs.
Procedimiento para autenticar una aplicación con Azure AD para acceder a recursos de Event Hubs:
https://docs.microsoft.com/azure/event-hubs/authenticate-application
Descripción del SSO con Azure AD: https://docs.microsoft.com/azure/active-directory/manage-apps/what-is-
single-sign-on
Super visión de Azure Security Center : No aplicable
Responsabilidad : Customer
3.5: Use la autenticación multifactor para todo el acceso basado en Azure Active Directory
Guía : Habilite Multi-Factor Authentication (MFA) de Azure Active Directory y siga las recomendaciones de
administración de identidades y acceso de Azure Security Center para ayudar a proteger los recursos habilitados
para Event Hubs.
Cómo habilitar la MFA en Azure: https://docs.microsoft.com/azure/active-directory/authentication/howto-mfa-
getstarted
Cómo supervisar la identidad y el acceso en Azure Security Center: https://docs.microsoft.com/azure/security-
center/security-center-identity-access
Super visión de Azure Security Center : Sí
Responsabilidad : Customer
3.6: Use máquinas dedicadas (estaciones de trabajo de acceso con privilegios) para todas las tareas
administrativas
Guía : Utilice estaciones de trabajo con acceso con privilegios (PAW) con Multi-Factor Authentication (MFA)
configurada para iniciar sesión en recursos habilitados para Event Hubs y configurarlos.
Más información sobre las estaciones de trabajo con privilegios de acceso: https://docs.microsoft.com/windows-
server/identity/securing-privileged-access/privileged-access-workstations
Cómo habilitar la MFA en Azure: https://docs.microsoft.com/azure/active-directory/authentication/howto-mfa-
getstarted
Super visión de Azure Security Center : No aplicable
Responsabilidad : Customer
3.7: Registre y alerte de la actividad sospechosa desde cuentas administrativas
Guía : Use Privileged Identity Management (PIM) de Azure Active Directory (AAD) para la generación de registros y
alertas cuando se produzca actividad sospechosa o insegura en el entorno. Use las detecciones de riesgo de
Azure AD para ver alertas e informes sobre el comportamiento de los usuarios de riesgo. Para obtener más
registros, envíe alertas de detección de Azure Security Center riesgo en Azure Monitor y configure alertas o
notificaciones personalizadas con grupos de acciones.
Procedimiento para implementar Privileged Identity Management (PIM): https://docs.microsoft.com/azure/active-
directory/privileged-identity-management/pim-deployment-plan
Introducción a las detecciones de riesgo de Azure AD: https://docs.microsoft.com/azure/active-directory/reports-
monitoring/concept-risk-events
Procedimiento para configurar grupos de acciones para alertas y notificaciones personalizadas:
https://docs.microsoft.com/azure/azure-monitor/platform/action-groups
Super visión de Azure Security Center : Sí
Responsabilidad : Customer
3.8: Administre los recursos de Azure solo desde ubicaciones aprobadas
Guía : Use ubicaciones con nombre de acceso condicional para permitir el acceso solo desde agrupaciones lógicas
específicas de intervalos de direcciones IP o países o regiones.
Configuración de ubicaciones con nombre en Azure: https://docs.microsoft.com/azure/active-directory/reports-
monitoring/quickstart-configure-named-locations
Super visión de Azure Security Center : No aplicable
Responsabilidad : Customer
3.9: Uso de Azure Active Directory
Guía : Use Azure Active Directory (AD) como sistema central de autenticación y autorización para recursos de
Azure, como Event Hubs. Esto permite el control de acceso basado en roles (RBAC) para administrar recursos
confidenciales.
Procedimiento para crear y configurar una instancia de Azure AD: https://docs.microsoft.com/azure/active-
directory/fundamentals/active-directory-access-create-new-tenant
Para obtener información sobre la manera en que Azure Event Hubs se integra en Azure Active Directory (AAD),
consulte Autorización del acceso a recursos de Event Hubs mediante Azure Active Directory:
https://docs.microsoft.com/azure/event-hubs/authorize-access-azure-active-directory
Super visión de Azure Security Center : No aplicable
Responsabilidad : Customer
3.10: Revise y concilie regularmente el acceso de los usuarios
Guía : Azure Active Directory (AD) proporciona registros para ayudar a descubrir cuentas obsoletas. Además, use
las revisiones de acceso de identidad de Azure para administrar de forma eficiente las pertenencias a grupos, el
acceso a las aplicaciones empresariales y las asignaciones de roles. El acceso de los usuarios se puede revisar de
forma periódica para asegurarse de que solo las personas adecuadas tengan acceso continuado.
Además, rote periódicamente las firmas de acceso compartido de Event Hubs.
Introducción a los informes de Azure AD: https://docs.microsoft.com/azure/active-directory/reports-monitoring/
Cómo usar las revisiones de acceso de identidad de Azure: https://docs.microsoft.com/azure/active-
directory/governance/access-reviews-overview
Introducción a las firmas de acceso compartido para Event Hubs: https://docs.microsoft.com/azure/event-
hubs/authenticate-shared-access-signature
Super visión de Azure Security Center : Sí
Responsabilidad : Customer
3.11: Supervise los intentos de acceso a cuentas desactivadas
Guía : Tiene acceso a los orígenes de registro de eventos de actividad de inicio de sesión, auditoría y riesgo de
Azure Active Directory (AD), que permiten la integración en cualquier herramienta de SIEM o supervisión.
Puede simplificar este proceso creando una configuración de diagnóstico para las cuentas de usuario de Azure AD
y enviando los registros de auditoría y los registros de inicio de sesión a un área de trabajo de Log Analytics. Puede
configurar las alertas de registro deseadas en Log Analytics.
Procedimiento para integrar los registros de actividad de Azure en Azure Monitor:
https://docs.microsoft.com/azure/active-directory/reports-monitoring/howto-integrate-activity-logs-with-log-
analytics
Autorización del acceso a recursos de Event Hubs mediante Azure Active Directory:
https://docs.microsoft.com/azure/event-hubs/authorize-access-azure-active-directory
Super visión de Azure Security Center : No aplicable
Responsabilidad : Customer
3.12: Alerte de las desviaciones de comportamiento en los inicios de sesión de las cuentas
Guía : Use las características Identity Protection y de detección de riesgos de Azure Active Directory para configurar
respuestas automatizadas a acciones sospechosas detectadas relacionadas con los recursos habilitados para Event
Hubs. Debe habilitar las respuestas automatizadas a través de Azure Sentinel para implementar las respuestas de
seguridad de su organización.
Procedimiento para ver los inicios de sesión de riesgo de Azure AD: https://docs.microsoft.com/azure/active-
directory/reports-monitoring/concept-risky-sign-ins
Procedimiento para configurar y habilitar las directivas de riesgo de Identity Protection:
https://docs.microsoft.com/azure/active-directory/identity-protection/howto-identity-protection-configure-risk-
policies
Cómo incorporar Azure Sentinel: https://docs.microsoft.com/azure/sentinel/quickstart-onboard
Super visión de Azure Security Center : No aplicable
Responsabilidad : Customer
3.13: Proporcione a Microsoft acceso a los datos pertinentes del cliente durante los escenarios de soporte
técnico
Instrucciones : Actualmente no disponible; la Caja de seguridad del cliente todavía no se admite en Event Hubs.
Lista de servicios admitidos por la Caja de seguridad del cliente:
https://docs.microsoft.com/azure/security/fundamentals/customer-lockbox-overview#supported-services-and-
scenarios-in-general-availability
Super visión de Azure Security Center : no disponible actualmente
Responsabilidad : no disponible actualmente

Protección de datos
Para obtener más información, consulte Control de seguridad: protección de datos.
4.1: Mantenimiento de un inventario de información confidencial
Instrucciones : Use etiquetas en los recursos relacionados con las instancias de Event Hubs para ayudar a realizar
un seguimiento de los recursos de Azure que almacenan o procesan información confidencial.
Creación y uso de etiquetas: https://docs.microsoft.com/azure/azure-resource-manager/resource-group-using-tags
Super visión de Azure Security Center : No aplicable
Responsabilidad : Customer
4.2: Aislamiento de los sistemas que almacenan o procesan información confidencial
Instrucciones : Implemente suscripciones y/o grupos de administración independientes para los entornos de
desarrollo, prueba y producción. Los espacios de nombres de Event Hubs deben estar separados por una red
virtual con puntos de conexión de servicio habilitados y etiquetados adecuadamente.
También puede proteger el espacio de nombres de Azure Event Hubs mediante firewalls. Azure Event Hubs admite
controles de acceso basado en IP para la compatibilidad con el firewall de entrada. Puede establecer reglas de
firewall mediante Azure Portal, plantillas de Azure Resource Manager, o a través de la CLI de Azure o Azure
PowerShell.
Creación de suscripciones adicionales de Azure: https://docs.microsoft.com/azure/billing/billing-create-subscription
Creación de grupos de administración: https://docs.microsoft.com/azure/governance/management-groups/create
Configuración de reglas de firewall de IP para espacios de nombres de Azure Event Hubs:
https://docs.microsoft.com/azure/event-hubs/event-hubs-ip-filtering
Procedimiento para crear y usar etiquetas: https://docs.microsoft.com/azure/azure-resource-manager/resource-
group-using-tags
Procedimiento para crear una red virtual: https://docs.microsoft.com/azure/virtual-network/quick-create-portal
Super visión de Azure Security Center : No aplicable
Responsabilidad : Customer
4.3: Supervisión y bloqueo de una transferencia no autorizada de información confidencial
Guía : Al usar máquinas virtuales para tener acceso a los centros de eventos, aproveche las redes virtuales, los
puntos de conexión de servicio, el firewall de Event Hubs, los grupos de seguridad de red y las etiquetas de servicio
para mitigar la posibilidad de que se produzca una filtración de datos.
Microsoft administra la infraestructura subyacente para Azure Event Hubs y ha implementado controles estrictos
para evitar la pérdida o exposición de los datos de los clientes.
Configuración de reglas de firewall de IP para espacios de nombres de Azure Event Hubs:
https://docs.microsoft.com/azure/event-hubs/event-hubs-ip-filtering
Introducción a los puntos de conexión de servicio de red virtual con Azure Event Hubs:
https://docs.microsoft.com/azure/event-hubs/event-hubs-service-endpoints
Integración de Azure Event Hubs en Azure Private Link: https://docs.microsoft.com/azure/event-hubs/private-link-
service
Introducción a los grupos de seguridad de red y las etiquetas de servicio: https://docs.microsoft.com/azure/virtual-
network/security-overview
Descripción de la protección de datos de los clientes en Azure:
https://docs.microsoft.com/azure/security/fundamentals/protection-customer-data
Super visión de Azure Security Center : No aplicable
Responsabilidad : Customer
4.4: Cifrado de toda la información confidencial en tránsito
Guía : Azure Event Hubs aplica las comunicaciones cifradas con TLS de forma predeterminada. Actualmente se
admiten las versiones de TLS 1.0, 1.1 y 1.2. Sin embargo, TLS 1.0 y 1.1 están en proceso de desuso en todo el sector,
por lo que se recomienda TLS 1.2 si es posible.
Para comprender las características de seguridad de Event Hubs, consulte Seguridad de red:
https://docs.microsoft.com/azure/event-hubs/network-security
Super visión de Azure Security Center : No aplicable
Responsabilidad : Microsoft
4.5: Uso de una herramienta de detección activa para identificar datos confidenciales
Instrucciones : Las características de identificación, clasificación y prevención de pérdida de datos todavía no están
disponibles para Azure Event Hubs. Implemente una solución de terceros, si es necesario, para fines de
cumplimiento.
En el caso de la plataforma subyacente administrada por Microsoft, Microsoft trata todo el contenido de los clientes
como confidencial y hace grandes esfuerzos para proteger a los clientes contra la pérdida y exposición de sus
datos. Para garantizar la seguridad de los datos de los clientes dentro de Azure, Microsoft ha implementado y
mantiene un conjunto de controles y funcionalidades eficaces de protección de datos.
Descripción de la protección de datos de los clientes en Azure:
https://docs.microsoft.com/azure/security/fundamentals/protection-customer-data
Super visión de Azure Security Center : no disponible actualmente
Responsabilidad : Compartido
4.6: Uso de RBAC de Azure para controlar el acceso a los recursos
Guía : Azure Event Hubs admite la autorización de solicitudes a recursos de Event Hubs mediante
Azure Active Directory (AD). Con Azure AD, puede usar el control de acceso basado en rol (RBAC) para conceder
permisos a una entidad de seguridad, que puede ser un usuario o una entidad de servicio de aplicación.
Introducción a RBAC de Azure AD y los roles disponibles para Azure Event Hubs:
https://docs.microsoft.com/azure/event-hubs/authorize-access-azure-active-directory
Super visión de Azure Security Center : No aplicable
Responsabilidad : Customer
4.7: Uso de la prevención de pérdida de datos basada en host para aplicar el control de acceso
Guía : No aplicable; esta guía está pensada para recursos de proceso.
Microsoft administra la infraestructura subyacente para Event Hubs y ha implementado controles estrictos para
evitar la pérdida o exposición de los datos de los clientes.
Descripción de la protección de datos de los clientes en Azure:
https://docs.microsoft.com/azure/security/fundamentals/protection-customer-data
Super visión de Azure Security Center : No aplicable
Responsabilidad : No aplicable
4.8: Cifrado de información confidencial en reposo
Guía : Azure Event Hubs admite la opción de cifrado de datos en reposo con claves administradas por Microsoft o
claves administradas por el cliente. Esta característica permite crear, rotar, deshabilitar y revocar el acceso a las
claves administradas por el cliente que se usan para cifrar datos en reposo de Azure Event Hubs.
Procedimiento para configurar claves administradas por el cliente para el cifrado de Azure Event Hubs:
https://docs.microsoft.com/azure/event-hubs/configure-customer-managed-key
Super visión de Azure Security Center : No aplicable
Responsabilidad : Customer
4.9: Registro y alerta de cambios en los recursos críticos de Azure
Guía : Use Azure Monitor con el registro de actividad de Azure para crear alertas para cuando se produzcan
cambios en las instancias de producción de Azure Event Hubs y otros recursos críticos o relacionados.
Procedimiento para crear alertas para eventos de registro de actividad de Azure:
https://docs.microsoft.com/azure/azure-monitor/platform/alerts-activity-log
Super visión de Azure Security Center : No aplicable
Responsabilidad : Customer

Administración de vulnerabilidades
Para obtener más información, consulte Control de seguridad: administración de vulnerabilidades.
5.1: Ejecute herramientas de análisis de vulnerabilidades automatizado
Instrucciones : No aplicable; Microsoft realiza la administración de vulnerabilidades en los sistemas subyacentes
que admiten Event Hubs.
Super visión de Azure Security Center : No aplicable
Responsabilidad : Microsoft
5.2: Implemente una solución de administración de revisiones de sistema operativo automatizada
Guía : No aplicable; Microsoft realiza la administración de revisiones en los sistemas subyacentes que admiten
Event Hubs.
Super visión de Azure Security Center : No aplicable
Responsabilidad : Microsoft
5.3: Implemente una solución automatizada de administración de revisiones de software de terceros
Guía : No aplicable; la prueba comparativa está pensada para recursos de proceso.
Super visión de Azure Security Center : No aplicable
Responsabilidad : Microsoft
5.4: Compare los exámenes de vulnerabilidades opuestos
Instrucciones : No aplicable; Microsoft realiza la administración de vulnerabilidades en los sistemas subyacentes
que admiten Event Hubs.
Super visión de Azure Security Center : No aplicable
Responsabilidad : Microsoft
5.5: Use un proceso de clasificación de riesgos para priorizar la corrección de las vulnerabilidades detectadas
Instrucciones : No aplicable; Microsoft realiza la administración de vulnerabilidades en los sistemas subyacentes
que admiten Event Hubs.
Super visión de Azure Security Center : No aplicable
Responsabilidad : Microsoft

Administración de recursos y del inventario


Para obtener más información, consulte Control de seguridad: inventario y administración de recursos.
6.1: Uso de la detección de recursos de Azure
Guía : Use Azure Resource Graph para consultar y detectar todos los recursos (incluidos los espacios de nombres
de Azure Event Hubs) dentro de las suscripciones. Asegúrese de que tiene los permisos adecuados (lectura) en el
inquilino y de que puede enumerar todas las suscripciones de Azure, así como los recursos de las suscripciones.
Creación de consultas con Azure Resource Graph: https://docs.microsoft.com/azure/governance/resource-
graph/first-query-portal
Visualización de las suscripciones de Azure: https://docs.microsoft.com/powershell/module/az.accounts/get-
azsubscription?view=azps-3.0.0
Descripción de Azure RBAC: https://docs.microsoft.com/azure/role-based-access-control/overview
Super visión de Azure Security Center : No aplicable
Responsabilidad : Customer
6.2: Mantenimiento de metadatos de recursos
Instrucciones : Aplique etiquetas a los recursos de Azure que proporcionan metadatos para organizarlos de forma
lógica en una taxonomía.
Creación y uso de etiquetas: https://docs.microsoft.com/azure/azure-resource-manager/resource-group-using-tags
Super visión de Azure Security Center : No aplicable
Responsabilidad : Customer
6.3: Eliminación de recursos de Azure no autorizados
Guía : Use el etiquetado, los grupos de administración y las suscripciones independientes, si procede, para
organizar y realizar un seguimiento de los espacios de nombres de Azure Event Hubs y los recursos relacionados.
Concilie el inventario periódicamente y asegúrese de que los recursos no autorizados se eliminan de la suscripción
de manera oportuna.
Creación de suscripciones adicionales de Azure: https://docs.microsoft.com/azure/billing/billing-create-subscription
Creación de grupos de administración: https://docs.microsoft.com/azure/governance/management-groups/create
Creación y uso de etiquetas: https://docs.microsoft.com/azure/azure-resource-manager/resource-group-using-tags
Super visión de Azure Security Center : No aplicable
Responsabilidad : Customer
6.4: Mantenimiento de un inventario de los recursos de Azure aprobados y títulos de software
Guía : No aplicable; esta recomendación está destinada a los recursos de proceso y a Azure en su conjunto.
Super visión de Azure Security Center : No aplicable
Responsabilidad : No aplicable
6.5: Supervisión de recursos de Azure no aprobados
Instrucciones : use Azure Policy para establecer restricciones sobre el tipo de recursos que se pueden crear en las
suscripciones del cliente con las siguientes definiciones de directiva integradas:
Tipos de recursos no permitidos
Tipos de recursos permitidos
Además, use Azure Resource Graph para consultar o detectar recursos dentro de las suscripciones.
Cómo configurar y administrar Azure Policy: https://docs.microsoft.com/azure/governance/policy/tutorials/create-
and-manage
Creación de consultas con Azure Graph: https://docs.microsoft.com/azure/governance/resource-graph/first-query-
portal
Super visión de Azure Security Center : No aplicable
Responsabilidad : Customer
6.6: Supervisión de aplicaciones de software no aprobadas en recursos de proceso
Instrucciones : No aplicable; esta recomendación está pensada para los recursos de proceso.
Super visión de Azure Security Center : No aplicable
Responsabilidad : No aplicable
6.7: Eliminación de aplicaciones de software y recursos de Azure no aprobadas
Guía : No aplicable; esta recomendación está destinada a los recursos de proceso y a Azure en su conjunto.
Super visión de Azure Security Center : No aplicable
Responsabilidad : No aplicable
6.8: Uso exclusivo de aplicaciones aprobadas
Instrucciones : No aplicable; esta recomendación está pensada para los recursos de proceso.
Super visión de Azure Security Center : No aplicable
Responsabilidad : No aplicable
6.9: Uso exclusivo de servicios de Azure aprobados
Instrucciones : use Azure Policy para establecer restricciones sobre el tipo de recursos que se pueden crear en las
suscripciones del cliente con las siguientes definiciones de directiva integradas:
Tipos de recursos no permitidos
Tipos de recursos permitidos
Cómo configurar y administrar Azure Policy: https://docs.microsoft.com/azure/governance/policy/tutorials/create-
and-manage
Denegación de un tipo de recurso específico con Azure Policy:
https://docs.microsoft.com/azure/governance/policy/samples/not-allowed-resource-types
Super visión de Azure Security Center : No aplicable
Responsabilidad : Customer
6.10: Implementación de la lista de aplicaciones aprobadas
Instrucciones : No aplicable; esta recomendación está pensada para los recursos de proceso.
Super visión de Azure Security Center : No aplicable
Responsabilidad : No aplicable
6.11:
Limitación de la capacidad de los usuarios para interactuar con Azure Resource Manager a través de scripts
Guía : Configure el acceso condicional de Azure para limitar la capacidad de los usuarios de interactuar con Azure
Resource Manager configurando "Bloquear acceso" en la aplicación Microsoft Azure Management.
Configuración del acceso condicional para bloquear el acceso a Azure Resource Manager:
https://docs.microsoft.com/azure/role-based-access-control/conditional-access-azure-management
Super visión de Azure Security Center : No aplicable
Responsabilidad : Customer
6.12: Limitación de capacidad de los usuarios para ejecutar scripts en recursos de proceso
Instrucciones : No aplicable; esta recomendación está pensada para los recursos de proceso.
Super visión de Azure Security Center : No aplicable
Responsabilidad : No aplicable
6.13: Segregación física o lógica de aplicaciones de alto riesgo
Instrucciones : No aplicable; esta recomendación está pensada para las aplicaciones web que se ejecutan en Azure
App Service o en recursos de proceso.
Super visión de Azure Security Center : No aplicable
Responsabilidad : No aplicable

Configuración segura
Para obtener más información, consulte Control de seguridad: configuración segura.
7.1: Establezca configuraciones seguras para todos los recursos de Azure
Guía : Defina e implemente configuraciones de seguridad estándar para las implementaciones de Azure Event
Hubs. Use alias de Azure Policy en el espacio de nombres "Microsoft.EventHub" para crear directivas personalizadas
con el fin de auditar o aplicar las configuraciones. También puede usar definiciones de directivas integradas para
Azure Event Hubs, como:
Los registros de diagnóstico del centro de eventos deben estar habilitados
El centro de eventos debe usar un punto de conexión del servicio de red virtual
Directiva integrada de Azure para espacio de nombres de Event Hubs:
https://docs.microsoft.com/azure/governance/policy/samples/built-in-policies#event-hub
Visualización de los alias de Azure Policy disponibles:
https://docs.microsoft.com/powershell/module/az.resources/get-azpolicyalias?view=azps-3.3.0
Cómo configurar y administrar Azure Policy: https://docs.microsoft.com/azure/governance/policy/tutorials/create-
and-manage
Super visión de Azure Security Center : No aplicable
Responsabilidad : Customer
7.2: Establezca configuraciones del sistema operativo seguras
Instrucciones : No aplicable; esta recomendación está pensada para los recursos de proceso.
Super visión de Azure Security Center : No aplicable
Responsabilidad : No aplicable
7.3: Mantenga configuraciones de recursos de Azure seguras
Guía : Use la directiva de Azure Policy [deny] y [deployifnotexist] para aplicar la configuración segura en los
recursos habilitados para Event Hubs.
Configuración y administración de Azure Policy:
https://docs.microsoft.com/azure/governance/policy/tutorials/create-and-manage
Para obtener más información, consulte los efectos de Azure Policy:
https://docs.microsoft.com/azure/governance/policy/concepts/effects
Super visión de Azure Security Center : No aplicable
Responsabilidad : Customer
7.4: Mantenga configuraciones del sistema operativo seguras
Instrucciones : No aplicable; esta recomendación está pensada para los recursos de proceso.
Super visión de Azure Security Center : No aplicable
Responsabilidad : No aplicable
7.5: Almacene de forma segura la configuración de los recursos de Azure
Guía : Si usa definiciones personalizadas de Azure Policy para los recursos de Event Hubs u otros relacionados, use
Azure Repos para almacenar y administrar el código de forma segura.
Cómo almacenar código en Azure DevOps: https://docs.microsoft.com/azure/devops/repos/git/gitworkflow?
view=azure-devops
Documentación de Azure Repos: https://docs.microsoft.com/azure/devops/repos/index?view=azure-devops
Super visión de Azure Security Center : No aplicable
Responsabilidad : No aplicable
7.6: Almacene imágenes de sistema operativo personalizadas de forma segura
Instrucciones : No aplicable; esta recomendación está pensada para los recursos de proceso.
Super visión de Azure Security Center : No aplicable
Responsabilidad : No aplicable
7.7: Implemente herramientas de administración de configuración del sistema
Guía : Use alias de Azure Policy en el espacio de nombres "Microsoft.EventHub" para crear directivas personalizadas
con el fin de auditar y aplicar las configuraciones del sistema y enviar alertas sobre ellas. Además, desarrolle un
proceso y una canalización para administrar las excepciones de las directivas.
Cómo configurar y administrar Azure Policy: https://docs.microsoft.com/azure/governance/policy/tutorials/create-
and-manage
Super visión de Azure Security Center : No aplicable
Responsabilidad : Customer
7.8: Implemente herramientas de administración de configuración del sistema para sistemas operativos
Instrucciones : No aplicable; esta recomendación está pensada para los recursos de proceso.
Super visión de Azure Security Center : No aplicable
Responsabilidad : No aplicable
7.9: Implemente la supervisión de configuración automatizada para servicios de Azure
Guía : Use alias de Azure Policy en el espacio de nombres "Microsoft.EventHub" para crear directivas personalizadas
con el fin de auditar y aplicar las configuraciones del sistema y enviar alertas sobre ellas. Use la directiva de Azure
Policy [audit], [deny] y [deployifnotexist] para aplicar automáticamente las configuraciones en las
implementaciones de Azure Event Hubs y los recursos relacionados.
Cómo configurar y administrar Azure Policy: https://docs.microsoft.com/azure/governance/policy/tutorials/create-
and-manage
Super visión de Azure Security Center : No aplicable
Responsabilidad : Customer
7.10: Implemente la supervisión de configuración automatizada para sistemas operativos
Instrucciones : No aplicable; esta recomendación está pensada para los recursos de proceso.
Super visión de Azure Security Center : No aplicable
Responsabilidad : No aplicable
7.11: Administre los secretos de Azure de forma segura
Guía : En el caso de las máquinas virtuales de Azure o las aplicaciones web que se ejecutan en Azure App Service y
se usan para tener acceso a los centros de eventos, use Managed Service Identity junto con Azure Key Vault para
simplificar y proteger la administración de firmas de acceso compartido para sus implementaciones de Azure Event
Hubs. Asegúrese de que la eliminación temporal de Key Vault esté habilitada.
Autenticación de una identidad administrada con Azure Active Directory para acceder a recursos de Event Hubs:
https://docs.microsoft.com/azure/event-hubs/authenticate-managed-identity?tabs=latest
Configuración de claves administradas por el cliente para Event Hubs: https://docs.microsoft.com/azure/event-
hubs/configure-customer-managed-key
Cómo integrar las identidades administradas de Azure: https://docs.microsoft.com/azure/azure-app-
configuration/howto-integrate-azure-managed-service-identity
Cómo crear un almacén de claves: https://docs.microsoft.com/azure/key-vault/quick-create-portal
Cómo proporcionar la autenticación de Key Vault con una identidad administrada:
https://docs.microsoft.com/azure/key-vault/managed-identity
Super visión de Azure Security Center : Sí
Responsabilidad : Customer
7.12: Administre las identidades de forma segura y automática
Guía : En el caso de las máquinas virtuales de Azure o las aplicaciones web que se ejecutan en Azure App Service y
se usan para tener acceso a los centros de eventos, use Managed Service Identity junto con Azure Key Vault para
simplificar y proteger Event Hubs de Azure. Asegúrese de que la eliminación temporal de Key Vault esté habilitada.
Use Identidades administradas para proporcionar a los servicios de Azure una identidad administrada
automáticamente en Azure Active Directory (AD). Identidades administradas le permite autenticarse en cualquier
servicio que admita la autenticación de Azure AD, incluido Azure Key Vault, sin necesidad de credenciales en el
código.
Autenticación de una identidad administrada con Azure Active Directory para acceder a recursos de Event Hubs:
https://docs.microsoft.com/azure/event-hubs/authenticate-managed-identity?tabs=latest
Configuración de claves administradas por el cliente para Event Hubs: https://docs.microsoft.com/azure/event-
hubs/configure-customer-managed-key
Cómo configurar las identidades administradas: https://docs.microsoft.com/azure/active-directory/managed-
identities-azure-resources/qs-configure-portal-windows-vm
Cómo integrar las identidades administradas de Azure: https://docs.microsoft.com/azure/azure-app-
configuration/howto-integrate-azure-managed-service-identity
Super visión de Azure Security Center : Sí
Responsabilidad : Customer
7.13: Elimine la exposición de credenciales no intencionada
Instrucciones : Implemente el escáner de credenciales para identificar las credenciales en el código. El escáner de
credenciales también fomenta el traslado de credenciales detectadas a ubicaciones más seguras, como Azure Key
Vault.
Cómo configurar el escáner de credenciales: https://secdevtools.azurewebsites.net/helpcredscan.html
Super visión de Azure Security Center : No aplicable
Responsabilidad : Customer

Defensa contra malware


Para obtener más información, consulte Control de seguridad: defensa contra malware.
8.1: Use software antimalware administrado centralmente
Instrucciones : No aplicable; esta recomendación está pensada para los recursos de proceso.
Microsoft Antimalware está habilitado en el host subyacente que admite los servicios de Azure (por ejemplo, Azure
App Service), pero no se ejecuta en el contenido del cliente.
Super visión de Azure Security Center : No aplicable
Responsabilidad : No aplicable
8.2: Examine previamente los archivos que se van a cargar en recursos de Azure que no son de proceso
Guía : Examine previamente el contenido que se carga en recursos de Azure que no son de proceso, como Azure
Event Hubs, App Service, Data Lake Storage, Blob Storage, Azure Database for PostgreSQL, etc. Microsoft no tiene
acceso a los datos de estas instancias.
Microsoft Antimalware está habilitado en el host subyacente que admite los servicios de Azure (por ejemplo, Azure
Cache for Redis), pero no se ejecuta en el contenido del cliente.
Super visión de Azure Security Center : No aplicable
Responsabilidad : Customer
8.3: Asegúrese de que se han actualizado el software y las firmas antimalware
Instrucciones : No aplicable; esta recomendación está pensada para los recursos de proceso.
Super visión de Azure Security Center : No aplicable
Responsabilidad : No aplicable

Recuperación de datos
Para obtener más información, consulte Control de seguridad: recuperación de datos.
9.1: Garantía de copias de seguridad automáticas periódicas
Instrucciones : Configure la recuperación ante desastres geográfica para Azure Event Hubs. Cuando hay regiones
de Azure completas o centros de datos (si no se utilizan zonas de disponibilidad) que experimentan un tiempo de
inactividad, es crucial que el procesamiento de datos siga funcionando en otra región o centro de datos. De esta
forma, la recuperación ante desastres geográfica y la replicación geográfica son características importantes para
cualquier empresa. Azure Event Hubs admite tanto la recuperación ante desastres con localización geográfica como
la replicación geográfica, en el nivel de espacio de nombres.
Introducción a la recuperación ante desastres geográfica para Azure Event Hubs:
https://docs.microsoft.com/azure/event-hubs/event-hubs-geo-dr#availability-zones
Super visión de Azure Security Center : no disponible actualmente
Responsabilidad : Customer
9.2: Realización de copias de seguridad completas del sistema y copia de seguridad de las claves administradas
por el cliente
Guía : Azure Event Hubs proporciona cifrado de datos en reposo con Azure Storage Service Encryption (Azure SSE).
Event Hubs se basa en Azure Storage para almacenar los datos y, de forma predeterminada, todos los datos que se
almacenan con Azure Storage se cifran mediante claves administradas por Microsoft. Si usa Azure Key Vault para
almacenar claves administradas por el cliente, asegúrese de realizar copias de seguridad automatizadas periódicas
de las claves.
Asegúrese de realizar copias de seguridad automatizadas periódicas de sus secretos de Key Vault con el siguiente
comando de PowerShell: Backup-AzKeyVaultSecret
Procedimiento para configurar claves administradas por el cliente para el cifrado de datos de Azure Event Hubs en
reposo: https://docs.microsoft.com/azure/event-hubs/configure-customer-managed-key
Realización de copias de seguridad de secretos de Key Vault:
https://docs.microsoft.com/powershell/module/azurerm.keyvault/backup-azurekeyvaultsecret
Super visión de Azure Security Center : No aplicable
Responsabilidad : Customer
9.3: Validación de todas las copias de seguridad, incluidas las claves administradas por el cliente
Guía : Pruebe la restauración de las claves administradas por el cliente de la copia de seguridad.
Restauración de las claves del almacén de claves en Azure:
https://docs.microsoft.com/powershell/module/azurerm.keyvault/restore-azurekeyvaultkey?view=azurermps-
6.13.0
Super visión de Azure Security Center : No aplicable
Responsabilidad : Customer
9.4: Garantía de la protección de las copias de seguridad y las claves administradas del cliente
Guía : Habilite la eliminación temporal en Key Vault para proteger las claves contra la eliminación accidental o
malintencionada. Azure Event Hubs requiere que las claves administradas por el cliente tengan configurada
Eliminación temporal y No purgar.
Configure la eliminación temporal para la cuenta de Azure Storage que se usa para capturar datos de Event Hubs.
Tenga en cuenta que esta característica aún no se admite para Azure Data Lake Storage Gen 2.
Habilitación de la eliminación temporal en Key Vault: https://docs.microsoft.com/azure/storage/blobs/storage-blob-
soft-delete?tabs=azure-portal
Configuración de un almacén de claves con claves: https://docs.microsoft.com/azure/event-hubs/configure-
customer-managed-key
Eliminación temporal de blobs de Azure Storage: https://docs.microsoft.com//azure/storage/blobs/storage-blob-
soft-delete?tabs=azure-portal
Super visión de Azure Security Center : Sí
Responsabilidad : Customer

Respuesta a los incidentes


Para obtener más información, consulte Control de seguridad: respuesta ante incidentes.
10.1: Creación de una guía de respuesta ante incidentes
Instrucciones : asegúrese de que haya planes de respuesta ante incidentes escritos que definan los roles del
personal, así como las fases de administración y gestión de los incidentes.
Configuración de las automatizaciones del flujo de trabajo en Azure Security Center:
https://docs.microsoft.com/azure/security-center/security-center-planning-and-operations-guide
Super visión de Azure Security Center : No aplicable
Responsabilidad : Customer
10.2: Creación de un procedimiento de priorización y puntuación de incidentes
Instrucciones : Security Center asigna una gravedad a las alertas, que le ayudan a priorizar el orden en el que
asiste a cada alerta, de modo que cuando un recurso está en peligro, puede obtenerlo inmediatamente. La
gravedad se basa en la confianza que tiene Security Center en la búsqueda o en el análisis utilizados para emitir la
alerta, así como en el nivel de confianza de que ha habido un intento malintencionado detrás de la actividad que ha
provocado la alerta.
Super visión de Azure Security Center : Sí
Responsabilidad : Customer
10.3: Prueba de los procedimientos de respuesta de seguridad
Guía : Realice ejercicios para probar las capacidades de respuesta a los incidentes de los sistemas con regularidad.
Identifique puntos débiles y brechas y revise el plan según sea necesario.
Consulte la publicación de NIST: Guía para probar, entrenar y ejecutar programas para planes y capacidades de TI:
https://nvlpubs.nist.gov/nistpubs/Legacy/SP/nistspecialpublication800-84.pdf
Super visión de Azure Security Center : No aplicable
Responsabilidad : Customer
10.4: Provisión de detalles de contacto de incidentes de seguridad y configuración de notificaciones de alerta
para incidentes de seguridad
Guía : La información de contacto del incidente de seguridad la utilizará Microsoft para ponerse en contacto con
usted si Microsoft Security Response Center (MSRC) detecta que un tercero no autorizado o ilegal ha accedido a los
datos del cliente. Revise los incidentes después del hecho para asegurarse de que se resuelven los problemas.
Cómo establecer el contacto de seguridad de Azure Security Center: https://docs.microsoft.com/azure/security-
center/security-center-provide-security-contact-details
Super visión de Azure Security Center : Sí
Responsabilidad : Customer
10.5: Incorporación de alertas de seguridad en el sistema de respuesta a incidentes
Instrucciones : Exporte sus alertas y recomendaciones de Azure Security Center mediante la característica de
exportación continua. La exportación continua le permite exportar alertas y recomendaciones de forma manual o
continua. Puede usar el conector de datos de Azure Security Center para transmitir las alertas a Sentinel.
Configuración de la exportación continua: https://docs.microsoft.com/azure/security-center/continuous-export
Transmisión de alertas a Azure Sentinel: https://docs.microsoft.com/azure/sentinel/connect-azure-security-center
Super visión de Azure Security Center : No aplicable
Responsabilidad : Customer
10.6: Automatización de la respuesta a las alertas de seguridad
Instrucciones : use la característica de automatización del flujo de trabajo de Azure Security Center para
desencadenar automáticamente respuestas mediante "Logic Apps" en las alertas y recomendaciones de seguridad.
Configuración de la automatización de flujo de trabajo y Logic Apps: https://docs.microsoft.com/azure/security-
center/workflow-automation
Super visión de Azure Security Center : No aplicable
Responsabilidad : Customer

Pruebas de penetración y ejercicios del equipo rojo


Para obtener más información, consulte Control de seguridad: Pruebas de penetración y ejercicios del equipo rojo.
11.1: Realice pruebas de penetración periódicas de los recursos de Azure y asegúrese de corregir todos los
resultados de seguridad críticos en un plazo de 60 días
Guía : siga las reglas de compromiso de Microsoft para asegurarse de que las pruebas de penetración no infrinjan
las directivas de Microsoft: https://www.microsoft.com/msrc/pentest-rules-of-engagement?rtc=1. Puede encontrar
más información sobre la estrategia de Microsoft y la ejecución de las pruebas de penetración del equipo rojo y
sitios activos en la infraestructura de nube, los servicios y las aplicaciones administradas por Microsoft aquí:
https://gallery.technet.microsoft.com/Cloud-Red-Teaming-b837392e
Super visión de Azure Security Center : Sí
Responsabilidad : Customer

Pasos siguientes
Consulte la prueba comparativa de seguridad de Azure.
Obtenga más información sobre las líneas de base de seguridad de Azure.
Guía del protocolo AMQP 1.0 Azure Service Bus y
Event Hubs
18/08/2020 • 62 minutes to read • Edit Online

Advanced Message Queueing Protocol 1.0 es un protocolo de tramas y transferencia estandarizado para transferir
mensajes de forma asincrónica, segura y confiable entre dos partes. Es el principal protocolo de Azure Service Bus
Messaging y Azure Event Hubs. Ambos servicios también admiten HTTPS. El protocolo SBMP propietario, que
también se admite, está desapareciendo en favor de AMQP.
AMQP 1.0 es el resultado de una amplia colaboración del sector que reunió a proveedores de middleware, como
Microsoft y Red Hat, con muchos usuarios de middleware de mensajería, como JP Morgan Chase, que representa
al sector de los servicios financieros. El foro de normalización técnica para las especificaciones del protocolo AMQP
y la extensión es OASIS, y ha logrado la aprobación formal como estándar internacional como ISO/IEC 19494.

Objetivos
Este artículo resume brevemente los conceptos básicos de la especificación de mensajería AMQP 1.0, junto con un
pequeño conjunto de borradores de especificaciones de la extensión que actualmente se está finalizando en el
comité técnico de OASIS para AMQP; también explica cómo Azure Service Bus implementa y crea basándose en
estas especificaciones.
El objetivo es que cualquier desarrollador que usa una pila de cliente de AMQP 1.0 existente en cualquier
plataforma pueda interactuar con Azure Service Bus mediante AMQP 1.0.
Las pilas de propósito general de AMQP 1.0 comunes, como Apache Proton o AMQP.NET Lite, ya implementan
todos los protocolos importantes de AMQP 1.0. Los gestos fundacionales a veces se encapsulan con una API de
mayor nivel; Apache Proton incluso ofrece dos: la API de Messenger imperativa y la API de Reactor reactiva.
En la siguiente sección, se supone que la administración de conexiones, sesiones y vínculos de AMQP, y la
administración de las transferencias de tramas y el control de flujo se tratan mediante la pila correspondiente (por
ejemplo, Apache Proton-C) y no requieren demasiada atención específica de los desarrolladores de aplicaciones, o
ninguna atención. Suponemos de forma abstracta la existencia de unas primitivas de API, como la capacidad de
conectarse y de crear algún tipo de objetos de abstracción remitente y receptor, que luego tienen alguna forma de
operaciones send() y receive() , respectivamente.
Cuando se habla de las funcionalidades avanzadas de Azure Service Bus, como la consulta de mensajes o la
administración de sesiones, estas características se explican en relación a AMQP, pero también como una
pseudoimplementación superpuesta sobre esta abstracción de API supuesta.

¿Qué es AMQP?
AMQP es un protocolo de tramas y transferencia. Las tramas significa que proporciona una estructura para los
flujos de datos binarios que fluyan en ambas direcciones de una conexión de red. La estructura proporciona la
delineación de bloques de datos distintivos tramas que se intercambiarán entre las partes conectadas. Las
funcionalidades de transferencia se aseguran de que ambas partes de la comunicación pueden establecer un
conocimiento compartido acerca de cuándo se transferirán las tramas y cuándo se considerarán completadas las
transferencias.
A diferencia de los anteriores borradores expirados producidos por el grupo de trabajo de AMQP que todavía usan
algunos agentes de mensajes, el protocolo AMQP 1.0 estandarizado y final del grupo de trabajo no prescribe la
presencia de un agente de mensajes o de ninguna topología concreta para las entidades dentro de un agente de
mensajes.
Puede usar el protocolo para la comunicación punto a punto simétrica, para la interacción con los agentes de
mensajes que admiten las colas y las entidades de publicación/suscripción, como hace Azure Service Bus. También
se puede utilizar para la interacción con la infraestructura de mensajería cuando los patrones de interacción son
distintos de las colas regulares, como sucede con Azure Event Hubs. Un Centro de eventos actúa como una cola
cuando se le envían eventos, pero actúa más como un servicio de almacenamiento en serie cuando se leen los
eventos desde él; en cierto modo, se parece a una unidad de cinta. El cliente elige un desplazamiento en el flujo de
datos disponible y, después, atiende todos los eventos desde ese desplazamiento hasta el más reciente disponible.
El protocolo AMQP 1.0 está diseñado para ser extensible, lo que permite que las especificaciones mejoren sus
funcionalidades. Las tres especificaciones de la extensión que tratamos en este documento lo muestran. Para la
comunicación a través de la infraestructura existente de HTTPS/WebSockets, la configuración de los puertos TCP
de AMQP nativos puede ser difícil. Una especificación de enlace define cómo superponer AMQP a WebSockets.
Para interactuar con la infraestructura de mensajería en forma de solicitud/respuesta para fines de administración
o para proporcionar una funcionalidad avanzada, la especificación de Administración de AMQP define las
primitivas de interacción básica necesarias. Para la integración del modelo de autorización federada, la
especificación de seguridad basada en notificaciones de AMQP define cómo asociar y renovar los tokens de
autorización asociados a los vínculos.

Escenarios básicos de AMQP


En esta sección se explica el uso básico de AMQP 1.0 con Azure Service Bus, lo que incluye la creación de
conexiones, sesiones y vínculos, así como la transferencia de mensajes tanto a las entidades de Services Bus (colas,
temas y suscripciones) como desde ellas.
La fuente con mayor autoridad para aprender cómo funciona AMQP es la especificación AMQP 1.0, pero se
escribió para guiar de forma precisa la implementación, no para enseñar el protocolo. Esta sección se centra en la
presentación de tanta terminología como sea necesario para describir el modo en que Service Bus usa AMQP 1.0.
Para una introducción más completa a AMQP, así como una explicación más amplia de AMQP 1.0, puede consultar
este curso en vídeo.
Conexiones y sesiones
AMQP llama a los programas de comunicación contenedores, que contienen nodos, unas entidades que se
comunican dentro de estos contenedores. Una cola puede ser uno de esos nodos. AMQP permite la multiplexación,
por lo que se puede usar una sola conexión para muchas rutas de comunicación entre los nodos; por ejemplo, un
cliente de aplicación puede recibir al mismo tiempo desde una cola y enviar a otra cola a través de la misma
conexión de red.

Por lo tanto, la conexión de red está anclada en el contenedor. El contenedor la inicia en el rol de cliente, realizando
una conexión de socket TCP saliente a un contenedor en el rol de receptor, que escucha y acepta las conexiones TCP
entrantes. El protocolo de enlace de conexión incluye negociar la versión del protocolo, declarar o negociar el uso
de la seguridad de nivel de transporte (TLS/SSL) y un protocolo de enlace de autenticación y autorización en el
ámbito de la conexión que se basa en SASL.
Azure Service Bus requiere el uso de TLS en todo momento. Admite conexiones a través del puerto TCP 5671,
donde la conexión TCP primero se superpone con TLS antes de entrar en el protocolo de enlace del protocolo
AMQP y también admite conexiones a través del puerto TCP 5672, donde el servidor ofrece inmediatamente una
actualización obligatoria de la conexión a TLS con el modelo prescrito por AMQP. El enlace de WebSockets de
AMQP crea un túnel a través del puerto TCP 443 que es equivalente a las conexiones 5671 de AMQP.
Después de configurar la conexión y TLS, Service Bus ofrece dos opciones de mecanismo SASL:
Normalmente, SASL PLAIN se utiliza para pasar las credenciales de usuario y la contraseña a un servidor.
Service Bus no tiene cuentas, sino reglas de seguridad de acceso compartido con nombre, que confieren
derechos y están asociadas a una clave. El nombre de una regla se usa como nombre de usuario y la clave
(como texto codificado con base64) se utiliza como contraseña. Los derechos asociados a la regla elegida rigen
las operaciones permitidas en la conexión.
SASL ANONYMOUS se utiliza para omitir la autorización de SASL cuando el cliente desea usar el modelo de
seguridad basada en notificaciones (CBS), que se describe más adelante. Con esta opción, se puede establecer
una conexión de cliente de forma anónima por un breve período, durante el cual el cliente solo puede
interactuar con el punto de conexión CBS y se debe completar el protocolo de enlace CBS.
Una vez establecida la conexión de transporte, cada contenedor declara el tamaño máximo de trama que desea
controlar y después de qué tiempo de espera inactivo se desconectará unilateralmente si no hay ninguna actividad
en la conexión.
También declaran cuántos canales simultáneos se admiten. Un canal es una ruta de transferencia unidireccional,
saliente y virtual sobre la conexión. Una sesión toma un canal de cada uno de los contenedores interconectados
para formar una ruta de comunicación bidireccional.
Las sesiones tienen un modelo de control de flujo basado en ventanas; cuando se crea una sesión, cada parte
declara el número de tramas que está dispuesto a aceptar en su ventana de recepción. A medida que las partes
intercambian tramas, las tramas transferidas llenan esa ventana y se detienen cuando la ventana está llena, y hasta
que la ventana se restablece o se expande mediante el performativo del flujo (performativo es el término de AMQP
para los gestos en el nivel de protocolo intercambiados entre las dos partes).
Este modelo basado en ventanas es parecido al concepto de control de flujo basado en ventanas de TCP, pero en el
nivel de sesión dentro del socket. El concepto del protocolo de permitir que haya varias sesiones simultáneas existe
para que el tráfico de alta prioridad pueda adelantar al tráfico normal limitado, como en un carril rápido de una
autopista.
En la actualidad, Azure Service Bus utiliza exactamente una sesión para cada conexión. El tamaño de trama máximo
de Service Bus es 262 144 bytes (256 KB) para Service Bus estándar y Event Hubs. Para Service Bus Premium es 1
048 576 (1 MB). Service Bus no impone ninguna ventana específica de limitación en el nivel de sesión, pero
restablece la ventana periódicamente como parte del control de flujo en el nivel de vínculo (consulte la siguiente
sección).
Las conexiones, los canales y las sesiones son efímeros. Si la conexión subyacente se contrae, es necesario
restablecer las conexiones, el túnel TLS, el contexto de autorización SASL y las sesiones.
Requisitos de puertos de salida de AMQP
Los clientes que usan conexiones AMQP a través de TCP requieren que se abran los puertos 5671 y 5672 en el
firewall local. Junto con estos puertos, podría ser necesario abrir puertos adicionales si está habilitada la
característica EnableLinkRedirect. EnableLinkRedirect es una nueva característica de mensajería que ayuda a
omitir un salto al recibir mensajes, lo que ayuda a mejorar el rendimiento. El cliente comenzará a comunicarse
directamente con el servicio back-end a través del intervalo de puertos 104XX como se muestra en la siguiente
imagen.
Un cliente de .NET producirá un error SocketException ("Intento de obtener acceso a un socket de una manera no
permitida por los permisos de acceso") si el firewall bloquea estos puertos. La característica se puede deshabilitar
estableciendo EnableAmqpLinkRedirect=false en la cadena de conexión, lo que obliga a los clientes a comunicarse
con el servicio remoto a través del puerto 5671.
Vínculos
AMQP transfiere los mensajes a través de vínculos. Un vínculo es una ruta de comunicación creada en una sesión
que permite transferir mensajes en un sentido; la negociación de estado de la transferencia es a través del vínculo
y bidireccional entre las partes conectadas.

Cualquier contenedor pueden crear vínculos en cualquier momento en una sesión existente, lo que hace que
AMQP sea diferente de muchos otros protocolos, incluidos HTTP y MQTT, donde la iniciación de las transferencias
y la ruta de la transferencia es un privilegio exclusivo de la parte que se crea la conexión de socket.
El contenedor que inicia el vínculo pide al contenedor opuesto que acepte un vínculo y elije un el rol de remitente o
receptor. Por lo tanto, cualquier contenedor puede iniciar la creación de rutas de comunicación unidireccionales o
bidireccionales, con esta última modelada como pares de vínculos.
Se asigna nombre a los vínculos y se asocian a los nodos. Como se indicó al principio, los nodos son las entidades
que se comunican dentro de un contenedor.
En Service Bus, un nodo es directamente equivalente a una cola, un tema, una suscripción o una subcola de
mensajes fallidos de una cola o suscripción. Por lo tanto, el nombre de nodo utilizado en AMQP es el nombre
relativo de la entidad dentro del espacio de nombres de Service Bus. Si una cola se denomina myqueue , ese es
también su nombre de nodo de AMQP. Una suscripción de un tema sigue la convención de API HTTP, ya que se
ordena en una colección de recursos de "suscripciones" y, por consiguiente, una suscripción sub en un tema
mytopic tiene el nombre de nodo de AMQP mytopic/subscriptions/sub .
El cliente que se conecta también debe usar un nombre de nodo local para crear los vínculos; Service Bus no es
preceptivo acerca de esos nombres de nodo y no los interpreta. Normalmente, las pilas de cliente de AMQP 1.0
utilizan un esquema para asegurarse de que estos nombres de nodo efímero son únicos en el ámbito del cliente.
Transferencias
Una vez establecido un vínculo, los mensajes se pueden transferir a través de ese vínculo. En AMQP, se realiza una
transferencia con un gesto de protocolo explícito (el performativo transfer) que mueve un mensaje del remitente al
receptor a través de un vínculo. Una transferencia está completa cuando que se "determina", lo que significa que
ambas partes han establecido una conocimiento compartido del resultado de esa transferencia.
En el caso más simple, el remitente puede enviar mensajes "previamente determinados", lo que significa que el
cliente no está interesado en el resultado y el receptor no proporciona ningún comentario sobre el resultado de la
operación. Este modo es compatible con Service Bus en el nivel del protocolo AMQP, pero no se expone en
ninguna de las API de cliente.
Lo normal es que los mensajes se envíen sin determinar y el receptor indique entonces la aceptación o el rechazo
mediante el performativo disposition. Se produce un rechazo cuando el receptor no puede aceptar el mensaje por
alguna razón y el mensaje de rechazo contiene información sobre el motivo, que es una estructura de error
definida por AMQP. Si se rechazan los mensajes debido a errores internos dentro de Service Bus, el servicio
devuelve información adicional dentro de esa estructura que puede utilizarse para proporcionar sugerencias de
diagnóstico al personal de soporte si está registrando solicitudes de soporte técnico. Obtendrá más detalles sobre
los errores más adelante.
Una forma especial de rechazo es el estado publicado, que indica que el receptor no tiene ninguna objeción técnica
a la transferencia, pero tampoco tiene ningún interés en determinarla. Ese es el caso, por ejemplo, cuando un
mensaje se entrega a un cliente de Service Bus y el cliente elige "abandonar" el mensaje porque no puede realizar
el trabajo resultante de procesar el mensaje, mientras que la entrega del mensaje en sí no tiene ningún error. Una
variación de este estado es el estado modificado, que permite realizar cambios en el mensaje cuando se envía. En
la actualidad, Service Bus no utiliza ese estado.
La especificación AMQP 1.0 define otro estado de disposición, denominado recibido, que ayuda específicamente a
controlar la recuperación de vínculos. La recuperación de vínculos permite reconstituir el estado de un vínculo y las
entregas pendientes sobre una nueva conexión y sesión, cuando se pierden la conexión y sesión anteriores.
Service Bus no admite la recuperación de vínculos; si el cliente pierde la conexión a Service Bus con una
transferencia de mensaje sin determinar pendiente, dicha transferencia se pierde y el cliente debe volver a
conectarse, restablecer el vínculo e intentar de nuevo la transferencia.
Como tal, Service Bus y Event Hubs admiten transferencias "al menos una vez", donde el remitente puede estar
seguro de que el mensaje se ha almacenado y aceptado, pero no admite transferencias "exactamente una vez" en
el nivel de AMQP, donde el sistema intentará recuperar el vínculo y continuar negociando el estado de entrega para
evitar la duplicación de la transferencia del mensaje.
Para compensar posibles envíos duplicados, Service Bus admite la detección de duplicados como una característica
opcional en colas y temas. La detección de duplicados registra los identificadores de todos los mensajes entrantes
durante un período definido por el usuario y después elimina silenciosamente todos los mensajes enviados con los
mismos identificadores de mensaje durante esa misma ventana.
Control de flujo
Además del modelo de control de flujo en el nivel de sesión que se ha tratado anteriormente, cada vínculo tiene su
propio modelo de control de flujo. El control de flujo en el nivel de sesión protege el contenedor para que no tenga
que controlar muchas tramas de una vez; el control de flujo de nivel de vínculo pone la aplicación a cargo de
cuántos mensajes desea controlar desde un vínculo y cuándo.

En un vínculo, las transferencias solo se pueden producir si el remitente tiene suficiente crédito del vínculo. El
crédito del vínculo es un contador establecido por el receptor con el performativo flow , que tiene un ámbito en un
vínculo. Cuando el remitente tiene crédito del vínculo asignado, intenta utilizar ese crédito con la entrega de
mensajes. Cada entrega de mensajes reduce en uno el crédito del vínculo restante. Cuando se agota el crédito del
vínculo, las entregas se detienen.
Cuando Service Bus está en el rol de receptor, proporciona instantáneamente al remitente el crédito del vínculo
suficiente para que los mensajes puedan enviarse de inmediato. Puesto que se utiliza el crédito del vínculo, Service
Bus envía ocasionalmente un performativo flow al remitente para actualizar el saldo del crédito del vínculo.
En el rol de remitente, Service Bus envía mensajes para utilizar todo el crédito del vínculo pendiente.
Una llamada "recibir" en el nivel de API se traduce en un performativo flow enviado a Service Bus por el cliente;
Service Bus usa ese crédito tomando el primer mensaje desbloqueado y disponible de la cola, bloqueándolo y
transfiriéndolo. Si no hay ningún mensaje disponible para la entrega, todo el crédito pendiente por cualquier
vínculo establecido con esa entidad concreta permanece registrado en orden de llegada, y los mensajes se
bloquean y transfieren a medida que estén disponibles para usar el crédito pendiente.
Se libera el bloqueo de un mensaje cuando la transferencia se determina en uno de los estados terminales
aceptado, rechazado o publicado. El mensaje se quita de Service Bus cuando el estado terminal aceptado.
Permanece en Service Bus y se entrega al siguiente receptor cuando la transferencia alcance cualquiera de los
otros estados. Service Bus pasa automáticamente el mensaje a la cola de mensajes fallidos de la entidad al alcanzar
el número máximo de entregas permitido para la entidad debido a rechazos o lanzamientos repetidos.
Aunque las API de Service Bus no exponen directamente dicha opción en la actualidad, un cliente del protocolo
AMQP de nivel inferior puede utilizar el modelo de crédito del vínculo para convertir la interacción de "estilo de
extracción", que emite una unidad de crédito para cada solicitud de recepción, en un modelo de "estilo de
inserción" al emitir un gran número de créditos del vínculo y, a continuación, recibir los mensajes cuando estén
disponibles sin intervención adicional. Se admite la inserción mediante la configuración de las propiedades
MessagingFactory.PrefetchCount o MessageReceiver.PrefetchCount. Si son distintas de cero, el cliente de AMQP las
usa como crédito del vínculo.
En este contexto, es importante comprender que el reloj de la expiración del bloqueo en el mensaje dentro de la
entidad se inicia cuando el mensaje se toma de la entidad, no cuando se coloca en la transferencia. Cada vez que el
cliente indica que está preparado para recibir mensajes mediante la emisión de crédito del vínculo, se espera que
extraiga activamente los mensajes a través de la red y que esté preparado para controlarlos. De lo contrario, el
bloqueo del mensaje puede haber expirado incluso antes de que el mensaje se entregue. El uso del control de flujo
del crédito del vínculo debe reflejar directamente la disponibilidad inmediata para tratar con mensajes disponibles
enviados al receptor.
En resumen, las secciones siguientes proporcionan una introducción esquemática del flujo de performativos
durante diferentes interacciones de API. Cada sección describe una operación lógica diferente. Algunas de esas
interacciones pueden ser "perezosas", lo que significa que solo pueden realizarse cuando se solicitan. La creación
de un remitente del mensaje puede no provocar una interacción de la red hasta que se envía o solicita el primer
mensaje.
Las flechas de la tabla siguiente muestran la dirección de flujo de performativos.
Creación del receptor del mensaje

REM OTO A Z URE SERVIC E B US

--> attach( El cliente se adjunta a la entidad como receptor


name={link name},
handle={numeric handle},
role=receiver ,
source={entity name},
target={client link ID}
)

Service Bus responde asociando su extremo del vínculo <-- attach(


name={link name},
handle={numeric handle},
role=sender ,
source={entity name},
target={client link ID}
)

Creación del remitente del mensaje

REM OTO A Z URE SERVIC E B US

--> attach( Ninguna acción


name={link name},
handle={numeric handle},
role=sender ,
source={client link ID},
target={entity name}
)

Ninguna acción <-- attach(


name={link name},
handle={numeric handle},
role=receiver ,
source={client link ID},
target={entity name}
)

Creación del remitente del mensaje (error)


REM OTO A Z URE SERVIC E B US

--> attach( Ninguna acción


name={link name},
handle={numeric handle},
role=sender ,
source={client link ID},
target={entity name}
)

Ninguna acción <-- attach(


name={link name},
handle={numeric handle},
role=receiver ,
source=null,
target=null
)

<-- detach(
handle={numeric handle},
closed=true ,
error={error info}
)

Cierre del remitente/receptor del mensaje

REM OTO A Z URE SERVIC E B US

--> detach( Ninguna acción


handle={numeric handle},
closed=true
)

Ninguna acción <-- detach(


handle={numeric handle},
closed=true
)

Envío (correcto)

REM OTO A Z URE SERVIC E B US

--> transfer( Ninguna acción


delivery-id={numeric handle},
delivery-tag={binary handle},
settled=false ,,more=false ,
state=null,
resume=false
)

Ninguna acción <-- disposition(


role=receiver,
first={delivery ID},
last={delivery ID},
settled=true ,
state=accepted
)

Envío (error)
REM OTO A Z URE SERVIC E B US

--> transfer( Ninguna acción


delivery-id={numeric handle},
delivery-tag={binary handle},
settled=false ,,more=false ,
state=null,
resume=false
)

Ninguna acción <-- disposition(


role=receiver,
first={delivery ID},
last={delivery ID},
settled=true ,
state=rejected (
error={error info}
)
)

Recepción

REM OTO A Z URE SERVIC E B US

--> flow( Ninguna acción


link-credit=1
)

Ninguna acción < transfer(


delivery-id={numeric handle},
delivery-tag={binary handle},
settled=false ,
more=false ,
state=null,
resume=false
)

--> disposition( Ninguna acción


role=receiver ,
first={delivery ID},
last={delivery ID},
settled=true ,
state=accepted
)

Recepción de múltiples mensajes

REM OTO A Z URE SERVIC E B US

--> flow( Ninguna acción


link-credit=3
)
REM OTO A Z URE SERVIC E B US

Ninguna acción < transfer(


delivery-id={numeric handle},
delivery-tag={binary handle},
settled=false ,
more=false ,
state=null,
resume=false
)

Ninguna acción < transfer(


delivery-id={numeric handle+1},
delivery-tag={binary handle},
settled=false ,
more=false ,
state=null,
resume=false
)

Ninguna acción < transfer(


delivery-id={numeric handle+2},
delivery-tag={binary handle},
settled=false ,
more=false ,
state=null,
resume=false
)

--> disposition( Ninguna acción


role=receiver,
first={delivery ID},
last={delivery ID+2},
settled=true ,
state=accepted
)

error de Hadoop
En las siguientes secciones se explican las propiedades de las secciones de mensajes de AMQP estándar utilizadas
por Service Bus y cómo se asignan al conjunto de API de Service Bus.
Cualquier propiedad que la aplicación necesite definir debe asignarse al valor application-properties de AMQP.

N O M B RE DEL C A M P O USO N O M B RE DE L A A P I

durable - -

priority - -

ttl Período de vida para este mensaje TimeToLive

first-acquirer - -

delivery-count - DeliveryCount

properties
N O M B RE DEL C A M P O USO N O M B RE DE L A A P I

message-id Identificador de formato libre definido MessageId


por la aplicación para este mensaje. Se
usa para la detección de duplicados.

user-id Identificador del usuario definido por la No es accesible a través de la API de


aplicación; no interpretado por Service Service Bus.
Bus.

to Identificador del destino definido por la To


aplicación; no interpretado por Service
Bus.

subject Identificador del propósito de mensaje Label


definido por la aplicación; no
interpretado por Service Bus.

reply-to Indicador de la ruta de respuesta ReplyTo


definido por la aplicación; no
interpretado por Service Bus.

correlation-id Identificador de la correlación definido CorrelationId


por la aplicación; no interpretado por
Service Bus.

content-type Indicador del tipo de contenido definido ContentType


por la aplicación para el cuerpo; no
interpretado por Service Bus.

content-encoding Indicador de la codificación de No es accesible a través de la API de


contenido definido por la aplicación Service Bus.
para el cuerpo; no interpretado por
Service Bus.

absolute-expiry-time Declara en qué instante absoluto expira ExpiresAtUtc


el mensaje. Se ignora en la entrada (se
observa el TTL de encabezado), es
autoritativo en la salida.

creation-time Declara en qué momento creó el No es accesible a través de la API de


mensaje. No usado por Service Bus Service Bus.

group-id Identificador definido por la aplicación SessionId


para un conjunto de mensajes
relacionado. Se utiliza para sesiones de
Service Bus.

group-sequence Contador que identifica el número de No es accesible a través de la API de


secuencia relativa del mensaje dentro Service Bus.
de una sesión. Omitido por Service Bus.

reply-to-group-id - ReplyToSessionId

Anotaciones del mensaje


Hay algunas otras propiedades de mensaje de Service Bus, que no forman parte de las propiedades de mensaje de
AMQP, que se transmiten como MessageAnnotations en el mensaje.
C L AVE DE A SIGN A C IÓ N DE
A N OTA C IO N ES USO N O M B RE DE L A A P I

x-opt-scheduled-enqueue-time Indica en qué momento debe aparecer ScheduledEnqueueTime


el mensaje en la entidad.

x-opt-partition-key Clave que define la aplicación que PartitionKey


determina a qué partición debe llegar el
mensaje.

x-opt-via-partition-key Valor de clave de partición que define la ViaPartitionKey


aplicación cuando se va a utilizar una
transacción para enviar mensajes a
través de una cola de transferencias.

x-opt-enqueued-time Hora UTC que define el servicio que EnqueuedTimeUtc


representa la hora real al poner en cola
el mensaje. Se omite en la entrada.

x-opt-sequence-number Número único que define el servicio SequenceNumber


asignado a un mensaje.

x-opt-offset Número de secuencia en cola que EnqueuedSequenceNumber


define el servicio y que pertenece al
mensaje.

x-opt-locked-until El servicio se encarga de definir este LockedUntilUtc


valor. Es la fecha y la hora hasta las
cuales se bloqueará el mensaje en la
cola o la suscripción.

x-opt-deadletter-source El servicio se encarga de definir este DeadLetterSource


valor. Si el mensaje se recibe de la cola
de mensajes fallidos, este es la fuente
del mensaje original.

Capacidad de transacciones
Una transacción agrupa dos o más operaciones en un ámbito de ejecución. Por naturaleza, una transacción de este
tipo debe garantizar que todas las operaciones que pertenecen a un grupo determinado de operaciones tendrán
éxito o darán error de forma conjunta. Las operaciones se agrupan según un identificador txn-id .
Para permitir la interacción transaccional, el cliente actúa como un transaction controller que controla las
operaciones que deben agruparse. El servicio de Bus Service actúa como un transactional resource y funciona tal
como solicitó el transaction controller .
El cliente y el servicio se comunican a través de un control link establecido por el cliente. El controlador envía los
mensajes declare y discharge a través del vínculo de control para asignar y completar las transacciones
respectivamente (no representan la demarcación del trabajo transaccional). El envío o la recepción real no se
realiza en este vínculo. Cada operación transaccional solicitada se identifica explícitamente con el txn-id deseado
y, por lo tanto, puede aparecer en cualquier vínculo de la conexión. Si el vínculo de control se cierra mientras
siguen presentes las transacciones no descargadas que este creó, todas esas transacciones se revierten
inmediatamente, y los intentos de llevar a cabo más trabajo transaccional en ellas darán lugar a un error. Los
mensajes en el vínculo de control no deben estar preestablecidos.
Cada conexión debe iniciar su propio vínculo de control para poder iniciar y finalizar transacciones. El servicio
define un objetivo especial que funciona como un coordinator . El cliente o el controlador establece un vínculo de
control para este objetivo. El vínculo de control está fuera del límite de una entidad, es decir, el mismo vínculo de
control se puede usar para iniciar y descargar transacciones de varias entidades.
Iniciar una transacción
Para iniciar el trabajo transaccional. el controlador debe obtener un elemento txn-id desde el coordinador. Para
ello, envía un mensaje de tipo declare . Si la declaración se realiza con éxito, el coordinador responde con un
resultado de disposición, que lleva el elemento txn-id asignado.

C L IEN T E ( C O N T RO L A DO R) DIREC C IÓ N SERVIC E B US ( C O O RDIN A DO R)

attach( ------>
name={link name},
... ,
role=sender ,
target=Coordinator
)

<------ attach(
name={link name},
... ,
target=Coordinator()
)

transfer( ------>
delivery-id=0, ...)
{ AmqpValue (Declare() )}

<------ disposition(
first=0, last=0,
state=Declared (
txn-id ={transaction ID}
))

Descargar una transacción


El controlador concluye el trabajo transaccional mediante el envío de un mensaje discharge al coordinador. El
controlador indica que quiere confirmar o revertir el trabajo transaccional al establecer la marca fail en el
cuerpo de la descarga. Si el coordinador no puede completar la descarga, se rechaza el mensaje con este resultado
que lleva el valor transaction-error .

Nota: El elemento fail=true indica la reversión de una transacción, y fail=false hace referencia a la
confirmación.

C L IEN T E ( C O N T RO L A DO R) DIREC C IÓ N SERVIC E B US ( C O O RDIN A DO R)

transfer( ------>
delivery-id=0, ...)
{ AmqpValue (Declare())}

<------ disposition(
first=0, last=0,
state=Declared(
txn-id={transaction ID}
))
C L IEN T E ( C O N T RO L A DO R) DIREC C IÓ N SERVIC E B US ( C O O RDIN A DO R)

...
Trabajo transaccional
en otros vínculos
...

transfer( ------>
delivery-id=57, ...)
{ AmqpValue (
Discharge(txn-id=0,
fail=false) )}

<------ disposition(
first=57, last=57,
state=Accepted() )

Enviar un mensaje en una transacción


Todo el trabajo transaccional se realiza gracias al estado de la entrega transaccional transactional-state que
transporta el valor de txn-id. En lo que respecta al envío de mensajes, el estado transaccional lo realiza el marco de
transferencias del mensaje.

C L IEN T E ( C O N T RO L A DO R) DIREC C IÓ N SERVIC E B US ( C O O RDIN A DO R)

transfer( ------>
delivery-id=0, ...)
{ AmqpValue (Declare())}

<------ disposition(
first=0, last=0,
state=Declared(
txn-id={transaction ID}
))

transfer( ------>
handle=1,
delivery-id=1,
state=
TransactionalState(
txn-id=0) )
{ payload }

<------ disposition(
first=1, last=1,
state=TransactionalState(
txn-id=0,
outcome=Accepted() ))

Disponer de un mensaje en una transacción


La disposición del mensaje incluye operaciones como Complete / Abandon / DeadLetter / Defer . Para llevar a
cabo estas operaciones dentro de una transacción, pase el elemento transactional-state con la disposición.

C L IEN T E ( C O N T RO L A DO R) DIREC C IÓ N SERVIC E B US ( C O O RDIN A DO R)

transfer( ------>
delivery-id=0, ...)
{ AmqpValue (Declare())}
C L IEN T E ( C O N T RO L A DO R) DIREC C IÓ N SERVIC E B US ( C O O RDIN A DO R)

<------ disposition(
first=0, last=0,
state=Declared(
txn-id={transaction ID}
))

<------ transfer(
handle=2,
delivery-id=11,
state=null)
{ payload }

disposition( ------>
first=11, last=11,
state=TransactionalState(
txn-id=0,
outcome=Accepted() ))

Funcionalidades avanzadas de Service Bus


En esta sección se tratan las funcionalidades avanzadas de Azure Service Bus que se basan en los borradores de las
extensiones AMQP que actualmente se están desarrollando en el comité técnico de OASIS para AMQP. Service Bus
implementa las versiones más recientes de estos borradores y adopta los cambios introducidos a medida que los
borradores alcanzan el estado estándar.

NOTE
Se admiten las operaciones avanzadas de mensajería de Service Bus mediante un modelo de solicitud y respuesta. Los
detalles de estas operaciones se describen en el artículo El protocolo AMQP 1.0 de Microsoft Azure Service Bus: operaciones
de respuesta/solicitud.

Administración de AMQP
La especificación de la administración de AMQP es la primera de las extensiones de borrador que se analizan en
este artículo. Esta especificación define un conjunto de protocolos superpuesto al protocolo AMQP que permite las
interacciones de administración con la infraestructura de mensajería a través de AMQP. La especificación define
operaciones genéricas como crear, leer, actualizar y eliminar para administrar entidades dentro de una
infraestructura de mensajería y un conjunto de operaciones de consulta.
Todos los gestos requieren una interacción de solicitud/respuesta entre el cliente y la infraestructura de mensajería
y, por tanto, la especificación define cómo modelar ese patrón de interacción sobre AMQP: el cliente se conecta a la
infraestructura de mensajería, inicia una sesión y crea un par de vínculos. En un vínculo, el cliente actúa como
remitente y en el otro actúa como receptor, creando así un par de vínculos que puede actuar como un canal
bidireccional.

O P ERA DO RES LÓ GIC O S REM OTO A Z URE SERVIC E B US

Creación de una ruta de acceso de --> attach( Ninguna acción


respuesta de solicitud name={link name},
handle={numeric handle},
role=sender ,
source=null,
target=”myentity/$management”
)
O P ERA DO RES LÓ GIC O S REM OTO A Z URE SERVIC E B US

Creación de una ruta de acceso de Ninguna acción <-- attach(


respuesta de solicitud name={link name},
handle={numeric handle},
role=receiver ,
source=null,
target=”myentity”
)

Creación de una ruta de acceso de --> attach(


respuesta de solicitud name={link name},
handle={numeric handle},
role=receiver ,
source=”myentity/$management”,
target=”myclient$id”
)

Creación de una ruta de acceso de Ninguna acción <-- attach(


respuesta de solicitud name={link name},
handle={numeric handle},
role=sender ,
source=”myentity”,
target=”myclient$id”
)

Con ese par de vínculos en su lugar, la implementación de la solicitud/respuesta es sencilla: una solicitud es un
mensaje enviado a una entidad dentro de la infraestructura de mensajería que comprende este patrón. En ese
mensaje de solicitud, el campo reply-to de la sección properties se establece en el identificador target para el
vínculo en el que se va a entregar la respuesta. La entidad de control procesa la solicitud y después entrega la
respuesta a través del vínculo cuyo identificador target coincide con el identificador reply-to indicado.
Obviamente, el patrón requiere que el contenedor del cliente y el identificador generado por el cliente para el
destino de la respuesta sean únicos en todos los clientes y, por motivos de seguridad, también difíciles de predecir.
Los intercambios de mensajes usados para el protocolo de administración y para todos los demás protocolos que
usan el mismo patrón se producen en el nivel de la aplicación; no definen nuevos gestos en el nivel de protocolo
AMQP. Eso es intencionado para que las aplicaciones puedan aprovechar inmediatamente estas extensiones con
pilas de AMQP 1.0 compatibles.
Service Bus no implementa actualmente ninguna de las características principales de la especificación de
administración, pero el patrón de solicitud/respuesta definido por la especificación de administración es
fundamental para la característica de seguridad basada en notificaciones y para casi todas las funcionalidades
avanzadas que se tratan en las secciones siguientes:
Autorización basada en notificaciones
El borrador de la especificación de autorización basada en notificaciones (CBS) de AMQP se basa en el patrón de
solicitud/respuesta de la especificación de administración; describe un modelo generalizado para el uso de tokens
de seguridad federados con AMQP.
El modelo de seguridad predeterminado de AMQP que se describe en la introducción se basa en SASL y se integra
con el protocolo de enlace de conexión de AMQP. El uso de SASL tiene la ventaja de ofrecer un modelo extensible
para el que se ha definido un conjunto de mecanismos del que se puede beneficiar cualquier protocolo que
emplee formalmente SASL. Entre estos mecanismos están: "PLAIN" para la transferencia de usuarios y
contraseñas, “EXTERNAL” para enlazar con la seguridad de nivel de TLS, “ANONYMOUS” para expresar la ausencia
de autenticación y autorización explícita y una amplia variedad de mecanismos adicionales que permiten pasar
credenciales de autenticación y autorización o tokens.
La integración de SASL de AMQP tiene dos inconvenientes:
Todas las credenciales y los tokens se limitan al ámbito de la conexión. Una infraestructura de mensajería puede
desear proporcionar un control de acceso diferenciado por entidad. Por ejemplo, permitiendo que el portador
de un token envíe a la cola A pero no a cola B. Con el contexto de autorización anclado en la conexión, no es
posible usar una sola conexión y utilizar tokens de acceso diferentes para la cola A y la cola B.
Normalmente, los tokens de acceso solo son válidos durante un tiempo limitado. Esta validez obliga al usuario
a volver a adquirir periódicamente los tokens y proporciona una oportunidad al emisor del token de rechazar la
emisión de un nuevo token si los permisos de acceso del usuario han cambiado. Las conexiones de AMQP
pueden durar períodos muy largos. El modelo SASL solo proporciona una oportunidad para establecer un
token en tiempo de conexión, lo que significa que la infraestructura de mensajería tiene para desconectar el
cliente cuando el token expira o debe aceptar el riesgo de permitir una comunicación continua con un cliente
cuyos derechos de acceso pueden haberse revocado mientras tanto.
La especificación de CBS de AMQP, implementada por Service Bus, proporciona una solución alternativa elegante
para estos problemas: Permite que un cliente asocie los tokens de acceso a cada nodo y actualice esos tokens antes
de que expiren, sin interrumpir el flujo de mensajes.
CBS define un nodo de administración virtual denominado $cbs, proporcionado por la infraestructura de
mensajería. El nodo de administración acepta los tokens en nombre de los otros nodos de la infraestructura de
mensajería.
El gesto del protocolo es un intercambio de solicitud y respuesta, tal como está definido en la especificación de
administración. Esto significa que el cliente establece un par de vínculos con el nodo $cbs, pasa una solicitud en el
vínculo de salida y, a continuación, espera la respuesta en el vínculo de entrada.
El mensaje de solicitud tiene las siguientes propiedades de la aplicación:

C L AVE O P C IO N A L T IP O DE VA LO R C O N T EN IDO DEL VA LO R

operation No string put-token

type No string Tipo del token que se coloca.

name No string El "público" al que se aplica el


token.

expiration Sí timestamp La hora de expiración del


token.

La propiedad name identifica la entidad a la que se va a asociar el token. En Service Bus es la ruta de acceso a la
cola, el tema o la suscripción. La propiedad type identifica el tipo de token:

T IP O DE TO K EN DESC RIP C IÓ N DEL TO K EN T IP O DE C UERP O N OTA S

amqp:jwt JSON Web Token (JWT) Valor de AMQP (cadena) No disponible todavía.

amqp:swt Simple Web Token (SWT) Valor de AMQP (cadena) Solo se admite para los
tokens SWT emitidos por
AAD y ACS

servicebus.windows.net:sast Token SAS de Service Bus Valor de AMQP (cadena) -


oken

Los tokens confieren derechos. Service Bus conoce tres derechos fundamentales: "Enviar" permite enviar,
"Escuchar" permite recibir y "Administrar" permite manipular las entidades. Los tokens SWT emitidos por
AAD/ACS incluyen explícitamente dichos derechos como notificaciones. Los tokens de SAS de Service Bus hacen
referencia a las reglas configuradas en el espacio de nombres o la entidad, y dichas reglas se configuran con
derechos. Firmar el token con la clave asociada a esa regla hace que el token exprese los derechos
correspondientes. El token asociado a una entidad con put-token permite que el cliente conectado interactúe con la
entidad de acuerdo con los derechos del token. Un vínculo en el que cliente adopta el rol sender requiere el
derecho "Enviar"; adoptar el rol receiver requiere el derecho "Escuchar".
El mensaje de respuesta tiene los siguientes valores de application-properties

C L AVE O P C IO N A L T IP O DE VA LO R C O N T EN IDO DEL VA LO R

status-code No int Código de respuesta HTTP


[RFC2616] .

status-description Sí string Descripción del estado.

El cliente puede llamar a put-token repetidamente y para cualquier entidad de la infraestructura de mensajería. El
ámbito de los tokens es el cliente actual y se anclan en la conexión actual, lo que significa que el servidor elimina
todos los tokens retenidos cuando la conexión se interrumpe.
La implementación actual de Service Bus solo permite CBS junto con el método SASL “ANONYMOUS”. Siempre
debe existir una conexión SSL/TLS antes del protocolo de enlace SASL.
Por tanto, el mecanismo ANONYMOUS debe ser compatible con el cliente de AMQP 1.0 elegido. El acceso
anónimo significa que el protocolo de enlace de conexión inicial, incluida la creación de la sesión inicial, tiene lugar
sin que Service Bus sepa quién está creando la conexión.
Una vez establecida la conexión y la sesión, las únicas operaciones permitidas son asociar los vínculos al nodo $cbs
y enviar la solicitud put-token. Un token válido debe establecerse correctamente mediante una solicitud put-token
para algún nodo de entidad en un plazo de 20 segundos después de establecer la conexión; de lo contrario, Service
Bus interrumpe la conexión unilateralmente.
El cliente es responsable de realizar un seguimiento de la expiración del token. Cuando expira un token, Service
Bus elimina rápidamente todos los vínculos de la conexión a la entidad correspondiente. Para evitar el problema, el
cliente puede sustituir el token del nodo por uno nuevo en cualquier momento mediante el nodo de
administración virtual $cbs con el mismo gesto put-token y sin interferir con el tráfico de carga que fluye en
diferentes vínculos.
Funcionalidad "enviar por"
Enviar por / Transferir remitente es una funcionalidad que permite a Service Bus desviar un mensaje dado a una
entidad de destino a través de otra entidad. Esta característica se usa para realizar operaciones entre entidades en
una sola transacción.
Gracias a esta funcionalidad, puede crear un remitente y establecer el vínculo a via-entity . Al establecer el
vínculo, se pasa información adicional para establecer el verdadero destino de los mensajes o transferencias en ese
vínculo. Una vez que la asociación se ha realizado correctamente, todos los mensajes enviados en este vínculo se
reenvían automáticamente a destination-entity a través de via-entity.

Nota: La autenticación debe realizarse en ambos elementos via-entity y destination-entity antes de establecer
este vínculo.
REM OTO DIREC C IÓ N A Z URE SERVIC E B US

attach( ------>
name={link name},
role=sender,
source={client link ID},
target= {via-entity} ,
proper ties=map [(
com.microsoft:transfer-
destination-address=
{destination-entity} )] )

<------ attach(
name={link name},
role=receiver,
source={client link ID},
target={via-entity},
properties=map [(
com.microsoft:transfer-destination-
address=
{destination-entity} )] )

Pasos siguientes
Para aprender más sobre AMQP, visite los siguientes vínculos:
Información general sobre AMQP para Service Bus
Compatibilidad de AMQP 1.0 con los temas y las colas con particiones de Service Bus
AMQP de Service Bus para Windows Server
Traslado de un espacio de nombres de Azure Event
Hubs a otra región
18/08/2020 • 8 minutes to read • Edit Online

Existen varios escenarios en los que puede que deba mover su espacio de nombres de Event Hubs existente de una
región a otra. Por ejemplo, si desea crear un espacio de nombres con la misma configuración para realizar pruebas.
También es posible que desee mover un espacio de nombres secundario a otra región como parte del
planeamiento de recuperación ante desastres.

NOTE
En este artículo se muestra cómo exportar una plantilla de Azure Resource Manager para un espacio de nombres de Event
Hubs existente y, a continuación, usar la plantilla para crear un espacio de nombres con la misma configuración en otra
región. Sin embargo, este proceso no traslada los eventos que todavía no se han procesado. Debe procesar los eventos del
espacio de nombres original antes de eliminarlo.

Prerrequisitos
Asegúrese de que los servicios y las características que usa su cuenta se admitan en la región de destino.
En el caso de las características en vista previa (GB), asegúrese de que la suscripción está en la lista de
permitidos para la región de destino.
Si tiene Característica de captura habilitada para Event Hubs en el espacio de nombres, mueva las cuentas de
Azure Storage o Azure Data Lake Store Gen 2 o Azure Data Lake Store Gen 1 antes de mover el espacio de
nombres Event Hubs. También puede trasladar el grupo de recursos que contiene los espacios de nombres de
Storage y de Event Hubs a la otra región siguiendo unos pasos similares a los que se describen en este artículo.
Si el espacio de nombres de Event Hubs está en un clúster de Event Hubs , cree un clúster dedicado en la
región de destino antes de seguir los pasos de este artículo. También puede usar la plantilla de inicio rápido
en GitHub para crear un clúster de Event Hubs. En la plantilla, quite la parte del espacio de nombres de JSON
para crear solo el clúster.

Preparación
Para empezar, exporte una plantilla de Resource Manager. Esta plantilla contiene la configuración que describe el
espacio de nombres de Event Hubs.
1. Inicie sesión en Azure Portal.
2. Seleccione Todos los recursos y, después, seleccione su espacio de nombres de Event Hubs.
3. Seleccione > Configuración > Expor tar plantilla .
4. Elija Descargar en la página Expor tar plantilla .
5. Busque el archivo ZIP que descargó desde el portal y descomprímalo en la carpeta que prefiera.
Este archivo ZIP contiene los archivos .json que incluyen la plantilla y los scripts para implementar la
plantilla.

Move
Implemente la plantilla para crear un espacio de nombres de Event Hubs en la región de destino.
1. En Azure Portal, haga clic en Crear un recurso .
2. En Buscar en Marketplace , escriba implementación de plantillas y, después, presione ENTRAR .
3. Seleccione Implementación de plantillas .
4. Seleccione Crear .
5. Seleccione Cree su propia plantilla en el editor .
6. Seleccione Cargar archivo y, después, siga las instrucciones para cargar el archivo template.json que
descargó en la última sección.
7. Seleccione Guardar para guardar la plantilla.
8. En la página Implementación personalizada , siga estos pasos:
a. Seleccione una suscripción de Azure.
b. Seleccione un grupo de recursos existente o cree uno. Si el espacio de nombres de origen se
encontraba en un clúster de Event Hubs, seleccione el grupo de recursos que contiene el clúster en la
región de destino.
c. Seleccione la ubicación o región de destino. Si ha seleccionado un grupo de recursos existente, esta
configuración es de solo lectura.
d. En la sección CONFIGURACIÓN , lleve a cabo estos pasos:
a. Escriba el nombre del nuevo espacio de nombres .
b. Si el espacio de nombres de origen se encontraba en un clúster de Event Hubs , escriba los
nombres del grupo de recursos y del clúster de Event Hubs como parte del
identificador externo .

/subscriptions/<AZURE SUBSCRIPTION ID>/resourceGroups/<CLUSTER'S RESOURCE


GROUP>/providers/Microsoft.EventHub/clusters/<CLUSTER NAME>

c. Si el centro de eventos del espacio de nombres usa una cuenta de Storage para capturar
eventos, especifique el nombre del grupo de recursos y la cuenta de almacenamiento para el
campo StorageAccounts_<original storage account name>_external .

/subscriptions/0000000000-0000-0000-0000-0000000000000/resourceGroups/<STORAGE'S RESOURCE
GROUP>/providers/Microsoft.Storage/storageAccounts/<STORAGE ACCOUNT NAME>

e. Seleccione la casilla Acepto los términos y condiciones indicados anteriormente .


f. A continuación, seleccione Select Purchase (Seleccionar compra) para iniciar el proceso de
implementación.

Descarte o limpieza
Después de la implementación, si quiere empezar de nuevo, puede eliminar el espacio de nombres de Event
Hubs de destino y repetir los pasos descritos en las secciones Preparación y Traslado de este artículo.
Para confirmar los cambios y completar el traslado de un espacio de nombres de Event Hubs, elimine el espacio
de nombres de Event Hubs de origen . Asegúrese de que ha procesado todos los eventos en el espacio de
nombres antes de eliminarlo.
Para eliminar un espacio de nombres de Event Hubs (de origen o destino) mediante Azure Portal:
1. En la ventana de búsqueda de la parte superior de Azure Portal, escriba Event Hubs y seleccione Event
Hubs en los resultados de la búsqueda. Verá los espacios de nombres de Event Hubs en una lista.
2. Seleccione el espacio de nombres de destino que desea eliminar y, a continuación, seleccione Eliminar en la
barra de herramientas.

3. En la página Eliminar recursos *, compruebe los recursos seleccionados y confirme la eliminación


escribiendo yes y, a continuación, seleccione Eliminar .

Pasos siguientes
En este tutorial, ha trasladado un espacio de nombres de Azure Event Hubs de una región a otra y ha limpiado los
recursos de origen. Para obtener más información sobre cómo trasladar recursos entre regiones y la recuperación
ante desastres en Azure, consulte:
Traslado de los recursos a un nuevo grupo de recursos o a una nueva suscripción
Traslado de máquinas virtuales de Azure a otra región
Agregar particiones de forma dinámica a un centro
de eventos (tema Apache Kafka) en Azure Event
Hubs
18/08/2020 • 11 minutes to read • Edit Online

Event Hubs proporciona streaming de mensajes mediante un patrón de consumidor con particiones en el que cada
consumidor lee solo un subconjunto específico o una partición del flujo de mensajes. Este patrón permite un
escalado horizontal para el procesamiento de eventos y ofrece otras características centradas en los flujos que no
están disponibles en las colas y los temas. Una partición es una secuencia ordenada de eventos que se mantiene en
un centro de eventos. A medida que llegan eventos más recientes, se agregan al final de esta secuencia. Para más
información sobre las particiones en general, consulte Particiones.
Puede especificar el número de particiones en el momento de crear un centro de eventos. En algunos escenarios,
puede que tenga que agregar particiones después de crear el centro de eventos. En este artículo se describe cómo
agregar particiones de forma dinámica a un centro de eventos existente.

IMPORTANT
La adición dinámica de particiones solo está disponible en clústeres de Event Hubs dedicados .

NOTE
En el caso de los clientes de Apache Kafka, un centro de eventos se asigna a un tema de Kafka . Para obtener más
asignaciones entre Azure Event Hubs y Apache Kafka, consulte Asignación conceptual de Kafka y Event Hubs.

Actualización del recuento de particiones


En esta sección se muestra cómo actualizar el recuento de particiones de un centro de eventos de maneras
diferentes (PowerShell, CLI, etc.).
PowerShell
Use el comando Set-AzureRmEventHub de PowerShell para actualizar las particiones en un centro de eventos.

Set-AzureRmEventHub -ResourceGroupName MyResourceGroupName -Namespace MyNamespaceName -Name MyEventHubName -


partitionCount 12

CLI
Use el comando az eventhubs eventhub update de la CLI para actualizar particiones en un centro de eventos.

az eventhubs eventhub update --resource-group MyResourceGroupName --namespace-name MyNamespaceName --name


MyEventHubName --partition-count 12

Plantilla de Resource Manager


Actualice el valor de la propiedad partitionCount en la plantilla de Resource Manager y vuelva a implementar la
plantilla para actualizar el recurso.
{
"apiVersion": "2017-04-01",
"type": "Microsoft.EventHub/namespaces/eventhubs",
"name": "[concat(parameters('namespaceName'), '/', parameters('eventHubName'))]",
"location": "[parameters('location')]",
"dependsOn": [
"[resourceId('Microsoft.EventHub/namespaces', parameters('namespaceName'))]"
],
"properties": {
"messageRetentionInDays": 7,
"partitionCount": 12
}
}

Apache Kafka
Use la API de AlterTopics (por ejemplo, a través de la herramienta de temas de Kafka de la CLI) para aumentar el
número de particiones. Para obtener más información, consulte Modificación de temas de Kafka.

Clientes de Event Hubs


Echemos un vistazo al comportamiento de los clientes de Event Hubs cuando se actualiza el recuento de
particiones en un centro de eventos.
Cuando se agrega una partición a un centro de eventos existente, el cliente del centro de eventos recibe
MessagingException del servicio que informa a los clientes de que los metadatos de la entidad (la entidad es el
centro de eventos y los metadatos son la información de la partición) se han modificado. Los clientes volverán a
abrir automáticamente los vínculos de AMQP, que luego recopilarán la información de metadatos modificada. Los
clientes seguirán funcionando con normalidad.
Clientes de remitente/productor
Event Hubs proporciona tres opciones de remitente:
Remitente de la par tición : en este escenario, los clientes envían eventos directamente a una partición.
Aunque las particiones son identificables y se pueden enviar eventos directamente a estas, no se recomienda
este patrón. La adición de particiones no afecta a este escenario. Se recomienda reiniciar las aplicaciones para
que puedan detectar las particiones recién agregadas.
Remitente de la clave de par tición : en este escenario, los clientes envían los eventos con una clave para que
todos los eventos que pertenecen a esa clave terminen en la misma partición. En este caso, el servicio aplica un
algoritmo hash a la clave y la enruta a la partición correspondiente. La actualización del recuento de particiones
puede provocar problemas de desorden debido a un cambio de hash. Por lo tanto, si le preocupa el orden,
asegúrese de que la aplicación consume todos los eventos de las particiones existentes antes de aumentar el
número de particiones.
Remitente de round robin (predeterminado) : en este escenario, el servicio Event Hubs aplica el método
round robin a los eventos en las particiones. El servicio de Event Hubs es consciente de los cambios en el
número de particiones y se enviará a nuevas particiones en cuestión de segundos después de modificar el
número de particiones.
Clientes del receptor/consumidor
Event Hubs proporciona receptores directos y una biblioteca de consumidor sencilla denominada host del
procesador de eventos (SDK antiguo) o procesador de eventos (SDK nuevo).
Receptores directos : los receptores directos escuchan particiones específicas. Su comportamiento en
tiempo de ejecución no se ve afectado cuando las particiones se escalan horizontalmente para un centro de
eventos. La aplicación que utiliza receptores directos debe encargarse de recoger las nuevas particiones y
asignar los receptores en consecuencia.
Host del procesador de eventos : este cliente no actualiza automáticamente los metadatos de la entidad.
Por lo tanto, no se dará cuenta del aumento del número de particiones. Al volver a crear una instancia del
procesador de eventos, se generará una captura de metadatos de entidad que, a su vez, creará nuevos blobs
para las particiones recién agregadas. Los blobs preexistentes no se verán afectados. Se recomienda reiniciar
todas las instancias del procesador de eventos para garantizar que todas las instancias sean conscientes las
particiones recién agregadas y que el equilibrio de carga se controle correctamente entre los consumidores.
Si usa la versión anterior del SDK de .NET (WindowsAzure.ServiceBus), el host del procesador de eventos
quita un punto de control existente al reiniciarse si el recuento de particiones del punto de control no
coincide con el recuento de particiones capturado del servicio. Este comportamiento puede afectar a la
aplicación.

Clientes de Apache Kafka


En esta sección se describe el comportamiento de los clientes de Apache Kafka que usan el punto de conexión de
Kafka de Azure Event Hubs cuando se actualiza el recuento de particiones de un centro de eventos.
Los clientes de Kafka que usan Event Hubs con el protocolo de Apache Kafka se comportan de manera diferente a
los clientes del centro de eventos que usan el protocolo AMQP. Los clientes de Kafka actualizan sus metadatos una
vez cada metadata.max.age.ms milisegundos. Este valor se especifica en las configuraciones de cliente. Las
bibliotecas de librdkafka también usan la misma configuración. Las actualizaciones de metadatos informan a los
clientes de los cambios en el servicio, incluidos los aumentos del número de particiones. Para obtener una lista de
configuraciones, consulte Configuraciones de Apache Kafka para Event Hubs.
Clientes de remitente/productor
Los productores siempre dictan que las solicitudes de envío contienen el destino de la partición de cada conjunto
de registros producidos. Por lo tanto, la creación de particiones se realiza en el lado cliente con la vista de
metadatos del agente del productor. Una vez que las nuevas particiones se agreguen a la vista de metadatos del
productor, estarán disponibles para las solicitudes del productor.
Clientes de consumidor/receptor
Cuando un miembro del grupo de consumidores realiza una actualización de metadatos y recoge las particiones
recién creadas, ese miembro inicia un reequilibrio de grupo. Posteriormente, los metadatos del consumidor se
actualizarán para todos los miembros del grupo y el líder de reequilibrio asignado realizará la asignación de las
nuevas particiones.

Recomendaciones
Si usa la clave de partición con las aplicaciones de productor y depende del hash de clave para garantizar el
orden en una partición, no se recomienda agregar particiones de forma dinámica.

IMPORTANT
Aunque los datos existentes conservan el orden, el hash de partición se interrumpirá para los mensajes con hash
aplicados cuando el número de particiones cambie debido a la adición de particiones.

Se recomienda agregar una partición a un tema existente o a una instancia del centro de eventos en los
siguientes casos:
Cuando se usa el método round robin (predeterminado) para enviar eventos.
Con estrategias de creación de particiones predeterminadas de Kafka, como Sticky Assignor.

Pasos siguientes
Para más información sobre las particiones, consulte Particiones.
Uso de Blob Storage como almacén de puntos de
comprobación: Event Hubs en Azure Stack Hub
(versión preliminar)
18/08/2020 • 2 minutes to read • Edit Online

Si usa Azure Blob Storage como almacén de puntos de comprobación en un entorno que admite una versión
diferente del SDK de blobs de almacenamiento que las que normalmente están disponibles en Azure, tendrá que
utilizar código para cambiar la versión de la API del servicio de almacenamiento a la versión admitida por ese
entorno. Por ejemplo, si ejecuta Event Hubs en una instancia de Azure Stack Hub versión 2002, la versión más alta
disponible para el servicio de almacenamiento es la 2017-11-09. En este caso, tendrá que usar código para
establecer como destino la versión de la API del servicio de almacenamiento en 2017-11-09. Para obtener un
ejemplo de cómo establecer como destino una versión específica de la API de almacenamiento, vea estos ejemplos
en GitHub:
.NET
Java.
JavaScript o TypeScript
Python: sincrónico, asincrónico

IMPORTANT
Event Hubs en Azure Stack Hub se encuentra actualmente en versión preliminar y es gratuito.

Si ejecuta un receptor de Event Hubs que usa Blob Storage como almacén de puntos de comprobación sin tener
como destino la versión que admite Azure Stack Hub, recibirá el mensaje de error siguiente:

The value for one of the HTTP headers is not in the correct format

Ejemplo de mensaje de error en Python


En el caso de Python, se pasa un error de azure.core.exceptions.HttpResponseError al controlador de errores
on_error(partition_context, error) de EventHubConsumerClient.receive() . Sin embargo, el método receive() no
inicia una excepción. print(error) imprimirá la siguiente información de excepción:

The value for one of the HTTP headers is not in the correct format.

RequestId:f048aee8-a90c-08ba-4ce1-e69dba759297
Time:2020-03-17T22:04:13.3559296Z
ErrorCode:InvalidHeaderValue
Error:None
HeaderName:x-ms-version
HeaderValue:2019-07-07

El registrador registrará dos advertencias como las siguientes:


WARNING:azure.eventhub.extensions.checkpointstoreblobaio._blobstoragecsaio:
An exception occurred during list_ownership for namespace '<namespace-name>.eventhub.
<region>.azurestack.corp.microsoft.com' eventhub 'python-eh-test' consumer group '$Default'.

Exception is HttpResponseError('The value for one of the HTTP headers is not in the correct
format.\nRequestId:f048aee8-a90c-08ba-4ce1-e69dba759297\nTime:2020-03-
17T22:04:13.3559296Z\nErrorCode:InvalidHeaderValue\nError:None\nHeaderName:x-ms-version\nHeaderValue:2019-07-
07')

WARNING:azure.eventhub.aio._eventprocessor.event_processor:EventProcessor instance '26d84102-45b2-48a9-b7f4-


da8916f68214' of eventhub 'python-eh-test' consumer group '$Default'. An error occurred while load-balancing
and claiming ownership.

The exception is HttpResponseError('The value for one of the HTTP headers is not in the correct
format.\nRequestId:f048aee8-a90c-08ba-4ce1-e69dba759297\nTime:2020-03-
17T22:04:13.3559296Z\nErrorCode:InvalidHeaderValue\nError:None\nHeaderName:x-ms-version\nHeaderValue:2019-07-
07'). Retrying after 71.45254944090853 seconds

Pasos siguientes
Vea el artículo siguiente para obtener información sobre la creación de particiones y puntos de comprobación:
Equilibrio de carga de particiones entre varias instancias de una aplicación
Desuso del soporte técnico de Azure Service
Manager para Azure Service Bus, Relay y Event Hubs
18/08/2020 • 5 minutes to read • Edit Online

Resource Manager, nuestra pila de infraestructura en la nube de próxima generación, está reemplazando por
completo el modelo de Azure Service Management "clásico" (modelo de implementación clásica). Como
consecuencia, tanto las API REST del modelo de implementación clásica como el soporte técnico para Service Bus,
Relay y Event Hubs se retirarán el 1 de noviembre de 2021. La primera vez que se informó de este desuso fue en un
anuncio de Microsoft Tech Community, pero recientemente hemos decidido ampliar el período de desuso dos años
más allá del momento del anuncio original. Para facilitar la identificación, estas API tienen
management.core.windows.net en su identificador URI. En la tabla siguiente encontrará una lista de las API en desuso
y su versión para Azure Resource Manager que debería usar ahora.
Para seguir usando Service Bus, Relay y Event Hubs, cambie a Resource Manager antes del 31 de octubre de 2021.
Animamos a todos los clientes que aún usan las API antiguas a que realicen pronto el cambio, con el fin de poder
aprovechar las ventajas adicionales de Resource Manager, entre las que se incluyen la agrupación de recursos, las
etiquetas, un proceso de administración e implementación simplificado, y un control de acceso específico mediante
el control de acceso basado en rol (RBAC).
Para más información sobre las diferencias entre Azure Resource Manager y Azure Service Manager, consulte el
blog de TechNet.
Para obtener más información sobre las API de Service Manager y Resource Manager para Azure Service Bus, Relay
y Event Hubs, consulte nuestra documentación de la API REST:
Azure Service Bus
Azure Event Hubs
Azure Relay

API REST de Service Manager frente a API REST de Resource Manager


A P I DE SERVIC E M A N A GER RESO URC E M A N A GER: RESO URC E M A N A GER: RESO URC E M A N A GER:
( EN DESUSO ) SERVIC E B US A P I EVEN T H UB A P I REL AY A P I

Namespaces- get get get


GetNamespaceAsync
Get Namespace de Service
Bus
Get Namespace de Event
Hub
Get Namespace de Relay
GET
https://management.core.windows.net/{subscription
ID}/services/ServiceBus/Namespaces/{namespace
name}
A P I DE SERVIC E M A N A GER RESO URC E M A N A GER: RESO URC E M A N A GER: RESO URC E M A N A GER:
( EN DESUSO ) SERVIC E B US A P I EVEN T H UB A P I REL AY A P I

ConnectionDetails- listkeys listkeys listkeys


GetConnectionDetails
GetConnectionDetals de
Service Bus/Event Hub/Relay
GET
https://management.core.windows.net/{subscription
ID}/services/ServiceBus/Namespaces/{namespace
name}/ConnectionDetails

Topics-GetTopicsAsync list
Azure Service Bus
GET
https://management.core.windows.net/{subscription
ID}/services/ServiceBus/Namespaces/{namespace
name}/topics? $skip={skip}&$top={top}

Queues-GetQueueAsync get
Azure Service Bus
GET
https://management.core.windows.net/{subscription
ID}/services/ServiceBus/Namespaces/{namespace
name}/queues/{queueName}

Relays-GetRelaysAsync list
Get Relays
GET
https://management.core.windows.net/{subscription
ID}/services/ServiceBus/Namespaces/{namespace
name}/relays? $skip={skip}&$top={top}

NamespaceAuthorization getauthorizationrule getauthorizationrule getauthorizationrule


Rules-
GetNamespaceAuthoriza
tionRuleAsync
GetNamespaceAuthRule de
Service Bus/Event Hub/Relay
GET
https://management.core.windows.net/{subscription
ID}/services/ServiceBus/Namespaces/{namespace
name}/authorizationrules?

Namespaces- delete delete delete


DeleteNamespaceAsync
Delete Namespace de
Service Bus
Delete Namespace de Event
Hubs
Delete Namespace de Relays
DELETE
https://management.core.windows.net/{subscription
ID}/services/ServiceBus/Namespaces/{namespace
name}

MessagingSKUPlan- get get get


GetPlanAsync
Get Namespace de Service
Bus/Event Hub/Relay
GET
https://management.core.windows.net/{subscription
ID}/services/ServiceBus/Namespaces/{namespace
name}/MessagingPlan
A P I DE SERVIC E M A N A GER RESO URC E M A N A GER: RESO URC E M A N A GER: RESO URC E M A N A GER:
( EN DESUSO ) SERVIC E B US A P I EVEN T H UB A P I REL AY A P I

MessagingSKUPlan- createorupdate createorupdate createorupdate


UpdatePlanAsync
Get Namespace de Service
Bus/Event Hub/Relay
PUT
https://management.core.windows.net/{subscription
ID}/services/ServiceBus/Namespaces/{namespace
name}/MessagingPlan

NamespaceAuthorization createorupdate createorupdateauthorization createorupdateauthorization


Rules- rule rule
UpdateNamespaceAutho
rizationRuleAsync
Get Namespace de Service
Bus/Event Hub/Relay
PUT
https://management.core.windows.net/{subscription
ID}/services/ServiceBus/Namespaces/{namespace
name}/AuthorizationRules/{rule name}

NamespaceAuthorization
Rules-
CreateNamespaceAuthor
izationRuleAsync

Service Bus/Event Hub/Relay createorupdate createorupdateauthorization createorupdateauthorization


PUT rule rule
https://management.core.windows.net/{subscription
ID}/services/ServiceBus/Namespaces/{namespace
name}/AuthorizationRules/{rule name}

NamespaceProper ties- get get get


GetNamespaceProper ties
Async
Get Namespace de Service
Bus
Get Namespace de Event
Hubs
Get Namespace de Relay
GET
https://management.core.windows.net/{subscription
ID}/services/ServiceBus/Namespaces/{namespace
name}

RegionCodes- listbysku listbysku


GetRegionCodesAsync
Get Namespace de Service
Bus/EventHub/Relay
GET
https://management.core.windows.net/{subscription
ID}/services/ServiceBus/Namespaces/{namespace
name}

NamespaceProper ties- createorupdate createorupdate createorupdate


UpdateNamespaceProper
tyAsync
Service Bus/EventHub/Relay
GET
https://management.core.windows.net/{subscription
ID}/services/ServiceBus/Regions/
A P I DE SERVIC E M A N A GER RESO URC E M A N A GER: RESO URC E M A N A GER: RESO URC E M A N A GER:
( EN DESUSO ) SERVIC E B US A P I EVEN T H UB A P I REL AY A P I

EventHubsCrud- list
ListEventHubsAsync
List Event Hubs
GET
https://management.core.windows.net/{subscription
ID}/services/ServiceBus/Namespaces/{namespace
name}/eventhubs?$skip={skip}&$top={top}

EventHubsCrud- get
GetEventHubAsync
Get Event Hubs
GET
https://management.core.windows.net/{subscription
ID}/services/ServiceBus/Namespaces/{namespace
name}/eventhubs/{eventHubPath}

NamespaceAuthorization deleteauthorizationrule deleteauthorizationrule deleteauthorizationrule


Rules-
DeleteNamespaceAuthori
zationRuleAsync
Service Bus/Event Hub/Relay
DELETE
https://management.core.windows.net/{subscription
ID}/services/ServiceBus/Namespaces/{namespace
name}/AuthorizationRules/{rule name}

NamespaceAuthorization listauthorizationrules listauthorizationrules listauthorizationrules


Rules-
GetNamespaceAuthoriza
tionRulesAsync
Service Bus/EventHub/Relay
GET
https://management.core.windows.net/{subscription
ID}/services/ServiceBus/Namespaces/{namespace
name}/AuthorizationRules

NamespaceAvailability- checknameavailability checknameavailability checknameavailability


IsNamespaceAvailable
Namespace Availability de
Service Bus
GET
https://management.core.windows.net/{subscription
ID}/services/ServiceBus/CheckNamespaceAvailability/?
namespace=<namespaceValue>

Namespaces- createorupdate createorupdate createorupdate


CreateOrUpdateNamesp
aceAsync
Service Bus/Event Hub/Relay
PUT
https://management.core.windows.net/{subscription
ID}/services/ServiceBus/Namespaces/{namespace
name}

Topics-GetTopicAsync get
GET
https://management.core.windows.net/{subscription
ID}/services/ServiceBus/Namespaces/{namespace
name}/topics/{topicPath}

PowerShell de Service Manager frente a Service Manager de Resource


Manager
C O M A N DO DE P O W ERSH EL L DE N UEVO S C O M A N DO S DE RESO URC E C O M A N DO DE RESO URC E M A N A GER
SERVIC E M A N A GER ( EN DESUSO ) M A N A GER A ÚN M Á S N UEVO

Get-AzureSBAuthorizationRule Get- Get-AzServiceBusAuthorizationRule


AzureRmServiceBusAuthorizationRule

Get-AzureSBLocation Get- Get-AzServiceBusGeoDRConfiguration


AzureRmServiceBusGeoDRConfiguration

Get-AzureSBNamespace Get-AzureRmServiceBusNamespace Get-AzServiceBusNamespace

New-AzureSBAuthorizationRule New- New-AzServiceBusAuthorizationRule


AzureRmServiceBusAuthorizationRule

New-AzureSBNamespace New-AzureRmServiceBusNamespace New-AzServiceBusNamespace

Remove- Remove- Remove-AzServiceBusAuthorizationRule


AzureRmRelayAuthorizationRule AzureRmEventHubAuthorizationRule

Remove-AzureSBNamespace Remove-AzureRmServiceBusNamespace Remove-AzServiceBusNamespace

Set-AzureSBAuthorizationRule Set- Set-AzServiceBusAuthorizationRule


AzureRmServiceBusAuthorizationRule

Pasos siguientes
Consulte la documentación siguiente:
Documentación más reciente de API REST
Azure Service Bus
Azure Event Hubs
Azure Relay
Documentación más reciente de Azure PowerShell
Azure Service Bus
Azure Event Hubs
Azure Event Grid
Obtención de una cadena de conexión de Event Hubs
18/08/2020 • 4 minutes to read • Edit Online

Para utilizar Event Hubs, debe crear un espacio de nombres de Event Hubs. Un espacio de nombres es un contenedor de ámbito para varios
centros de eventos o temas de Kafka. Este espacio de nombres proporciona un FQDN único. Una vez creado un espacio de nombres, puede
obtener la cadena de conexión necesaria para comunicarse con Event Hubs.
La cadena de conexión para Azure Event Hubs tiene los siguientes componentes incrustados dentro de ella:
FQDN = el FQDN del espacio de nombres de Event Hubs que creó (incluye el espacio de nombres de Event Hubs seguido de
servicebus.windows.net).
SharedAccessKeyName = el nombre que eligió para las claves SAS de la aplicación.
SharedAccessKey = el valor generado de la clave.
La plantilla de la cadena de conexión tiene el siguiente aspecto

Endpoint=sb://<FQDN>/;SharedAccessKeyName=<KeyName>;SharedAccessKey=<KeyValue>

Un ejemplo de cadena de conexión podría ser similar a


Endpoint=sb://dummynamespace.servicebus.windows.net/;SharedAccessKeyName=DummyAccessKeyName;SharedAccessKey=5dOntTRytoC24opYThisAsit3is2B+OGY1US/fuL3ly=

En este artículo se explican distintas formas de obtener la cadena de conexión.

Obtención de la cadena de conexión del portal


1. Inicie sesión en el portal de Azure.
2. Seleccione Todos los ser vicios en el menú de navegación izquierdo.
3. Seleccione Event Hubs en la sección Analytics .
4. En la lista de centros de eventos, seleccione el centro de eventos.
5. En la página Espacio de nombres de Event Hubs , seleccione Directivas de acceso compar tido en el menú de la izquierda.

6. Seleccione una directiva de acceso compar tido en la lista de directivas. El valor predeterminado se denomina:
RootManageSharedAccessPolicy . Puede agregar una directiva con los permisos adecuados (lectura y escritura) y usar esa directiva.
7. Seleccione el botón Copiar junto al campo Cadena de conexión: clave principal .

Obtención de la cadena de conexión con Azure PowerShell


NOTE
Este artículo se ha actualizado para usar el nuevo módulo Az de Azure PowerShell. Aún puede usar el módulo de AzureRM que continuará recibiendo
correcciones de errores hasta diciembre de 2020 como mínimo. Para más información acerca del nuevo módulo Az y la compatibilidad con AzureRM, consulte
Introducing the new Azure PowerShell Az module (Presentación del nuevo módulo Az de Azure PowerShell). Para obtener instrucciones sobre la instalación del
módulo Az, consulte Instalación de Azure PowerShell.

Puede usar Get-AzEventHubKey para obtener la cadena de conexión del nombre de directiva o regla específica, tal como se muestra a
continuación:

Get-AzEventHubKey -ResourceGroupName dummyresourcegroup -NamespaceName dummynamespace -AuthorizationRuleName RootManageSharedAccessKey

Obtención de la cadena de conexión con la CLI de Azure


Puede usar lo siguiente para obtener la cadena de conexión para el espacio de nombres:

az eventhubs namespace authorization-rule keys list --resource-group dummyresourcegroup --namespace-name dummynamespace --name
RootManageSharedAccessKey

O bien puede usar lo siguiente para obtener la cadena de conexión para una entidad EventHub:

az eventhubs eventhub authorization-rule keys list --resource-group dummyresourcegroup --namespace-name dummynamespace --eventhub-name
dummyeventhub --name RootManageSharedAccessKey

Para más información sobre los comandos de la CLI de Azure para Event Hubs, consulte CLI de Azure para Event Hubs.

Pasos siguientes
Para más información acerca de Event Hubs, visite los vínculos siguientes:
Información general de Event Hubs
Creación de un Centro de eventos
Intercambio de eventos entre consumidores y
productores que utilizan distintos protocolos: AMQP,
Kafka y HTTPS
18/08/2020 • 17 minutes to read • Edit Online

Azure Event Hubs admite tres protocolos para consumidores y productores: AMQP, Kafka y HTTPS. Cada uno de
estos protocolos tiene su propia manera de representar un mensaje, por lo que surge la pregunta siguiente: si una
aplicación envía eventos a un centro de eventos con un protocolo y los consume con otro, ¿qué aspecto tienen las
distintas partes y valores del evento cuando llegan al consumidor? En este artículo se describen los procedimientos
recomendados para el productor y el consumidor a fin de garantizar que la aplicación de consumo interprete
correctamente los valores de un evento.
La información de este artículo abarca específicamente estos clientes, con las versiones indicadas utilizadas para
desarrollar los fragmentos de código:
Cliente Java de Kafka (versión 1.1.1 en https://www.mvnrepository.com/artifact/org.apache.kafka/kafka-clients)
Cliente de Microsoft Azure Event Hubs para Java (versión 1.1.0 en https://github.com/Azure/azure-event-hubs-
java)
Cliente de Microsoft Azure Event Hubs para .NET (versión 2.1.0 en https://github.com/Azure/azure-event-hubs-
dotnet)
Microsoft Azure Service Bus (versión 5.0.0 en https://www.nuget.org/packages/WindowsAzure.ServiceBus)
HTTPS (solo es compatible con productores)
Otros clientes de AMQP pueden comportarse de forma ligeramente diferente. AMQP tiene un sistema de tipos bien
definidos, pero los aspectos específicos de serializar los tipos específicos de lenguaje hacia y desde ese sistema de
tipos depende del cliente, igual que de cómo el cliente proporciona acceso a las partes de un mensaje AMQP.

Cuerpo del evento


Todos los clientes de Microsoft AMQP representan el cuerpo del evento como un contenedor de bytes sin
interpretar. Una aplicación de producción pasa una secuencia de bytes al cliente y una aplicación de consumo recibe
esa misma secuencia desde el cliente. La interpretación de la secuencia de bytes se produce dentro del código de
aplicación.
Cuando se envía un evento a través de HTTPS, el cuerpo del evento es el contenido publicado, que también se trata
como bytes sin interpretar. Es fácil lograr el mismo estado en un productor o un consumidor Kafka empleando los
elementos ByteArraySerializer y ByteArrayDeserializer proporcionados, tal como se muestra en el código siguiente:
Productor Kafka byte []

final Properties properties = new Properties();


// add other properties
properties.put(ProducerConfig.VALUE_SERIALIZER_CLASS_CONFIG, ByteArraySerializer.class.getName());

final KafkaProducer<Long, byte[]> producer = new KafkaProducer<Long, byte[]>(properties);

final byte[] eventBody = new byte[] { 0x01, 0x02, 0x03, 0x04 };


ProducerRecord<Long, byte[]> pr =
new ProducerRecord<Long, byte[]>(myTopic, myPartitionId, myTimeStamp, eventBody);
Consumidor Kafka byte []

final Properties properties = new Properties();


// add other properties
properties.put(ConsumerConfig.VALUE_DESERIALIZER_CLASS_CONFIG, ByteArrayDeserializer.class.getName());

final KafkaConsumer<Long, byte[]> consumer = new KafkaConsumer<Long, byte[]>(properties);

ConsumerRecord<Long, byte[]> cr = /* receive event */


// cr.value() is a byte[] with values { 0x01, 0x02, 0x03, 0x04 }

Este código crea una canalización de bytes transparente entre las dos mitades de la aplicación y permite al
desarrollador de la aplicación serializar y deserializar manualmente en cualquier forma deseada, incluida la toma
de decisiones de deserialización en tiempo de ejecución, por ejemplo, según el tipo o la información del remitente
en las propiedades del conjunto de usuarios del evento.
Las aplicaciones que tienen un solo tipo de cuerpo de evento fijo pueden utilizar otros serializadores y
deserializadores de Kafka para convertir datos de forma transparente. Por ejemplo, considere una aplicación que
utiliza JSON. La construcción y la interpretación de la cadena JSON se produce en el nivel de aplicación. En el nivel
de Event Hubs, el cuerpo del evento siempre es una cadena, una secuencia de bytes que representa los caracteres
de la codificación UTF-8. En este caso, el productor o consumidor Kafka puede aprovechar el elemento
StringSerializer o StringDeserializer proporcionado como se muestra en el código siguiente:
Productor de cadena UTF -8 de Kafka

final Properties properties = new Properties();


// add other properties
properties.put(ProducerConfig.VALUE_SERIALIZER_CLASS_CONFIG, StringSerializer.class.getName());

final KafkaProducer<Long, String> producer = new KafkaProducer<Long, String>(properties);

final String exampleJson = "{\"name\":\"John\", \"number\":9001}";


ProducerRecord<Long, String> pr =
new ProducerRecord<Long, String>(myTopic, myPartitionId, myTimeStamp, exampleJson);

Consumidor de cadena UTF -8 de Kafka

final Properties properties = new Properties();


// add other properties
properties.put(ConsumerConfig.VALUE_DESERIALIZER_CLASS_CONFIG, StringDeserializer.class.getName());

final KafkaConsumer<Long, String> consumer = new KafkaConsumer<Long, String>(properties);

ConsumerRecord<Long, Bytes> cr = /* receive event */


final String receivedJson = cr.value();

Para el lado AMQP, Java y .NET proporcionan maneras integradas para convertir cadenas a o desde secuencias de
bytes UTF-8. Los clientes de Microsoft AMQP representan los eventos como una clase denominada EventData. En
los ejemplos siguientes se muestra cómo serializar una cadena UTF-8 en un cuerpo de evento EventData con un
productor AMQP y cómo deserializar un cuerpo de evento EventData en una cadena UTF-8 en un consumidor
AMQP.
Productor de cadena UTF -8 de Java AMQP

final String exampleJson = "{\"name\":\"John\", \"number\":9001}";


final EventData ed = EventData.create(exampleJson.getBytes(StandardCharsets.UTF_8));

Consumidor de cadena UTF -8 de Java AMQP


EventData ed = /* receive event */
String receivedJson = new String(ed.getBytes(), StandardCharsets.UTF_8);

Productor de cadena UTF -8 de C# .NET

string exampleJson = "{\"name\":\"John\", \"number\":9001}";


EventData working = new EventData(Encoding.UTF8.GetBytes(exampleJson));

Consumidor de cadena UTF -8 de C# .NET

EventData ed = /* receive event */

// getting the event body bytes depends on which .NET client is used
byte[] bodyBytes = ed.Body.Array; // Microsoft Azure Event Hubs Client for .NET
// byte[] bodyBytes = ed.GetBytes(); // Microsoft Azure Service Bus

string receivedJson = Encoding.UTF8.GetString(bodyBytes);

Como Kafka es código abierto, el desarrollador de aplicaciones puede inspeccionar la implementación de cualquier
serializador o deserializador e implementar código, que produzca o consuma una secuencia de bytes compatible en
el lado AMQP.

Propiedades de usuario de eventos


Se pueden establecer y recuperar propiedades del conjunto de usuarios de ambos clientes AMQP (en los clientes
de Microsoft AMQP se llaman propiedades) y Kafka (donde se llaman encabezados). Los remitentes HTTPS pueden
establecer las propiedades de usuario en un evento proporcionándolas como encabezados HTTP en la operación
POST. Sin embargo, Kafka trata los cuerpos de los eventos y los valores de encabezado de los eventos como
secuencias de bytes. Mientras que en los clientes AMQP, los valores de propiedades tienen tipos, que se comunican
mediante la codificación de los valores de propiedad según el sistema de tipos AMQP.
HTTPS es un caso especial. En el punto de envío, todos los valores de propiedad son texto UTF-8. El servicio Event
Hubs hace una interpretación limitada para convertir los valores de propiedad adecuados a enteros con signo de
32 y 64 bits, números de punto flotante de 64 bits y booleanos codificados con AMQP. Cualquier valor de
propiedad que no se ajuste a uno de esos tipos se trata como una cadena.
La combinación de estos enfoques para escribir la propiedad significa que un consumidor Kafka ve la secuencia de
bytes codificada con AMQP sin formato, incluida la información de tipo de AMQP. Mientras que un consumidor
AMQP ve la secuencia de bytes sin tipo enviada por el productor Kafka, que la aplicación debe interpretar.
Para los consumidores Kafka que reciben propiedades de los productores AMQP o HTTPS, utilice la clase
AmqpDeserializer, que está modelada según los demás deserializadores del ecosistema de Kafka. Interpreta la
información de tipo en las secuencias de bytes codificadas con AMQP para deserializar los bytes de datos en un
tipo Java.
Como procedimiento recomendado, incluya una propiedad en los mensajes enviados a través de AMQP o HTTPS. El
consumidor Kafka puede usarla para determinar si los valores de encabezado necesitan deserialización de AMQP. El
valor de la propiedad no es importante. Solo necesita un nombre conocido que el consumidor Kafka pueda buscar
en la lista de encabezados y ajustar su comportamiento en consecuencia.
AMQP a Kafka, parte 1: crear y enviar un evento en C# (.NET ) con propiedades
// Create an event with properties "MyStringProperty" and "MyIntegerProperty"
EventData working = new EventData(Encoding.UTF8.GetBytes("an event body"));
working.Properties.Add("MyStringProperty", "hello");
working.Properties.Add("MyIntegerProperty", 1234);

// BEST PRACTICE: include a property which indicates that properties will need AMQP deserialization
working.Properties.Add("AMQPheaders", 0);

AMQP a Kafka, parte 2: usar AmqpDeserializer para deserializar las propiedades de un consumidor Kafka

final AmqpDeserializer amqpDeser = new AmqpDeserializer();

ConsumerRecord<Long, Bytes> cr = /* receive event */


final Header[] headers = cr.headers().toArray();

final Header headerNamedMyStringProperty = /* find header with key "MyStringProperty" */


final Header headerNamedMyIntegerProperty = /* find header with key "MyIntegerProperty" */
final Header headerNamedAMQPheaders = /* find header with key "AMQPheaders", or null if not found */

// BEST PRACTICE: detect whether AMQP deserialization is needed


if (headerNamedAMQPheaders != null) {
// The deserialize() method requires no prior knowledge of a property's type.
// It returns Object and the application can check the type and perform a cast later.
Object propertyOfUnknownType = amqpDeser.deserialize("topicname", headerNamedMyStringProperty.value());
if (propertyOfUnknownType instanceof String) {
final String propertyString = (String)propertyOfUnknownType;
// do work here
}
propertyOfUnknownType = amqpDeser.deserialize("topicname", headerNamedMyIntegerProperty.value());
if (propertyOfUnknownType instanceof Integer) {
final Integer propertyInt = (Integer)propertyOfUnknownType;
// do work here
}
} else {
/* event sent via Kafka, interpret header values the Kafka way */
}

Si la aplicación conoce el tipo esperado para una propiedad, existen métodos de deserialización que no requieren
una conversión más tarde, pero generan un error si la propiedad no es del tipo esperado.
AMQP a Kafka, parte 3: una manera diferente de usar AmqpDeserializer en un consumidor Kafka
// BEST PRACTICE: detect whether AMQP deserialization is needed
if (headerNamedAMQPheaders != null) {
// Property "MyStringProperty" is expected to be of type string.
try {
final String propertyString = amqpDeser.deserializeString(headerNamedMyStringProperty.value());
// do work here
}
catch (IllegalArgumentException e) {
// property was not a string
}

// Property "MyIntegerProperty" is expected to be a signed integer type.


// The method returns long because long can represent the value range of all AMQP signed integer types.
try {
final long propertyLong = amqpDeser.deserializeSignedInteger(headerNamedMyIntegerProperty.value());
// do work here
}
catch (IllegalArgumentException e) {
// property was not a signed integer
}
} else {
/* event sent via Kafka, interpret header values the Kafka way */
}

Ir en la otra dirección es más complicado, porque el consumidor AMQP siempre ve los encabezados establecidos
por un productor Kafka como bytes sin formato (tipo org.apache.qpid.proton.amqp.Binary para el cliente de
Microsoft Azure Event Hubs para Java, o System.Byte[] para los clientes .NET AMQP de Microsoft). La ruta de
acceso más fácil es usar uno de los serializadores proporcionados con Kafka para generar los bytes para los valores
de encabezado en el lado del productor Kafka y, a continuación, escribir un código de deserialización compatible en
el lado del consumidor AMQP.
Al igual que para AMQP a Kafka, el procedimiento recomendado es incluir una propiedad en los mensajes enviados
a través de Kafka. El consumidor AMQP puede usar la propiedad para determinar si los valores de encabezado
necesitan deserialización. El valor de la propiedad no es importante. Solo necesita un nombre conocido que el
consumidor AMQP pueda buscar en la lista de encabezados y ajustar su comportamiento en consecuencia. Si no se
puede cambiar el productor Kafka, también es posible que la aplicación de consumo compruebe si el valor de la
propiedad es de tipo binario o de bytes, e intente la deserialización en función del tipo.
Kafka a AMQP, parte 1: crear y enviar un evento desde Kafka con propiedades
final String topicName = /* topic name */
final ProducerRecord<Long, String> pr = new ProducerRecord<Long, String>(topicName, /* other arguments */);
final Headers h = pr.headers();

// Set headers using Kafka serializers


IntegerSerializer intSer = new IntegerSerializer();
h.add("MyIntegerProperty", intSer.serialize(topicName, 1234));

LongSerializer longSer = new LongSerializer();


h.add("MyLongProperty", longSer.serialize(topicName, 5555555555L));

ShortSerializer shortSer = new ShortSerializer();


h.add("MyShortProperty", shortSer.serialize(topicName, (short)22222));

FloatSerializer floatSer = new FloatSerializer();


h.add("MyFloatProperty", floatSer.serialize(topicName, 1.125F));

DoubleSerializer doubleSer = new DoubleSerializer();


h.add("MyDoubleProperty", doubleSer.serialize(topicName, Double.MAX_VALUE));

StringSerializer stringSer = new StringSerializer();


h.add("MyStringProperty", stringSer.serialize(topicName, "hello world"));

// BEST PRACTICE: include a property which indicates that properties will need deserialization
h.add("RawHeaders", intSer.serialize(0));

Kafka a AMQP, parte 2: deserializar manualmente esas propiedades en C# (.NET )


EventData ed = /* receive event */

// BEST PRACTICE: detect whether manual deserialization is needed


if (ed.Properties.ContainsKey("RawHeaders"))
{
// Kafka serializers send bytes in big-endian order, whereas .NET on x86/x64 is little-endian.
// Therefore it is frequently necessary to reverse the bytes before further deserialization.

byte[] rawbytes = ed.Properties["MyIntegerProperty"] as System.Byte[];


if (BitConverter.IsLittleEndian)
{
Array.Reverse(rawbytes);
}
int myIntegerProperty = BitConverter.ToInt32(rawbytes, 0);

rawbytes = ed.Properties["MyLongProperty"] as System.Byte[];


if (BitConverter.IsLittleEndian)
{
Array.Reverse(rawbytes);
}
long myLongProperty = BitConverter.ToInt64(rawbytes, 0);

rawbytes = ed.Properties["MyShortProperty"] as System.Byte[];


if (BitConverter.IsLittleEndian)
{
Array.Reverse(rawbytes);
}
short myShortProperty = BitConverter.ToInt16(rawbytes, 0);

rawbytes = ed.Properties["MyFloatProperty"] as System.Byte[];


if (BitConverter.IsLittleEndian)
{
Array.Reverse(rawbytes);
}
float myFloatProperty = BitConverter.ToSingle(rawbytes, 0);

rawbytes = ed.Properties["MyDoubleProperty"] as System.Byte[];


if (BitConverter.IsLittleEndian)
{
Array.Reverse(rawbytes);
}
double myDoubleProperty = BitConverter.ToDouble(rawbytes, 0);

rawbytes = ed.Properties["MyStringProperty"] as System.Byte[];


string myStringProperty = Encoding.UTF8.GetString(rawbytes);
}

Kafka a AMQP, parte 3: deserializar manualmente esas propiedades en Java


final EventData ed = /* receive event */

// BEST PRACTICE: detect whether manual deserialization is needed


if (ed.getProperties().containsKey("RawHeaders")) {
byte[] rawbytes =
((org.apache.qpid.proton.amqp.Binary)ed.getProperties().get("MyIntegerProperty")).getArray();
int myIntegerProperty = 0;
for (byte b : rawbytes) {
myIntegerProperty <<= 8;
myIntegerProperty |= ((int)b & 0x00FF);
}

rawbytes = ((org.apache.qpid.proton.amqp.Binary)ed.getProperties().get("MyLongProperty")).getArray();
long myLongProperty = 0;
for (byte b : rawbytes) {
myLongProperty <<= 8;
myLongProperty |= ((long)b & 0x00FF);
}

rawbytes = ((org.apache.qpid.proton.amqp.Binary)ed.getProperties().get("MyShortProperty")).getArray();
short myShortProperty = (short)rawbytes[0];
myShortProperty <<= 8;
myShortProperty |= ((short)rawbytes[1] & 0x00FF);

rawbytes = ((org.apache.qpid.proton.amqp.Binary)ed.getProperties().get("MyFloatProperty")).getArray();
int intbits = 0;
for (byte b : rawbytes) {
intbits <<= 8;
intbits |= ((int)b & 0x00FF);
}
float myFloatProperty = Float.intBitsToFloat(intbits);

rawbytes = ((org.apache.qpid.proton.amqp.Binary)ed.getProperties().get("MyDoubleProperty")).getArray();
long longbits = 0;
for (byte b : rawbytes) {
longbits <<= 8;
longbits |= ((long)b & 0x00FF);
}
double myDoubleProperty = Double.longBitsToDouble(longbits);

rawbytes = ((org.apache.qpid.proton.amqp.Binary)ed.getProperties().get("MyStringProperty")).getArray();
String myStringProperty = new String(rawbytes, StandardCharsets.UTF_8);
}

Pasos siguientes
En este artículo se muestra cómo hacer streaming a instancias de Event Hubs sin cambiar los clientes del protocolo
o ejecutar sus propios clústeres. Para obtener más información acerca de Event Hubs y Event Hubs para Kafka,
consulte los artículos siguientes:
Más información sobre Events Hubs
Información sobre Event Hubs para Kafka
Más ejemplos en GitHub de Event Hubs para Kafka
Use MirrorMaker para transmitir eventos desde Kafka local a una instancia de Event Hubs en la nube.
Aprenda a transmitir en una instancia de Event Hubs mediante aplicaciones nativas de Kafka, Apache Flink o
Akka Streams.
Guía de programación de .NET para Azure Event
Hubs (paquete heredado Microsoft.Azure.EventHubs)
18/08/2020 • 15 minutes to read • Edit Online

En este artículo se describen algunos escenarios comunes para escribir código mediante Azure Event Hubs. En él
se presupone un conocimiento previo de Event Hubs. Para obtener una visión general conceptual de Event Hubs,
consulte la Información general de Azure Event Hubs.

WARNING
Esta guía se refiere al paquete Microsoft.Azure.EventHubs anterior. Se recomienda migrar el código a fin de usar el
paquete Azure.Messaging.EventHubs más reciente.

Publicadores de eventos
Los eventos se envían a un centro de eventos mediante HTTP POST o una conexión AMQP 1.0. La elección de cuál
usar y cuándo depende del escenario específico abordado. Las conexiones AMQP 1.0 se miden como conexiones
asincrónicas en Service Bus y son más apropiadas en los escenarios con volúmenes mayores de mensajes
frecuentes y requisitos de latencia menores, ya que proporcionan un canal de mensajería persistente.
Si se usan las API administradas de .NET, las construcciones principales para publicar datos en Event Hubs son las
clases EventHubClient y EventData. EventHubClient proporciona el canal de comunicación AMQP a través del que
se envían eventos al centro de eventos. La clase EventData representa un evento y se usa para publicar mensajes
en un centro de eventos. Esta clase incluye el cuerpo, algunos metadatos (Properties) e información de encabezado
(SystemProperties) sobre el evento. Otras propiedades se agregan al objeto EventData cuando este atraviesa un
centro de eventos.

Introducción
Las clases .NET que admiten Event Hubs se proporcionan en el paquete NuGet Microsoft.Azure.EventHubs. Puede
instalarlas mediante el Explorador de soluciones de Visual Studio o la Consola del Administrador de paquetes de
Visual Studio. Para ello, emita el siguiente comando en la ventana Consola del administrador de paquetes :

Install-Package Microsoft.Azure.EventHubs

Creación de un centro de eventos


Puede usar Azure Portal, Azure PowerShell o la CLI de Azure para crear centros de eventos. Para más información,
consulte Creación de un espacio de nombres de Event Hubs y un centro de eventos con Azure Portal.

Creación de un cliente de Event Hubs


La clase principal para interactuar con Event Hubs es Microsoft.Azure.EventHubs.EventHubClient. Puede crear una
instancia de esta clase con el método CreateFromConnectionString, tal como se muestra en el ejemplo siguiente:
private const string EventHubConnectionString = "Event Hubs namespace connection string";
private const string EventHubName = "event hub name";

var connectionStringBuilder = new EventHubsConnectionStringBuilder(EventHubConnectionString)


{
EntityPath = EventHubName

};
eventHubClient = EventHubClient.CreateFromConnectionString(connectionStringBuilder.ToString());

Envío eventos a un centro de eventos


Para enviar eventos a un centro de eventos, cree una instancia EventHubClient y envíela de forma asincrónica
mediante el método SendAsync. Este método toma un único parámetro de instancia EventData y lo envía de forma
asincrónica a un centro de eventos.

Serialización de eventos
La clase EventData tiene dos constructores sobrecargados que aceptan diversos parámetros, bytes o una matriz de
bytes, que representan la carga de datos de eventos. Cuando se usa JSON con EventData, puede usar
Encoding.UTF8.GetBytes() para recuperar la matriz de bytes de una cadena codificada con JSON. Por ejemplo:

for (var i = 0; i < numMessagesToSend; i++)


{
var message = $"Message {i}";
Console.WriteLine($"Sending message: {message}");
await eventHubClient.SendAsync(new EventData(Encoding.UTF8.GetBytes(message)));
}

Clave de partición
NOTE
Si no está familiarizado con las particiones, consulte este artículo.

Al enviar datos de eventos, puede especificar un valor con hash para generar una asignación de partición. La
partición se especifica mediante la propiedad PartitionSender.PartitionID. Sin embargo, la decisión de usar
particiones implica la elección entre disponibilidad y coherencia.
Consideraciones sobre disponibilidad
El uso de una clave de partición es opcional y debe considerar detenidamente si desea o no utilizar uno. Si no
especifica una clave de partición cuando se publica un evento, se usa una asignación de tipo round robin. En
muchos casos, el uso de una clave de partición es una buena elección si el orden de los eventos es importante.
Cuando se usa una clave de partición, estas particiones requieren la disponibilidad en un solo nodo y las
interrupciones pueden producirse a lo largo del tiempo; por ejemplo, cuando los nodos de ejecución se reinician y
revisan. Por lo tanto, si establece un identificador de partición y esa partición deja de estar disponible por alguna
razón, un intento de acceder a los datos de esa partición provocará un error. Si la alta disponibilidad es más
importante, no especifique una clave de partición; en ese caso, los eventos se envían a las particiones que usan el
modelo round robin descrito anteriormente. En este escenario, se realiza una selección explícita entre
disponibilidad (ningún identificador de partición) y coherencia (anclar eventos a un identificador de partición).
Otra consideración es el control de retrasos en el procesamiento de eventos. En algunos casos podría ser mejor
quitar datos y reintentarlo que intentar seguir con el procesamiento, lo que puede provocar más retrasos de
procesamiento descendente. Por ejemplo, con un tablero de cotizaciones es preferible esperar a tener todos los
datos actualizados, pero en un escenario de chat en directo o VOIP sería preferible disponer de los datos
rápidamente, aunque no estén completos.
Dadas estas consideraciones de disponibilidad, en estos casos puede elegir una de las siguientes estrategias de
control de errores:
Detener (dejar de leer Event Hubs hasta que se solucionen cosas)
Quitar (los mensajes no son importantes, quítelos)
Reintentar (reintentar los mensajes cuando lo vea apropiado)
Para obtener más información y una explicación sobre las ventajas y desventajas entre la disponibilidad y la
coherencia, consulte Disponibilidad y coherencia en Event Hubs.

Operaciones de envío de eventos por lotes


El envío de eventos por lotes puede ayudar a aumentar el rendimiento. Puede usar la API CreateBatch para crear
un lote al que más tarde se pueden agregar objetos de datos para una llamada SendAsync.
Un único lote no debe superar el límite de 1 MB de un evento. Además, cada mensaje del lote usa la misma
identidad del publicador. Es responsabilidad del remitente asegurarse de que el lote no supera el tamaño máximo
del evento. Si es así, se generará un error de envío de cliente. Puede utilizar el método auxiliar
EventHubClient.CreateBatch para asegurarse de que el lote no supera los 1 MB. Obtiene una salida vacía
EventDataBatch de la API CreateBatch y, después, use TryAdd para agregar eventos para construir el lote.

Enviar de forma asincrónica y enviar a escala


Los eventos se envían a un centro de eventos de forma asincrónica. Al enviar de forma asincrónica aumenta la
velocidad a la que un cliente es capaz de enviar eventos. SendAsync devuelve un objeto Task. Puede usar la clase
RetryPolicy en el cliente para controlar opciones de reintento del cliente.

Consumidores de eventos
La clase EventProcessorHost procesa los datos de Event Hubs. Debe usar esta implementación para generar los
lectores de eventos en la plataforma .NET. EventProcessorHost proporciona un entorno de tiempo de ejecución
seguro, seguro para subprocesos y de varios procesos para las implementaciones de procesadores de eventos que
también ofrecen administración de concesión de puntos de comprobación y particiones.
Para usar la clase EventProcessorHost, puede implementar IEventProcessor. Esta interfaz contiene cuatro métodos:
OpenAsync
CloseAsync
ProcessEventsAsync
ProcessErrorAsync
Para iniciar el procesamiento de eventos, cree una instancia de EventProcessorHost, proporcionando los
parámetros adecuados para el centro de eventos. Por ejemplo:

NOTE
EventProcessorHost y sus clases relacionadas se ofrecen en el paquete Microsoft.Azure.EventHubs.Processor . Agregue
el paquete al proyecto de Visual Studio siguiendo las instrucciones de este artículo o emitiendo el comando siguiente en la
ventana de la Consola del Administrador de paquetes: Install-Package Microsoft.Azure.EventHubs.Processor .
var eventProcessorHost = new EventProcessorHost(
EventHubName,
PartitionReceiver.DefaultConsumerGroupName,
EventHubConnectionString,
StorageConnectionString,
StorageContainerName);

Después, llame a RegisterEventProcessorAsync para registrar su implementación de IEventProcessor en el entorno


de tiempo de ejecución.

await eventProcessorHost.RegisterEventProcessorAsync<SimpleEventProcessor>();

En este momento, el host intenta adquirir una concesión en cada partición del centro de eventos mediante un
algoritmo "expansivo". Estas concesiones duran un período de tiempo determinado y después deben renovarse. A
medida que nuevos nodos, instancias de trabajo en este caso, pasan a estar en línea, colocan reservas de concesión
y, con el tiempo, la carga cambia entre los nodos a medida que cada una trata de adquirir más concesiones.

Con el tiempo, se establece un equilibrio. Esta capacidad dinámica permite la aplicación del escalado automático
basado en CPU a los consumidores para escalar vertical y horizontalmente. Debido a que Event Hubs no tiene un
concepto directo de recuentos de mensajes, el uso medio de la CPU suele ser el mejor mecanismo para medir el
back-end o la escala del consumidor. Si los publicadores empiezan a publicar más eventos de los que los
consumidores pueden procesar, el aumento de la CPU en los consumidores puede usarse para producir una escala
automática en el recuento de instancias de trabajador.
La clase EventProcessorHost también implementa un mecanismo de puntos de comprobación basado en el
almacenamiento de Azure. Este mecanismo almacena el desplazamiento en función de la partición, para que cada
consumidor pueda determinar cuál fue el último punto de comprobación del cliente anterior. A medida que las
particiones pasan de un nodo a otro a través de concesiones, este es el mecanismo de sincronización que facilita el
desplazamiento de cargas.

Revocación de publicador
Además de las características avanzadas del entorno en tiempo de ejecución del host del procesador de eventos, el
servicio Event Hubs permite la revocación del editor con el fin de impedir a editores específicos el envío de eventos
a un centro de eventos. Estas características son útiles si se ha visto comprometido el token de un publicador o si
una actualización de software está provocando que se comporten incorrectamente. En estas situaciones, es posible
bloquear que la identidad del editor, que forma parte de su token de SAS, publique eventos.

NOTE
Actualmente, solo la API REST es compatible con esta característica (revocación del editor).
Para más información acerca de la revocación del publicador y cómo realizar envíos a Event Hubs como publicador,
consulte el ejemplo de Event Hubs Large Scale Secure Publishing (Publicación segura a gran escala de Event Hubs).

Pasos siguientes
Para obtener más información acerca de los escenarios de Event Hubs, visite estos vínculos:
Introducción a la API de Event Hubs
¿Qué es Event Hubs?
Disponibilidad y coherencia en Event Hubs
Referencia de la API de host del procesador de eventos
Procesamiento de datos de un centro de eventos con
Azure Stream Analytics
18/08/2020 • 7 minutes to read • Edit Online

El servicio Azure Stream Analytics permite ingerir, procesar y analizar fácilmente los datos de streaming
procedentes de Azure Event Hubs, lo que proporciona valiosa información para emprender acciones en tiempo real.
Esta integración le permite crear rápidamente una canalización de análisis de la ruta de acceso activa. Puede usar
Azure Portal para visualizar los datos de entrada y escribir una consulta de Stream Analytics. Cuando la consulta
esté lista, podrá transferirla a producción con solo unos pocos clics.

Ventajas principales
Estas son las principales ventajas de la integración de Azure Event Hubs y Azure Stream Analytics:
Vista previa de datos : puede obtener una vista previa de los datos de entrada de un centro de eventos en
Azure Portal.
Comprobación de la consulta : prepare una consulta de transformación y pruébela directamente en Azure
Portal. Si necesita información sobre la sintaxis del lenguaje de consulta, consulte la documentación sobre el
lenguaje de consulta de Stream Analytics.
Implementación de la consulta en producción : puede implementar la consulta en producción creando e
iniciando un trabajo de Azure Stream Analytics.

Flujo integral
1. Inicie sesión en Azure Portal.
2. Vaya al espacio de nombres de Event Hubs y acceda al centro de eventos que contiene los datos de
entrada.
3. Seleccione Procesar datos en la página del centro de eventos.

4. En el icono Enable real-time insights from events (Extraer información en tiempo real de los eventos),
seleccione Explorar .
5. Aparecerá una página de consulta con los valores ya establecidos en los campos siguientes:
a. El centro de eventos , como entrada de la consulta.
b. Una consulta SQL de ejemplo con la instrucción SELECT.
c. Un alias de salida que hace referencia a los resultados de la prueba de consulta.

NOTE
Si usa esta característica por primera vez, esta página le pedirá permiso para crear un grupo de consumidores
y una directiva del centro de eventos para obtener una vista previa de los datos de entrada.

6. Seleccione Crear en el panel Vista previa de la entrada , tal como se muestra en la imagen anterior.
7. Aparecerá inmediatamente una instantánea de los últimos datos de entrada en esta pestaña.
El tipo de serialización de los datos se detecta automáticamente (JSON o CSV). Puede cambiarlo
manualmente a JSON, CSV o AVRO.
Puede obtener una vista previa de los datos de entrada en formato de tabla o en formato sin procesar.
Si los datos que aparecen no están actualizados, seleccione Actualizar para ver los eventos más
recientes.
Este es un ejemplo de datos con formato de tabla :

Este es un ejemplo de los datos con formato sin procesar :

8. Seleccione Test quer y (Consulta de prueba) para ver una instantánea de los resultados de prueba de la
consulta en la pestaña Test results (Resultados de la prueba). También puede descargar los resultados.
9. Escriba su propia consulta para transformar los datos. Consulte Stream Analytics Query Language reference
(Referencia del lenguaje de consulta de Stream Analytics).///
10. Cuando haya probado la consulta y desee moverla a producción, seleccione Deploy quer y (Implementar
consulta). Para implementar la consulta, cree un trabajo de Azure Stream Analytics, donde podrá configurar
una salida del trabajo e iniciarlo. Para crear un trabajo de Stream Analytics, especifique un nombre para el
trabajo y seleccione Create (Crear).

NOTE
Le recomendamos que cree un grupo de consumidores y una directiva para cada nuevo trabajo de Azure Stream
Analytics que cree en la página de Event Hubs. Los grupos de consumidores solo permiten cinco lectores simultáneos,
por lo que, si se proporciona un grupo de consumidores dedicado para cada trabajo, se evitarán los errores que
podrían surgir en caso de que se superara ese límite. Las directivas dedicadas le permiten cambiar la clave o revocar
permisos sin afectar a otros recursos.

11. El trabajo de Stream Analytics se crea en el mismo lugar de la consulta que coincide con la consulta probada;
el centro de eventos se utiliza como entrada.
12. Para completar la canalización, establezca la salida de la consulta y seleccione Star t (Iniciar) para iniciar el
trabajo.

NOTE
Antes de iniciar el trabajo, no olvide reemplazar el alias de salida por el nombre de salida que creó en Azure Stream
Analytics.

Restricciones conocidas
Cuando se prueba la consulta, los resultados tardan aproximadamente seis segundos en cargarse. Estamos
trabajando para mejorar el rendimiento de las pruebas. Sin embargo, cuando se implementa en producción, la
latencia de Azure Stream Analytics es inferior a un segundo.

Unidades de streaming
El valor de Azure Stream Analytics se establece de forma predeterminada en tres unidades de streaming (SU). Para
ajustar esta configuración, seleccione Escala en el menú izquierdo de la página Trabajo de Stream Analytics de
Azure Portal. Para más información sobre las unidades de streaming, consulte Descripción y ajuste de las unidades
de streaming.

Pasos siguientes
Para más información sobre de las consultas de Stream Analytics, consulte este artículo sobre el lenguaje de
consulta de Stream Analytics
Guía del desarrollador de Apache Kafka para Azure
Event Hubs
18/08/2020 • 11 minutes to read • Edit Online

En este artículo se proporcionan vínculos a artículos que describen cómo integrar las aplicaciones de Apache
Kafka en Azure Event Hubs.

Información general
Event Hubs proporciona un punto de conexión de Kafka que las aplicaciones basadas en Kafka existentes pueden
usar como alternativa a la ejecución de su propio clúster de Kafka. Event Hubs admite el protocolo de Apache
Kafka 1.0 y versiones posteriores, y funciona con las aplicaciones existentes de Kafka, incluida MirrorMaker. Para
obtener más información, consulte Event Hubs para Apache Kafka.

Guías de inicio rápido


Puede encontrar guías de inicio rápido en GitHub y en este conjunto de contenido que le ayudarán a avanzar
rápidamente en Event Hubs para Kafka.
Guías de inicio rápido en GitHub
Consulte las siguientes guías de inicio rápido en el repositorio azure-event-hubs-for-kafka :

L EN GUA JE/ M A RC O DEL C L IEN T E DESC RIP C IÓ N

.NET En esta guía de inicio rápido se muestra cómo crear y


conectarse a un punto de conexión de Kafka para Event
Hubs con un productor y un consumidor de ejemplo
escritos en C# mediante .NET Core 2.0.
Este ejemplo se basa en el cliente de .NET para Apache
Kafka de Confluent, modificado para su uso con Event
Hubs para Kafka.

Java En esta guía de inicio rápido se muestra cómo crear y


conectarse a un punto de conexión de Kafka para Event
Hubs con un productor y un consumidor de ejemplo escritos
en Java.

Node.js En esta guía de inicio rápido se muestra cómo crear y


conectarse a un punto de conexión de Kafka para Event
Hubs con un productor y un consumidor de ejemplo
escritos en Node.
En este ejemplo se usa la biblioteca node-rdkafka.
L EN GUA JE/ M A RC O DEL C L IEN T E DESC RIP C IÓ N

Python En esta guía de inicio rápido se muestra cómo crear y


conectarse a un punto de conexión de Kafka para Event
Hubs con un productor y un consumidor de ejemplo
escritos en python.
Este ejemplo se basa en el cliente de Python para Apache
Kafka de Confluent, modificado para su uso con Event
Hubs para Kafka.

Go En esta guía de inicio rápido se muestra cómo crear y


conectarse a un punto de conexión de Kafka para Event
Hubs con un productor y un consumidor de ejemplo
escritos en Go.
Este ejemplo se basa en el cliente de Golang para Apache
Kafka de Confluent, modificado para su uso con Event
Hubs para Kafka.

Sarama Kafka Go En esta guía de inicio rápido se muestra cómo crear y


conectarse a un punto de conexión de Kafka para Event
Hubs con un productor y un consumidor de ejemplo escritos
en Go mediante la biblioteca del cliente de Sarama Kafka.

Kafka En esta guía de inicio rápido se muestra cómo crear y


conectarse a un punto de conexión de Kafka para Event
Hubs mediante la CLI incluida en la distribución de Apache
Kafka.

Kafkacat kafkacat es un consumidor y productor de línea de


comandos que no es JVM, basados en librdkafka, popular
debido a su velocidad y su pequeña superficie. Esta guía de
inicio rápido contiene una configuración de ejemplo y varios
comandos sencillos de kafkacat de ejemplo.

Guías de inicio rápido en DOCS


Consulte la guía de inicio rápido: Streaming de datos con Event Hubs mediante el protocolo de Kafka en este
conjunto de contenido, que proporciona instrucciones paso a paso sobre cómo transmitir en Event Hubs.
Aprenderá a usar los productores y los consumidores para hablar con instancias de Event Hubs solo con un
cambio de configuración en las aplicaciones.

Tutoriales
Tutoriales en GitHub
Consulte los siguientes tutoriales en GitHub:

T UTO RIA L DESC RIP C IÓ N

Akka En este tutorial se muestra cómo conectar Akka Streams a


instancias de Event Hubs habilitadas para Kafka sin cambiar
los clientes del protocolo ni ejecutar sus propios clústeres.
Hay dos tutoriales independientes que usan los lenguajes de
programaciónJava y Scala .
T UTO RIA L DESC RIP C IÓ N

Conexión En este documento encontrará una guía para la integración


de Kafka Connect en Azure Event Hubs y la implementación
de conectores básicos FileStreamSource y FileStreamSink.
Aunque estos conectores no están pensados para su uso en
producción, muestran un escenario de un extremo a otro de
Kafka Connect en el que Azure Event Hubs se enmascara
como agente de Kafka.

Filebeat En este documento encontrará una guía para la integración


de Filebeat y Event Hubs a través de la salida Kafka de
Filebeat.

Flink En este tutorial se muestra cómo conectar Apache Flink a


instancias de Event Hubs habilitadas para Kafka sin cambiar
los clientes del protocolo ni ejecutar sus propios clústeres.

Fluentd En este documento encontrará una guía para la integración


de Fluentd y Event Hubs con el complemento de salida de
out_kafka para Fluentd.

Interop En este tutorial se muestra cómo intercambiar eventos entre


consumidores y productores mediante distintos protocolos.

Logstash En este tutorial encontrará una guía para la integración de


Logstash en Event Hubs habilitado para Kafka mediante
complementos de entrada/salida de Logstash Kafka.

MirrorMaker En este tutorial se muestra cómo un centro de eventos y


Kafka MirrorMaker se pueden integrar en una canalización
de Kafka existente en Azure al crear un reflejo del flujo de
entrada de Kafka en el servicio Event Hubs.

NiFi En este tutorial se muestra cómo conectar Apache NiFi a un


espacio de nombres de Event Hubs.

OAuth En las guías de inicio rápido se muestra cómo crear y


conectarse a un punto de conexión de Kafka para Event
Hubs con un productor y un consumidor de ejemplo escritos
en los lenguajes de programación Go y Java.

Confluent's Schema Registry En este tutorial encontrará una guía para la integración de
Schema Registry y Event Hubs para Kafka.

Spark En este tutorial se muestra cómo conectar su aplicación


Spark a un centro de eventos sin cambiar los clientes del
protocolo ni ejecutar sus propios clústeres de Kafka.

Tutoriales en DOCS
Además, consulte el tutorial: Procesamiento de eventos de Apache Kafka para Event Hubs mediante Stream
Analytics en este conjunto de contenido, que muestra cómo transmitir datos a Event Hubs y procesarlos con
Azure Stream Analytics.

Guías paso a paso


Consulte las siguientes guías paso a paso en nuestra documentación:
A RT ÍC ULO DESC RIP C IÓ N

Reflejo de un agente de Kafka en un centro de eventos Muestra cómo reflejar un agente de Kafka en un centro de
eventos mediante Kafka MirrorMaker.

Conexión de Apache Spark a un centro de eventos Le guía a través de la conexión de la aplicación de Spark a
Event Hubs para el streaming en tiempo real.

Conexión de Apache Flink a un centro de eventos Se muestra cómo conectar Apache Flink a un centro de
eventos sin cambiar los clientes del protocolo o ejecutar sus
propios clústeres.

Integración de Apache Kafka Connect en Event Hubs Le guía por la integración de Kafka Connect con un centro de
(versión preliminar) eventos y la implementación de conectores básicos
FileStreamSource y FileStreamSink.

Conexión de Akka Streams a un centro de eventos Muestra cómo conectar Akka Streams a un centro de
eventos sin cambiar los clientes del protocolo ni ejecutar sus
propios clústeres.

Cómo usar el iniciador de Spring Boot para Apache Kafka Muestra cómo configurar una aplicación de Spring Cloud
con Azure Event Hubs Stream Binder basada en Java creada con Spring Boot
Initializer para usar Apache Kafka con Azure Event Hubs.

Pasos siguientes
Revise los ejemplos del repositorio de GitHub azure-event-hubs-for-kafka en las carpetas de guías de inicio
rápido y tutoriales.
Consulte también los siguientes artículos:
Guía de solución de problemas de Apache Kafka para Event Hubs
Preguntas más frecuentes: Event Hubs para Apache Kafka
Guía de migración de Kafka para Event Hubs
Migración a Azure Event Hubs para ecosistemas de
Apache Kafka
18/08/2020 • 4 minutes to read • Edit Online

Azure Event Hubs expone un punto de conexión de Apache Kafka, que le permite conectarse a Event Hubs
mediante el protocolo Kafka. Al realizar cambios mínimos en una aplicación de Kafka existente, puede conectarse a
Azure Event Hubs y disfrutar de las ventajas del ecosistema de Azure. Event Hubs para Kafka admite Apache Kafka
versión 1.0 y posteriores.

Antes de la migración
Crear una cuenta de Azure
Si no tiene una suscripción a Azure, cree una cuenta gratuita antes de empezar.
Creación de un espacio de nombres de Event Hubs
Siga las instrucciones paso a paso de Creación de un centro de eventos para crear un espacio de nombres de Event
Hubs y un centro de eventos.
Cadena de conexión
Siga los pasos del artículo Obtención de la cadena de conexión del portal. Anote la cadena de conexión para usarla
más adelante.
Nombre de dominio completo (FQDN )
Es posible que también necesite el nombre de dominio completo que señala a su espacio de nombres de Event
Hubs. El nombre de dominio completo puede encontrarse en la cadena de conexión de la siguiente manera:
Endpoint=sb:// mynamespace.servicebus.windows.net /;SharedAccessKeyName=XXXXXX;SharedAccessKey=XXXXXX

Si el espacio de nombres de Event Hubs se implementa en una nube no pública, el nombre de dominio puede ser
distinto (por ejemplo, *.servicebus.chinacloudapi.cn, *.servicebus.usgovcloudapi.net o *.servicebus.cloudapi.de).

Migración
Actualización de la configuración del cliente de Kafka
Para conectarse a un centro de eventos habilitado para Kafka, debe actualizar las configuraciones de cliente de
Kafka. Si no encuentra la suya, pruebe a buscar dónde está establecido bootstrap.servers en su aplicación.
Inserte las siguientes configuraciones donde corresponda en su aplicación. Asegúrese de actualizar los valores
bootstrap.servers y sasl.jaas.config para dirigir al cliente al punto de conexión de Kafka para Event Hubs con la
autenticación correcta.

bootstrap.servers={MYNAMESPACE}.servicebus.windows.net:9093
request.timeout.ms=60000
security.protocol=SASL_SSL
sasl.mechanism=PLAIN
sasl.jaas.config=org.apache.kafka.common.security.plain.PlainLoginModule required username="$ConnectionString"
password="{CONNECTION STRING TO YOUR NAMESPACE}";

Si sasl.jaas.config no es una configuración compatible con su marco, busque las configuraciones que se usan
para establecer el nombre de usuario y contraseña de SASL y úselas en su lugar. Establezca el nombre de usuario
en $ConnectionString y la contraseña para la cadena de conexión de Event Hubs.

Después de la migración
Ejecute la aplicación de Kafka que envía eventos a un centro de eventos. A continuación, compruebe que el centro
de eventos recibe los eventos mediante Azure Portal. En la página Información general del espacio de nombres
de Event Hubs, cambie a la vista Mensajes de la sección Métricas . Actualice la página para actualizar el gráfico.
Puede tardar unos segundos en mostrar que los mensajes se han recibido.

Pasos siguientes
Para obtener más información acerca de Event Hubs y Event Hubs para Kafka, consulte los artículos siguientes:
Guía de solución de problemas de Apache Kafka para Event Hubs
Preguntas más frecuentes: Event Hubs para Apache Kafka
Guía del desarrollador de Apache Kafka para Azure Event Hubs
Configuraciones recomendadas
Guía de solución de problemas de Apache Kafka para
Event Hubs
18/08/2020 • 9 minutes to read • Edit Online

En este artículo se proporcionan sugerencias para la solución de problemas que pueden aparecer al usar Event
Hubs para Apache Kafka.

Excepción de servidor ocupado


Puede recibir una excepción de servidor ocupado que se deba a una limitación de Kafka. Con los clientes de AMQP,
Event Hubs devuelve inmediatamente una excepción de ser vidor ocupado tras la limitación del servicio. Esto
equivale a un mensaje de "inténtelo de nuevo más tarde". En Kafka, los mensajes se retrasan antes de que se
completen. La duración del retraso se devuelve en milisegundos como throttle_time_ms en la respuesta de
generación/captura. En la mayoría de los casos, estas solicitudes retrasadas no se registran como excepciones de
servidor ocupado en los paneles de Event Hubs. En su lugar, se debe usar el valor throttle_time_ms de la respuesta
como un indicador de que el rendimiento ha superado la cuota aprovisionada.
Si el tráfico es excesivo, el servicio tiene el siguiente comportamiento:
Si el retraso de la solicitud de generación supera el tiempo de expiración de la solicitud, Event Hubs devuelve un
código de error de Infracción de la directiva .
Si el retraso de la solicitud de captura supera el tiempo de expiración de la solicitud, Event Hubs registra la
solicitud como limitada y responde con un conjunto vacío de registros y sin código de error.
Los clústeres dedicados no tienen mecanismos de limitación. Puede consumir todos los recursos del clúster.

No se recibieron registros
Puede que vea que los consumidores no están obteniendo ningún registro y se están reequilibrando
constantemente. En este escenario, los consumidores no obtienen ningún registro y se reequilibran
constantemente. Cuando se produce no hay ninguna excepción o error, pero los registros de Kafka mostrarán que
los consumidores están atascados intentando volver a unirse al grupo y asignar las particiones. Las causas
principales pueden ser varias:
Asegúrese de que request.timeout.ms y session.timeout.ms tengan al menos los valores recomendados de
60000 y 30000 respectivamente. Si estos valores son demasiado bajos podrían provocar tiempos de expiración
de consumidor, que, a su vez, provocarían reequilibrios (lo que provocaría más tiempos de expiración, que
provocarían más reequilibrios, y así sucesivamente)
Si la configuración coincide con los valores recomendados y aun así sigue viendo un reequilibrio constante, no
dude en abrir una incidencia (no olvide incluir toda la configuración en la incidencia para que podamos ayudarle
a depurar).

Problema de compresión y versión de formato de mensaje


Kafka admite la compresión, pero Event Hubs para Kafka actualmente no lo hace. Los errores que mencionan una
versión de formato de mensaje (por ejemplo,
The message format version on the broker does not support the request. ) se producen cuando un cliente intenta
enviar mensajes Kafka comprimidos a nuestros agentes.
Si los datos comprimidos son necesarios, una solución alternativa consiste en comprimir los datos antes de
enviarlos a los agentes y descomprimirlos después de recibirlos. El cuerpo del mensaje es simplemente una matriz
de bytes para el servicio, por lo que la compresión/descompresión en el lado del cliente no causará ningún
problema.

UnknownServerException
Puede recibir un excepción UnknownServerException de las bibliotecas de cliente de Kafka que sea similar al
ejemplo siguiente:

org.apache.kafka.common.errors.UnknownServerException: The server experienced an unexpected error when


processing the request

Registre una incidencia con el servicio de soporte técnico de Microsoft. El registro en el nivel de depuración y las
marcas de tiempo de excepción en UTC son útiles para depurar el problema.

Otros problemas
Si ve problemas al usar Kafka en Event Hubs, compruebe los siguientes elementos.
Firewall que bloquea el tráfico : asegúrese de que el firewall no está bloqueando el puerto 9093 .
TopicAuthorizationException : las causas más comunes de esta excepción son:
Un error de escritura en la cadena de conexión del archivo de configuración, o
Un intento de uso de Event Hubs para Kafka en un espacio de nombres de nivel básico. La característica
Event Hubs para Kafka solo es compatible con los espacios de nombres de niveles Estándar y Dedicado.
La versión de Kafka no coincide : Event Hubs para ecosistemas de Kafka admite las versiones 1.0 y
posteriores de Kafka. Algunas aplicaciones que usan la versión 0.10 de Kafka y versiones posteriores pueden
funcionar ocasionalmente gracias a la compatibilidad con versiones anteriores del protocolo de Kafka, pero se
recomienda seriamente no usar versiones antiguas de la API. Las versiones 0.9 y anteriores de Kafka no admiten
los protocolos SASL necesarios y no se pueden conectar a Event Hubs.
Codificaciones extrañas en encabezados de AMQP al consumir con Kafka : al enviar eventos a un centro
de eventos a través de AMQP, los encabezados de carga de AMQP se serializan en la codificación de AMQP. Los
consumidores de Kafka no deserializan los encabezados de AMQP. Para leer los valores de encabezado,
descodifique manualmente los encabezados AMQP. Como alternativa, puede evitar el uso de encabezados
AMQP si sabe que va a consumir a través del protocolo Kafka. Para más información, consulte este problema de
GitHub.
Autenticación SASL : la obtención de un marco para cooperar con el protocolo de autenticación SASL que
requiere Event Hubs puede resultar más difícil de lo que parece. Vea si puede solucionar problemas relacionados
con la configuración mediante los recursos del marco en la autenticación SASL.

límites
Apache Kafka frente a Event Hubs Kafka. En su mayor parte, Event Hubs Kafka tienen los mismos valores
predeterminados, propiedades, códigos de error y comportamiento general que Apache Kafka. Las instancias en las
que difieren explícitamente (o donde Event Hubs impone un límite que Kafka no tiene) se enumeran a continuación:
La longitud máxima de la propiedad group.id es 256 caracteres
El tamaño máximo de offset.metadata.max.bytes es 1024 bytes
Las confirmaciones de desplazamiento se limitan a 4 llamadas por segundo por partición con un tamaño de
registro interno máximo de 1 MB

Pasos siguientes
Para obtener más información acerca de Event Hubs y Event Hubs para Kafka, consulte los artículos siguientes:
Guía del desarrollador de Apache Kafka para Event Hubs
Guía de migración de Kafka para Event Hubs
Preguntas más frecuentes: Event Hubs para Apache Kafka
Configuraciones recomendadas
Uso de Apache Kafka MirrorMaker con Event Hubs
para Apache Kafka
18/08/2020 • 8 minutes to read • Edit Online

En este ejemplo se muestra cómo reflejar un agente de Kafka en un centro de eventos mediante Kafka
MirrorMaker.

NOTE
Este ejemplo está disponible en GitHub.

En este tutorial, aprenderá a:


Creación de un espacio de nombres de Event Hubs
Clonación del proyecto de ejemplo
Configuración de un clúster de Kafka
Configurar de Kafka MirrorMaker
Ejecución de Kafka MirrorMaker

Introducción
Un aspecto importante de las aplicaciones de escala en la nube modernas es la capacidad de actualizar, mejorar y
cambiar la infraestructura sin interrumpir el servicio. En este tutorial se muestra cómo un centro de eventos y
Kafka MirrorMaker se pueden integrar en una canalización de Kafka existente en Azure al "crear un reflejo" del
flujo de entrada de Kafka en el servicio Event Hubs.
Un punto de conexión de Kafka en Azure Event Hubs permite conectarse a Azure Event Hubs mediante el
protocolo Kafka (es decir, clientes de Kafka). Al realizar cambios mínimos en una aplicación de Kafka, puede
conectarse a Azure Event Hubs y disfrutar de las ventajas del ecosistema de Azure. Las instancias de Event Hubs
actualmente son compatibles con Kafka versión 1.0 y posteriores.
Prerrequisitos
Para completar este tutorial, asegúrese de disponer de los siguientes elementos:
Lea el artículo Event Hubs para Apache Kafka.
Suscripción a Azure. Si no tiene una, cree una cuenta gratuita antes de empezar.
Kit de desarrollo de Java (JDK) 1.7+
En Ubuntu, ejecute apt-get install default-jdk para instalar el JDK.
Asegúrese de establecer la variable de entorno JAVA_HOME para que apunte a la carpeta donde está
instalado el JDK.
Descargue e instale un archivo binario de Maven
En Ubuntu, puede ejecutar apt-get install maven para instalar Maven.
Git
En Ubuntu, puede ejecutar sudo apt-get install git para instalar Git.

Creación de un espacio de nombres de Event Hubs


Se requiere un espacio de nombres de Event Hubs para enviar y recibir de cualquier servicio de Event Hubs.
Consulte Creación de un centro de eventos para obtener instrucciones sobre cómo crear un espacio de nombres y
un centro de eventos. Asegúrese de copiar la cadena de conexión de Event Hubs para su uso posterior.

Clonación del proyecto de ejemplo


Ahora que tiene una cadena de conexión de Event Hubs, clone el repositorio de Azure Event Hubs para Kafka y
vaya a la subcarpeta mirror-maker :

git clone https://github.com/Azure/azure-event-hubs-for-kafka.git


cd azure-event-hubs-for-kafka/tutorials/mirror-maker

Configuración de un clúster de Kafka


Utilice la guía de inicio rápido de Kafka para configurar un clúster con la configuración deseada (o use un clúster
de Kafka existente).

Configurar de Kafka MirrorMaker


Kafka MirrorMaker permite la "creación de reflejos" de un flujo de datos. Dados clústeres de Kafka de origen y
destino, MirrorMaker garantiza que los mensajes enviados al clúster de origen se reciban tanto en el clúster de
origen como en el clúster de destino. En este ejemplo se muestra cómo crear el reflejo de un clúster de Kafka de
origen con el centro de eventos de destino. Este escenario puede utilizarse para enviar datos de una canalización
de Kafka existente a Event Hubs sin interrumpir el flujo de datos.
Para obtener información más detallada sobre Kafka MirrorMaker, consulte la guía de creación de reflejo de Kafka
para MirrorMaker.
Para configurar Kafka MirrorMaker, asígnele un clúster de Kafka como su consumidor u origen, y un centro de
evento como su productor o destino.
Configuración del consumidor
Actualice el archivo de configuración del consumidor source-kafka.config , que indica a MirrorMaker las
propiedades del clúster de origen de Kafka.
so u r c e - k a fk a .c o n fi g
bootstrap.servers={SOURCE.KAFKA.IP.ADDRESS1}:{SOURCE.KAFKA.PORT1},{SOURCE.KAFKA.IP.ADDRESS2}:
{SOURCE.KAFKA.PORT2},etc
group.id=example-mirrormaker-group
exclude.internal.topics=true
client.id=mirror_maker_consumer

Configuración del productor


Ahora, actualice el archivo de configuración del productor mirror-eventhub.config , que indica a MirrorMaker que
envíe los datos duplicados (o "reflejados") al servicio de Event Hubs. En concreto, cambie bootstrap.servers y
sasl.jaas.config para que apunten a su punto de conexión de Kafka para Event Hubs. El servicio de Event Hubs
requiere una comunicación segura (SASL), que se consigue estableciendo las tres últimas propiedades en la
configuración siguiente:
m i r r o r- e v e n t h u b .c o n fi g

bootstrap.servers={YOUR.EVENTHUBS.FQDN}:9093
client.id=mirror_maker_producer

#Required for Event Hubs


sasl.mechanism=PLAIN
security.protocol=SASL_SSL
sasl.jaas.config=org.apache.kafka.common.security.plain.PlainLoginModule required
username="$ConnectionString" password="{YOUR.EVENTHUBS.CONNECTION.STRING}";

Ejecución de Kafka MirrorMaker


Ejecute el script de Kafka MirrorMaker desde el directorio raíz de Kafka con los archivos de configuración
recientemente actualizados. Asegúrese de copiar los archivos de configuración al directorio raíz de Kafka, o de
actualizar sus rutas de acceso en el siguiente comando.

bin/kafka-mirror-maker.sh --consumer.config source-kafka.config --num.streams 1 --producer.config mirror-


eventhub.config --whitelist=".*"

Para comprobar que los eventos llegan al centro de eventos, consulte las estadísticas de entrada en Azure Portal o
ejecute un consumidor en el centro de eventos.
Con MirrorMaker en ejecución, los eventos que se envían al clúster de Kafka de origen son recibidos por el clúster
de Kafka y el centro de eventos reflejado. Al usar MirrorMaker y un punto de conexión de Kafka para Event Hubs,
puede migrar una canalización de Kafka existente al servicio de Azure Event Hubs administrado sin cambiar el
clúster existente ni interrumpir ningún flujo de datos en curso.

Ejemplos
Consulte los siguientes ejemplos en GitHub:
Código de ejemplo de este tutorial en GitHub
Kafka MirrorMaker para Azure Event Hubs que se ejecuta en una instancia de contenedor de Azure

Pasos siguientes
Para obtener más información acerca de Event Hubs para Kafka, consulte los artículos siguientes:
Conexión de Apache Spark a un centro de eventos
Conexión de Apache Flink a un centro de eventos
Integración de Kafka Connect con un centro de eventos
Exploración de ejemplos en nuestro GitHub
Conexión de Akka Streams a un centro de eventos
Guía del desarrollador de Apache Kafka para Azure Event Hubs
Conexión de una aplicación de Apache Spark con
Azure Event Hubs
18/08/2020 • 4 minutes to read • Edit Online

Este tutorial le guía a través de la conexión de la aplicación de Spark a Event Hubs para el streaming en tiempo
real. Esta integración permite el streaming sin tener que cambiar sus clientes de protocolo o ejecutar sus propios
clústeres de Kafka o Zookeeper. Este tutorial necesita Apache Spark v2.4 o superior y Apache Kafka v2.0 o superior.

NOTE
Este ejemplo está disponible en GitHub.

En este tutorial, aprenderá a:


Creación de un espacio de nombres de Event Hubs
Clonación del proyecto de ejemplo
Ejecución de Spark
Lectura de Event Hubs para Kafka
Escritura de Event Hubs para Kafka

Prerrequisitos
Antes de comenzar este tutorial, asegúrese de que dispone de lo siguiente:
Suscripción de Azure. En caso de no tener ninguna, cree una cuenta gratuita.
Apache Spark v2.4
Apache Kafka v2.0
Git

NOTE
El adaptador Spark-Kafka se actualizó para ser compatible con Kafka v2.0 a partir de Spark v2.4. En versiones anteriores de
Spark, el adaptador admitía Kafka v0.10 y versiones posteriores, pero confiaba específicamente en las API de Kafka v0.10.
Como Event Hubs para Kafka no admite Kafka v0.10, los adaptadores Spark-Kafka de versiones de Spark anteriores a la v2.4
no se admiten en Event Hubs para ecosistemas de Kafka.

Creación de un espacio de nombres de Event Hubs


Se requiere un espacio de nombres de Event Hubs para enviar y recibir de cualquier servicio de Event Hubs. Vea
Creación de un centro de eventos para obtener instrucciones sobre cómo crear un espacio de nombres y un centro
de eventos. Obtenga la cadena de conexión de Event Hubs y el nombre de dominio completo (FQDN) para su uso
posterior. Para obtener instrucciones, consulte Get an Event Hubs connection string (Obtención de una cadena de
conexión de Event Hubs).

Clonación del proyecto de ejemplo


Clone el repositorio de Azure Event Hubs y vaya a la subcarpeta tutorials/spark :
git clone https://github.com/Azure/azure-event-hubs-for-kafka.git
cd azure-event-hubs-for-kafka/tutorials/spark

Lectura de Event Hubs para Kafka


Con unos pocos cambios de configuración, puede empezar a leer desde Event Hubs para Kafka. Actualice
BOOTSTRAP_SERVERS y EH_SASL con los detalles de su espacio de nombres y puede empezar a transmitir con
Event Hubs como lo haría con Kafka. Para ver el código de ejemplo completo, consulte el archivo
sparkConsumer.scala en GitHub.

//Read from your Event Hub!


val df = spark.readStream
.format("kafka")
.option("subscribe", TOPIC)
.option("kafka.bootstrap.servers", BOOTSTRAP_SERVERS)
.option("kafka.sasl.mechanism", "PLAIN")
.option("kafka.security.protocol", "SASL_SSL")
.option("kafka.sasl.jaas.config", EH_SASL)
.option("kafka.request.timeout.ms", "60000")
.option("kafka.session.timeout.ms", "30000")
.option("kafka.group.id", GROUP_ID)
.option("failOnDataLoss", "false")
.load()

//Use dataframe like normal (in this example, write to console)


val df_write = df.writeStream
.outputMode("append")
.format("console")
.start()

Escritura de Event Hubs para Kafka


También puede escribir en Event Hubs de la misma manera que escribe en Kafka. No olvide actualizar su
configuración para cambiar BOOTSTRAP_SERVERS y EH_SASL con información de su espacio de nombres de
Event Hubs. Para ver el código de ejemplo completo, consulte el archivo sparkProducer.scala en GitHub.

df = /**Dataframe**/

//Write to your Event Hub!


df.writeStream
.format("kafka")
.option("topic", TOPIC)
.option("kafka.bootstrap.servers", BOOTSTRAP_SERVERS)
.option("kafka.sasl.mechanism", "PLAIN")
.option("kafka.security.protocol", "SASL_SSL")
.option("kafka.sasl.jaas.config", EH_SASL)
.option("checkpointLocation", "./checkpoint")
.start()

Pasos siguientes
Para obtener más información acerca de Event Hubs y Event Hubs para Kafka, consulte los artículos siguientes:
Reflejo de un agente de Kafka en un centro de eventos
Conexión de Apache Flink a un centro de eventos
Integración de Kafka Connect con un centro de eventos
Exploración de ejemplos en nuestro GitHub
Conexión de Akka Streams a un centro de eventos
Guía del desarrollador de Apache Kafka para Azure Event Hubs
Uso de Apache Flink con Azure Event Hubs para
Apache Kafka
18/08/2020 • 6 minutes to read • Edit Online

En este tutorial se muestra cómo conectar Apache Flink a un centro de eventos sin cambiar los clientes del
protocolo o ejecutar sus propios clústeres. Azure Event Hubs admite Apache Kafka versión 1.0..
Uno de los beneficios clave de usar Apache Kafka es el ecosistema de plataformas a los que se puede conectar.
Event Hubs combina la flexibilidad de Kafka con la escalabilidad, coherencia y compatibilidad del ecosistema de
Azure.
En este tutorial, aprenderá a:
Creación de un espacio de nombres de Event Hubs
Clonación del proyecto de ejemplo
Ejecutar el productor Flink
Ejecutar el consumidor Flink

NOTE
Este ejemplo está disponible en GitHub.

Prerrequisitos
Para completar este tutorial, asegúrese de cumplir estos requisitos previos:
Lea el artículo Event Hubs para Apache Kafka.
Suscripción a Azure. Si no tiene una, cree una cuenta gratuita antes de empezar.
Kit de desarrollo de Java (JDK) 1.7+
En Ubuntu, ejecute apt-get install default-jdk para instalar el JDK.
Asegúrese de establecer la variable de entorno JAVA_HOME para que apunte a la carpeta donde está
instalado el JDK.
Descargue e instale un archivo binario de Maven
En Ubuntu, puede ejecutar apt-get install maven para instalar Maven.
Git
En Ubuntu, puede ejecutar sudo apt-get install git para instalar Git.

Creación de un espacio de nombres de Event Hubs


Se requiere un espacio de nombres de Event Hubs para enviar o recibir de cualquier servicio de Event Hubs. Vea
Creación de un centro de eventos para obtener instrucciones sobre cómo crear un espacio de nombres y un
centro de eventos. Asegúrese de copiar la cadena de conexión de Event Hubs para su uso posterior.

Clonación del proyecto de ejemplo


Ahora que tiene una cadena de conexión de Event Hubs, clone el repositorio de Azure Event Hubs para Kafka y
vaya a la subcarpeta flink :
git clone https://github.com/Azure/azure-event-hubs-for-kafka.git
cd azure-event-hubs-for-kafka/tutorials/flink

Ejecutar el productor Flink


Con el ejemplo de productor de Flink proporcionado, envíe mensajes al servicio Event Hubs.
Proporcionar un punto de conexión de Kafka para Event Hubs
Producer.config
Actualice los valores bootstrap.servers y sasl.jaas.config en producer/src/main/resources/producer.config
para dirigir el productor al punto de conexión de Kafka para Event Hubs con la autenticación correcta.

bootstrap.servers={YOUR.EVENTHUBS.FQDN}:9093
client.id=FlinkExampleProducer
sasl.mechanism=PLAIN
security.protocol=SASL_SSL
sasl.jaas.config=org.apache.kafka.common.security.plain.PlainLoginModule required \
username="$ConnectionString" \
password="{YOUR.EVENTHUBS.CONNECTION.STRING}";

Ejecución del productor desde la línea de comandos


Para ejecutar el productor desde la línea de comandos, genere los JAR y luego ejecútelo desde Maven (o genere
los JAR con Maven, luego ejecútelo en Java al agregar los JAR de Kafka necesarios al parámetro classpath):

mvn clean package


mvn exec:java -Dexec.mainClass="FlinkTestProducer"

El productor ahora comenzará a enviar eventos al centro de eventos en el tema test e imprimir los eventos en
stdout.

Ejecutar el consumidor Flink


Con el ejemplo de consumidor proporcionado, reciba mensajes desde el centro de eventos.
Proporcionar un punto de conexión de Kafka para Event Hubs
consumer.config
Actualice los valores bootstrap.servers y sasl.jaas.config en consumer/src/main/resources/consumer.config
para dirigir el consumidor al punto de conexión de Kafka para Event Hubs con la autenticación correcta.

bootstrap.servers={YOUR.EVENTHUBS.FQDN}:9093
group.id=FlinkExampleConsumer
sasl.mechanism=PLAIN
security.protocol=SASL_SSL
sasl.jaas.config=org.apache.kafka.common.security.plain.PlainLoginModule required \
username="$ConnectionString" \
password="{YOUR.EVENTHUBS.CONNECTION.STRING}";

Ejecución del consumidor desde la línea de comandos


Para ejecutar el consumidor desde la línea de comandos, genere los JAR y luego ejecútelo desde Maven (o genere
los JAR con Maven, luego ejecútelo en Java al agregar los JAR de Kafka necesarios al parámetro classpath):
mvn clean package
mvn exec:java -Dexec.mainClass="FlinkTestConsumer"

Si el centro de eventos tiene eventos (por ejemplo, si el productor también se está ejecutando), el consumidor
comienza a recibir eventos del tema test .
Revise la guía del conector Kafka de Flink para más información acerca de cómo conectar Flink a Kafka.

Pasos siguientes
Para más información sobre Event Hubs para Kafka, vea los artículos siguientes:
Reflejo de un agente de Kafka en un centro de eventos
Conexión de Apache Spark a un centro de eventos
Integración de Kafka Connect con un centro de eventos
Exploración de ejemplos en nuestro GitHub
Conexión de Akka Streams a un centro de eventos
Guía del desarrollador de Apache Kafka para Azure Event Hubs
Integración de la compatibilidad con Apache Kafka
Connect en Azure Event Hubs (versión preliminar)
18/08/2020 • 8 minutes to read • Edit Online

A medida que aumenta la ingesta para las necesidades del negocio, también aumenta la necesidad de ingerir para
varios orígenes y receptores externos. Apache Kafka Connect proporciona dicha plataforma para conectar e
importar o exportar datos desde y hacia cualquier sistema externo como MySQL, HDFS y sistema de archivos
mediante un clúster de Kafka. Este tutorial le guiará por el uso del marco Kafka Connect con Event Hubs.
Este tutorial le guiará por la integración de Kafka Connect con un centro de eventos de Azure y la implementación
de conectores básicos FileStreamSource y FileStreamSink. Esta funcionalidad actualmente está en su versión
preliminar. Aunque estos conectores no están pensados para su uso en la producción, muestran un escenario de
un extremo a otro de Kafka Connect en el que Azure Event Hubs actúa como un agente de Kafka.

NOTE
Este ejemplo está disponible en GitHub.

En este tutorial, realizará los siguientes pasos:


Creación de un espacio de nombres de Event Hubs
Clonación del proyecto de ejemplo
Configuración de Kafka Connect para Event Hubs
Ejecución de Kafka Connect
Creación de conectores

Prerrequisitos
Para completar este tutorial, asegúrese de cumplir estos requisitos previos:
Suscripción de Azure. En caso de no tener ninguna, cree una cuenta gratuita.
Git
Linux/MacOS
Versión de Kafka (versión 1.1.1, Scala versión 2.11), disponible en kafka.apache.org
Lea el artículo de introducción Event Hubs para Apache Kafka.

Creación de un espacio de nombres de Event Hubs


Se requiere un espacio de nombres de Event Hubs para enviar y recibir de cualquier servicio de Event Hubs.
Consulte Creación de un centro de eventos para obtener instrucciones sobre cómo crear un espacio de nombres y
un centro de eventos. Obtenga la cadena de conexión de Event Hubs y el nombre de dominio completo (FQDN)
para su uso posterior. Para obtener instrucciones, consulte Get an Event Hubs connection string (Obtención de una
cadena de conexión de Event Hubs).

Clonación del proyecto de ejemplo


Clone el repositorio de Azure Event Hubs y vaya a la carpeta tutorials/connect:
git clone https://github.com/Azure/azure-event-hubs-for-kafka.git
cd azure-event-hubs-for-kafka/tutorials/connect

Configuración de Kafka Connect para Event Hubs


Es necesaria una reconfiguración mínima cuando se redirige el rendimiento de Kafka Connect desde Kafka a Event
Hubs. En el siguiente ejemplo connect-distributed.properties se muestra cómo configurar Connect para
autenticar y comunicarse con el punto de conexión de Kafka en Event Hubs:

bootstrap.servers={YOUR.EVENTHUBS.FQDN}:9093 # e.g. namespace.servicebus.windows.net:9093


group.id=connect-cluster-group

# connect internal topic names, auto-created if not exists


config.storage.topic=connect-cluster-configs
offset.storage.topic=connect-cluster-offsets
status.storage.topic=connect-cluster-status

# internal topic replication factors - auto 3x replication in Azure Storage


config.storage.replication.factor=1
offset.storage.replication.factor=1
status.storage.replication.factor=1

rest.advertised.host.name=connect
offset.flush.interval.ms=10000

key.converter=org.apache.kafka.connect.json.JsonConverter
value.converter=org.apache.kafka.connect.json.JsonConverter
internal.key.converter=org.apache.kafka.connect.json.JsonConverter
internal.value.converter=org.apache.kafka.connect.json.JsonConverter

internal.key.converter.schemas.enable=false
internal.value.converter.schemas.enable=false

# required EH Kafka security settings


security.protocol=SASL_SSL
sasl.mechanism=PLAIN
sasl.jaas.config=org.apache.kafka.common.security.plain.PlainLoginModule required username="$ConnectionString"
password="{YOUR.EVENTHUBS.CONNECTION.STRING}";

producer.security.protocol=SASL_SSL
producer.sasl.mechanism=PLAIN
producer.sasl.jaas.config=org.apache.kafka.common.security.plain.PlainLoginModule required
username="$ConnectionString" password="{YOUR.EVENTHUBS.CONNECTION.STRING}";

consumer.security.protocol=SASL_SSL
consumer.sasl.mechanism=PLAIN
consumer.sasl.jaas.config=org.apache.kafka.common.security.plain.PlainLoginModule required
username="$ConnectionString" password="{YOUR.EVENTHUBS.CONNECTION.STRING}";

plugin.path={KAFKA.DIRECTORY}/libs # path to the libs directory within the Kafka release

Ejecución de Kafka Connect


En este paso, un trabajo de Kafka Connect se inicia localmente en modo distribuido, con Event Hubs para
mantener el estado del clúster.
1. Guarde el archivo anterior connect-distributed.properties localmente. Asegúrese de reemplazar todos los
valores entre llaves.
2. Vaya a la ubicación de la versión de Kafka en la máquina.
3. Ejecute ./bin/connect-distributed.sh /PATH/TO/connect-distributed.properties . La API REST del trabajo de
Connect está lista para interactuar cuando vea 'INFO Finished starting connectors and tasks' .

NOTE
Kafka Connect utiliza Kafka AdminClient API para crear temas automáticamente con configuraciones recomendadas, incluida
la compactación. Una rápida comprobación del espacio de nombres en Azure Portal revela que los temas internos del
trabajo de Connect se han creado automáticamente.
Los temas internos de Kafka Connect deben usar compactación . El equipo de Event Hubs no es responsable de corregir
configuraciones incorrectas si los temas internos de Connect no están configurados correctamente.

Creación de conectores
Esta sección le guiará por la rotación de los conectores FileStreamSource y FileStreamSink.
1. Cree un directorio para archivos de datos de entrada y salida.

mkdir ~/connect-quickstart

2. Cree dos archivos: un archivo con datos de inicialización de los que lee el conector FileStreamSource y otro
en el que escribe nuestro conector FileStreamSink.

seq 1000 > ~/connect-quickstart/input.txt


touch ~/connect-quickstart/output.txt

3. Cree un conector FileStreamSource. Asegúrese de reemplazar las llaves por la ruta de acceso del directorio
particular.

curl -s -X POST -H "Content-Type: application/json" --data '{"name": "file-source","config":


{"connector.class":"org.apache.kafka.connect.file.FileStreamSourceConnector","tasks.max":"1","topic":"c
onnect-quickstart","file": "{YOUR/HOME/PATH}/connect-quickstart/input.txt"}}'
http://localhost:8083/connectors

Debería ver el centro de eventos connect-quickstart en la instancia de Event Hubs después de ejecutar el
comando anterior.
4. Compruebe el estado del conector de origen.

curl -s http://localhost:8083/connectors/file-source/status

Si lo desea, puede usar Explorador de Service Bus para comprobar que los eventos han llegado al tema
connect-quickstart .

5. Cree un conector FileStreamSink. Una vez más, asegúrese de reemplazar las llaves por la ruta de acceso del
directorio particular.

curl -X POST -H "Content-Type: application/json" --data '{"name": "file-sink", "config":


{"connector.class":"org.apache.kafka.connect.file.FileStreamSinkConnector", "tasks.max":"1",
"topics":"connect-quickstart", "file": "{YOUR/HOME/PATH}/connect-quickstart/output.txt"}}'
http://localhost:8083/connectors

6. Compruebe el estado del conector del receptor.


curl -s http://localhost:8083/connectors/file-sink/status

7. Compruebe que se han replicado los datos entre los archivos y que son idénticos en ambos archivos.

# read the file


cat ~/connect-quickstart/output.txt
# diff the input and output files
diff ~/connect-quickstart/input.txt ~/connect-quickstart/output.txt

Limpieza
Kafka Connect crea temas de centro de eventos para almacenar las configuraciones, los desplazamientos y los
estados que persisten incluso después de que el clúster de Connect se haya desactivado. A menos que se desee
esta persistencia, se recomienda eliminar estos temas. También puede eliminar el centro de eventos
connect-quickstart que se creó durante el transcurso de este tutorial.

Pasos siguientes
Para obtener más información acerca de Event Hubs para Kafka, consulte los artículos siguientes:
Reflejo de un agente de Kafka en un centro de eventos
Conexión de Apache Spark a un centro de eventos
Conexión de Apache Flink a un centro de eventos
Exploración de ejemplos en nuestro GitHub
Conexión de Akka Streams a un centro de eventos
Guía del desarrollador de Apache Kafka para Azure Event Hubs
Uso de Akka Streams con Event Hubs para Apache
Kafka
18/08/2020 • 5 minutes to read • Edit Online

En este tutorial se muestra cómo conectar Akka Streams a un centro de eventos sin cambiar los clientes del
protocolo o ejecutar sus propios clústeres. Azure Event Hubs para Kafka admite Apache Kafka versión 1.0.
En este tutorial, aprenderá a:
Creación de un espacio de nombres de Event Hubs
Clonación del proyecto de ejemplo
Ejecutar el productor de Akka Streams
Ejecutar el consumidor de Akka Streams

NOTE
Este ejemplo está disponible en GitHub.

Prerrequisitos
Para completar este tutorial, asegúrese de cumplir estos requisitos previos:
Lea el artículo Event Hubs para Apache Kafka.
Suscripción a Azure. Si no tiene una, cree una cuenta gratuita antes de empezar.
Kit de desarrollo de Java (JDK) 1.8+
En Ubuntu, ejecute apt-get install default-jdk para instalar el JDK.
Asegúrese de establecer la variable de entorno JAVA_HOME para que apunte a la carpeta donde está
instalado el JDK.
Descargue e instale un archivo binario de Maven
En Ubuntu, puede ejecutar apt-get install maven para instalar Maven.
Git
En Ubuntu, puede ejecutar sudo apt-get install git para instalar Git.

Creación de un espacio de nombres de Event Hubs


Se requiere un espacio de nombres de Event Hubs para enviar o recibir de cualquier servicio de Event Hubs.
Consulte Creación de un centro de eventos para obtener más información detallada. Asegúrese de copiar la
cadena de conexión de Event Hubs para su uso posterior.

Clonación del proyecto de ejemplo


Ahora que tiene una cadena de conexión de Event Hubs, clone el repositorio de Azure Event Hubs para Kafka y
vaya a la subcarpeta akka :

git clone https://github.com/Azure/azure-event-hubs-for-kafka.git


cd azure-event-hubs-for-kafka/tutorials/akka/java
Ejecutar el productor de Akka Streams
Con el ejemplo del productor de Akka Streams proporcionado, envíe mensajes al servicio Event Hubs.
Proporcionar un punto de conexión de Kafka para Event Hubs
application.conf del productor
Actualice los valores bootstrap.servers y sasl.jaas.config en producer/src/main/resources/application.conf
para dirigir el productor al punto de conexión de Kafka para Event Hubs con la autenticación correcta.

akka.kafka.producer {
#Akka Kafka producer properties can be defined here

# Properties defined by org.apache.kafka.clients.producer.ProducerConfig


# can be defined in this configuration section.
kafka-clients {
bootstrap.servers="{YOUR.EVENTHUBS.FQDN}:9093"
sasl.mechanism=PLAIN
security.protocol=SASL_SSL
sasl.jaas.config="org.apache.kafka.common.security.plain.PlainLoginModule required
username=\"$ConnectionString\" password=\"{YOUR.EVENTHUBS.CONNECTION.STRING}\";"
}
}

Ejecución del productor desde la línea de comandos


Para ejecutar el productor desde la línea de comandos, genere los JAR y luego ejecútelo desde Maven (o genere
los JAR con Maven, luego ejecútelo en Java al agregar los JAR de Kafka necesarios al parámetro classpath):

mvn clean package


mvn exec:java -Dexec.mainClass="AkkaTestProducer"

El productor ahora comienza a enviar eventos al centro de eventos en el tema test e imprimir los eventos a
stdout.

Ejecutar el consumidor de Akka Streams


Con el ejemplo de consumidor proporcionado, reciba mensajes desde el centro de eventos.
Proporcionar un punto de conexión de Kafka para Event Hubs
application.conf del consumidor
Actualice los valores bootstrap.servers y sasl.jaas.config en consumer/src/main/resources/application.conf
para dirigir el consumidor al punto de conexión de Kafka para Event Hubs con la autenticación correcta.
akka.kafka.consumer {
#Akka Kafka consumer properties defined here
wakeup-timeout=60s

# Properties defined by org.apache.kafka.clients.consumer.ConsumerConfig


# defined in this configuration section.
kafka-clients {
request.timeout.ms=60000
group.id=akka-example-consumer

bootstrap.servers="{YOUR.EVENTHUBS.FQDN}:9093"
sasl.mechanism=PLAIN
security.protocol=SASL_SSL
sasl.jaas.config="org.apache.kafka.common.security.plain.PlainLoginModule required
username=\"$ConnectionString\" password=\"{YOUR.EVENTHUBS.CONNECTION.STRING}\";"
}
}

Ejecución del consumidor desde la línea de comandos


Para ejecutar el consumidor desde la línea de comandos, genere los JAR y luego ejecútelo desde Maven (o genere
los JAR con Maven, luego ejecútelo en Java al agregar los JAR de Kafka necesarios al parámetro classpath):

mvn clean package


mvn exec:java -Dexec.mainClass="AkkaTestConsumer"

Si el centro de eventos tiene eventos (por ejemplo, si el productor también está ejecutándose), el consumidor
comienza a recibir eventos del tema test .
Consulte la Guía de Kafka de Akka Streams para más información sobre Akka Streams.

Pasos siguientes
Para obtener más información acerca de Event Hubs para Kafka, consulte los artículos siguientes:
Reflejo de un agente de Kafka en un centro de eventos
Conexión de Apache Spark a un centro de eventos
Conexión de Apache Flink a un centro de eventos
Integración de Kafka Connect con un centro de eventos
Exploración de ejemplos en nuestro GitHub
Guía del desarrollador de Apache Kafka para Azure Event Hubs
Preguntas más frecuentes: Event Hubs para Apache
Kafka
18/08/2020 • 4 minutes to read • Edit Online

En este artículo se responden algunas de las preguntas más frecuentes sobre la migración a Event Hubs de Apache
Kafka.

¿Se ejecuta Apache Kafka?


No. Ejecutamos operaciones de Kafka API en la infraestructura de Event Hubs. Dado que hay una estrecha
correlación entre Apache Kafka y la funcionalidad de AMQP de Event Hubs (es decir, generar, recibir,
administración, etc.), podemos incorporar la confiabilidad conocida de Event Hubs al espacio de PaaS de Kafka.

Grupo de consumidores de Event Hubs frente a grupo de


consumidores de Kafka
¿Cuál es la diferencia entre un grupo de consumidores de Event Hubs y un grupo de consumidores de Kafka en
Event Hubs? Los grupos de consumidores de Kafka en Event Hubs son completamente distintos de los grupos de
consumidores de Event Hubs estándar.
Grupo de consumidores de Event Hubs
Se administran con operaciones de creación, recuperación, actualización y eliminación (CRUD) mediante el
portal, el SDK o las plantillas de Azure Resource Manager. Los grupos de consumidores de Event Hubs no
pueden crearse de forma automática.
Son entidades secundarias de un centro de eventos. Esto significa que el mismo nombre de grupo de
consumidores puede usarse varias veces entre centros de eventos en el mismo espacio de nombres porque
son entidades independientes.
No se usan para almacenar desplazamientos. El consumo de AMQP organizado se realiza mediante
almacenamiento externo del desplazamiento, por ejemplo en Azure Storage.
Grupos de consumidores de Kafka
Se crean de forma automática. Los grupos de Kafka se pueden administrar mediante las API de grupo de
consumidores de Kafka.
Pueden almacenar desplazamientos en el servicio de Event Hubs.
Se usan como claves en lo que realmente es un almacén de pares de clave-valor de desplazamiento. Para un
par único de group.id y topic-partition , se almacena un desplazamiento en Azure Storage (3x replicación).
Los usuarios de Event Hubs no incurren en costos de almacenamiento adicionales por almacenar
desplazamientos de Kafka. Los desplazamientos se pueden manipular mediante las API de grupo de
consumidores de Kafka, pero las cuentas de almacenamiento de desplazamiento no son visibles directamente
ni manipulables para los usuarios de Event Hubs.
Abarcan un espacio de nombres. El uso del mismo nombre de grupo de Kafka para varias aplicaciones en
varios temas significa que todas las aplicaciones y sus clientes de Kafka se volverán a equilibrar siempre que
solo sea necesario reequilibrar una sola aplicación. Elija los nombres de grupo con cuidado.
Son completamente diferentes de los grupos de consumidores de Event Hubs. No tiene que usar ' $Default ', ni
tiene que preocuparse de que los clientes de Kafka interfieran con las cargas de trabajo de AMQP.
No se pueden ver en Azure Portal. La información del grupo de consumidores es accesible mediante las API de
Kafka.

Pasos siguientes
Para obtener más información acerca de Event Hubs y Event Hubs para Kafka, consulte los artículos siguientes:
Guía del desarrollador de Apache Kafka para Event Hubs
Guía de migración de Kafka para Event Hubs
Guía de solución de problemas de Apache Kafka para Event Hubs
Configuraciones recomendadas
Métricas de Azure Event Hubs en Azure Monitor
18/08/2020 • 12 minutes to read • Edit Online

Las métricas de Event Hubs le permiten conocer el estado de los recursos de Event Hubs en su suscripción de
Azure. Con un amplio conjunto de datos de métricas, puede evaluar el estado general de los centros de eventos, no
solo en el nivel de espacio de nombres, sino también en el nivel de entidad. Estas estadísticas pueden ser
importantes, ya que le ayudan a supervisar el estado de los centros de eventos. Las métricas también pueden
ayudarle a solucionar problemas de causa principal sin necesidad de ponerse en contacto con el soporte técnico de
Azure.
Azure Monitor proporciona interfaces de usuario unificadas para la supervisión de distintos servicios de Azure.
Para obtener más información, vea Supervisión de Microsoft Azure y el ejemplo Retrieve Azure Monitor metrics
with .NET (Recuperación de métricas de Azure Monitor con .NET) en GitHub.

Acceso a la métrica
Azure Monitor proporciona varias maneras de tener acceso a las métricas. Puede acceder a las métricas desde
Azure Portal, o usar las API de Azure Monitor (REST y .NET) y soluciones de análisis como Log Analytics y Event
Hubs. Para más información, vea Datos de supervisión recopilados por Azure Monitor.
De forma predeterminada, las métricas están habilitadas y puede acceder a datos de los últimos 30 días. Si es
necesario conservar los datos durante un periodo mayor, se pueden archivar en una cuenta de Azure Storage. Esto
se configura en la configuración de diagnóstico de Azure Monitor.

Acceso a métricas del portal


Una vez transcurrido un tiempo, las métricas se pueden supervisar en Azure Portal. En el ejemplo siguiente se
muestra cómo ver las solicitudes correctas y las solicitudes entrantes en el nivel de cuenta:

También puede tener acceso a las métricas directamente a través del espacio de nombres. Para ello, seleccione el
espacio de nombres y, después, haga clic en Métricas . Para mostrar las métricas filtradas al ámbito del centro de
eventos, seleccione el centro de eventos y, después, haga clic en Métricas .
Para ver métricas que admitan las dimensiones, debe filtrar por el valor de la dimensión que desee como se
muestra en el siguiente ejemplo:

Facturación
Actualmente, el uso de métricas en Azure Monitor es gratuito. Sin embargo, si usa otras soluciones que ingieren
datos de métricas, puede que se le facturen dichas soluciones. Por ejemplo, se le facturará por Azure Storage si
archiva datos de métricas en una cuenta de Azure Storage. También se le facturará por Azure si transmite datos de
métricas a registros de Azure Monitor para realizar análisis avanzados.
Las siguientes métricas ofrecen una visión general del estado de su servicio.

NOTE
Se están dejando de usar algunas métricas a medida que se mueven a otro nombre. Esto podría requerir que actualice las
referencias. Las métricas que se marquen con la palabra clave "en desuso" no se admitirán en el futuro.

Los valores de las métricas se envían a Azure Monitor cada minuto. La granularidad de tiempo define el intervalo
de tiempo para el que se presentan los valores de las métricas. El intervalo de tiempo compatible para todas las
métricas de Event Hubs es 1 minuto.

Solicitud de métricas
Cuenta el número de solicitudes de operaciones de datos y administración.

N O M B RE DE L A M ÉT RIC A DESC RIP C IÓ N


N O M B RE DE L A M ÉT RIC A DESC RIP C IÓ N

Solicitudes entrantes Número de solicitudes realizadas al servicio de Azure Event


Hubs durante un período determinado.

Unidad: recuento
Tipo de agregación: total
Dimensión: EntityName

Solicitudes correctas Número de solicitudes correctas realizadas al servicio de Azure


Event Hubs durante un período determinado.

Unidad: recuento
Tipo de agregación: total
Dimensión: EntityName

Errores del servidor Número de solicitudes no procesadas debido a un error en el


servicio de Azure Event Hubs durante un período
determinado.

Unidad: recuento
Tipo de agregación: total
Dimensión: EntityName

Errores de usuario Número de solicitudes no procesadas debido a errores de


usuario durante un período determinado.

Unidad: recuento
Tipo de agregación: total
Dimensión: EntityName

Cuota de errores superada El número de solicitudes que superó la cuota disponible. Para
más información sobre las cuotas de Event Hubs, vea este
artículo.

Unidad: recuento
Tipo de agregación: total
Dimensión: EntityName

Métricas de procesamiento
N O M B RE DE L A M ÉT RIC A DESC RIP C IÓ N

Solicitudes limitadas Número de solicitudes que se han limitado porque se superó


el uso de la unidad de procesamiento.

Unidad: recuento
Tipo de agregación: total
Dimensión: EntityName

Métricas de mensaje
N O M B RE DE L A M ÉT RIC A DESC RIP C IÓ N
N O M B RE DE L A M ÉT RIC A DESC RIP C IÓ N

Mensajes entrantes Número de eventos o mensajes enviados a Event Hubs


durante un período determinado.

Unidad: recuento
Tipo de agregación: total
Dimensión: EntityName

Mensajes salientes Número de eventos o mensajes recuperados de Event Hubs


durante un período determinado.

Unidad: recuento
Tipo de agregación: total
Dimensión: EntityName

Bytes entrantes El número de bytes enviado al servicio de Azure Event Hubs


durante un período determinado.

Unidad: bytes
Tipo de agregación: total
Dimensión: EntityName

Bytes salientes El número de bytes recuperado del servicio de Azure Event


Hubs durante un período determinado.

Unidad: bytes
Tipo de agregación: total
Dimensión: EntityName

Métricas de conexión
N O M B RE DE L A M ÉT RIC A DESC RIP C IÓ N

ActiveConnections Número de conexiones activas en un espacio de nombres, así


como en una entidad.

Unidad: recuento
Tipo de agregación: total
Dimensión: EntityName

Conexiones abiertas Número de conexiones abiertas.

Unidad: recuento
Tipo de agregación: total
Dimensión: EntityName

Conexiones cerradas Número de conexiones cerradas.

Unidad: recuento
Tipo de agregación: total
Dimensión: EntityName

Métricas de captura de Event Hubs


Puede supervisar las métricas de captura de Event Hubs cuando se habilita la característica de captura de los
centros de eventos. Las métricas siguientes describen lo que puede supervisar con la característica de captura
habilitada.
N O M B RE DE L A M ÉT RIC A DESC RIP C IÓ N

Capture el trabajo pendiente El número de bytes que se aún se tiene que capturar en el
destino elegido.

Unidad: bytes
Tipo de agregación: total
Dimensión: EntityName

Mensajes capturados El número de mensajes o eventos que se capturan en el


destino elegido durante un período determinado.

Unidad: recuento
Tipo de agregación: total
Dimensión: EntityName

Bytes capturados El número de bytes que se capturan en el destino elegido


durante un período determinado.

Unidad: bytes
Tipo de agregación: total
Dimensión: EntityName

Dimensiones de métricas
Azure Event Hubs admite las siguientes dimensiones para las métricas de Azure Monitor. La adición de
dimensiones a las métricas es opcional. Si no agrega dimensiones, las métricas se especifican en el nivel de espacio
de nombres.

N O M B RE DE L A M ÉT RIC A DESC RIP C IÓ N

EntityName Event Hubs admite las entidades de concentrador de eventos


en el espacio de nombres.

Integración de Azure Monitor con las herramientas SIEM


El enrutamiento de los datos de supervisión (registros de actividad, registros de diagnóstico, etc.) a un centro de
eventos con Azure Monitor permite conseguir una integración sencilla con las herramientas de Administración de
eventos e información de seguridad (SIEM). Para más información, consulte los siguientes artículos o entradas de
blog:
Flujo de datos de supervisión de Azure a un centro de eventos para que lo consuma una herramienta externa
Introducción a Azure Log Integration
Uso de Azure Monitor para su integración con herramientas SIEM
En el escenario en el que una herramienta SIEM consume datos de registro de un centro de eventos, si no ve
ningún mensaje entrante o si ve mensajes entrantes pero no hay mensajes salientes en el gráfico de métricas, siga
estos pasos:
Si no hay mensajes entrantes , significa que el servicio Azure Monitor no está moviendo los registros de
auditoría o diagnóstico al centro de eventos. En este caso, abra una incidencia de soporte técnico con el equipo
de Azure Monitor.
Si hay mensajes entrantes, pero no hay mensajes salientes , significa que la aplicación SIEM no está leyendo
los mensajes. Póngase en contacto con el proveedor de SIEM para determinar si la configuración del centro de
eventos en esas aplicaciones es correcta.
Pasos siguientes
Vea Información general sobre la supervisión en Microsoft Azure.
Ejemplo Retrieve Azure Monitor metrics with .NET (Recuperación de métricas de Azure Monitor con .NET) en
GitHub.
Para obtener más información acerca de Event Hubs, visite los vínculos siguientes:
Empiece a trabajar con un tutorial de Event Hubs
.NET Core
Java
Python
JavaScript
Preguntas más frecuentes sobre Event Hubs
Aplicaciones de ejemplo que usan Event Hubs
Configuración de registros de diagnóstico de Azure
Event Hubs
18/08/2020 • 12 minutes to read • Edit Online

Puede ver dos tipos de registros para Event Hubs de Azure:


Registros de actividad : Estos registros contienen información sobre las operaciones realizadas en un
trabajo. Los registros están siempre habilitados. Puede ver las entradas del registro de actividad si
selecciona Registro de actividad en el panel izquierdo del espacio de nombres del centro de eventos en
Azure Portal. Por ejemplo: "Crear o actualizar el espacio de nombres", "Crear o actualizar el centro de
eventos".

Registros de diagnóstico : los registros de diagnóstico proporcionan información más completa sobre
las operaciones y acciones realizadas en el espacio de nombres mediante la API o mediante clientes de
administración en el SDK de lenguaje.
En la sección siguiente se muestra cómo habilitar los registros de diagnóstico para un espacio de nombres
de Event Hubs.

Habilitar registros de diagnóstico


Los registros de diagnóstico están inhabilitados de forma predeterminada. Para habilitarlos, siga estos pasos:
1. En Azure Portal, vaya al espacio de nombres de Event Hubs.
2. Seleccione Configuración de diagnóstico en Super visión en el panel izquierdo y, luego, elija +
Agregar configuración de diagnóstico .
3. En la sección Detalles de la categoría , seleccione los tipos de registros de diagnóstico que quiere
habilitar. Más adelante en este artículo encontrará información sobre estas categorías.
4. En la sección Detalles de destino , establezca el destino de archivo que prefiera; por ejemplo, una cuenta
de almacenamiento, un centro de eventos o un área de trabajo de Log Analytics.

5. Seleccione Guardar en la barra de herramientas para guardar la configuración de diagnóstico.


La nueva configuración surte efecto en unos 10 minutos. Después, los registros aparecen en el destino de
archivo configurado, en el panel Registros de diagnóstico .
Para obtener más información sobre el diagnóstico de configuraciones, consulte la información general
sobre los registros de diagnóstico de Azure.

Categorías de registros de diagnósticos


Event Hubs captura los registros de diagnóstico de las siguientes categorías:

C AT EGO RY DESC RIP C IÓ N

Registros de archivo Capturan información sobre las operaciones de Event Hubs


Capture, en concreto, registros relacionados con errores de
captura.

Registros operativos Capturan todas las operaciones de administración que se


realizan en el espacio de nombres de Azure Event Hubs. Las
operaciones de datos no se capturan debido al elevado
volumen de este tipo de operaciones que se realizan en Azure
Event Hubs.

Registros de escalabilidad automática Capturan las operaciones de inflado automático realizadas en


un espacio de nombres de Event Hubs.

Registros de coordinador de Kafka Capturan las operaciones del coordinador de Kafka


relacionadas con Event Hubs.

Registros de errores de usuario de Kafka Capturan información sobre las API de Kafka llamadas en
Event Hubs.

Evento de conexión de red virtual de Event Hubs Captura información sobre las direcciones IP y las redes
virtuales que envían tráfico a Event Hubs.

Registros de usuario de claves administradas por el cliente Capturan las operaciones relacionadas con las claves
administradas por el cliente.

Todos los registros se almacenan en el formato de notación de objetos JavaScript (JSON). Cada entrada tiene
campos de cadena que usan el formato descrito en las secciones siguientes.

Esquema de registros de archivo


Las cadenas JSON de registros de archivo incluyen elementos enumerados en la tabla siguiente:

N O M B RE DESC RIP C IÓ N

TaskName La descripción de la tarea que produjo error

ActivityId El identificador interno, usado con fines de seguimiento

trackingId El identificador interno, usado con fines de seguimiento

resourceId El identificador de recursos de Azure Resource Manager

eventHub Nombre completo del centro de eventos (incluye el nombre


del espacio de nombres)

partitionId La partición del centro de eventos en la que se escribe.

archiveStep Valores posibles: ArchiveFlushWriter, DestinationInit

startTime Hora de inicio del error


N O M B RE DESC RIP C IÓ N

errores Número de veces que se ha producido el error.

durationInSeconds La duración del error

message Mensaje de error

category ArchiveLogs

El código siguiente es un ejemplo de una cadena JSON de registro de archivo:

{
"TaskName": "EventHubArchiveUserError",
"ActivityId": "000000000-0000-0000-0000-0000000000000",
"trackingId": "0000000-0000-0000-0000-00000000000000000",
"resourceId": "/SUBSCRIPTIONS/000000000-0000-0000-0000-0000000000000/RESOURCEGROUPS/<Resource Group
Name>/PROVIDERS/MICROSOFT.EVENTHUB/NAMESPACES/<Event Hubs Namespace Name>",
"eventHub": "<Event Hub full name>",
"partitionId": "1",
"archiveStep": "ArchiveFlushWriter",
"startTime": "9/22/2016 5:11:21 AM",
"failures": 3,
"durationInSeconds": 360,
"message": "Microsoft.WindowsAzure.Storage.StorageException: The remote server returned an error: (404) Not
Found. ---> System.Net.WebException: The remote server returned an error: (404) Not Found.\r\n at
Microsoft.WindowsAzure.Storage.Shared.Protocol.HttpResponseParsers.ProcessExpectedStatusCodeNoException[T]
(HttpStatusCode expectedStatusCode, HttpStatusCode actualStatusCode, T retVal, StorageCommandBase`1 cmd,
Exception ex)\r\n at Microsoft.WindowsAzure.Storage.Blob.CloudBlockBlob.<PutBlockImpl>b__3e(RESTCommand`1
cmd, HttpWebResponse resp, Exception ex, OperationContext ctx)\r\n at
Microsoft.WindowsAzure.Storage.Core.Executor.Executor.EndGetResponse[T](IAsyncResult getResponseResult)\r\n
--- End of inner exception stack trace ---\r\n at
Microsoft.WindowsAzure.Storage.Core.Util.StorageAsyncResult`1.End()\r\n at
Microsoft.WindowsAzure.Storage.Core.Util.AsyncExtensions.<>c__DisplayClass4.
<CreateCallbackVoid>b__3(IAsyncResult ar)\r\n--- End of stack trace from previous location where exception was
thrown ---\r\n at System.",
"category": "ArchiveLogs"
}

Esquema de registros operativos


Las cadenas JSON de registros operativos incluyen elementos enumerados en la tabla siguiente:

N O M B RE DESC RIP C IÓ N

ActivityId Identificador interno, usado con fines de seguimiento.

EventName Nombre de la operación

resourceId El identificador de recursos de Azure Resource Manager

SubscriptionId Id. de suscripción

EventTimeString Hora de la operación

EventProperties Propiedades de la operación


N O M B RE DESC RIP C IÓ N

Estado Estado de la operación

Autor de llamada Autor de la llamada de la operación (Azure Portal o


Management Client)

Category OperationalLogs

El código siguiente es un ejemplo de una cadena JSON de registro operativo:

Example:
{
"ActivityId": "00000000-0000-0000-0000-00000000000000",
"EventName": "Create EventHub",
"resourceId": "/SUBSCRIPTIONS/00000000-0000-0000-0000-0000000000000/RESOURCEGROUPS/<Resource Group
Name>/PROVIDERS/MICROSOFT.EVENTHUB/NAMESPACES/<Event Hubs namespace name>",
"SubscriptionId": "000000000-0000-0000-0000-000000000000",
"EventTimeString": "9/28/2016 8:40:06 PM +00:00",
"EventProperties": "{\"SubscriptionId\":\"0000000000-0000-0000-0000-000000000000\",\"Namespace\":\"
<Namespace Name>\",\"Via\":\"https://<Namespace
Name>.servicebus.windows.net/f8096791adb448579ee83d30e006a13e/?api-version=2016-
07\",\"TrackingId\":\"5ee74c9e-72b5-4e98-97c4-08a62e56e221_G1\"}",
"Status": "Succeeded",
"Caller": "ServiceBus Client",
"category": "OperationalLogs"
}

Esquema de registros de escalabilidad automática


Las cadenas JSON del registro de escalabilidad automática incluyen los elementos enumerados en la tabla
siguiente:

N O M B RE DESC RIP C IÓ N

TrackingId Identificador interno, que se usa con fines de seguimiento.

ResourceId Identificador de recursos de Azure Resource Manager.

Message Mensaje informativo, que proporciona detalles sobre la acción


de inflado automático. El mensaje contiene el valor anterior y
actual de la unidad de procesamiento de un espacio de
nombres determinado y lo que desencadenó el inflado de la
unidad de rendimiento.

Este es un evento de escalado automático de ejemplo:

{
"TrackingId": "fb1b3676-bb2d-4b17-85b7-be1c7aa1967e",
"Message": "Scaled-up EventHub TUs (UpdateStartTimeUTC: 5/13/2020 7:48:36 AM, PreviousValue: 1,
UpdatedThroughputUnitValue: 2, AutoScaleReason: 'IncomingMessagesPerSecond reached 2170')",
"ResourceId": "/subscriptions/0000000-0000-0000-0000-
000000000000/resourcegroups/testrg/providers/microsoft.eventhub/namespaces/namespace-name"
}

Esquema de registros de coordinador de Kafka


Las cadenas JSON del registro de coordinador de Kafka incluyen los elementos enumerados en la tabla siguiente:

N O M B RE DESC RIP C IÓ N

RequestId Identificador de solicitud, que se usa con fines de seguimiento.

ResourceId El identificador de recursos de Azure Resource Manager

Operación Nombre de la operación que se realiza durante la coordinación


de grupos.

ClientId Id. de cliente

NamespaceName Nombre del espacio de nombres

SubscriptionId Identificador de suscripción de Azure

Message Mensaje informativo o de advertencia, que proporciona


detalles sobre las acciones realizadas durante la coordinación
de grupos.

Ejemplo

{
"RequestId": "FE01001A89E30B020000000304620E2A_KafkaExampleConsumer#0",
"Operation": "Join.Start",
"ClientId": "KafkaExampleConsumer#0",
"Message": "Start join group for new member namespace-name:c:$default:I:KafkaExampleConsumer#0-
cc40856f7f3c4607915a571efe994e82, current group size: 0, API version: 2, session timeout: 10000ms, rebalance
timeout: 300000ms.",
"SubscriptionId": "0000000-0000-0000-0000-000000000000",
"NamespaceName": "namespace-name",
"ResourceId": "/subscriptions/0000000-0000-0000-0000-
000000000000/resourcegroups/testrg/providers/microsoft.eventhub/namespaces/namespace-name",
"Category": "KafkaCoordinatorLogs"
}

Esquema de registros de error de usuario de Kafka


Las cadenas JSON del registro de errores de Kafka incluyen los elementos enumerados en la tabla siguiente:

N O M B RE DESC RIP C IÓ N

TrackingId Identificador de seguimiento, que se usa con fines de


seguimiento.

NamespaceName Nombre del espacio de nombres

Eventhub Nombre del centro de eventos

PartitionId Id. de partición

GroupId Identificador de grupo

ClientId Id. de cliente


N O M B RE DESC RIP C IÓ N

ResourceId Identificador de recursos de Azure Resource Manager.

Message Mensaje informativo, que proporciona detalles sobre un error.

Esquema de eventos de conexión de red virtual de Event Hubs


Las cadenas JSON del evento de conexión de red virtual (VNet) de Event Hubs contienen los elementos
enumerados en la tabla siguiente:

N O M B RE DESC RIP C IÓ N

SubscriptionId Identificador de suscripción de Azure

NamespaceName Nombre del espacio de nombres

IPAddress Dirección IP de un cliente que se conecta al servicio de Event


Hubs.

Acción Acción realizada por el servicio Event Hubs al evaluar las


solicitudes de conexión. Las acciones admitidas son Accept
Connection (Aceptar conexión) y Deny Connection
(Denegar conexión).

Motivo Proporciona el motivo de que se haya realizado la acción.

Count Número de repeticiones de una acción dada.

ResourceId Identificador de recursos de Azure Resource Manager.

Ejemplo

{
"SubscriptionId": "0000000-0000-0000-0000-000000000000",
"NamespaceName": "namespace-name",
"IPAddress": "1.2.3.4",
"Action": "Deny Connection",
"Reason": "IPAddress doesn't belong to a subnet with Service Endpoint enabled.",
"Count": "65",
"ResourceId": "/subscriptions/0000000-0000-0000-0000-
000000000000/resourcegroups/testrg/providers/microsoft.eventhub/namespaces/namespace-name",
"Category": "EventHubVNetConnectionEvent"
}

Registros de usuario de claves administradas por el cliente


Las cadenas JSON del registro de usuario de claves administradas por el cliente incluyen los elementos
enumerados en la tabla siguiente:

N O M B RE DESC RIP C IÓ N

Category Tipo de categoría de un mensaje. Corresponde a uno de los


siguientes valores: error e info
N O M B RE DESC RIP C IÓ N

ResourceId Identificador de recurso interno, que incluye el identificador de


suscripción y el nombre del espacio de nombres de Azure.

KeyVault Nombre del recurso de Key Vault.

Clave Nombre de la clave de Key Vault.

Versión Versión de la clave de Key Vault.

Operación El nombre de una operación realizada para atender solicitudes.

Código status code

Message Mensaje, que proporciona detalles sobre un error o un


mensaje informativo.

Pasos siguientes
Introducción a Event Hubs
Ejemplos de Event Hubs
Introducción a Event Hubs
.NET Core
Java
Python
JavaScript
Envío de datos de Windows Azure Diagnostics
Extension a Azure Event Hubs
18/08/2020 • 7 minutes to read • Edit Online

Azure Diagnostics Extension es un agente de Azure Monitor que recopila datos de supervisión del sistema
operativo invitado y de las cargas de trabajo de las máquinas virtuales de Azure y de otros recursos de proceso. En
este artículo, se explica cómo puede enviar datos desde Windows Azure Diagnostic Extension (WAD) a Azure Event
Hubs para reenviarlos después fuera de Azure.

Datos admitidos
Los datos recopilados del sistema operativo invitado que pueden enviarse a Event Hubs son los siguientes. Otros
orígenes de datos recopilados por WAD, como los volcados de memoria y los registros de IIS, no se pueden enviar
a Event Hubs.
Eventos de Seguimiento de eventos para Windows (ETW)
Contadores de rendimiento
Registros de eventos de Windows, incluidos los registros de aplicaciones en el registro de eventos de Windows
Registros de infraestructura de diagnóstico de Azure

Requisitos previos
Windows Diagnostics Extension 1.6 o versiones posteriores. Consulte el historial de versiones en Historial y
versiones de esquemas de configuración de Azure Diagnostics Extension y los recursos admitidos en la
introducción a Azure Diagnostics Extension.
Siempre debe aprovisionarse un espacio de nombres de Event Hubs. Consulte la introducción a Event Hubs para
más información.

Esquema de configuración
Consulte las diferentes opciones para habilitar y configurar Diagnostics Extension en Instalación y configuración de
Windows Azure Diagnostics Extension (WAD) y una referencia del esquema de configuración en Esquema de
configuración de Azure Diagnostics. De aquí hasta el final del artículo, se describe cómo se utiliza esta
configuración para enviar datos a un centro de eventos.
Azure Diagnostics siempre envía registros y métricas a una cuenta de Azure Storage. Puede configurar uno o varios
receptores de datos para enviar datos a otros destinos. Cada receptor de datos se define en el elemento
SinksConfig de la configuración pública con información confidencial en la configuración privada. Esta
configuración de los centros de eventos utiliza los valores de la tabla siguiente.

P RO P IEDA D DESC RIP C IÓ N

Nombre Nombre descriptivo del receptor. Se utiliza en la configuración


para especificar qué orígenes de datos van a enviar
información al receptor.

Url Dirección URL del centro de eventos con el formato <event-


hubs-namespace>.servicebus.windows.net/<event-hub-
name>.
P RO P IEDA D DESC RIP C IÓ N

SharedAccessKeyName Nombre de la directiva de acceso compartido del centro de


eventos que tiene, como mínimo, el permiso Enviar .

SharedAccessKey Clave principal o secundaria de la directiva de acceso


compartido del centro de eventos.

A continuación, se incluyen ejemplos de la configuración pública y privada. Se trata de una configuración mínima
con un solo contador de rendimiento y un solo registro de eventos que ilustra cómo se configura y utiliza el
receptor de datos del centro de eventos. Puede ver un ejemplo más complejo en Esquema de configuración de
Azure Diagnostics.
Configuración pública

{
"WadCfg": {
"DiagnosticMonitorConfiguration": {
"overallQuotaInMB": 5120,
"PerformanceCounters": {
"scheduledTransferPeriod": "PT1M",
"sinks": "myEventHub",
"PerformanceCounterConfiguration": [
{
"counterSpecifier": "\\Processor(_Total)\\% Processor Time",
"sampleRate": "PT3M"
}
]
},
"WindowsEventLog": {
"scheduledTransferPeriod": "PT1M",
"sinks": "myEventHub",
"DataSource": [
{
"name": "Application!*[System[(Level=1 or Level=2 or Level=3)]]"
}
]
}
},
"SinksConfig": {
"Sink": [
{
"name": "myEventHub",
"EventHub": {
"Url": "https://diags-mycompany-ns.servicebus.windows.net/diageventhub",
"SharedAccessKeyName": "SendRule"
}
}
]
}
},
"StorageAccount": "mystorageaccount",
}

Configuración privada
{
"storageAccountName": "mystorageaccount",
"storageAccountKey": "{base64 encoded key}",
"storageAccountEndPoint": "https://core.windows.net",
"EventHub": {
"Url": "https://diags-mycompany-ns.servicebus.windows.net/diageventhub",
"SharedAccessKeyName": "SendRule",
"SharedAccessKey": "{base64 encoded key}"
}
}

Opciones de configuración
Para enviar datos a un receptor de datos, debe especificar el atributo sinks en el nodo del origen de datos. El lugar
en el que incluya el atributo sinks determinará el ámbito de la asignación. En el ejemplo siguiente, el atributo sinks
está definido en el nodo PerformanceCounters , lo que hará que todos los contadores de rendimiento
secundarios se envíen al centro de eventos.

"PerformanceCounters": {
"scheduledTransferPeriod": "PT1M",
"sinks": "MyEventHub",
"PerformanceCounterConfiguration": [
{
"counterSpecifier": "\\Processor(_Total)\\% Processor Time",
"sampleRate": "PT3M"
},
{
"counterSpecifier": "\\Memory\\Available MBytes",
"sampleRate": "PT3M"
},
{
"counterSpecifier": "\\Web Service(_Total)\\ISAPI Extension Requests/sec",
"sampleRate": "PT3M"
}
]
}

En el ejemplo siguiente, el atributo sinks se aplica directamente a tres contadores, por lo que solo se enviarán estos
contadores de rendimiento al centro de eventos.
"PerformanceCounters": {
"scheduledTransferPeriod": "PT1M",
"PerformanceCounterConfiguration": [
{
"counterSpecifier": "\\Processor(_Total)\\% Processor Time",
"sampleRate": "PT3M",
"sinks": "MyEventHub"
},
{
"counterSpecifier": "\\Memory\\Available MBytes",
"sampleRate": "PT3M"
},
{
"counterSpecifier": "\\Web Service(_Total)\\ISAPI Extension Requests/sec",
"sampleRate": "PT3M"
},
{
"counterSpecifier": "\\ASP.NET\\Requests Rejected",
"sampleRate": "PT3M",
"sinks": "MyEventHub"
},
{
"counterSpecifier": "\\ASP.NET\\Requests Queued",
"sampleRate": "PT3M",
"sinks": "MyEventHub"
}
]
}

Validación de la configuración
Puede utilizar diferentes métodos para comprobar que los datos se están enviando al centro de eventos. El método
más sencillo es utilizar una captura de Event Hubs, tal y como se describe en Captura de eventos a través de Azure
Event Hubs en Azure Blob Storage o Azure Data Lake Storage.

Solución de problemas con los receptores de Event Hubs


Consulte la tabla WADDiagnosticInfrastructureLogsTable de Azure Storage, que contiene registros y
errores de Azure Diagnostics. Una opción es usar una herramienta como el Explorador de Azure Storage
para conectarse a esta cuenta de almacenamiento, ver esta tabla y agregar una consulta para TimeStamp en
las últimas 24 horas. Puede usar la herramienta para exportar un archivo .csv y abrirlo en una aplicación
como Microsoft Excel. Excel facilita la búsqueda de cadenas de tarjeta de llamadas, como EventHubs , para
ver qué error se notifica.
Compruebe que el centro de eventos esté correctamente aprovisionado. Toda la información de conexión de
la sección PrivateConfig de la configuración debe coincidir con los valores del recurso que se muestran en
el portal. No olvide que debe tener una directiva SAS definida (en este ejemplo es SendRule) en el portal y
que debe haberse concedido el permiso Enviar.

Pasos siguientes
Información general de Event Hubs
Creación de un centro de eventos
Preguntas más frecuentes sobre Event Hubs
Escalado vertical y automático de las unidades de
procesamiento de Azure Event Hubs
18/08/2020 • 6 minutes to read • Edit Online

Azure Event Hubs es una plataforma de streaming de datos muy escalable. Por lo tanto, el uso de Event Hubs
suele aumentar después de empezar a utilizar el servicio. Para esta utilización, es necesario incrementar las
unidades de procesamiento predeterminadas con el objetivo de escalar Event Hubs y controlar velocidades de
transferencia más elevadas. La característica de inflado automático de Event Hubs escala verticalmente y de
forma automática mediante el aumento del número de unidades de procesamiento para responder a las
necesidades de utilización. Al aumentar las unidades de rendimiento, se evitan escenarios de limitación en los
que nos encontramos con:
Velocidades de entrada de datos que superan las unidades de rendimiento establecidas.
Velocidades de solicitud de salida de datos que superan las unidades de rendimiento establecidas.
El servicio Event Hubs aumenta el rendimiento cuando la carga aumenta más allá del umbral mínimo, sin que se
produzca ningún problema de las solicitudes con errores de ServerBusy.

Funcionamiento del inflado automático


El tráfico de los Event Hubs lo controlan las unidades de procesamiento. Una sola unidad de procesamiento
permite una entrada de 1 MB por segundo y una salida que duplica esa cifra. Event Hubs estándar se puede
configurar con un número de unidades de procesamiento de uno a veinte. El inflado automático permite
empezar poco a poco con las unidades de procesamiento mínimas que se elijan. Después, la característica escala
automáticamente la cantidad hasta el límite máximo de unidades de procesamiento que necesite, según el
aumento del tráfico. El inflado automático proporciona las siguientes ventajas:
Un mecanismo de escalado eficaz para empezar poco a poco y escalar verticalmente a medida que aumente
el tráfico.
Escalado automático hasta el límite superior especificado sin problemas de limitación.
Más control sobre el escalado, ya que se puede controlar el momento y la cantidad que se escala.

Habilitación del inflado automático en un espacio de nombres


Puede habilitar o deshabilitar aumentar el inflado automático en un espacio de nombres de Event Hubs del nivel
Estándar mediante cualquiera de los métodos siguientes:
Azure Portal
Una Plantilla de Azure Resource Manager.

NOTE
Los espacios de nombres de Event Hubs de nivel Básico no admiten el inflado automático.

Habilitación del inflado automático mediante Azure Portal


Habilitación en el momento de creación
Puede habilitar la característica de inflado automático al crear un espacio de nombres de Event Hubs :
Con esta opción habilitada, puede empezar poco a poco con las unidades de procesamiento y escalarlas
verticalmente a medida que sus necesidades de utilización sean más exigentes. El límite superior del inflado no
afecta inmediatamente al precio, que depende del número de unidades de procesamiento utilizadas por hora.
Habilitación del inflado automático para un centro de eventos existente
También puede habilitar la característica de inflado automático y modificar su configuración mediante las
siguientes instrucciones:
1. En la página Espacio de nombres de Event Hubs , seleccione Deshabilitado en Unidades de
procesamiento de inflado automático .

2. En la página Configuración de escalado , seleccione la casilla de verificación Habilitar (si no se ha


habilitado la característica de escalabilidad automática).
3. Escriba el número máximo de unidades de rendimiento o use la barra de desplazamiento para
establecer el valor.
4. (opcional) Actualice el número mínimo de unidades de procesamiento en la parte superior de esta
página.

NOTE
Al aplicar la configuración de inflado automático para aumentar las unidades de procesamiento, el servicio Event Hubs
emite los registros de diagnóstico que le proporcionan información acerca de por qué y cuándo aumentó el rendimiento.
Para habilitar el registro de diagnóstico para un centro de eventos, seleccione configuración de diagnóstico en el
menú izquierdo de la página del centro de eventos en Azure Portal. Para más información, vea Configuración de registros
de diagnóstico de Azure Event Hubs.

Habilitación del inflado automático mediante una plantilla de Azure Resource Manager
Puede habilitar el inflado automático durante la implementación de una plantilla de Azure Resource Manager.
Por ejemplo, establezca la propiedad isAutoInflateEnabled en True , y maximumThroughputUnits en 10. Por
ejemplo:
"resources": [
{
"apiVersion": "2017-04-01",
"name": "[parameters('namespaceName')]",
"type": "Microsoft.EventHub/Namespaces",
"location": "[variables('location')]",
"sku": {
"name": "Standard",
"tier": "Standard"
},
"properties": {
"isAutoInflateEnabled": true,
"maximumThroughputUnits": 10
},
"resources": [
{
"apiVersion": "2017-04-01",
"name": "[parameters('eventHubName')]",
"type": "EventHubs",
"dependsOn": [
"[concat('Microsoft.EventHub/namespaces/', parameters('namespaceName'))]"
],
"properties": {},
"resources": [
{
"apiVersion": "2017-04-01",
"name": "[parameters('consumerGroupName')]",
"type": "ConsumerGroups",
"dependsOn": [
"[parameters('eventHubName')]"
],
"properties": {}
}
]
}
]
}
]

Para ver la plantilla completa, consulte la plantilla Create Event Hubs namespace and enable inflate (Creación de
un espacio de nombres de Event Hubs y habilitación del inflado) en GitHub.

Pasos siguientes
Para más información acerca de Event Hubs, visite los vínculos siguientes:
Información general de Event Hubs
Bibliotecas de administración de Event Hubs
18/08/2020 • 2 minutes to read • Edit Online

Puede usar las bibliotecas de administración de Azure Event Hubs para aprovisionar de forma dinámica las
entidades y los espacios de nombres de Event Hubs. Esta naturaleza dinámica posibilita escenarios complejos de
implementación y mensajería, lo que permite determinar mediante programación qué entidades aprovisionar. Estas
bibliotecas están actualmente disponibles para .NET.

Funcionalidad admitida
Creación, actualización y eliminación de espacios de nombres
Creación, actualización y eliminación de Event Hubs
Creación, actualización y eliminación de grupos de consumidores

Prerequisites
Para comenzar a usar las bibliotecas de administración de Event Hubs, debe autenticarse con Azure Active Directory
(AAD). AAD requiere que se autentique como una entidad de servicio que proporciona acceso a los recursos de
Azure. Para más información sobre cómo crear una entidad de servicio, consulte uno de los siguientes artículos:
Uso de Azure Portal para crear una aplicación de Active Directory y una entidad de servicio con acceso a los
recursos
Uso de Azure PowerShell para crear a una entidad de servicio para acceder a recursos
Uso de la CLI de Azure para crear a una entidad de servicio para acceder a recursos
Estos tutoriales le proporcionan valores para AppId (identificador de cliente), TenantId y ClientSecret (clave de
autenticación), que usan las bibliotecas de administración con fines de autenticación. Debe tener permisos de
Propietario en el grupo de recursos en el que desea realizar la ejecución.

Modelo de programación
El patrón para manipular los recursos de Event Hubs sigue un protocolo común:
1. Obtenga un token de AAD mediante la biblioteca Microsoft.IdentityModel.Clients.ActiveDirectory .

var context = new AuthenticationContext($"https://login.microsoftonline.com/{tenantId}");

var result = await context.AcquireTokenAsync(


"https://management.core.windows.net/",
new ClientCredential(clientId, clientSecret)
);

2. Cree el objeto EventHubManagementClient .

var creds = new TokenCredentials(token);


var ehClient = new EventHubManagementClient(creds)
{
SubscriptionId = SettingsCache["SubscriptionId"]
};

3. Establezca los parámetros de CreateOrUpdate en los valores especificados.


var ehParams = new EventHubCreateOrUpdateParameters()
{
Location = SettingsCache["DataCenterLocation"]
};

4. Ejecute la llamada.

await ehClient.EventHubs.CreateOrUpdateAsync(resourceGroupName, namespaceName, EventHubName, ehParams);

Pasos siguientes
Ejemplo de administración de .NET
Referencia de Microsoft.Azure.Management.EventHub
Configuración de reglas de firewall de IP para un
espacio de nombres de Azure Event Hubs
18/08/2020 • 7 minutes to read • Edit Online

Los espacios de nombres de Azure Event Hubs son accesibles de forma predeterminada desde Internet, siempre
que la solicitud venga con una autenticación y una autorización válidas. Con el firewall de IP, puede restringirlo
aún más a solo un conjunto de direcciones o intervalos de direcciones IPv4 en notación CIDR (Enrutamiento de
interdominios sin clases).
Esta característica es útil en escenarios en los que Azure Event Hubs debe ser accesible únicamente desde ciertos
sitios conocidos. Las reglas de firewall permiten configurar reglas para aceptar el tráfico procedente de
direcciones IPv4 concretas. Por ejemplo, si usa Event Hubs con Azure ExpressRoute, puede crear una regla de
firewall para permitir el tráfico procedente única y exclusivamente de las direcciones IP de la infraestructura
local.

WARNING
La habilitación del filtrado de IP puede evitar que otros servicios de Azure interactúen con Event Hubs.
Los servicios de confianza de Microsoft no se admiten cuando se implementan instancias de Virtual Network.
Estos son los escenarios comunes de Azure que no funcionan con instancias de Virtual Network (tenga en cuenta que la
lista NO está completa).
Azure Stream Analytics
Enrutamientos de Azure IoT Hub
Azure IoT Device Explorer
Los siguientes servicios de Microsoft deben estar en una red virtual
Azure Web Apps
Azure Functions

Reglas de firewall de IP
Las reglas de firewall de IP se aplican en el nivel del espacio de nombres de Event Hubs. Por lo tanto, las reglas
se aplican a todas las conexiones de clientes que usan cualquier protocolo admitido. Cualquier intento de
conexión desde una dirección IP que no coincida con una regla IP admitida en el espacio de nombres de Event
Hubs se rechaza como no autorizado. La respuesta no menciona la regla IP. Las reglas de filtro IP se aplican en
orden y la primera regla que coincida con la dirección IP determina la acción de aceptar o rechazar.

Usar Azure Portal


En esta sección se muestra cómo usar Azure Portal para crear reglas de firewall de IP para un espacio de
nombres de Event Hubs.
1. Vaya a su espacio de nombres de Event Hubs en Azure Portal.
2. En el menú de la izquierda, seleccione la opción Redes . Si selecciona la opción Todas las redes , el centro
de eventos aceptará conexiones procedentes de cualquier dirección IP. Esta configuración equivale a una
regla que acepta el intervalo de direcciones IP 0.0.0.0/0.
3. Para restringir el acceso a únicamente algunas redes y direcciones IP, seleccione la opción Redes
seleccionadas . En la sección Firewall , haga lo siguiente:
a. Seleccione la opción Agregar la dirección IP del cliente para dar acceso a esa IP de cliente
actual al espacio de nombres.
b. En Inter valo de direcciones , escriba una dirección IPv4 específica o un intervalo de direcciones
IPv4 en notación CIDR.
c. Especifique si quiere permitir que los ser vicios de confianza de Microsoft omitan este
firewall .

WARNING
Si elige la opción Redes seleccionadas y no especifica ninguna dirección IP o un intervalo de direcciones,
el servicio permitirá el tráfico desde todas las redes.
4. Seleccione Guardar en la barra de herramientas para guardar la configuración. Espere unos minutos
hasta que la confirmación se muestre en las notificaciones de Azure Portal.

Uso de plantillas de Resource Manager


IMPORTANT
Las reglas de firewall se admiten en los niveles estándar y dedicado de Event Hubs. No se admiten en el nivel básico.

La siguiente plantilla de Resource Manager permite agregar una regla de filtro de IP a un espacio de nombres de
Event Hubs.
Parámetros de plantilla:
ipMask es una única dirección IPv4 o un bloque de direcciones IP en la notación CIDR. Por ejemplo, en
notación CIDR 70.37.104.0/24 representa las 256 direcciones IPv4 de 70.37.104.0 a 70.37.104.255, donde 24
indica el número de bits de prefijo significativos para el intervalo.

NOTE
Si bien no hay reglas de denegación posibles, la plantilla de Azure Resource Manager tiene la acción predeterminada
establecida en "Permitir" , que no restringe las conexiones. Cuando se realizan las reglas de Virtual Network o de firewall,
es necesario cambiar el valor "defaultAction"
desde

"defaultAction": "Allow"

to

"defaultAction": "Deny"
{
"$schema": "https://schema.management.azure.com/schemas/2015-01-01/deploymentTemplate.json#",
"contentVersion": "1.0.0.0",
"parameters": {
"eventhubNamespaceName": {
"type": "string",
"metadata": {
"description": "Name of the Event Hubs namespace"
}
},
"location": {
"type": "string",
"metadata": {
"description": "Location for Namespace"
}
}
},
"variables": {
"namespaceNetworkRuleSetName": "[concat(parameters('eventhubNamespaceName'), concat('/',
'default'))]",
},
"resources": [
{
"apiVersion": "2018-01-01-preview",
"name": "[parameters('eventhubNamespaceName')]",
"type": "Microsoft.EventHub/namespaces",
"location": "[parameters('location')]",
"sku": {
"name": "Standard",
"tier": "Standard"
},
"properties": { }
},
{
"apiVersion": "2018-01-01-preview",
"name": "[variables('namespaceNetworkRuleSetName')]",
"type": "Microsoft.EventHub/namespaces/networkruleset",
"dependsOn": [
"[concat('Microsoft.EventHub/namespaces/', parameters('eventhubNamespaceName'))]"
],
"properties": {
"virtualNetworkRules": [<YOUR EXISTING VIRTUAL NETWORK RULES>],
"ipRules":
[
{
"ipMask":"10.1.1.1",
"action":"Allow"
},
{
"ipMask":"11.0.0.0/24",
"action":"Allow"
}
],
"trustedServiceAccessEnabled": false,
"defaultAction": "Deny"
}
}
],
"outputs": { }
}

Para implementar la plantilla, siga las instrucciones para Azure Resource Manager.

Pasos siguientes
Para restringir el acceso a Event Hubs a las redes virtuales de Azure, visite el siguiente vínculo:
Puntos de conexión de servicio de red virtual para Event Hubs
Permitir el acceso al espacio de nombres de Event
Hubs desde redes virtuales específicas
18/08/2020 • 12 minutes to read • Edit Online

La integración de Event Hubs con los puntos de conexión de servicio de red virtual (VNet) permite el acceso
seguro a las funcionalidades de mensajería desde cargas de trabajo tales como máquinas virtuales que están
enlazadas a redes virtuales, con una ruta de acceso del tráfico de red que está protegida en ambos extremos.
Una vez realizada la configuración para enlazarse con al menos un punto de conexión de servicio de subred de
red virtual, el espacio de nombres respectivo de Event Hubs ya solo aceptará el tráfico procedente de redes
virtuales autorizadas. Desde la perspectiva de la red virtual, el enlace de un espacio de nombres de Event Hubs a
un punto de conexión de servicio configura un túnel de redes aislado desde la subred de la red virtual al servicio
de mensajería.
El resultado es una relación privada y aislada entre las cargas de trabajo enlazadas a la subred y el espacio de
nombres respectivo de Event Hubs, a pesar de que la dirección de red que se puede observar en el punto de
conexión de servicio de mensajería esté en un intervalo IP público. Hay una excepción a este comportamiento. Al
habilitar un punto de conexión de servicio, de forma predeterminada, se habilita la regla denyall en el firewall de
IP asociado a la red virtual. Puede agregar direcciones IP específicas en el firewall de IP para habilitar el acceso al
punto de conexión público del centro de eventos.

WARNING
La implementación de la integración de instancias de Virtual Network puede evitar que otros servicios de Azure interactúen
con Event Hubs.
Los servicios de confianza de Microsoft no se admiten cuando se implementan instancias de Virtual Network.
Estos son los escenarios comunes de Azure que no funcionan con instancias de Virtual Network (tenga en cuenta que la
lista NO está completa).
Azure Stream Analytics
Enrutamientos de Azure IoT Hub
Azure IoT Device Explorer
Los siguientes servicios de Microsoft deben estar en una red virtual
Azure Web Apps
Azure Functions
Azure Monitor (configuración de diagnósticos)

IMPORTANT
Las redes virtuales se admiten en los niveles estándar y dedicado de Event Hubs. No se admiten en el nivel básico .

Escenarios de seguridad avanzados que habilita la integración de VNet


En el caso de soluciones que requieren una estricta seguridad compartimentalizada y en las que las subredes de
redes virtuales proporcionan la segmentación entre los servicios compartimentalizados, estas siguen necesitando
rutas de comunicación entre los servicios que residen en esos compartimentos.
Cualquier ruta IP inmediata entre compartimientos, incluidos aquellos que transportan HTTPS a través de TCP/IP,
tienen el riesgo de sufrir ataques por puntos vulnerables en la capa de red o en capas superiores. Los servicios de
mensajería proporcionan rutas de comunicación aisladas, donde los mensajes incluso se escriben en discos
cuando se trasladan entre entidades. Las cargas de trabajo de dos redes virtuales distintas enlazadas a la misma
instancia de Event Hubs pueden comunicarse de forma eficaz y fiable mediante mensajes, al tiempo que se
preserva la integridad de los respectivos límites de aislamiento de red.
Esto significa que sus soluciones confidenciales en la nube no solo obtienen acceso a las funcionalidades de
mensajería asíncrona de Azure (líderes del sector en fiabilidad y escalabilidad), sino que también pueden usar la
mensajería para crear rutas de comunicación entre compartimentos seguros de la solución, que son
intrínsecamente más seguros de lo que se puede lograr con cualquier otro modo de comunicación entre iguales,
incluyendo en protocolo HTTPS y los protocolos de socket protegidos por TLS.

Enlace de centros de eventos a redes virtuales


Las reglas de red vir tual son una característica de firewall que controla si el espacio de nombres de Azure
Event Hubs acepta las conexiones de una subred determinada de una red virtual.
Enlazar un espacio de nombres de Event Hubs a una red virtual es un proceso de dos pasos. Primero debe crear
un punto de conexión de ser vicio de red vir tual en una subred de red virtual y habilitarlo para
Microsoft.EventHub , tal como se explica en el artículo de introducción a los puntos de conexión de servicio. Una
vez que haya agregado el punto de conexión de servicio, enlácelo con el espacio de nombres de Event Hubs con
una regla de red vir tual .
La regla de red virtual es una asociación del espacio de nombres de Event Hubs con una subred de red virtual.
Mientras exista la regla, se les concederá acceso a todas las cargas de trabajo que estén enlazadas a la subred, al
espacio de nombres de Event Hubs. Event Hubs no establece nunca por sí mismo conexiones de salida, no
necesita obtener acceso y, por tanto, nunca se le concede acceso a la subred habilitando esta regla.

Usar Azure Portal


En esta sección se muestra cómo usar Azure Portal para agregar un punto de conexión de servicio de red virtual.
Para limitar el acceso, debe integrar el punto de conexión de servicio de red virtual para este espacio de nombres
de Event Hubs.
1. Vaya a su espacio de nombres de Event Hubs en Azure Portal.
2. Seleccione Redes en Configuración en el menú de la izquierda.

NOTE
La pestaña Redes solo se muestra para espacios de nombres estándar o dedicados .

De forma predeterminada, está seleccionada la opción Redes seleccionadas . Si no especifica una regla
de firewall de IP ni agrega una red virtual en esta página, se podrá acceder al espacio de nombres desde
todas las redes, incluida la red pública de Internet (mediante la clave de acceso).
Si selecciona la opción Todas las redes , el centro de eventos aceptará conexiones procedentes de
cualquier dirección IP (mediante la tecla de acceso). Esta configuración equivale a una regla que acepta el
intervalo de direcciones IP 0.0.0.0/0.

3. Para restringir el acceso a redes específicas, seleccione la opción Selected Networks (Redes
seleccionadas) en la parte superior de la página si aún no está seleccionada.
4. En la sección Red vir tual de la página, seleccione +Agregar red vir tual existente *. Seleccione +
Crear una red vir tual nueva si quiere crear una nueva red virtual.
5. En la lista de redes virtuales, seleccione la red virtual y después elija la subred . Debe habilitar el punto de
conexión de servicio antes de agregar la red virtual a la lista. Si no está habilitado el punto de conexión de
servicio, el portal le pedirá que lo habilite.

6. Debería ver el siguiente mensaje correcto después de habilitar el punto de conexión de servicio para la
subred para Microsoft.EventHub . Seleccione Agregar en la parte inferior de la página para agregar la
red.
NOTE
Si no puede habilitar el punto de conexión de servicio, puede ignorar el punto de conexión de servicio de red virtual
que falta mediante la plantilla de Resource Manager. Esta funcionalidad no está disponible en Azure Portal.

7. Seleccione Guardar en la barra de herramientas para guardar la configuración. Espere unos minutos hasta
que la confirmación se muestre en las notificaciones de Azure Portal.
NOTE
Para restringir el acceso a intervalos o direcciones concretos, consulte Permitir el acceso desde intervalos o
direcciones IP específicos.

Uso de plantillas de Resource Manager


La siguiente plantilla de Resource Manager permite agregar una regla de red virtual a un espacio de nombres de
Event Hubs.
Parámetros de plantilla:
namespaceName : espacio de nombres de Event Hubs.
vnetRuleName : nombre de la regla de red virtual que se va a crear.
virtualNetworkingSubnetId : ruta de acceso completa de Resource Manager para la subred de la red virtual; por
ejemplo,
/subscriptions/{id}/resourceGroups/{rg}/providers/Microsoft.Network/virtualNetworks/{vnet}/subnets/default
para la subred predeterminada de una red virtual.

NOTE
Si bien no hay reglas de denegación posibles, la plantilla de Azure Resource Manager tiene la acción predeterminada
establecida en "Permitir" , que no restringe las conexiones. Cuando se realizan las reglas de Virtual Network o de firewall,
es necesario cambiar el valor "defaultAction"
desde

"defaultAction": "Allow"

to

"defaultAction": "Deny"

{
"$schema": "https://schema.management.azure.com/schemas/2015-01-01/deploymentTemplate.json#",
"contentVersion": "1.0.0.0",
"parameters": {
"eventhubNamespaceName": {
"type": "string",
"metadata": {
"description": "Name of the Event Hubs namespace"
}
},
"virtualNetworkName": {
"type": "string",
"metadata": {
"description": "Name of the Virtual Network Rule"
}
},
"subnetName": {
"type": "string",
"metadata": {
"description": "Name of the Virtual Network Sub Net"
}
},
"location": {
"type": "string",
"metadata": {
"metadata": {
"description": "Location for Namespace"
}
}
},
"variables": {
"namespaceNetworkRuleSetName": "[concat(parameters('eventhubNamespaceName'), concat('/', 'default'))]",
"subNetId": "[resourceId('Microsoft.Network/virtualNetworks/subnets/',
parameters('virtualNetworkName'), parameters('subnetName'))]"
},
"resources": [
{
"apiVersion": "2018-01-01-preview",
"name": "[parameters('eventhubNamespaceName')]",
"type": "Microsoft.EventHub/namespaces",
"location": "[parameters('location')]",
"sku": {
"name": "Standard",
"tier": "Standard"
},
"properties": { }
},
{
"apiVersion": "2017-09-01",
"name": "[parameters('virtualNetworkName')]",
"location": "[parameters('location')]",
"type": "Microsoft.Network/virtualNetworks",
"properties": {
"addressSpace": {
"addressPrefixes": [
"10.0.0.0/23"
]
},
"subnets": [
{
"name": "[parameters('subnetName')]",
"properties": {
"addressPrefix": "10.0.0.0/23",
"serviceEndpoints": [
{
"service": "Microsoft.EventHub"
}
]
}
}
]
}
},
{
"apiVersion": "2018-01-01-preview",
"name": "[variables('namespaceNetworkRuleSetName')]",
"type": "Microsoft.EventHub/namespaces/networkruleset",
"dependsOn": [
"[concat('Microsoft.EventHub/namespaces/', parameters('eventhubNamespaceName'))]"
],
"properties": {
"virtualNetworkRules":
[
{
"subnet": {
"id": "[variables('subNetId')]"
},
"ignoreMissingVnetServiceEndpoint": false
}
],
"ipRules":[<YOUR EXISTING IP RULES>],
"trustedServiceAccessEnabled": false,
"defaultAction": "Deny"
}
}
],
"outputs": { }
}

Para implementar la plantilla, siga las instrucciones para Azure Resource Manager.

Pasos siguientes
Para obtener más información acerca de las redes virtuales, consulte los siguientes vínculos:
Punto de conexión de servicio de red virtual de Azure
Filtrado de IP de Azure Event Hubs
Permiso para acceder a los espacios de nombres de
Azure Event Hubs a través de puntos de conexión
privados
18/08/2020 • 18 minutes to read • Edit Online

Azure Private Link le permite acceder a los servicios de Azure (por ejemplo, Azure Event Hubs, Azure Storage y
Azure Cosmos DB) y a los servicios de asociados o clientes hospedados de Azure mediante un punto de
conexión privado de la red virtual.
Un punto de conexión privado es una interfaz de red que le conecta de forma privada y segura a un servicio con
la tecnología de Azure Private Link. El punto de conexión privado usa una dirección IP privada de la red virtual
para incorporar el servicio de manera eficaz a su red virtual. Todo el tráfico dirigido al servicio se puede enrutar
mediante el punto de conexión privado, por lo que no se necesita ninguna puerta de enlace, dispositivos NAT,
conexiones de ExpressRoute o VPN ni direcciones IP públicas. El tráfico entre la red virtual y el servicio atraviesa la
red troncal de Microsoft, eliminando la exposición a la red pública de Internet. Puede conectarse a una instancia
de un recurso de Azure, lo que le otorga el nivel más alto de granularidad en el control de acceso.
Para más información, consulte ¿Qué es Azure Private Link?

IMPORTANT
Esta característica se admite en los niveles tanto estándar como dedicado .

WARNING
La habilitación de los puntos de conexión privados puede evitar que otros servicios de Azure interactúen con Event Hubs.
Los servicios de confianza de Microsoft no se admiten cuando se usan instancias de Virtual Network.
Estos son los escenarios comunes de Azure que no funcionan con instancias de Virtual Network (tenga en cuenta que la
lista NO está completa).
Azure Stream Analytics
Enrutamientos de Azure IoT Hub
Azure IoT Device Explorer
Los siguientes servicios de Microsoft deben estar en una red virtual
Azure Web Apps
Azure Functions

Incorporación de un punto de conexión privado mediante Azure Portal


Prerrequisitos
Para integrar un espacio de nombres de Event Hubs con Azure Private Link, necesitará las siguientes entidades o
permisos:
Un espacio de nombres de Event Hubs.
Una red virtual de Azure.
Una subred en la red virtual. Puede usar la subred predeterminada .
Permisos de propietario o colaborador para el espacio de nombres y la red virtual.
El punto de conexión privado y la red virtual deben estar en la misma región. Al seleccionar una región para el
punto de conexión privado mediante el portal, solo se filtran automáticamente las redes virtuales que se
encuentran en dicha región. El espacio de nombres puede estar en una región diferente.
El punto de conexión privado usa una dirección IP privada en la red virtual.
Pasos
Si ya tiene un espacio de nombres de Event Hubs, puede crear una conexión de vínculo privado siguiendo estos
pasos:
1. Inicie sesión en Azure Portal.
2. En la barra de búsqueda, escriba Event Hubs .
3. En la lista, seleccione el espacio de nombres al que desea agregar un punto de conexión privado.
4. Seleccione Redes en Configuración en el menú de la izquierda.

NOTE
La pestaña Redes solo se muestra para espacios de nombres estándar o dedicados .

NOTE
De forma predeterminada, está seleccionada la opción Redes seleccionadas . Si no especifica una regla de firewall
de IP o agrega una red virtual, se puede acceder al espacio de nombres a través de la red pública de Internet.

5. Seleccione la pestaña Conexiones de puntos de conexión privadas en la parte superior de la página.


6. Seleccione el botón + Punto de conexión privado en la parte superior de la página.
7. En la página Conceptos básicos , siga estos pasos:
a. Seleccione la suscripción de Azure donde desea crear el punto de conexión privado.
b. Seleccione el grupo de recursos para el recurso de punto de conexión privado.
c. Escriba el Nombre del punto de conexión privado.
d. Seleccione la región del punto de conexión privado. El punto de conexión privado debe estar en la
misma región que la red virtual, que puede no ser la misma que la del recurso de Private Link al que
se está conectando.
e. Seleccione Siguiente: Recurso > en la parte inferior de la página.

8. En la página Recurso , siga estos pasos:


a. Como método de conexión, si selecciona Conectarse a un recurso de Azure en mi directorio. ,
siga estos pasos:
a. Seleccione la suscripción de Azure en la que existe el espacio de nombres de Event
Hubs .
b. En Tipo de recurso , seleccione Microsoft.EventHub/namespaces para el tipo de
recurso .
c. En Recurso , seleccione un espacio de nombres de Event Hubs de la lista desplegable.
d. Confirme que Subrecurso de destino está establecido en espacio de nombres .
e. Seleccione Siguiente: Configuración > situado en la parte inferior de la página.

b. Si selecciona Conéctese a un recurso de Azure por identificador de recurso o alias. , siga estos
pasos:
a. Escriba el identificador de recurso o alias . Puede ser el identificador de recurso o el alias
que alguien haya compartido con usted. La forma más fácil de obtener el identificador de
recurso es desplazarse hasta el espacio de nombres de Event Hubs de Azure Portal y copiar la
parte de URI a partir de /subscriptions/ . Vea la imagen siguiente como ejemplo.
b. En Subrecurso de destino , escriba espacio de nombres . Este es el tipo de subrecurso al
que puede acceder el punto de conexión privado.
c. (Opcional) Escriba un mensaje de solicitud . El propietario del recurso ve este mensaje
mientras administra la conexión del punto de conexión privado.
d. Después, seleccione Next (Siguiente): Configuración > situado en la parte inferior de la
página.
9. En la página Configuración , seleccione la subred de una red virtual en la que desee implementar el punto
de conexión privado.
a. Seleccione una red vir tual . En la lista desplegable, solo se muestran las redes virtuales de la
suscripción y la ubicación seleccionadas actualmente.
b. Seleccione una subred de la red virtual que seleccionó.
c. Seleccione Siguiente: Etiquetas > situado en la parte inferior de la página.
10. En la página Etiquetas , cree cualquier etiqueta (nombres y valores) que desee asociar al recurso de punto
de conexión privado. Después, en la parte inferior de la página, seleccione el botón Revisar y crear .
11. En Revisar y crear , revise toda la configuración y seleccione Crear para crear el punto de conexión
privado.
12. Confirme que la conexión de punto de conexión privado que ha creado aparece en la lista de puntos de
conexión. En este ejemplo, el punto de conexión privado se aprueba automáticamente porque se conectó a
un recurso de Azure de su directorio y tiene permisos suficientes.
Incorporación de un punto de conexión privado mediante PowerShell
En el ejemplo siguiente se muestra cómo usar Azure PowerShell para crear una conexión de punto de conexión
privado. No crea un clúster dedicado. Siga los pasos de este artículo para crear un clúster de Event Hubs
dedicado.

# create resource group

$rgName = "<RESOURCE GROUP NAME>"


$vnetlocation = "<VIRTUAL NETWORK LOCATION>"
$vnetName = "<VIRTUAL NETWORK NAME>"
$subnetName = "<SUBNET NAME>"
$namespaceLocation = "<NAMESPACE LOCATION>"
$namespaceName = "<NAMESPACE NAME>"
$peConnectionName = "<PRIVATE ENDPOINT CONNECTION NAME>"

# create virtual network


$virtualNetwork = New-AzVirtualNetwork `
-ResourceGroupName $rgName `
-Location $vnetlocation `
-Name $vnetName `
-AddressPrefix 10.0.0.0/16

# create subnet with endpoint network policy disabled


$subnetConfig = Add-AzVirtualNetworkSubnetConfig `
-Name $subnetName `
-AddressPrefix 10.0.0.0/24 `
-PrivateEndpointNetworkPoliciesFlag "Disabled" `
-VirtualNetwork $virtualNetwork

# update virtual network


$virtualNetwork | Set-AzVirtualNetwork

# create an event hubs namespace in a dedicated cluster


$namespaceResource = New-AzResource -Location $namespaceLocation `
-ResourceName $namespaceName `
-ResourceGroupName $rgName `
-Sku @{name = "Standard"; capacity = 1} `
-Properties @{clusterArmId = "/subscriptions/<SUBSCRIPTION
ID>/resourceGroups/<RESOURCE GROUP NAME>/providers/Microsoft.EventHub/clusters/<EVENT HUBS CLUSTER NAME>"} `
-ResourceType "Microsoft.EventHub/namespaces" -ApiVersion "2018-01-01-
preview"

# create private endpoint connection


$privateEndpointConnection = New-AzPrivateLinkServiceConnection `
-Name $peConnectionName `
-PrivateLinkServiceId $namespaceResource.ResourceId `
-GroupId "namespace"

# get subnet object that you will use later


$virtualNetwork = Get-AzVirtualNetwork -ResourceGroupName $rgName -Name $vnetName
$subnet = $virtualNetwork | Select -ExpandProperty subnets `
| Where-Object {$_.Name -eq $subnetName}

# create a private endpoint


$privateEndpoint = New-AzPrivateEndpoint -ResourceGroupName $rgName `
-Name $vnetName `
-Location $vnetlocation `
-Subnet $subnet `
-PrivateLinkServiceConnection $privateEndpointConnection

(Get-AzResource -ResourceId $namespaceResource.ResourceId -ExpandProperties).Properties


Configuración de la zona DNS privada
Cree una zona DNS privada para el dominio de Event Hubs y cree un vínculo de asociación con la red virtual:

$zone = New-AzPrivateDnsZone -ResourceGroupName $rgName `


-Name "privatelink.servicebus.windows.net"

$link = New-AzPrivateDnsVirtualNetworkLink -ResourceGroupName $rgName `


-ZoneName "privatelink.servicebus.windows.net" `
-Name "mylink" `
-VirtualNetworkId $virtualNetwork.Id

$networkInterface = Get-AzResource -ResourceId $privateEndpoint.NetworkInterfaces[0].Id -ApiVersion "2019-04-


01"

foreach ($ipconfig in $networkInterface.properties.ipConfigurations) {


foreach ($fqdn in $ipconfig.properties.privateLinkConnectionProperties.fqdns) {
Write-Host "$($ipconfig.properties.privateIPAddress) $($fqdn)"
$recordName = $fqdn.split('.',2)[0]
$dnsZone = $fqdn.split('.',2)[1]
New-AzPrivateDnsRecordSet -Name $recordName -RecordType A -ZoneName
"privatelink.servicebus.windows.net" `
-ResourceGroupName $rgName -Ttl 600 `
-PrivateDnsRecords (New-AzPrivateDnsRecordConfig -IPv4Address
$ipconfig.properties.privateIPAddress)
}
}

Administración de puntos de conexión privados desde Azure Portal


Cuando se crea un punto de conexión privado, se debe aprobar la conexión. Si el recurso para el que va a crear un
punto de conexión privado está en el directorio, puede aprobar la solicitud de conexión siempre que tenga
permisos suficientes. Si se va a conectar a un recurso de Azure en otro directorio, debe esperar a que el
propietario de ese recurso apruebe la solicitud de conexión.
Hay cuatro estados de aprovisionamiento:

ESTA DO DE P UN TO DE C O N EXIÓ N
P RIVA DO DEL C O N SUM IDO R DEL
A C C IÓ N DEL SERVIC IO SERVIC IO DESC RIP C IÓ N

None Pending La conexión se crea manualmente y


está pendiente de aprobación por parte
del propietario del recurso de Private
Link.

Aprobación Aprobado La conexión se aprobó de forma


automática o manual y está lista para
usarse.

Reject Rechazada El propietario del recurso de vínculo


privado rechazó la conexión.

Remove Escenario desconectado El propietario del recurso del vínculo


privado quitó la conexión, el punto de
conexión privado se vuelve informativo
y debe eliminarse para la limpieza.

Aprobación, rechazo o eliminación de una conexión de punto de conexión privado


1. Inicie sesión en Azure Portal.
2. En la barra de búsqueda, escriba Event Hubs .
3. Seleccione el espacio de nombres que desea administrar.
4. Seleccione la pestaña Redes .
5. Vaya a la sección correspondiente a continuación según la operación que desee: aprobar, rechazar o quitar.
Aprobación de una conexión de punto de conexión privado
1. Si hay alguna conexión pendiente, verá una conexión que aparece con el estado Pendiente como estado
de aprovisionamiento.
2. Seleccione el punto de conexión privado que desea aprobar.
3. Seleccione el botón Aprobar .

4. En la página Aprobación de la conexión agregue un comentario (opcional), y seleccione Sí . Si selecciona


No , no ocurrirá nada.
5. Ahora puede ver que el estado de la conexión de punto de conexión privado de la lista ha cambiado a
Aprobado .
Rechazo de una conexión de punto de conexión privado
1. Si hay conexiones de punto de conexión privado que quiere rechazar, ya sea una solicitud pendiente o una
conexión existente, seleccione la conexión y haga clic en el botón Rechazar .

2. En la página Rechazo de la conexión , escriba un comentario (opcional), y seleccione Sí . Si selecciona No ,


no ocurrirá nada.
3. Ahora puede ver que el estado de la conexión de punto de conexión privado de la lista ha cambiado a
Rechazado .
Eliminación de una conexión de punto de conexión privado
1. Para eliminar una conexión de punto de conexión privado, selecciónela en la lista y seleccione Eliminar en la
barra de herramientas.
2. En la página Eliminar conexión , seleccione Sí para confirmar la eliminación del punto de conexión privado.
Si selecciona No , no ocurrirá nada.
3. Ahora puede ver que el estado ha cambiado a Desconectado . A continuación, verá que el punto de conexión
desaparece de la lista.

Validación de que la conexión de vínculo privado funciona


Debe comprobar que los recursos de la misma subred del recurso de punto de conexión privado se conectan al
espacio de nombres de Event Hubs mediante una dirección IP privada y que tienen la integración correcta de la
zona DNS privada.
En primer lugar, cree una máquina virtual siguiendo los pasos que encontrará en Creación de una máquina virtual
Windows en Azure Portal.
Haga clic en la pestaña Redes :
1. Especifique Red vir tual y Subred . Debe seleccionar la instancia de Virtual Network en la que implementó el
punto de conexión privado.
2. Especifique un recurso de dirección IP pública .
3. En Grupo de seguridad de red de NIC , seleccione Ninguno .
4. En Equilibrio de carga , seleccione No .
Conéctese a la máquina virtual, abra la línea de comandos y ejecute el siguiente comando:

nslookup <event-hubs-namespace-name>.servicebus.windows.net

Debería ver un resultado con el siguiente aspecto.

Non-authoritative answer:
Name: <event-hubs-namespace-name>.privatelink.servicebus.windows.net
Address: 10.0.0.4 (private IP address associated with the private endpoint)
Aliases: <event-hubs-namespace-name>.servicebus.windows.net

Limitaciones y consideraciones de diseño


Precios : Para más información sobre los precios, consulte Precios de Azure Private Link.
Limitaciones : Esta característica está disponible en todas las regiones públicas de Azure.
Número máximo de puntos de conexión privados por espacio de nombres de Event Hubs : 120.
Para más información, consulte Servicio Azure Private Link: Limitaciones

Pasos siguientes
Más información sobre Azure Private Link.
Más información acerca de Azure Event Hubs
Configuración de claves administradas por el cliente
para cifrar datos en reposo de Azure Event Hubs
mediante Azure Portal
18/08/2020 • 20 minutes to read • Edit Online

Azure Event Hubs proporciona cifrado de datos en reposo con Azure Storage Service Encryption (Azure SSE). Event
Hubs se basa en Azure Storage para almacenar los datos y, de forma predeterminada, todos los datos que se
almacenan con Azure Storage se cifran mediante claves administradas por Microsoft.

Información general
Azure Event Hubs ahora admite la opción de cifrado de datos en reposo con claves administradas por Microsoft o
claves administradas por el cliente (Bring Your Own Key – BYOK). Esta característica permite crear, rotar, deshabilitar
y revocar el acceso a las claves administradas por el cliente que se usan para cifrar datos en reposo de Azure Event
Hubs.
La habilitación de la característica BYOK es un proceso que solo hay que configurar una vez en el espacio de
nombres.

NOTE
La funcionalidad BYOK es compatible con los clústeres dedicados de un solo inquilino de Event Hubs. No se puede habilitar
para espacios de nombres de Event Hubs estándar.

Puede usar Azure Key Vault para administrar las claves y auditar su uso. Puede crear sus propias claves y
almacenarlas en un almacén de claves, o puede usar las API de Azure Key Vault para generarlas. Para obtener más
información sobre Azure Key Vault, consulte ¿Qué es Azure Key Vault?
En este artículo se muestra cómo configurar un almacén de claves con claves administradas del cliente mediante
Azure Portal. Para obtener información sobre cómo crear un almacén de claves mediante Azure Portal, consulte
Inicio rápido: Establecimiento y recuperación de un secreto de Azure Key Vault mediante Azure Portal.

IMPORTANT
El uso de claves administradas por el cliente con Azure Event Hubs requiere que el almacén de claves tenga configuradas dos
propiedades obligatorias. Son las siguientes: Eliminación temporal y No purgar . Estas propiedades están habilitadas de
manera predeterminada cuando crea un nuevo almacén de claves en Azure Portal. Sin embargo, si tiene que habilitar estas
propiedades en un almacén de claves existente, deberá usar PowerShell o la CLI de Azure.

Habilitar claves administradas del cliente


Para habilitar claves administradas del cliente en Azure Portal, siga estos pasos:
1. Vaya al clúster de Event Hubs dedicado.
2. Seleccione el espacio de nombres en el que desea habilitar BYOK.
3. En la página Configuración del espacio de nombres de Event Hubs, seleccione Cifrado .
4. Seleccione Cifrado de claves en reposo que administra el cliente como se muestra en la siguiente
imagen.

Configuración de un almacén de claves con claves


Después de habilitar las claves administradas por el cliente, debe asociar la clave administrada por el cliente con su
espacio de nombres de Azure Event Hubs. Event Hubs solo admite Azure Key Vault. Si habilita la opción
Encr yption with customer-managed key (Cifrado con clave administrada por el cliente) en la sección anterior,
debe importar la clave en Azure Key Vault. Recuerde que las claves deben tener habilitadas las opciones
Eliminación temporal y No purgar . Estas opciones se pueden configurar mediante PowerShell o la CLI.
1. Para crear un nuevo almacén de claves, siga el inicio rápido de Azure Key Vault. Para más información sobre
cómo importar claves existentes, consulte Información acerca de claves, secretos y certificados.
2. Para activar la eliminación temporal y la protección de purgas al crear un almacén, use el comando az
keyvault create.

az keyvault create --name ContosoVault --resource-group ContosoRG --location westus --enable-soft-delete


true --enable-purge-protection true

3. Para agregar la protección de purgas a un almacén existente (que ya tenga habilitada la eliminación
temporal), use el comando az keyvault update.

az keyvault update --name ContosoVault --resource-group ContosoRG --enable-purge-protection true

4. Siga estos pasos para crear claves:


a. Para crear una nueva clave, seleccione Generar/Impor tar en el menú Claves en Configuración .
b. Establezca Opciones en Generar y asigne un nombre a la clave.

c. Ahora puede seleccionar esta clave para asociarla con el espacio de nombres de Event Hubs para el
cifrado en la lista desplegable.
d. Rellene los detalles de la clave y haga clic en Seleccionar . Esto habilitará el cifrado de datos en
reposo en el espacio de nombres con una clave administrada por el cliente.

Rotación de las claves de cifrado


Puede rotar la clave en el almacén de claves mediante el mecanismo de rotación de los Azure Key Vault. También es
posible establecer fechas de activación y expiración para automatizar la rotación de claves. El servicio Event Hubs
detectará nuevas versiones de clave y comenzará a usarlas automáticamente.

Revocación del acceso a las claves


Al revocar el acceso a las claves de cifrado, no se purgan los datos de Event Hubs. Sin embargo, no se podrá
acceder a los datos desde el espacio de nombres de Event Hubs. Puede revocar la clave de cifrado mediante la
directiva de acceso o eliminando la clave. Obtenga más información sobre las directivas de acceso y la protección
del almacén de claves en Protección del acceso a un almacén de claves.
Una vez revocada la clave de cifrado, el servicio Event Hubs en el espacio de nombres cifrado dejará de ser
operativo. Si el acceso a la clave está habilitado o si se ha restaurado la clave eliminada, el servicio Event Hubs
seleccionará la clave para que pueda acceder a los datos desde el espacio de nombres de Event Hubs cifrado.

Configuración de registros de diagnósticos


La configuración de los registros de diagnóstico para los espacios de nombres habilitados para BYOK proporciona
la información necesaria sobre las operaciones cuando se cifra un espacio de nombres con claves administradas
por el cliente. Estos registros pueden habilitarse y, posteriormente, transmitirse a un centro de eventos, analizarse
mediante análisis de registros o transmitirse al almacenamiento para realizar análisis personalizados. Para más
información acerca de los registros de diagnóstico, consulte Información general sobre los registros de diagnóstico
de Azure.

Habilitación de registros de usuario


Siga estos pasos para habilitar registros para las claves administradas por el cliente.
1. En Azure Portal, desplácese hasta el espacio de nombres que tiene habilitado BYOK.
2. Seleccione Configuración de diagnóstico en Super visión .

3. Seleccione +Agregar configuración de diagnóstico .

4. Proporcione un nombre y seleccione dónde desea transmitir los registros.


5. Seleccione CustomerManagedKeyUserLogs y Guardar . Esta acción habilita los registros de BYOK en el
espacio de nombres.
Esquema de registro
Todos los registros se almacenan en el formato de notación de objetos JavaScript (JSON). Cada entrada tiene
campos de cadena que usan el formato descrito en la siguiente tabla.

N O M B RE DESC RIP C IÓ N

TaskName La descripción de la tarea que generó el error.

ActivityId El identificador interno, usado con fines de seguimiento.

category Define la clasificación de la tarea. Por ejemplo, si la clave del


almacén de claves se va a deshabilitar, sería una categoría de
información, o si no se puede desencapsular una clave, podría
tratarse de un error.

resourceId El identificador de recursos de Azure Resource Manager

keyVault Nombre completo del almacén de claves.


N O M B RE DESC RIP C IÓ N

key Nombre de clave que se usa para cifrar el espacio de nombres


de Event Hubs.

version Versión de la clave que se va a usar.

operation La operación que se realiza en la clave en el almacén de claves.


Por ejemplo, deshabilitar o habilitar la clave, encapsular o
desencapsular.

código Código asociado a la operación. Ejemplo: Código de error; 404


indica que no se ha encontrado la clave.

message Cualquier mensaje de error asociado con la operación.

El siguiente es un ejemplo del registro de una clave administrada por el cliente:

{
"TaskName": "CustomerManagedKeyUserLog",
"ActivityId": "11111111-1111-1111-1111-111111111111",
"category": "error"
"resourceId": "/SUBSCRIPTIONS/11111111-1111-1111-1111-11111111111/RESOURCEGROUPS/DEFAULT-EVENTHUB-
CENTRALUS/PROVIDERS/MICROSOFT.EVENTHUB/NAMESPACES/FBETTATI-OPERA-EVENTHUB",
"keyVault": "https://mykeyvault.vault-int.azure-int.net",
"key": "mykey",
"version": "1111111111111111111111111111111",
"operation": "wrapKey",
"code": "404",
"message": "Key not found: ehbyok0/111111111111111111111111111111",
}

{
"TaskName": "CustomerManagedKeyUserLog",
"ActivityId": "11111111111111-1111-1111-1111111111111",
"category": "info"
"resourceId": "/SUBSCRIPTIONS/111111111-1111-1111-1111-11111111111/RESOURCEGROUPS/DEFAULT-EVENTHUB-
CENTRALUS/PROVIDERS/MICROSOFT.EVENTHUB/NAMESPACES/FBETTATI-OPERA-EVENTHUB",
"keyVault": "https://mykeyvault.vault-int.azure-int.net",
"key": "mykey",
"version": "111111111111111111111111111111",
"operation": "disable" | "restore",
"code": "",
"message": "",
}

Uso de la plantilla de Resource Manager para habilitar el cifrado


En esta sección se muestra cómo realizar las siguientes tareas con plantillas de Azure Resource Manager .
1. Cree un espacio de nombres de Event Hubs con una identidad de servicio administrada.
2. Cree un almacén de claves y conceda a la identidad de servicio acceso a él.
3. Actualice el espacio de nombres de Event Hubs con la información del almacén de claves (clave/valor).
Creación de un clúster y un espacio de nombres de Event Hubs con la identidad de servicio administrada
En esta sección se muestra cómo crear un espacio de nombres de Azure Event Hubs con la identidad de servicio
administrada mediante una plantilla de Azure Resource Manager y PowerShell.
1. Cree una plantilla de Azure Resource Manager para crear un espacio de nombres de Event Hubs con una
identidad de servicio administrada. Asigne al archivo el nombre:
CreateEventHubClusterAndNamespace.json :
{
"$schema":"https://schema.management.azure.com/schemas/2015-01-01/deploymentTemplate.json#",
"contentVersion":"1.0.0.0",
"parameters":{
"clusterName":{
"type":"string",
"metadata":{
"description":"Name for the Event Hub cluster."
}
},
"namespaceName":{
"type":"string",
"metadata":{
"description":"Name for the Namespace to be created in cluster."
}
},
"location":{
"type":"string",
"defaultValue":"[resourceGroup().location]",
"metadata":{
"description":"Specifies the Azure location for all resources."
}
}
},
"resources":[
{
"type":"Microsoft.EventHub/clusters",
"apiVersion":"2018-01-01-preview",
"name":"[parameters('clusterName')]",
"location":"[parameters('location')]",
"sku":{
"name":"Dedicated",
"capacity":1
}
},
{
"type":"Microsoft.EventHub/namespaces",
"apiVersion":"2018-01-01-preview",
"name":"[parameters('namespaceName')]",
"location":"[parameters('location')]",
"identity":{
"type":"SystemAssigned"
},
"sku":{
"name":"Standard",
"tier":"Standard",
"capacity":1
},
"properties":{
"isAutoInflateEnabled":false,
"maximumThroughputUnits":0,
"clusterArmId":"[resourceId('Microsoft.EventHub/clusters', parameters('clusterName'))]"
},
"dependsOn":[
"[resourceId('Microsoft.EventHub/clusters', parameters('clusterName'))]"
]
}
],
"outputs":{
"EventHubNamespaceId":{
"type":"string",
"value":"[resourceId('Microsoft.EventHub/namespaces',parameters('namespaceName'))]"
}
}
}
2. Cree un archivo de parámetros de plantilla llamado:
CreateEventHubClusterAndNamespaceParams.json .

NOTE
Reemplace los siguientes valores:
<EventHubsClusterName> : nombre del clúster de Event Hubs.
<EventHubsNamespaceName> : nombre del espacio de nombres de Event Hubs.
<Location> : ubicación del espacio de nombres de Event Hubs.

{
"$schema":"https://schema.management.azure.com/schemas/2015-01-01/deploymentParameters.json#",
"contentVersion":"1.0.0.0",
"parameters":{
"clusterName":{
"value":"<EventHubsClusterName>"
},
"namespaceName":{
"value":"<EventHubsNamespaceName>"
},
"location":{
"value":"<Location>"
}
}
}

3. Ejecute el siguiente comando de PowerShell para implementar la plantilla y crear un espacio de nombres de
Event Hubs. A continuación, recupere el identificador del espacio de nombres de Event Hubs para usarlo
más adelante. Antes de ejecutar el comando, reemplace {MyRG} por el nombre del grupo de recursos.

$outputs = New-AzResourceGroupDeployment -Name CreateEventHubClusterAndNamespace -ResourceGroupName


{MyRG} -TemplateFile ./CreateEventHubClusterAndNamespace.json -TemplateParameterFile
./CreateEventHubClusterAndNamespaceParams.json

$EventHubNamespaceId = $outputs.Outputs["eventHubNamespaceId"].value

Concesión de acceso al almacén de claves a la identidad del espacio de nombres de Event Hubs
1. Ejecute el siguiente comando para crear un almacén de claves con las características protección de purga
y eliminación temporal habilitadas.

New-AzureRmKeyVault -Name {keyVaultName} -ResourceGroupName {RGName} -Location {location} -


EnableSoftDelete -EnablePurgeProtection

O BIEN
Ejecute el siguiente comando para actualizar un almacén de claves existente . Antes de ejecutar el
comando, especifique valores para los nombres de grupo de recursos y almacén de claves.

($updatedKeyVault = Get-AzureRmResource -ResourceId (Get-AzureRmKeyVault -ResourceGroupName {RGName} -


VaultName {keyVaultName}).ResourceId).Properties| Add-Member -MemberType "NoteProperty" -Name
"enableSoftDelete" -Value "true"-Force | Add-Member -MemberType "NoteProperty" -Name
"enablePurgeProtection" -Value "true" -Force

2. Establezca la directiva de acceso del almacén de claves para que la identidad administrada del espacio de
nombres de Event Hubs pueda acceder al valor de la clave del almacén de claves. Use el identificador del
espacio de nombres de Event Hubs de la sección anterior.

$identity = (Get-AzureRmResource -ResourceId $EventHubNamespaceId -ExpandProperties).Identity

Set-AzureRmKeyVaultAccessPolicy -VaultName {keyVaultName} -ResourceGroupName {RGName} -ObjectId


$identity.PrincipalId -PermissionsToKeys get,wrapKey,unwrapKey,list

Cifrado de datos en el espacio de nombres de Event Hubs con la clave administrada por el cliente desde el
almacén de claves
Hasta el momento ha realizado los pasos siguientes:
1. Ha creado un espacio de nombres premium con una identidad administrada.
2. Cree un almacén de claves y conceda a la identidad administrada acceso al almacén de claves.
En este paso, actualizará el espacio de nombres de Event Hubs con la información del almacén de claves.
1. Cree un archivo JSON llamado CreateEventHubClusterAndNamespace.json con el contenido siguiente:

{
"$schema":"https://schema.management.azure.com/schemas/2015-01-01/deploymentTemplate.json#",
"contentVersion":"1.0.0.0",
"parameters":{
"clusterName":{
"type":"string",
"metadata":{
"description":"Name for the Event Hub cluster."
}
},
"namespaceName":{
"type":"string",
"metadata":{
"description":"Name for the Namespace to be created in cluster."
}
},
"location":{
"type":"string",
"defaultValue":"[resourceGroup().location]",
"metadata":{
"description":"Specifies the Azure location for all resources."
}
},
"keyVaultUri":{
"type":"string",
"metadata":{
"description":"URI of the KeyVault."
}
},
"keyName":{
"type":"string",
"metadata":{
"description":"KeyName."
}
}
},
"resources":[
{
"type":"Microsoft.EventHub/namespaces",
"apiVersion":"2018-01-01-preview",
"name":"[parameters('namespaceName')]",
"location":"[parameters('location')]",
"identity":{
"type":"SystemAssigned"
},
"sku":{
"sku":{
"name":"Standard",
"tier":"Standard",
"capacity":1
},
"properties":{
"isAutoInflateEnabled":false,
"maximumThroughputUnits":0,
"clusterArmId":"[resourceId('Microsoft.EventHub/clusters', parameters('clusterName'))]",
"encryption":{
"keySource":"Microsoft.KeyVault",
"keyVaultProperties":[
{
"keyName":"[parameters('keyName')]",
"keyVaultUri":"[parameters('keyVaultUri')]"
}
]
}
}
}
]
}

2. Cree un archivo de parámetros de plantilla: UpdateEventHubClusterAndNamespaceParams.json .

NOTE
Reemplace los siguientes valores:
<EventHubsClusterName> : nombre del clúster de Event Hubs.
<EventHubsNamespaceName> : nombre del espacio de nombres de Event Hubs.
<Location> : ubicación del espacio de nombres de Event Hubs.
<KeyVaultName> : nombre de su almacén de claves.
<KeyName> : nombre de la clave del almacén de claves.

{
"$schema":"https://schema.management.azure.com/schemas/2015-01-01/deploymentParameters.json#",
"contentVersion":"1.0.0.0",
"parameters":{
"clusterName":{
"value":"<EventHubsClusterName>"
},
"namespaceName":{
"value":"<EventHubsNamespaceName>"
},
"location":{
"value":"<Location>"
},
"keyName":{
"value":"<KeyName>"
},
"keyVaultUri":{
"value":"https://<KeyVaultName>.vault.azure.net"
}
}
}

3. Ejecute el siguiente comando de PowerShell para implementar la plantilla de Resource Manager. Antes de
ejecutar el comando, reemplace {MyRG} por el nombre del grupo de recursos.
New-AzResourceGroupDeployment -Name UpdateEventHubNamespaceWithEncryption -ResourceGroupName {MyRG} -
TemplateFile ./UpdateEventHubClusterAndNamespace.json -TemplateParameterFile
./UpdateEventHubClusterAndNamespaceParams.json

Solución de problemas
Como procedimiento recomendado, habilite siempre los registros como se muestra en la sección anterior. Esto
ayuda a realizar el seguimiento de las actividades cuando está habilitado el cifrado de BYOK. También ayuda a
limitar los problemas.
A continuación se muestran los códigos de error comunes que buscar cuando está habilitado el cifrado de BYOK.

A C C IÓ N C Ó DIGO DE ERRO R ESTA DO RESULTA N T E DE LO S DATO S

Quitar el permiso de 403 Inaccessible


encapsular/desencapsular de un
almacén de claves

Quitar la pertenencia al rol de AAD de 403 Inaccessible


una entidad de seguridad de AAD que
concedió el permiso de
encapsular/desencapsular

Eliminar una clave de cifrado del 404 Inaccessible


almacén de claves

Eliminar el almacén de claves 404 Inaccesible (se da por supuesto que la


eliminación temporal está habilitada, al
ser una opción obligatoria)

Cambiar el período de expiración de la 403 Inaccessible


clave de cifrado para que ya haya
expirado

Cambiar el valor NBF (no antes), de 403 Inaccessible


modo que la clave de cifrado de clave
no esté activa

Seleccionar la opción Allow MSFT 403 Inaccessible


Ser vices (Permitir servicios MSFT) para
el firewall del almacén de claves o
bloquear el acceso de red al almacén de
claves que tiene la clave de cifrado

Mover el almacén de claves a un 404 Inaccessible


inquilino diferente

Problema de red intermitente o Accesible mediante clave de cifrado de


interrupción de DNS/AAD/MSI datos en caché
IMPORTANT
Para habilitar la recuperación ante desastres con localización geográfica en un espacio de nombres que use el cifrado de
BYOK, el espacio de nombres secundario para el emparejamiento debe estar en un clúster dedicado y debe tener habilitada
en este una identidad administrada asignada por el sistema. Para más información, consulte Identidades administradas para
recursos de Azure.

Pasos siguientes
Vea los artículos siguientes:
Información general de Event Hubs
Introducción a Azure Key Vault
Solución de problemas de conectividad: Azure Event
Hubs
18/08/2020 • 16 minutes to read • Edit Online

Hay varias razones por las que las aplicaciones cliente no pueden conectarse a un centro de eventos. Los
problemas de conectividad que experimenta pueden ser permanentes o transitorios. Si el problema sucede todo el
tiempo (permanente), puede que desee comprobar la cadena de conexión, la configuración del firewall de la
organización, la configuración del firewall de IP, la configuración de seguridad de la red (puntos de conexión de
servicio, puntos de conexión privados, etc.), etc. En el caso de problemas transitorios, la actualización a la versión
más reciente del SDK, la ejecución de comandos para comprobar los paquetes descartados y la obtención de
seguimientos de red pueden ayudar a solucionar los problemas.
En este artículo se proporcionan consejos sobre cómo solucionar problemas de conectividad con Azure Event
Hubs.

Solución de problemas de conectividad permanentes


Si la aplicación no puede conectarse al centro de eventos, siga los pasos de esta sección para solucionar el
problema.
Compruebe si hay una interrupción del servicio
Compruebe la interrupción del servicio de Azure Event Hubs en el sitio de estado del servicio de Azure.
Compruebe la cadena de conexión
Compruebe que la cadena de conexión que está usando es correcta. Consulte Obtención de una cadena de
conexión de Event Hubs para obtener la cadena de conexión mediante Azure Portal, la CLI o PowerShell.
Para clientes de Kafka, compruebe que los archivos productor.config o consumer.config están configurados
correctamente. Para más información, consulte Envío y recepción de mensajes con Kafka en Event Hubs.
Compruebe si los puertos necesarios para comunicarse con Event Hubs están bloqueados por el firewall de la
organización
Compruebe que los puertos utilizados para comunicarse con Azure Event Hubs no estén bloqueados en el firewall
de la organización. Consulte en la siguiente tabla los puertos de salida que se deben abrir para comunicarse con
Azure Event Hubs.

P ROTO C O LO P UERTO S DETA L L ES

AMQP 5671 y 5672 Consulte la guía del protocolo AMQP

HTTP, HTTPS 80, 443

Kafka 9093 Consulte Uso de Azure Event Hubs


desde aplicaciones de Apache Kafka

Este es un comando de ejemplo que comprueba si el puerto 5671 está bloqueado.

tnc <yournamespacename>.servicebus.windows.net -port 5671

En Linux:
telnet <yournamespacename>.servicebus.windows.net 5671

Compruebe que las direcciones IP se permiten en el firewall corporativo


Cuando trabaja con Azure, en ocasiones tiene que permitir intervalos de direcciones IP específicos o direcciones
URL en el firewall o proxy corporativo para tener acceso a todos los servicios de Azure que está usando o
intentando usar. Compruebe que se permite el tráfico en las direcciones IP utilizadas por Event Hubs. En el caso de
las direcciones IP usadas por Azure Event Hubs, vea Intervalos de direcciones IP y etiquetas de servicio de Azure:
nube pública.
Además, compruebe que se permite la dirección IP del espacio de nombres. Para buscar las direcciones IP correctas
para permitirlas para las conexiones, siga estos pasos:
1. Ejecute el siguiente comando desde el símbolo del sistema:

nslookup <YourNamespaceName>.servicebus.windows.net

2. Anote la dirección IP devuelta en Non-authoritative answer . El único momento en que cambiaría es si


restaurara el espacio de nombres en un clúster distinto.
Si usa la redundancia de zona para el espacio de nombres, deberá realizar algunos pasos adicionales:
1. En primer lugar, ejecute nslookup en el espacio de nombres.

nslookup <yournamespace>.servicebus.windows.net

2. Anote el nombre de la sección respuesta no autoritativa , que se encuentra en uno de los siguientes
formatos:

<name>-s1.cloudapp.net
<name>-s2.cloudapp.net
<name>-s3.cloudapp.net

3. Ejecute nslookup para cada uno con los sufijos s1, s2 y s3 para obtener las direcciones IP de las tres
instancias que se ejecutan en tres zonas de disponibilidad.
Compruebe que se permite la etiqueta de servicio AzureEventGrid en los grupos de seguridad de red
Si la aplicación se ejecuta dentro de una subred y hay un grupo de seguridad de red asociado, confirme si se
permite la salida de Internet o la etiqueta de servicio AzureEventGrid. Vea Etiquetas de servicio de red virtual y
busque EventHub .
Comprobar si la aplicación debe ejecutarse en una subred específica de una red virtual
Confirme que la aplicación se está ejecutando en una subred de red virtual que tiene acceso al espacio de
nombres. Si no es así, ejecute la aplicación en la subred que tenga acceso al espacio de nombres o agregue la
dirección IP del equipo en el que se ejecuta la aplicación al firewall de IP.
Cuando se crea un punto de conexión de servicio de red virtual para un espacio de nombres del centro de eventos,
el espacio de nombres solamente acepta tráfico de la subred enlazada al punto de conexión de servicio. Hay una
excepción a este comportamiento. Puede agregar direcciones IP específicas en el firewall de IP para habilitar el
acceso al punto de conexión público del centro de eventos. Para obtener más información, vea Puntos de conexión
de servicio de red.
Comprobar la configuración del firewall de IP para su espacio de nombres
Compruebe que el firewall de IP no bloquea la dirección IP pública de la máquina en la que se ejecuta la aplicación.
De forma predeterminada, los espacios de nombres de Azure Event Hubs son accesibles desde Internet, siempre
que la solicitud venga con una autenticación y una autorización válidas. Con el firewall de IP, puede restringirlo aún
más a solo un conjunto de direcciones o intervalos de direcciones IPv4 en notación CIDR (Enrutamiento de
interdominios sin clases).
Las reglas de firewall de IP se aplican en el nivel del espacio de nombres de Event Hubs. Por lo tanto, las reglas se
aplican a todas las conexiones de clientes que usan cualquier protocolo admitido. Cualquier intento de conexión
desde una dirección IP que no coincida con una regla IP admitida en el espacio de nombres de Event Hubs se
rechaza como no autorizado. La respuesta no menciona la regla IP. Las reglas de filtro IP se aplican en orden y la
primera regla que coincida con la dirección IP determina la acción de aceptar o rechazar.
Para obtener más información, consulte Configuración de reglas de firewall de IP para un espacio de nombres de
Azure Event Hubs. Para comprobar si tiene problemas de filtrado de direcciones IP, red virtual o cadena de
certificados, consulte Solución de problemas relacionados con la red.
Buscar las direcciones IP bloqueadas por el firewall de IP
Habilite los registros de diagnóstico para eventos de conexión de red virtual de Event Hubs siguiendo las
instrucciones indicadas en Habilitar registros de diagnóstico. Verá la dirección IP para la conexión que se deniega.

{
"SubscriptionId": "0000000-0000-0000-0000-000000000000",
"NamespaceName": "namespace-name",
"IPAddress": "1.2.3.4",
"Action": "Deny Connection",
"Reason": "IPAddress doesn't belong to a subnet with Service Endpoint enabled.",
"Count": "65",
"ResourceId": "/subscriptions/0000000-0000-0000-0000-
000000000000/resourcegroups/testrg/providers/microsoft.eventhub/namespaces/namespace-name",
"Category": "EventHubVNetConnectionEvent"
}

Comprobar si se puede acceder al espacio de nombres con solo un punto de conexión privado
Si el espacio de nombres de Event Hubs está configurado para ser accesible únicamente a través de un punto de
conexión privado, confirme que la aplicación cliente accede al espacio de nombres a través del punto de conexión
privado.
El servicio Azure Private Link permite el acceso a Azure Event Hubs a través de un punto de conexión privado
en la red virtual. Un punto de conexión privado es una interfaz de red que le conecta de forma privada y segura a
un servicio con la tecnología de Azure Private Link. El punto de conexión privado usa una dirección IP privada de la
red virtual para incorporar el servicio de manera eficaz a su red virtual. Todo el tráfico dirigido al servicio se puede
enrutar mediante el punto de conexión privado, por lo que no se necesita ninguna puerta de enlace, dispositivos
NAT, conexiones de ExpressRoute o VPN ni direcciones IP públicas. El tráfico entre la red virtual y el servicio
atraviesa la red troncal de Microsoft, eliminando la exposición a la red pública de Internet. Puede conectarse a una
instancia de un recurso de Azure, lo que le otorga el nivel más alto de granularidad en el control de acceso.
Para obtener más información, consulte Configuración de puntos de conexión privados. Vea la sección Validación
de que la conexión del punto de conexión privado funciona para confirmar que se usa un punto de
conexión privado.
Solución de problemas relacionados con la red
Para solucionar problemas relacionados con la red con Event Hubs, siga estos pasos:
Desplácese a https://<yournamespacename>.servicebus.windows.net/ o use wget ir allí. Le ayudará a comprobar si
tiene problemas de cadena de certificados (lo más común al usar el SDK de Java), filtrado IP o red virtual.
Un ejemplo de mensaje correcto :
<feed xmlns="http://www.w3.org/2005/Atom"><title type="text">Publicly Listed Services</title><subtitle
type="text">This is the list of publicly-listed services currently available.</subtitle><id>uuid:27fcd1e2-
3a99-44b1-8f1e-3e92b52f0171;id=30</id><updated>2019-12-27T13:11:47Z</updated><generator>Service Bus
1.1</generator></feed>

Un ejemplo de mensaje de error :

<Error>
<Code>400</Code>
<Detail>
Bad Request. To know more visit https://aka.ms/sbResourceMgrExceptions. . TrackingId:b786d4d1-cbaf-
47a8-a3d1-be689cda2a98_G22, SystemTracker:NoSystemTracker, Timestamp:2019-12-27T13:12:40
</Detail>
</Error>

Solución de problemas de conectividad transitorios


Si tiene problemas de conectividad intermitentes, consulte las siguientes secciones para obtener sugerencias para
la solución de problemas.
Usar la versión más reciente del SDK
Es posible que algunos de los problemas de conectividad transitorios se hayan corregido en las versiones
posteriores del SDK de las que está usando. Asegúrese de que está usando la versión más reciente de los SDK
cliente en las aplicaciones. Los SDK se han mejorado continuamente con características nuevas o actualizadas y
correcciones de errores, por lo que siempre debe probar con el paquete más reciente. Compruebe las notas de la
versión para conocer los problemas corregidos y las características agregadas o actualizadas.
Para obtener información sobre los SDK cliente, consulte el artículo Azure Event Hubs: SDK cliente.
Ejecutar el comando para comprobar los paquetes descartados
Si hay problemas de conectividad intermitentes, ejecute el siguiente comando para comprobar si hay paquetes
descartados. Este comando intentará establecer 25 conexiones TCP diferentes cada segundo con el servicio. A
continuación, puede comprobar cuántas de ellas se han realizado correctamente y cuántas han fallado y, además,
ver la latencia de conexión TCP. Puede descargar la herramienta psping desde aquí.

.\psping.exe -n 25 -i 1 -q <yournamespacename>.servicebus.windows.net:5671 -nobanner

Puede usar comandos equivalentes si utiliza otras herramientas como tnc , ping , etc.
Realice un seguimiento de red si los pasos anteriores no ayudan y analícelo con herramientas como Wireshark. Si
lo necesita, póngase en contacto con el soporte técnico de Microsoft.
Actualizaciones o reinicios del servicio
Pueden producirse problemas de conectividad transitorios debido a actualizaciones y reinicios del servicio back-
end. Cuando se producen, es posible que vea los síntomas siguientes:
Puede haber una caída en la llegada de mensajes o solicitudes entrantes.
El archivo de registro puede contener mensajes de error.
Puede que las aplicaciones se desconecten del servicio durante unos segundos.
Puede que las solicitudes se limiten momentáneamente.
Si el código de aplicación usa SDK, la directiva de reintento ya está integrada y activa. La aplicación se volverá a
conectar sin un impacto significativo en la aplicación o el flujo de trabajo. La detección de estos errores transitorios,
la interrupción y el posterior reintento de la llamada garantizará que el código sea resistente a estos problemas
transitorios.

Pasos siguientes
Vea los artículos siguientes:
Solución de problemas de autenticación y autorización
Solución de problemas de autenticación y
autorización: Azure Event Hubs
18/08/2020 • 5 minutes to read • Edit Online

En el artículo Solución de problemas de conectividad se ofrecen sugerencias para solucionar problemas de


conectividad con Azure Event Hubs. En este artículo se proporcionan sugerencias y recomendaciones para
solucionar problemas de autenticación y autorización con Azure Event Hubs.

Si usa Azure Active Directory


Si usa Azure Active Directory (Azure AD) para la autenticación y la autorización con Azure Event Hubs, confirme
que la identidad que tiene acceso al centro de eventos es miembro del rol de Azure adecuado en el ámbito de
recursos adecuado (grupo de consumidores, centro de eventos, espacio de nombres, grupo de recursos o
suscripción).
Roles de Azure
Propietario de datos de Azure Event Hubs para tener acceso completo a los recursos de Event Hubs.
Remitente de los datos de Azure Event Hubs para el acceso de emisión.
Receptor de datos de Azure Event Hubs para el acceso de recepción.
Ámbitos de recursos
Grupo de consumidores : en este ámbito, la asignación de roles solo se aplica a esta entidad. Actualmente,
Azure Portal no admite la asignación de un rol de Azure a una entidad de seguridad en este nivel.
Centro de eventos: la asignación de roles se aplica a la entidad de Event Hubs y al grupo de consumidores
que hay en ella.
Espacio de nombres : la asignación de roles abarca toda la topología de Event Hubs en el espacio de nombres
y el grupo de consumidores que tiene asociado.
Grupo de recursos : la asignación de roles se aplica a todos los recursos de Event Hubs del grupo de recursos.
Suscripción : la asignación de roles se aplica a todos los recursos de Event Hubs de todos los grupos de
recursos de la suscripción.
Para más información, consulte los siguientes artículos.
Autenticación de una aplicación con Azure Active Directory para acceder a recursos de Event Hubs
Autorización del acceso a recursos de Event Hubs mediante Azure Active Directory

Si usa firmas de acceso compartido (SAS)


Si usa SAS, siga estos pasos:
Asegúrese de que la clave SAS que está usando es correcta. Si no es así, use la clave SAS correcta.
Compruebe que la clave tiene los permisos correctos (enviar, recibir o administrar). Si no es así, use una clave
que tenga el permiso que necesita.
Compruebe si la clave ha expirado. Se recomienda renovar la SAS antes de que caduque. Si hay un sesgo de
reloj entre el cliente y los nodos de servicio de Event Hubs, el token de autenticación podría expirar antes de que
el cliente se dé cuenta. El reloj actual de las cuentas de implementación tiene un sesgo de hasta 5 minutos; es
decir, el cliente renueva el token 5 minutos antes de que caduque. Por lo tanto, si el sesgo del reloj es mayor que
5 minutos, el cliente puede observar errores de autenticación intermitentes.
Si la hora de inicio de la SAS está establecida en ahora , es posible que vea errores intermitentes durante los
primeros minutos debido al sesgo del reloj (diferencias en la hora actual en diferentes máquinas). Establezca la
hora de inicio para que sea al menos 15 minutos atrás o no la configure en modo alguno. Lo mismo suele
aplicarse también a la hora de expiración.
Para más información, consulte los siguientes artículos.
Autenticación con firmas de acceso compartido (SAS)
Autorización del acceso a recursos de Event Hubs mediante firmas de acceso compartido

Pasos siguientes
Vea los artículos siguientes:
Solución de problemas de conectividad
Guía de solución de problemas de Apache Kafka
para Event Hubs
18/08/2020 • 9 minutes to read • Edit Online

En este artículo se proporcionan sugerencias para la solución de problemas que pueden aparecer al usar Event
Hubs para Apache Kafka.

Excepción de servidor ocupado


Puede recibir una excepción de servidor ocupado que se deba a una limitación de Kafka. Con los clientes de AMQP,
Event Hubs devuelve inmediatamente una excepción de ser vidor ocupado tras la limitación del servicio. Esto
equivale a un mensaje de "inténtelo de nuevo más tarde". En Kafka, los mensajes se retrasan antes de que se
completen. La duración del retraso se devuelve en milisegundos como throttle_time_ms en la respuesta de
generación/captura. En la mayoría de los casos, estas solicitudes retrasadas no se registran como excepciones de
servidor ocupado en los paneles de Event Hubs. En su lugar, se debe usar el valor throttle_time_ms de la
respuesta como un indicador de que el rendimiento ha superado la cuota aprovisionada.
Si el tráfico es excesivo, el servicio tiene el siguiente comportamiento:
Si el retraso de la solicitud de generación supera el tiempo de expiración de la solicitud, Event Hubs devuelve
un código de error de Infracción de la directiva .
Si el retraso de la solicitud de captura supera el tiempo de expiración de la solicitud, Event Hubs registra la
solicitud como limitada y responde con un conjunto vacío de registros y sin código de error.
Los clústeres dedicados no tienen mecanismos de limitación. Puede consumir todos los recursos del clúster.

No se recibieron registros
Puede que vea que los consumidores no están obteniendo ningún registro y se están reequilibrando
constantemente. En este escenario, los consumidores no obtienen ningún registro y se reequilibran
constantemente. Cuando se produce no hay ninguna excepción o error, pero los registros de Kafka mostrarán que
los consumidores están atascados intentando volver a unirse al grupo y asignar las particiones. Las causas
principales pueden ser varias:
Asegúrese de que request.timeout.ms y session.timeout.ms tengan al menos los valores recomendados de
60000 y 30000 respectivamente. Si estos valores son demasiado bajos podrían provocar tiempos de expiración
de consumidor, que, a su vez, provocarían reequilibrios (lo que provocaría más tiempos de expiración, que
provocarían más reequilibrios, y así sucesivamente)
Si la configuración coincide con los valores recomendados y aun así sigue viendo un reequilibrio constante, no
dude en abrir una incidencia (no olvide incluir toda la configuración en la incidencia para que podamos
ayudarle a depurar).

Problema de compresión y versión de formato de mensaje


Kafka admite la compresión, pero Event Hubs para Kafka actualmente no lo hace. Los errores que mencionan una
versión de formato de mensaje (por ejemplo,
The message format version on the broker does not support the request. ) se producen cuando un cliente intenta
enviar mensajes Kafka comprimidos a nuestros agentes.
Si los datos comprimidos son necesarios, una solución alternativa consiste en comprimir los datos antes de
enviarlos a los agentes y descomprimirlos después de recibirlos. El cuerpo del mensaje es simplemente una matriz
de bytes para el servicio, por lo que la compresión/descompresión en el lado del cliente no causará ningún
problema.

UnknownServerException
Puede recibir un excepción UnknownServerException de las bibliotecas de cliente de Kafka que sea similar al
ejemplo siguiente:

org.apache.kafka.common.errors.UnknownServerException: The server experienced an unexpected error when


processing the request

Registre una incidencia con el servicio de soporte técnico de Microsoft. El registro en el nivel de depuración y las
marcas de tiempo de excepción en UTC son útiles para depurar el problema.

Otros problemas
Si ve problemas al usar Kafka en Event Hubs, compruebe los siguientes elementos.
Firewall que bloquea el tráfico : asegúrese de que el firewall no está bloqueando el puerto 9093 .
TopicAuthorizationException : las causas más comunes de esta excepción son:
Un error de escritura en la cadena de conexión del archivo de configuración, o
Un intento de uso de Event Hubs para Kafka en un espacio de nombres de nivel básico. La característica
Event Hubs para Kafka solo es compatible con los espacios de nombres de niveles Estándar y Dedicado.
La versión de Kafka no coincide : Event Hubs para ecosistemas de Kafka admite las versiones 1.0 y
posteriores de Kafka. Algunas aplicaciones que usan la versión 0.10 de Kafka y versiones posteriores pueden
funcionar ocasionalmente gracias a la compatibilidad con versiones anteriores del protocolo de Kafka, pero se
recomienda seriamente no usar versiones antiguas de la API. Las versiones 0.9 y anteriores de Kafka no
admiten los protocolos SASL necesarios y no se pueden conectar a Event Hubs.
Codificaciones extrañas en encabezados de AMQP al consumir con Kafka : al enviar eventos a un
centro de eventos a través de AMQP, los encabezados de carga de AMQP se serializan en la codificación de
AMQP. Los consumidores de Kafka no deserializan los encabezados de AMQP. Para leer los valores de
encabezado, descodifique manualmente los encabezados AMQP. Como alternativa, puede evitar el uso de
encabezados AMQP si sabe que va a consumir a través del protocolo Kafka. Para más información, consulte
este problema de GitHub.
Autenticación SASL : la obtención de un marco para cooperar con el protocolo de autenticación SASL que
requiere Event Hubs puede resultar más difícil de lo que parece. Vea si puede solucionar problemas
relacionados con la configuración mediante los recursos del marco en la autenticación SASL.

límites
Apache Kafka frente a Event Hubs Kafka. En su mayor parte, Event Hubs Kafka tienen los mismos valores
predeterminados, propiedades, códigos de error y comportamiento general que Apache Kafka. Las instancias en
las que difieren explícitamente (o donde Event Hubs impone un límite que Kafka no tiene) se enumeran a
continuación:
La longitud máxima de la propiedad group.id es 256 caracteres
El tamaño máximo de offset.metadata.max.bytes es 1024 bytes
Las confirmaciones de desplazamiento se limitan a 4 llamadas por segundo por partición con un tamaño de
registro interno máximo de 1 MB

Pasos siguientes
Para obtener más información acerca de Event Hubs y Event Hubs para Kafka, consulte los artículos siguientes:
Guía del desarrollador de Apache Kafka para Event Hubs
Guía de migración de Kafka para Event Hubs
Preguntas más frecuentes: Event Hubs para Apache Kafka
Configuraciones recomendadas
Excepciones de mensajería de Event Hubs: .NET
18/08/2020 • 14 minutes to read • Edit Online

En esta sección se enumeran las excepciones de .NET generadas por API de .NET Framework.

Categorías de excepciones
Las API de .NET de Event Hubs generan excepciones que pueden dividirse en las siguientes categorías, junto con la
acción asociada que puede realizar para intentar corregirlas:
Error de codificación de usuario:
System.ArgumentException
System.InvalidOperationException
System.OperationCanceledException
System.Runtime.Serialization.SerializationException
Acción general: intente corregir el código antes de continuar.
Error de instalación/configuración:
Microsoft.ServiceBus.Messaging.MessagingEntityNotFoundException
Microsoft.Azure.EventHubs.MessagingEntityNotFoundException
System.UnauthorizedAccessException
Acción general: revise la configuración y cámbiela si es necesario.
Excepciones transitorias:
Microsoft.ServiceBus.Messaging.MessagingException
Microsoft.ServiceBus.Messaging.ServerBusyException
Microsoft.Azure.EventHubs.ServerBusyException
Microsoft.ServiceBus.Messaging.MessagingCommunicationException
Acción general: intente realizar de nuevo la operación o informe a los usuarios.
Otras excepciones:
System.Transactions.TransactionException
System.TimeoutException
Microsoft.ServiceBus.Messaging.MessageLockLostException
Microsoft.ServiceBus.Messaging.SessionLockLostException
Acción general: es específica del tipo de excepción; consulte la tabla de la siguiente sección.

Tipos de excepciones
En la tabla siguiente se describen los tipos de excepción de mensajería, sus causas y las acciones sugeridas que
puede realizar.

DESC RIP C IÓ N / C A USA / E JEM N OTA SO B RE EL REIN T EN TO


T IP O DE EXC EP C IÓ N P LO S A C C IÓ N SUGERIDA A UTO M ÁT IC O O IN M EDIATO
DESC RIP C IÓ N / C A USA / E JEM N OTA SO B RE EL REIN T EN TO
T IP O DE EXC EP C IÓ N P LO S A C C IÓ N SUGERIDA A UTO M ÁT IC O O IN M EDIATO

TimeoutException El servidor no respondió a la Compruebe la coherencia del El reintento podría resultar


operación solicitada en el estado del sistema y vuelva útil en algunos casos;
tiempo especificado, que a intentarlo si es necesario. agregue lógica de reintento
está controlado por Consulte TimeoutException. al código.
OperationTimeout. Puede
que el servidor haya
completado la operación
solicitada. Esta excepción se
puede producir debido a un
retraso de red o a otros
retrasos de infraestructura.

InvalidOperationException La operación del usuario Compruebe el código y la Los reintentos no funcionan.


solicitada no está permitida documentación. Asegúrese
en el servidor o servicio. de que la operación
Consulte el mensaje de solicitada sea válida.
excepción para obtener
detalles. Por ejemplo,
Complete genera esta
excepción si el mensaje se
recibió en el modo
ReceiveAndDelete .

OperationCanceledException Se realiza un intento para Compruebe el código y Los reintentos no funcionan.


invocar una operación en un asegúrese de que no invoca
objeto que ya se ha cerrado, operaciones de un objeto
anulado o eliminado. En desechado.
raras ocasiones, la
transacción de ambiente ya
se ha eliminado.

UnauthorizedAccessExceptio El objeto TokenProvider no Asegúrese de que el El reintento podría resultar


n pudo adquirir un token, el proveedor de tokens se cree útil en algunos casos;
token no es válido o no con los valores correctos. agregue lógica de reintento
contiene las notificaciones Compruebe la configuración al código.
necesarias para realizar la de Access Control Service.
operación.

ArgumentException Uno o varios de los Compruebe el código de El reintento no le será de


ArgumentNullException argumentos proporcionados llamada y asegúrese de que ayuda.
ArgumentOutOfRangeExcep para el método no son los argumentos sean
tion válidos. El URI correctos.
proporcionado a
NamespaceManager o
Create contiene segmentos
de ruta de acceso. El
esquema de URI
proporcionado a
NamespaceManager o
Create no es válido. El valor
de la propiedad es mayor de
32 KB.
DESC RIP C IÓ N / C A USA / E JEM N OTA SO B RE EL REIN T EN TO
T IP O DE EXC EP C IÓ N P LO S A C C IÓ N SUGERIDA A UTO M ÁT IC O O IN M EDIATO

Microsoft.ServiceBus.Messag La entidad asociada a la Asegúrese de que la entidad El reintento no le será de


ing operación no existe o se exista. ayuda.
MessagingEntityNotFoundEx eliminó.
ception

Microsoft.Azure.EventHubs
MessagingEntityNotFoundEx
ception

MessagingCommunicationEx El cliente no puede Asegúrese de que el nombre El reintento podría resultar


ception establecer una conexión al de host proporcionado sea útil si hay problemas de
Centro de eventos. correcto y que este sea conectividad intermitente.
accesible.

Microsoft.ServiceBus.Messag El servicio no puede El cliente puede esperar El cliente puede volver a


ing ServerBusyException procesar la solicitud en este durante un período de intentarlo tras un
momento. tiempo y volver a intentar determinado intervalo de
Microsoft.Azure.EventHubs realizar la operación. tiempo. Si el reintento
ServerBusyException Consulte genera otra excepción,
ServerBusyException. compruebe el
comportamiento de
reintento de esa excepción.

MessagingException Excepción de mensajería Compruebe el código y El comportamiento de


genérica que puede asegúrese de que solo se reintento es indefinido y
producirse en los siguientes usan objetos serializables en quizá no resulte útil.
casos: Se intentó crear el cuerpo del mensaje (o use
QueueClient con un nombre un serializador
o una ruta de acceso que personalizado). Consulte la
pertenece a un tipo de documentación de los tipos
entidad diferente (por de valor de las propiedades
ejemplo, un tema). Intento admitidos y use solo los
de enviar un mensaje mayor tipos compatibles.
de 1 MB. El servidor o Compruebe la propiedad
servicio encontró un error IsTransient . Si es true ,
durante el procesamiento de puede volver a intentar la
la solicitud. Consulte el operación.
mensaje de excepción para
obtener detalles. Por lo
general, se trata de una
excepción transitoria.

MessagingEntityAlreadyExist Se intenta crear una entidad Elimine la entidad existente o El reintento no le será de
sException con un nombre que ya se elija un nombre diferente ayuda.
usa en otra entidad de ese para la entidad que quiere
espacio de nombres de crear.
servicio.

QuotaExceededException La entidad de mensajería Cree espacio en la entidad El reintento podría resultar


alcanzó su tamaño máximo recibiendo mensajes de esta útil si los mensajes se
permitido. Esta excepción o de sus subcolas. eliminan mientras este se
puede suceder si ya ha Consulte lleva a cabo.
abierto el número máximo QuotaExceededException.
de destinatarios (que es
cinco) en un nivel de grupo
por consumidor.
DESC RIP C IÓ N / C A USA / E JEM N OTA SO B RE EL REIN T EN TO
T IP O DE EXC EP C IÓ N P LO S A C C IÓ N SUGERIDA A UTO M ÁT IC O O IN M EDIATO

MessagingEntityDisabledExc Solicitud para realizar una Active la entidad. El reintento podría ser útil si
eption operación en tiempo de la entidad se activa mientras
ejecución en una entidad este se lleva a cabo.
deshabilitada.

Microsoft.ServiceBus.Messag Carga de mensaje que Reduzca el tamaño de la El reintento no le será de


ing supera el límite de 1 MB. carga del mensaje y vuelva a ayuda.
MessageSizeExceededExcepti Este límite de 1 MB es para intentar la operación.
on el mensaje total, que puede
incluir propiedades del
Microsoft.Azure.EventHubs sistema y cualquier
MessageSizeExceededExcepti sobrecarga .NET.
on

QuotaExceededException
QuotaExceededException indica que se ha superado una cuota de una entidad específica.
Esta excepción suceder si ya ha abierto el número máximo de destinatarios (cinco) en un nivel de grupo por
consumidor.
Event Hubs
Event Hubs tiene un límite de 20 grupos de consumidores por Centro de eventos. Cuando intenta crear más, recibe
QuotaExceededException.

TimeoutException
TimeoutException indica que la operación iniciada por el usuario está superando el tiempo de espera.
Para Event Hubs, el tiempo de espera se especifica como parte de la cadena de conexión o a través de
ServiceBusConnectionStringBuilder. El propio mensaje de error puede variar, pero siempre contiene el valor de
tiempo de espera especificado para la operación actual.
Causas comunes
Hay dos causas comunes de este error: configuración incorrecta o un error de servicio transitorio.
Configuración incorrecta : es posible que el tiempo de espera de la operación sea demasiado breve para la
condición operativa. El valor predeterminado para el tiempo de espera de la operación en el SDK de cliente es
60 segundos. Compruebe si su código tiene el valor establecido en algo demasiado pequeño. La condición de la
red y el uso de CPU pueden afectar al tiempo que tarda en completarse una operación particular, por lo que el
tiempo de espera de esta no debe establecerse en un valor pequeño.
Error de ser vicio transitorio : a veces, el servicio Event Hubs puede experimentar retrasos en el
procesamiento de solicitudes; por ejemplo, durante períodos de tráfico elevado. En tales casos, puede reintentar
su operación después de un retraso hasta que la operación se realice correctamente. Si la misma operación aún
experimenta errores después de varios intentos, visite el sitio de estado del servicio de Azure para ver si hay
interrupciones del servicio conocidas.

ServerBusyException
Una excepción Microsoft.ServiceBus.Messaging.ServerBusyException o
Microsoft.Azure.EventHubs.ServerBusyException indica que un servidor está sobrecargado. Hay dos códigos de
error relevantes para esta excepción.
Código de error 50002
Este error puede producirse por uno de estos dos motivos:
La carga no se distribuye uniformemente entre todas las particiones del centro de eventos y una partición
ha alcanzado la limitación de unidades de rendimiento local.
Solución: revisar la estrategia de distribución de particiones o probar
EventHubClient.Send(eventDataWithOutPartitionKey) puede que le sirva de ayuda.
El espacio de nombres de Event Hubs no tiene suficientes unidades de rendimiento (puede comprobar la
pantalla Métrica en la ventana de espacio de nombres de Event Hubs en Azure Portal para confirmar). El
portal muestra información agregada (un minuto), pero el rendimiento se mide en tiempo real, por lo que
esto es solo una estimación.
Solución: aumentar las unidades de rendimiento en el espacio de nombres puede resultar útil. Puede hacer
esta operación en este portal, en la ventana Escala de la pantalla de espacio de nombres de Event Hubs. O
bien, puede usar el inflado automático.
Código de error 50001
Este error se produce raras veces. Se produce cuando el contenedor que ejecuta el código para su espacio de
nombres hace un uso bajo de la CPU: no más de unos pocos segundos antes de que comience el equilibrador de
carga de Event Hubs.
Solución: Límite a las llamadas al método GetRuntimeInformation. Azure Event Hubs admite hasta 50 llamadas
por segundo al método GetRuntimeInfo. Una vez que se alcanza el límite, puede recibir una excepción similar a
esta:

ExceptionId: 00000000000-00000-0000-a48a-9c908fbe84f6-ServerBusyException: The request was terminated because


the namespace 75248:aaa-default-eventhub-ns-prodb2b is being throttled. Error code : 50001. Please wait 10
seconds and try again.

Pasos siguientes
Para más información acerca de Event Hubs, visite los vínculos siguientes:
Información general de Event Hubs
Creación de un Centro de eventos
Preguntas más frecuentes sobre Event Hubs
Azure Event Hubs: excepciones de Resource Manager
18/08/2020 • 8 minutes to read • Edit Online

En este artículo se enumeran las excepciones generadas al interactuar con Azure Event Hubs mediante Azure
Resource Manager por medio de plantillas o llamadas directas.

IMPORTANT
Este documento se actualiza con frecuencia. Compruebe si hay actualizaciones.

En las secciones siguientes se proporcionan varias excepciones o errores que se exhiben mediante Azure Resource
Manager.

Código de error: Conflicto


SUB C Ó DIGO DE
C Ó DIGO DE ERRO R ERRO R M EN SA JE DE ERRO R DESC RIP C IÓ N REC O M EN DA C IÓ N

Conflicto 40300 Se ha alcanzado o El espacio de nombres Elimine los centros de


superado el número ha alcanzado su cuota eventos no usados o
máximo de recursos del número de extraños del espacio
de tipo EventHub. centros de eventos de nombres o
Real: #, máximo que puede contener. considere la
permitido: # posibilidad de
actualizar a un clúster
dedicado.

Conflicto None No se puede eliminar La replicación de Para desbloquear la


la configuración de GeoDR está en curso, eliminación de la
recuperación ante por lo que en este configuración, espere
desastres (DR) porque momento no se a que la replicación se
la replicación está en puede eliminar la haya completado,
curso. Conmute por configuración. desencadene una
error o interrumpa el conmutación por
emparejamiento antes error o interrumpa el
de intentar eliminar la emparejamiento de
configuración de GeoDR.
recuperación ante
desastres.

Conflicto None No se pudo actualizar Actualmente se está Espere hasta que se


el espacio de nombres realizando otra complete la operación
y se generó un operación en este actual y, luego, vuelva
conflicto en el back- espacio de nombres. a intentarlo.
end.

Código de error: 429


SUB C Ó DIGO DE
C Ó DIGO DE ERRO R ERRO R M EN SA JE DE ERRO R DESC RIP C IÓ N REC O M EN DA C IÓ N
SUB C Ó DIGO DE
C Ó DIGO DE ERRO R ERRO R M EN SA JE DE ERRO R DESC RIP C IÓ N REC O M EN DA C IÓ N

429 None Aprovisionamiento Actualmente se está Espere hasta que se


del espacio de realizando otra complete la operación
nombres en transición operación en este actual y, luego, vuelva
espacio de nombres. a intentarlo.

429 None Operación de Actualmente se está Espere hasta que se


recuperación ante realizando una complete la operación
desastres en curso. operación GeoDR en GeoDR actual y, luego,
este espacio de vuelva a intentarlo.
nombres o
emparejamiento.

Código de error: BadRequest


SUB C Ó DIGO DE
C Ó DIGO DE ERRO R ERRO R M EN SA JE DE ERRO R DESC RIP C IÓ N REC O M EN DA C IÓ N

BadRequest 40000 No se puede cambiar El nivel básico o Cree un centro de


PartitionCount para estándar de Azure eventos con el
un centro de eventos. Event Hubs no admite número deseado de
el cambio de particiones en el
particiones. espacio de nombres
de nivel básico o
estándar. La
escalabilidad
horizontal de la
partición es
compatible con
clústeres dedicados.

BadRequest 40000 El valor "#" de Los espacios de Si quiere más de un


MessageRetentionInD nombres de Event día de retención de
ays no es válido para Hubs del nivel básico mensajes, cree un
el nivel básico. El valor solo admiten la espacio de nombres
no puede superar "1" retención de mensajes de Event Hubs
día(s). de hasta 1 día. estándar.

BadRequest None El nombre Los nombres de Si es el propietario del


especificado no está espacios de nombres espacio de nombres
disponible. deben ser únicos, sin existente con el
embargo, el nombre nombre especificado,
especificado ya se ha puede eliminarlo, lo
usado. que producirá la
pérdida de datos.
Luego, vuelva a
intentarlo con el
mismo nombre. Si no
es seguro eliminar el
espacio de nombres
(o no es el
propietario), elija otro
nombre de espacio de
nombres.
SUB C Ó DIGO DE
C Ó DIGO DE ERRO R ERRO R M EN SA JE DE ERRO R DESC RIP C IÓ N REC O M EN DA C IÓ N

BadRequest None La suscripción Su suscripción ha Considere la


especificada ha alcanzado la cuota del posibilidad de eliminar
alcanzado su cuota de número de espacios los espacios de
espacios de nombres. de nombres que nombres no usados
puede contener. en esta suscripción,
crear otra suscripción
o actualizar a un
clúster dedicado.

BadRequest None No se puede El espacio de nombres Si es necesario, realice


actualizar un espacio no se puede actualizar el cambio en el
de nombres porque es el espacio espacio de nombres
secundario. de nombres principal de este
secundario de un emparejamiento. De
emparejamiento de lo contrario,
GeoDR. interrumpa el
emparejamiento de
GeoDR para efectuar
el cambio.

BadRequest None No se puede No se puede habilitar Para habilitar el


establecer el inflado el inflado automático inflado automático en
automático en la SKU en los espacios de un espacio de
básica. nombres de Event nombres, asegúrese
Hubs de nivel básico. de que sea de nivel
estándar.

BadRequest None No hay suficiente La región seleccionada Seleccione otra región


capacidad para crear está al máximo de su para hospedar el
el espacio de capacidad y no se espacio de nombres.
nombres. Póngase en pueden crear más
contacto con el espacios de nombres.
administrador de
Event Hubs.

BadRequest None No se puede realizar Los espacios de Siga usando el grupo


la operación en el tipo nombres de Event de consumidores
de entidad Hubs de nivel básico predeterminado
"ConsumerGroup" tienen una cuota de ($Default) o, si
porque el espacio de un grupo de necesita más,
nombres "nombre del consumidores (valor considere la
espacio de nombres" predeterminado). No posibilidad de usar en
usa el nivel "Básico". se admite la creación su lugar un espacio de
de más grupos de nombres de Event
consumidores. Hubs de nivel
estándar.

BadRequest None El espacio de nombres No se pudo encontrar Compruebe que el


"nombre del espacio el espacio de nombres nombre del espacio
de nombres" no proporcionado. de nombres sea
existe. correcto y se
encuentre en su
suscripción. Si no, cree
un espacio de
nombres de Event
Hubs.
SUB C Ó DIGO DE
C Ó DIGO DE ERRO R ERRO R M EN SA JE DE ERRO R DESC RIP C IÓ N REC O M EN DA C IÓ N

BadRequest None La propiedad location No se pudo crear un Intente crear el centro


del recurso no centro de eventos en de eventos en la
coincide con el una región específica misma región que el
espacio de nombres porque no coincidía espacio de nombres.
contenedor. con la región del
espacio de nombres.

Código de error: Error interno del servidor


SUB C Ó DIGO DE
C Ó DIGO DE ERRO R ERRO R M EN SA JE DE ERRO R DESC RIP C IÓ N REC O M EN DA C IÓ N

Internal Server Error None Error interno del Error interno del Vuelva a intentar la
servidor. servicio Event Hubs. operación con error. Si
la operación sigue
produciendo errores,
póngase en contacto
con el servicio de
soporte técnico.
Azure Event Hubs: SDK cliente
18/08/2020 • 2 minutes to read • Edit Online

En este artículo se proporciona la siguiente información sobre los SDK compatibles con Azure Event Hubs:
Ubicación de paquete que se puede usar en las aplicaciones
Ubicación de GitHub donde se puede encontrar código fuente, ejemplos, archivo Léame, registro de cambios,
problemas detectados y además notificar nuevos problemas
Vínculos a tutoriales de inicio rápido

SDK de cliente
En la siguiente sección se describen todos los clientes del runtime de Azure Event Hubs disponibles en este
momento. Aunque algunas de estas bibliotecas también incluyen funcionalidad de administración limitada, hay
bibliotecas específicas dedicadas a las operaciones de administración. El principal objetivo de estas bibliotecas es
enviar y recibir mensajes en un centro de eventos.

IDIO M A PA Q UET E REF EREN C IA

. NET Standard (más reciente y admite Azure.Messaging.EventHubs Ubicación de GitHub


.NET Core y .NET Framework) Tutorial

Azure.Messaging.EventHubs.Processor Ubicación de GitHub


Tutorial

. NET Standard (heredado y admite Microsoft.Azure.EventHubs Ubicación de GitHub


.NET Core y .NET Framework) Tutorial

Microsoft.Azure.EventHubs.Processor Ubicación de GitHub


Tutorial

. NET Framework (anterior ) WindowsAzure.Messaging Tutorial

Java azure-messaging-eventhubs Ubicación de GitHub


Tutorial

azure-eventhubs (heredado) Ubicación de GitHub


Tutorial

Python azure-eventhub Ubicación de GitHub


Tutorial

azure-eventhub-checkpointstoreblob- Ubicación de GitHub


aio Tutorial
IDIO M A PA Q UET E REF EREN C IA

JavaScript azure/event-hubs Ubicación de GitHub


Tutorial

azure/eventhubs-checkpointstore-blob Ubicación de GitHub


Tutorial

Go azure-event-hubs-go Ubicación de GitHub


Tutorial

C azure-event-hubs-c Ubicación de GitHub


Tutorial

SDK de administración
En la tabla siguiente se listan todas las bibliotecas específicas de administración disponibles actualmente. Ninguna
de estas bibliotecas contiene operaciones de runtime; además, su único propósito es administrar entidades de
Event Hubs .

IDIO M A PA Q UET E REF EREN C IA

.NET Standard Microsoft.Azure.Management.EventHub Ubicación de GitHub


Tutorial

Pasos siguientes
Para más información acerca de Event Hubs, visite los vínculos siguientes:
Información general de Event Hubs
Creación de un Centro de eventos
Preguntas más frecuentes sobre Event Hubs
Cuotas y límites de Azure Event Hubs
18/08/2020 • 4 minutes to read • Edit Online

En esta sección se describen las cuotas y los límites básicos en Azure Event Hubs.
En las tablas siguientes se enumeran las cuotas y los límites específicos de Azure Event Hubs. Para más
información sobre los precios de Event Hubs, consulte los precios de Event Hubs.
Los límites siguientes son comunes en los niveles básico y estándar.

L ÍM IT E Á M B ITO N OTA S VA L UE

Número de espacios de Subscription - 100


nombres de Event Hubs por
suscripción

Número de centros de Espacio de nombres Las solicitudes posteriores 10


eventos por espacio de para la creación de un
nombres nuevo centro de eventos se
rechazan.

Número de particiones por Entidad - 32


centro de eventos

Tamaño máximo del nombre Entidad - 256 caracteres


de un centro de eventos

Tamaño máximo del nombre Entidad - 256 caracteres


de un grupo de
consumidores

Número de destinatarios no Entidad - 5


de época por grupo de
consumidores

Unidades de rendimiento Espacio de nombres Si se supera el límite de 20


máximo unidades de procesamiento,
los datos se limitan y se
genera un excepción
ServerBusyException. Para
solicitar un número mayor
de unidades de
procesamiento para el nivel
Estándar rellene una
solicitud de soporte técnico.
Las unidades de
rendimiento adicionales se
encuentran disponibles en
bloques de 20 y están
sujetas a un compromiso de
compra.

Número de reglas de Espacio de nombres Las solicitudes posteriores 12


autorización por espacio de de creación de reglas de
nombres autorización se rechazan.
L ÍM IT E Á M B ITO N OTA S VA L UE

Número de llamadas al Entidad - 50 por segundo


método
GetRuntimeInformation

Número de reglas de red Entidad - 128


virtual (VNet) y de
configuración IP

Niveles Básico y Estándar de Event Hubs: límites y cuotas


L ÍM IT E Á M B ITO N OTA S B Á SIC A ESTÁ N DA R

Tamaño máximo de Entidad 256 KB 1 MB


evento de Event
Hubs

Número de grupos Entidad 1 20


de consumidores por
centro de eventos

Número de Espacio de nombres Las solicitudes 100 5.000


conexiones de AMQP posteriores de
por espacio de conexiones
nombres adicionales se
rechazan y el código
que llama recibe una
excepción.

Período de retención Entidad 1 día 1-7 días


máximo de datos de
eventos

Espacio de nombres Espacio de nombres Aplicaciones de flujos No Sí


habilitado para de espacios de
Apache Kafka nombres de Event
Hubs que usan el
protocolo Kafka.

Capturar Entidad Cuando está No Sí


habilitado, microlotes
en el mismo flujo.

Cuotas y límites de Event Hubs dedicado


La oferta de Event Hubs dedicado se factura aplicando una tarifa mensual fija con un uso mínimo de 4 horas. El
nivel Dedicado ofrece todas las características del plan Estándar, pero con una capacidad de escalado de nivel
empresarial para aquellos clientes que tienen cargas de trabajo muy exigentes.

C A RA C T ERÍST IC A L ÍM IT ES

Ancho de banda 20 CU

Espacios de nombres 50 por CU

Event Hubs 1000 por espacio de nombres


C A RA C T ERÍST IC A L ÍM IT ES

Eventos de entrada Se incluye

Tamaño de los mensajes 1 MB

Particiones 2000 por CU

Grupos de consumidores Sin límite por CU, 1000 por centro de eventos

Conexiones asincrónicas 100 000 incluidos

Retención de mensajes 90 días, 10 TB incluidas por TU

Capturar Se incluye

Pasos siguientes
Para más información acerca de Event Hubs, visite los vínculos siguientes:
Información general de Event Hubs
Inflado automático de Event Hubs
Preguntas más frecuentes sobre Event Hubs
Configuraciones recomendadas para clientes de
Apache Kafka
18/08/2020 • 6 minutes to read • Edit Online

Estas son las configuraciones recomendadas para usar Azure Event Hubs desde las aplicaciones cliente de Apache
Kafka.

Propiedades de configuración del cliente de Java


Configuraciones de productos y consumidor
P RO P IEDA D VA LO RES REC O M EN DA DO S IN T ERVA LO P ERM IT IDO N OTA S

metadata.max.age.ms 180 000 (aproximado) <240 000 Se puede reducir para


recoger los cambios de
metadatos antes.

connections.max.idle.ms 180000 <240 000 Azure cierra la inactividad de


TCP entrante > 240 000 ms,
lo que puede dar lugar a un
envío de conexiones
inactivas (que se muestran
como lotes expirados debido
al tiempo de espera de
envío).

Solo configuraciones de productor


Las configuraciones de productor se pueden encontrar aquí.

P RO P IEDA D VA LO RES REC O M EN DA DO S IN T ERVA LO P ERM IT IDO N OTA S

max.request.size 1000000 <1 046 528 El servicio cerrará las


conexiones si se envían
solicitudes de más de
1 046 528 bytes. Este valor
debe cambiar y causará
problemas en escenarios de
producción de alto
rendimiento.

retries >0 Puede que sea necesario


aumentar el valor de
delivery.timeout.ms;
consulte la documentación.
P RO P IEDA D VA LO RES REC O M EN DA DO S IN T ERVA LO P ERM IT IDO N OTA S

request.timeout.ms 30 000 .. 60000 >20 000 EH se establecerá


internamente de forma
predeterminada en un
mínimo de 20 000 ms.
Aunque se aceptan
solicitudes con valores de
tiempo de espera menores,
no se garantiza el
comportamiento del cliente.

metadata.max.idle.ms 180000 >5000 Controla cuánto tiempo el


productor almacenará en
memoria caché los
metadatos de un tema que
está inactivo. Si el tiempo
transcurrido desde la última
vez que se generó un tema
supera la duración de
inactividad de los
metadatos, los metadatos
del tema se olvidan y el
siguiente acceso a estos
forzará la solicitud de
captura de metadatos.

linger.ms >0 En escenarios de alto


rendimiento, el valor de
permanencia debe ser igual
al valor tolerable más alto
para aprovechar el
procesamiento por lotes.

delivery.timeout.ms Se establece según la


fórmula (
request.timeout.ms +
linger.ms )* retries .

enable.idempotence false La idempotencia no se


admite actualmente.

compression.type none La compresión no se admite


actualmente.

Solo configuraciones de consumidor


Las configuraciones de consumidor se pueden encontrar aquí.

P RO P IEDA D VA LO RES REC O M EN DA DO S IN T ERVA LO P ERM IT IDO N OTA S

heartbeat.interval.ms 3000 3000 es el valor


predeterminado y no debe
cambiarse.

session.timeout.ms 30000 6000 .. 300000 Comience con 30 000 y


auméntelo si ve un
reequilibrio frecuente debido
a los latidos que faltan.
Propiedades de configuración de librdkafka
El archivo de configuración principal de librdkafka (vínculo) contiene descripciones extendidas de las
propiedades siguientes.
Configuraciones de productos y consumidor
P RO P IEDA D VA LO RES REC O M EN DA DO S IN T ERVA LO P ERM IT IDO N OTA S

socket.keepalive.enable true Necesario si se espera que la


conexión esté inactiva. Azure
cerrará la inactividad de TCP
entrante > 240 000 ms.

metadata.max.age.ms ~ 180 000 <240 000 Se puede reducir para


recoger los cambios de
metadatos antes.

Solo configuraciones de productor


P RO P IEDA D VA LO RES REC O M EN DA DO S IN T ERVA LO P ERM IT IDO N OTA S

retries >0 El valor predeterminado es


2. Se recomienda mantener
este valor.

request.timeout.ms 30 000 .. 60000 >20 000 EH se establecerá


internamente de forma
predeterminada en un
mínimo de 20 000 ms. El
valor predeterminado de
librdkafka es 5000, que
puede ser problemático.
Aunque se aceptan
solicitudes con valores de
tiempo de espera menores,
no se garantiza el
comportamiento del cliente.

partitioner consistent_random Véase la documentación de consistent_random es el


librdkafka valor predeterminado y el
mejor. Las claves vacías y
nulas se controlan
idealmente en la mayoría de
los casos.

enable.idempotence false La idempotencia no se


admite actualmente.

compression.codec none La compresión no se admite


actualmente.

Solo configuraciones de consumidor


P RO P IEDA D VA LO RES REC O M EN DA DO S IN T ERVA LO P ERM IT IDO N OTA S
P RO P IEDA D VA LO RES REC O M EN DA DO S IN T ERVA LO P ERM IT IDO N OTA S

heartbeat.interval.ms 3000 3000 es el valor


predeterminado y no debe
cambiarse.

session.timeout.ms 30000 6000 .. 300000 Comience con 30 000 y


auméntelo si ve un
reequilibrio frecuente debido
a los latidos que faltan.

Notas adicionales
Consulte la siguiente tabla de escenarios de errores comunes relacionados con la configuración.

SÍN TO M A S P RO B L EM A SO L UC IÓ N

Errores de confirmación de El consumidor está esperando Tiene varias opciones:


desplazamiento debido al reequilibrio demasiado tiempo entre las llamadas a Aumentar el tiempo de espera
poll() y el servicio está echando al de la sesión.
consumidor fuera del grupo. Reducir el tamaño de lote de los
mensajes para acelerar el
procesamiento.
Mejorar la paralelización del
procesamiento para evitar el
bloqueo de consumer.poll().
La aplicación de alguna combinación de
estas tres opciones es probablemente
la más acertada.

Excepciones de red con un alto ¿Usa el cliente de Java y el valor Consulte las configuraciones de Java
rendimiento de producción predeterminado de max.request.size? Es anteriores.
posible que las solicitudes sean
demasiado grandes.

Pasos siguientes
Consulte Suscripción de Azure y límites de servicio, cuotas y restricciones para obtener las cuotas y los límites de
todos los servicios de Azure.
Preguntas frecuentes sobre Event Hubs
18/08/2020 • 32 minutes to read • Edit Online

General
¿Qué es un espacio de nombres de Event Hubs?
Un espacio de nombres es un contenedor de temas de Event Hubs y Kafka. Proporciona un FQDN único. Un
espacio de nombres actúa como un contenedor de aplicaciones que puede alojar varios temas de Event Hubs
y Kafka.
¿Cuando crear un nuevo espacio de nombres o cuándo usar un espacio de nombres existente?
Las asignaciones de capacidad (unidades de procesamiento (TU)) se facturan según el espacio de nombres.
Un espacio de nombres también se asocia a una región.
Es posible que desee crear un nuevo espacio de nombres en lugar de usar uno existente en alguno de los
siguientes escenarios:
Necesita un centro de eventos asociado a una nueva región.
Necesita un centro de eventos asociado a otra suscripción.
Necesita un centro de eventos con una asignación de capacidad diferente (es decir, la capacidad necesaria
para el espacio de nombres con el centro de eventos agregado superaría el umbral de 40 TU y no sería
conveniente el clúster dedicado)
¿Cuál es la diferencia entre los niveles Basic y Standard de Event Hubs?
El nivel Estándar de Azure Event Hubs proporciona más características de las disponibles en el nivel Básico.
Estas son las características disponibles en el nivel Estándar:
Retención de eventos más prolongada
Más conexiones asíncronas, con un cargo por uso por encima del límite de más del número incluido
Más de un único grupo de consumidores
Capture
Integración de Kafka
Para más información sobre los planes de tarifa, incluido Event Hubs dedicado, vea los detalles de los precios
de Event Hubs.
¿Dónde está disponible Azure Event Hubs?
Azure Event Hubs está disponible en todas las regiones de Azure admitidas. Para obtener una lista, visite la
página Regiones de Azure.
¿Se puede usar una sola conexión AMQP para enviar y recibir en varios centros de eventos?
Sí, siempre y cuando todos los centros de eventos se encuentren en el mismo espacio de nombres.
¿Cuál es el período de retención máximo para eventos?
El nivel Event Hubs estándar admite actualmente un período de retención máximo de siete días. Event Hubs
no está concebido como un almacén de datos permanente. Los períodos de retención superiores a 24 horas
están pensados para escenarios en los que es útil volver a reproducir un flujo de eventos en los mismos
sistemas; por ejemplo, para entrenar o comprobar un nuevo modelo de aprendizaje automático con datos
existentes. Si necesita conservar los mensajes más de siete días, habilite Event Hubs Capture en el centro de
eventos para extraer los datos de este a la cuenta de almacenamiento o la cuenta del servicio Azure Data Lake
que prefiera. Al habilita Capture se le cobrará un cargo en función de las unidades de procesamiento
compradas.
Puede configurar el período de retención de los datos capturados en su cuenta de almacenamiento. La
característica de administración del ciclo de vida de Azure Storage ofrece una útil directiva basada en
reglas para las cuentas de uso general v2 y de Blob Storage. Use la directiva para realizar la transición de los
datos a los niveles de acceso adecuados o hacer que expiren al final de su ciclo de vida. Para más información,
consulte Administración del ciclo de vida de Azure Blob Storage.
¿Cómo puedo supervisar mi instancia de Event Hubs?
Event Hubs emite métricas exhaustivas que proporcionan el estado de los recursos a Azure Monitor. También
permite evaluar el estado general del servicio Event Hubs, no solo en el nivel de espacio de nombres, sino
también en el nivel de entidad. Obtenga información sobre la supervisión que se ofrece para Azure Event
Hubs.
¿Qué puertos es necesario abrir en el firewall?
Puede usar los siguientes protocolos con Azure Service Bus para enviar y recibir mensajes:
Advanced Message Queuing Protocol (AMQP)
HTTP
Apache Kafka
Consulte en la siguiente tabla los puertos de salida que se deben abrir para usar estos protocolos para
comunicarse con Azure Event Hubs.

P ROTO C O LO P UERTO S DETA L L ES

AMQP 5671 y 5672 Consulte la guía del protocolo AMQP

HTTP, HTTPS 80, 443

Kafka 9093 Consulte Uso de Azure Event Hubs


desde aplicaciones de Apache Kafka

¿Qué direcciones IP debo incluir en la lista de permitidas?


Para buscar las direcciones IP correctas para incluirlas en la lista de direcciones permitidas para las
conexiones, siga estos pasos:
1. Ejecute el siguiente comando desde el símbolo del sistema:

nslookup <YourNamespaceName>.servicebus.windows.net

2. Anote la dirección IP devuelta en Non-authoritative answer . El único momento en que cambiaría es si


restaurara el espacio de nombres en un clúster distinto.
Si usa la redundancia de zona para el espacio de nombres, deberá realizar algunos pasos adicionales:
1. En primer lugar, ejecute nslookup en el espacio de nombres.

nslookup <yournamespace>.servicebus.windows.net

2. Anote el nombre de la sección respuesta no autoritativa , que se encuentra en uno de los siguientes
formatos:
<name>-s1.cloudapp.net
<name>-s2.cloudapp.net
<name>-s3.cloudapp.net

3. Ejecute nslookup para cada uno con los sufijos s1, s2 y s3 para obtener las direcciones IP de las tres
instancias que se ejecutan en tres zonas de disponibilidad.
¿Dónde puedo encontrar la IP de cliente que envía o recibe mensajes en mi espacio de nombres?
En primer lugar, habilite el filtrado de IP en el espacio de nombres.
A continuación, habilite los registros de diagnóstico para eventos de conexión de red virtual de Event Hubs
siguiendo las instrucciones indicadas en Habilitar registros de diagnóstico. Verá la dirección IP para la que se
deniega la conexión.

{
"SubscriptionId": "0000000-0000-0000-0000-000000000000",
"NamespaceName": "namespace-name",
"IPAddress": "1.2.3.4",
"Action": "Deny Connection",
"Reason": "IPAddress doesn't belong to a subnet with Service Endpoint enabled.",
"Count": "65",
"ResourceId": "/subscriptions/0000000-0000-0000-0000-
000000000000/resourcegroups/testrg/providers/microsoft.eventhub/namespaces/namespace-name",
"Category": "EventHubVNetConnectionEvent"
}

Integración de Apache Kafka


¿Cómo se puede integrar una aplicación existente de Kafka con Event Hubs?
Event Hubs proporciona un punto de conexión de Kafka que las aplicaciones basadas en Apache Kafka
existentes pueden usar. Basta con un cambio de configuración para poder disfrutar de la experiencia de PaaS
Kafka. Proporciona una alternativa a ejecutar su propio clúster de Kafka. Event Hubs admite Apache Kafka 1.0
y versiones del cliente más recientes y funciona con marcos, herramientas y aplicaciones de Kafka existentes.
Para obtener más información, consulte Event Hubs for Kafka repo (Event Hubs para el repositorio de Kafka).
¿Qué cambios de configuración deben realizarse para que mi aplicación existente se comunique con Event
Hubs?
Para conectarse a un centro de eventos, debe actualizar las configuraciones de cliente de Kafka. Se hace
mediante la creación de un espacio de nombres de Event Hubs y la obtención de la cadena de conexión.
Cambie bootstrap.servers para que señale al FQDN de Event Hubs y el puerto, a 9093. Actualice
sasl.jaas.config para dirigir el cliente de Kafka al punto de conexión de Event Hubs (que es la cadena de
conexión que ha obtenido) con la autenticación correcta, tal y como se muestra aquí:
bootstrap.servers={YOUR.EVENTHUBS.FQDN}:9093 request.timeout.ms=60000 security.protocol=SASL_SSL
sasl.mechanism=PLAIN sasl.jaas.config=org.apache.kafka.common.security.plain.PlainLoginModule required
username="$ConnectionString" password="{YOUR.EVENTHUBS.CONNECTION.STRING}";
Ejemplo:
bootstrap.servers=dummynamespace.servicebus.windows.net:9093 request.timeout.ms=60000
security.protocol=SASL_SSL sasl.mechanism=PLAIN
sasl.jaas.config=org.apache.kafka.common.security.plain.PlainLoginModule required
username="$ConnectionString"
password="Endpoint=sb://dummynamespace.servicebus.windows.net/;SharedAccessKeyName=DummyAcce
ssKeyName;SharedAccessKey=5dOntTRytoC24opYThisAsit3is2B+OGY1US/fuL3ly=";
Nota: Si sasl.jaas.config no es una configuración compatible con su marco, busque las configuraciones que se
usan para establecer el nombre de usuario y contraseña SASL y úselas en su lugar. Establezca el nombre de
usuario para $ConnectionString y la contraseña para la cadena de conexión de Event Hubs.
¿Cuál es el tamaño de mensaje o evento de Event Hubs?
El tamaño máximo de mensaje permitido en Event Hubs es 1 MB.

Unidades de procesamiento
¿Qué son las unidades de procesamiento de Event Hubs?
El rendimiento de Event Hubs define la cantidad de datos en megabytes o el número (en miles) de eventos de
1 KB que entran y salen a través de Event Hubs. Este rendimiento se mide en unidades de procesamiento (TU).
Compre TU antes de empezar a usar el servicio Event Hubs. Las TU de Event Hubs se pueden seleccionar
explícitamente mediante el portal o las plantillas de Resource Manager para Event Hubs.
¿Se aplican las unidades de procesamiento a todos los centros de eventos de un espacio de nombres?
Sí, las unidades de procesamiento (TU) se aplican a todos los centros de eventos de un espacio de nombres
de Event Hubs. Significa que las TU se compran en el nivel de espacio de nombres y se comparten entre los
centros de eventos de ese espacio de nombres. Cada TU da al espacio de nombres derecho a las siguientes
funcionalidades:
Hasta 1 MB por segundo de eventos de entrada (eventos enviados a un centro de eventos), pero no más
de 1000 eventos de entrada, operaciones de administración o llamadas a la API de control por segundo.
Hasta 2 MB por segundo de eventos de salida (eventos consumidos de un centro de eventos), pero no más
de 4096 eventos de salida.
Hasta 84 GB de almacenamiento de eventos (suficiente para el período de retención predeterminado de
24 horas).
¿Cómo se facturan las unidades de procesamiento?
Las unidades de procesamiento (TU) se facturan por hora. La facturación se basa en el número máximo de
unidades que se seleccionaron durante la hora en cuestión.
¿Cómo puedo optimizar el uso de las unidades de procesamiento?
Puede empezar con solo una unidad de procesamiento (TU) y activar el inflado automático. La función de
inflado automático le permite aumentar las TU a medida que incrementa la carga y el tráfico. También puede
establecer un límite superior en el número de TU.
¿Cómo funciona la característica de inflado automático de Event Hubs?
La función de inflado automático le permite escalar verticalmente las unidades de procesamiento (TU).
Significa que, para empezar, puede comprar un número bajo de TU y el inflado automático escalará
verticalmente las TU a medida que aumente la entrada. Le ofrece una opción rentable y el control total del
número de TU que se van a administrar. Esta característica permite solo escalar ver ticalmente y puede
controlar por completo la reducción vertical del número de TU mediante su actualización.
Es recomendable empezar con un número bajo de unidades de procesamiento (TU); por ejemplo, 2 TU. Si
prevé que el tráfico puede crecer hasta 15 TU, active la función de inflado automático en el espacio de
nombres y establezca el límite máximo en 15 TU. Ahora podrá aumentar automáticamente las TU a medida
que crezca el tráfico.
¿Hay algún costo asociado a la activación de la característica de inflado automático?
No hay ningún costo asociado con esta característica.
¿Cómo se aplican los límites de procesamiento?
Si el rendimiento total de entrada o la tasa total de eventos de entrada en todos centros de eventos de un
espacio de nombres superan las asignaciones de unidades de procesamiento agregado, los emisores quedan
sujetos a limitaciones y reciben errores que indican que se superó la cuota de entrada.
Si el rendimiento total de salida o la tasa total de eventos de salida en todos centros de eventos de un
espacio de nombres superan las asignaciones de unidades de procesamiento agregado, los receptores
quedan sujetos a limitaciones pero no se generan errores de limitación.
Las cuotas de entrada y de salida se aplican por separado, por lo que ningún remitente puede provocar que
se ralentice el consumo de eventos ni ningún receptor puede impedir que los eventos se envíen a un centro
de eventos.
¿Hay algún límite en el número de unidades de procesamiento (TU ) que se pueden reservar o seleccionar?
En una oferta multiempresa, las unidades de procesamiento pueden aumentar hasta 40 TU (se pueden
seleccionar hasta 20 TU en el portal y generar una incidencia de soporte técnico para elevarlas a 40 TU en el
mismo espacio de nombres). Más allá de 40 TU, Event Hubs ofrece el modelo basado en recursos o capacidad
denominado clústeres de Event Hubs dedicado . Los clústeres dedicados se venden en unidades de
capacidad (CU).

Clústeres dedicados
¿Qué son los clústeres de Event Hubs dedicado?
Los clústeres de Event Hubs dedicado ofrecen implementaciones de un único inquilino para los clientes con
los requisitos más exigentes. Esta oferta construye un clúster basado en la capacidad que no está limitado por
las unidades de procesamiento. Esto significa que podría utilizar el clúster para la ingesta y transmisión de los
datos tal y como indica el uso de CPU y memoria del clúster. Para obtener más información, consulte Event
Hubs Dedicated clusters (Clústeres de Event Hubs dedicado).
¿Qué me permite realizar una única unidad de capacidad?
Para un clúster dedicado, la cantidad que se puede ingerir y transmitir depende de varios factores, como los
productores, los consumidores, la velocidad a la que se ingiere y procesa, etc.
En la tabla siguiente se muestran los resultados del banco de pruebas que hemos obtenido durante nuestras
pruebas:

A N C H O DE M EN SA JES A N C H O DE
F O RM A DE REC EP TO R B A N DA DE DE B A N DA DE M EN SA JES TU
L A C A RGA ES EN T RA DA EN T RA DA SA L IDA DE SA L IDA TOTA L ES T U POR C U

Lotes de 2 400 MB/s 400 000 m 800 MB/s 800 000 m 400 TU 100 TU
100 x 1 KB ensajes/s ensajes/s

Lotes de 2 666 MB/s 66 600 me 1,33 GB/s 133 000 m 666 TU 166 TU
10 x 10 KB nsajes/s ensajes/s

Lotes de 6 1 1,05 GB/s 34 000 me 1,05 GB/s 34 000 me 1000 TU 250 TU


x 32 KB nsajes/s nsajes/s

En las pruebas, se usaron los siguientes criterios:


Se usó un clúster de Event Hubs dedicado con cuatro unidades de capacidad (CU).
El centro de eventos usado para la ingesta tenía 200 particiones.
Dos aplicaciones receptoras recibieron los datos ingeridos de todas las particiones.
Los resultados ofrecen una idea de lo que puede lograrse con un clúster de Event Hubs dedicado. Además, un
clúster dedicado incluye Event Hubs Capture habilitado para los escenarios de retención a largo plazo y de
microlotes.
¿Cómo puedo crear un clúster de Event Hubs dedicado?
Un clúster de Event Hubs dedicado se crea mediante el envío de una solicitud de soporte técnico de aumento
de cuota o poniéndose en contacto con el equipo de Event Hubs. Normalmente, se necesitan unas dos
semanas para que el clúster esté implementado y entregado, y pueda usarlo. Este proceso es temporal hasta
que haya un autoservicio completo disponible a través de Azure Portal.

Procedimientos recomendados
¿Cuántas particiones necesito?
El número de particiones se especifica en el momento de la creación y debe estar comprendido entre 2 y 32.
El número de particiones no es modificable, por lo que debería tener en cuenta el escalado a largo plazo a la
hora de configurar este número. Las particiones son un mecanismo de organización de datos relacionado con
el paralelismo de bajada necesario para consumir las aplicaciones. El número de particiones de un centro de
eventos está directamente relacionado con el número de lectores simultáneos que espera tener. Para más
información sobre las particiones, consulte Particiones.
Es posible que quiera establecer el valor lo más alto posible, que es 32, en el momento de la creación.
Recuerde que, si hay más de una partición, los eventos se enviarán a varias particiones sin conservar el orden,
a menos que configure los remitentes para que solo realicen el envío a una única partición de las 32, lo que
hará que las 31 restantes sean redundantes. En el primer caso, tendrá que leer eventos en las 32 particiones.
En el último caso, no hay ningún costo adicional obvio aparte de la configuración adicional que debe realizar
en el host del procesador de eventos.
Event Hubs está diseñado para permitir un lector de partición única por grupo de consumidores. En la
mayoría de los casos de uso, el valor predeterminado de cuatro particiones es suficiente. Si desea escalar el
procesamiento de eventos, tal vez desee agregar particiones adicionales. No hay ningún límite de
procesamiento específico en una partición, pero el número total de unidades de procesamiento limita el
procesamiento agregado en el espacio de nombres. A medida que aumenta el número de unidades de
procesamiento en el espacio de nombres, puede que necesite particiones adicionales para permitir que los
lectores simultáneos logren su propio procesamiento máximo.
Pero si tiene un modelo en el que su aplicación tiene afinidad con una partición determinada, aumentar el
número de particiones puede que no suponga ventaja alguna. Para más información, vea Disponibilidad y
coherencia.

Precios
¿Dónde puedo encontrar más información sobre precios?
Para obtener una completa información sobre los precios de Event Hubs, consulte los detalles de precios de
Event Hubs.
¿Hay un cargo por retener eventos de Event Hubs durante más de 24 horas?
El nivel Event Hubs estándar permite períodos de retención de mensajes superiores a 24 horas, hasta un
máximo de siete días. Si el tamaño del número total de eventos almacenados supera la asignación de
almacenamiento para el número de unidades de procesamiento seleccionadas (84 GB por unidad de
procesamiento), el tamaño que supere la asignación se cargará con la tarifa publicada de almacenamiento de
blobs de Azure. La asignación de almacenamiento en cada unidad de procesamiento cubre todos los costos
de almacenamiento de los períodos de retención de 24 horas (valor predeterminado), incluso aunque la
unidad de procesamiento se consuma hasta la asignación de entrada máxima.
¿Cómo se calcula y se cobra el tamaño de almacenamiento de Event Hubs?
El tamaño total de todos los eventos almacenados, incluida la sobrecarga interna de encabezados de eventos
o las estructuras de almacenamiento en disco de todos los centros de eventos, se mide a lo largo del día. Al
final del día, se calcula el tamaño máximo de almacenamiento. La asignación de almacenamiento diario se
calcula basándose en el número mínimo de unidades de procesamiento seleccionadas durante el día (cada
unidad de procesamiento ofrece una asignación de 84 GB). Si el tamaño total supera la asignación de
almacenamiento diaria calculada, el exceso de almacenamiento se factura con las tarifas de Azure Blob
Storage (con la tarifa de almacenamiento con redundancia local ).
¿Cómo se calculan los eventos de entrada de Event Hubs?
Cada evento enviado a un centro de eventos cuenta como mensaje facturable. Un evento de entrada se define
como una unidad de datos que es menor o igual que 64 KB. Cualquier evento que tenga un tamaño menor o
igual que 64 KB se considera un evento facturable. Si el evento es mayor de 64 KB, el número de eventos
facturables se calcula según el tamaño del evento, en múltiplos de 64 KB. Por ejemplo, un evento de 8 KB
enviado al centro de eventos se factura como un evento, pero un mensaje de 96 KB enviado al centro de
eventos se factura como dos eventos.
Los eventos consumidos en un centro de eventos, así como las operaciones de administración y las llamadas
de control (como los puntos de comprobación), no se cuentan como eventos de entrada facturables, pero se
acumulan hasta llegar a la asignación de unidades de procesamiento.
¿Los cargos por conexión desacoplada se aplican a Event Hubs?
Los cargos de conexión se aplican solo cuando se usa el protocolo AMQP. No hay ningún cargo de conexión
por el envío de eventos mediante HTTP, independientemente del número de sistemas o dispositivos emisores.
Si tiene previsto usar AMQP (por ejemplo, para conseguir un flujo de eventos más eficiente o para habilitar la
comunicación bidireccional en escenarios de comando y control de IoT), vea la página de información de
precios de Event Hubs para obtener información sobre el número de conexiones incluidas en cada nivel de
servicio.
¿Cómo se factura Event Hubs Capture?
Capture se habilita cuando algún centro de eventos del espacio de nombres tiene la opción Capture
habilitada. Event Hubs Capture se factura por horas y por unidad de rendimiento comprada. A medida que el
número de unidades de rendimiento aumenta o disminuye, la facturación de Event Hubs Capture refleja estos
cambios en incrementos de horas completas. Para más información sobre Event Hubs Capture, vea los
detalles de los precios de Event Hubs.
¿Se me cobrará la cuenta de almacenamiento que seleccione para Event Hubs Capture?
Capture usa la cuenta de almacenamiento que se especifique al habilitarlo en un servicio centro de eventos.
Dado que esta es su cuenta de almacenamiento, los cambios efectuados en esta configuración se facturan en
su suscripción a Azure.

Cuotas
¿Hay alguna cuota asociada a los centros Event Hubs?
Para obtener una lista de todas las cuotas de los centros Event Hubs, consulte Cuotas.

Solución de problemas
¿Por qué no puedo crear un espacio de nombres después de eliminarlo de otra suscripción?
Cuando elimine un espacio de nombres de una suscripción, espere 4 horas antes de volver a crearlo con el
mismo nombre en otra suscripción. En caso contrario, es posible que reciba el mensaje de error siguiente:
Namespace already exists .

¿Cuáles son algunas de las excepciones generadas por los centros Event Hubs y sus acciones sugeridas?
Para obtener una lista de posibles excepciones de Event Hubs, consulte Información general sobre
excepciones.
Registros de diagnóstico
Event Hubs admite dos tipos de registros de diagnóstico: los registros de errores de Capture y los registros
operativos. Ambos, se representan en JSON y se pueden activar a través de Azure Portal.
SLA y soporte técnico
El soporte técnico para Event Hubs está disponible a través de la página de preguntas y respuestas de
Microsoft sobre Azure Service Bus. Se ofrece de forma gratuita soporte técnico para la administración de
suscripciones y la facturación.
Para más información sobre nuestro SLA, consulte la página Acuerdos de nivel de servicio .

Pasos siguientes
Para más información acerca de Event Hubs, visite los vínculos siguientes:
Información general de Event Hubs
Creación de un Centro de eventos
Inflado automático de Event Hubs

También podría gustarte