Nota:
El acceso a esta página requiere autorización. Puede intentar iniciar sesión o cambiar directorios.
El acceso a esta página requiere autorización. Puede intentar cambiar los directorios.
El equilibrio de carga de particiones es una técnica en Azure Event Hubs que distribuye las cargas de trabajo de procesamiento de eventos entre varias instancias de la aplicación. El cliente del procesador de eventos administra automáticamente la propiedad de la partición y coordina la distribución del trabajo entre todas las instancias de consumidor activas.
En las versiones más recientes del SDK (5.0 en adelante), EventProcessorClient (.NET y Java) o EventHubConsumerClient (Python y JavaScript) controla automáticamente el equilibrio de carga. Suscríbase a los eventos que le interesen al registrar un controlador de eventos.
En este artículo se describe un escenario de ejemplo para usar varias instancias de aplicaciones cliente para leer eventos de un centro de eventos. También se explican conceptos clave como la propiedad de la partición, los puntos de control y el equilibrio de carga.
Sugerencia
Si usa una versión anterior de la biblioteca cliente, consulte las guías de migración: .NET, Java, Python y JavaScript.
Nota:
La clave para escalar Event Hubs es la idea de consumidores particionados. A diferencia del patrón de consumidores competidores, el patrón de consumidor particionado permite una escala alta eliminando el cuello de botella por contención y facilitando el paralelismo de extremo a extremo.
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.
Aplicación para el consumidor
Al diseñar un consumidor en un entorno distribuido, el escenario debe controlar los siguientes requisitos:
- Escala: Cree varios consumidores, cada uno asumiendo la lectura de algunas particiones de Event Hubs.
- Equilibrio de carga: aumente o reduzca los consumidores dinámicamente. 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 (un humano) aumenta el número de instancias consumidoras. 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.
- 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.
- 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 eventos y hacer algo útil con él. Por ejemplo, agréguelo y cárguelo en el Blob Storage.
Procesador de eventos o cliente consumidor
No es necesario que cree su propia solución para cumplir estos requisitos. Los SDK de Azure Event Hubs proporcionan esta funcionalidad. En .NET o Java SDK, use un cliente de procesador de eventos (EventProcessorClient). En Python y SDK de JavaScript, use EventHubConsumerClient. En la versión anterior del SDK, el host del procesador de eventos (EventProcessorHost) admite estas características.
Para la mayoría de los escenarios de producción, use el cliente del procesador de eventos para leer y procesar eventos. El cliente del procesador proporciona una experiencia sólida para procesar eventos en todas las particiones de un centro de eventos de forma eficaz y tolerante a errores, al tiempo que proporciona un medio para controlar su progreso. Los clientes del procesador de eventos pueden trabajar en colaboración en el contexto de un grupo de consumidores para un centro de eventos determinado. Los clientes administran automáticamente la distribución y el balanceo del trabajo a medida que las instancias están disponibles o no disponibles para el grupo.
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. El sistema distribuye uniformemente la propiedad de las particiones entre todas las instancias de procesador de eventos activas asociadas a una combinación de centro de eventos y grupo de consumidores.
Cada procesador de eventos tiene un identificador único y reivindica la propiedad de las particiones agregando o actualizando una entrada en un almacén de puntos de verificación. Todas las instancias de procesador de eventos se comunican con este almacén periódicamente para actualizar su propio estado de procesamiento y obtener información sobre otras instancias activas. El sistema usa estos datos para equilibrar la carga entre los procesadores activos. Para escalar verticalmente, se pueden unir instancias nuevas al grupo de procesamiento. Cuando las instancias bajan, ya sea debido a errores o para reducir la escala, el sistema transfiere de manera ordenada la propiedad de la partición 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 del Event Hubs, el nombre del centro de eventos, el grupo de consumidores, el identificador de procesador de eventos (también conocido como propietario), el identificador de la partición y la hora de la última modificación.
| Espacio de nombres de Event Hubs | Nombre del centro de eventos | Grupo de consumidores | Propietario | Id. de partición | Hora de la última modificación |
|---|---|---|---|---|---|
| mynamespace.servicebus.windows.net | myeventhub | myconsumergroup | 3be3f9d3-9d9e-4c50-9491-85ece8334ff6 | 0 | 2020-01-15T01:22:15 |
| mynamespace.servicebus.windows.net | myeventhub | mi grupo de consumidores | f5cc5176-ce96-4bb4-bbaa-a0e3a9054ecf | 1 | 2020-01-15T01:22:17 |
| mynamespace.servicebus.windows.net | myeventhub | miGrupoDeConsumidores | 72b980e9-2efc-4ca7-ab1b-ffd7bece8472 | 2 | 2020-01-15T01:22:10 |
| : | |||||
| : | |||||
| mynamespace.servicebus.windows.net | myeventhub | migrupondeconsumidores | 844bd8fb-1f3a-4580-984d-6324f9e208af | 15 | 2020-01-15T01:22:00 |
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 conocido. Si se produce un error en un procesador (la máquina virtual se apaga), otras instancias detectan el error examinando la hora de la última modificación. Otras instancias intentan obtener la propiedad de las particiones que anteriormente eran propiedad de la instancia inactiva. 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 cualquier momento dado, hay como máximo un procesador que recibe eventos de una partición.
Recepción de mensajes
Al crear un procesador de eventos, especifique funciones que procesan eventos y errores. Cada llamada a la función que procesa los eventos entrega un solo evento de una partición específica. Debe gestionar este evento. Si desea asegurarse de que el consumidor procesa cada mensaje al menos una vez, escriba su propio código con lógica de reintento. Pero tenga cuidado con los mensajes dudosos.
Procesar eventos de manera relativamente rápida. 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.
Punto 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. El marcado de un punto de control suele producirse dentro de la función que procesa los eventos y se produce por partición dentro de un grupo de consumidores.
Si un procesador de eventos se desconecta de una partición, otra instancia correspondiente puede reanudar el procesamiento de la partición en el punto de comprobación comprometido anteriormente por el último procesador de esa partición dentro de ese grupo de consumidores. Cuando el procesador se conecta, pasa el desplazamiento de lectura al centro de eventos para especificar dónde 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. Puede volver a los datos más antiguos indicando un desplazamiento menor desde este proceso de punto de control.
Cuando el punto de control marca un evento como procesado, agrega o actualiza una entrada en el almacén de puntos de control con el desplazamiento y el número de secuencia del evento. Decida 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 que los sistemas aguas abajo sean idempotentes, es fácil recuperarse de fallos o reinicios que hacen que se reciban múltiples veces los mismos eventos.
Siga estas recomendaciones al usar Azure Blob Storage como almacén de puntos de control:
- Use un contenedor independiente para cada grupo de consumidores. Puede usar la misma cuenta de almacenamiento, pero usar un contenedor por cada grupo.
- No use la cuenta de almacenamiento para nada más.
- No use el contenedor para nada más.
- Cree la cuenta de almacenamiento en la misma región que la aplicación implementada. Si la aplicación es local, intente elegir la región más cercana posible.
En la página Cuenta de almacenamiento de Azure Portal, en la sección Blob service, asegúrese de que la siguiente configuración está deshabilitada.
- Espacio de nombres jerárquico
- Eliminación reversible de blobs
- Control de versiones
Seguridad de subprocesos e instancias del procesador
De manera predeterminada, se llama de forma secuencial a la función que procesa eventos para una partición determinada. Los eventos y llamadas subsiguientes a esta función desde la misma partición se acumulan en la cola mientras el bombeo de eventos sigue ejecutándose en segundo plano en otros subprocesos. Los eventos de diferentes particiones se pueden procesar simultáneamente. Debe sincronizar cualquier estado compartido al que se tenga acceso entre particiones.
Contenido relacionado
Consulte los siguientes inicios rápidos: