Escalar tu aplicación de procesamiento

Completado

Para escalar la aplicación de procesamiento de eventos, puede ejecutar varias instancias de la aplicación y hacer que equilibre la carga entre sí. En las versiones anteriores, EventProcessorHost le permitió equilibrar la carga entre varias instancias del programa y los eventos de punto de control al recibir. En las versiones más recientes (5.0 y posteriores), EventProcessorClient (.NET y Java) o EventHubConsumerClient (Python y JavaScript) le permiten hacer lo mismo.

Nota:

La clave del escalado de Event Hubs es el concepto de consumidores con particiones. A diferencia del patrón de consumidores competidores, el patrón de consumidor particionado permite la escala alta quitando el cuello de botella de contención y facilitando el paralelismo de un extremo a otro.

Escenario de ejemplo

Como ejemplo, pensemos en una empresa de seguridad doméstica que supervisa 100 000 hogares. Cada minuto, obtiene datos de diversos sensores, como detectores de movimiento, sensores de apertura de puertas y ventanas, detectores de rotura de cristales, etc., instalados en cada hogar. La empresa ofrece un sitio web para que los residentes puedan supervisar la actividad de su hogar 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 y volcar el agregado a un blob de almacenamiento, que luego se proyecta en una página web fácil de usar.

Al diseñar el consumidor en un entorno distribuido, el escenario debe controlar los siguientes requisitos:

  • Escalado: cree varios consumidores, de modo que cada uno se encargue de leer unas cuantas particiones de Event Hubs.
  • 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.
  • Reanudación sin problemas después de los errores: si un consumidor (consumidor A) Si falla (por ejemplo, la máquina virtual que aloja al consumidor se bloquea repentinamente), entonces otros consumidores pueden hacerse cargo de las particiones que pertenecen al consumidor A y continuar. Además, el punto de continuación, denominado 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.
  • Consumir eventos: Aunque los tres puntos anteriores tratan con la administración del consumidor, debe haber código para consumir los eventos y hacer algo útil con ellos. Por ejemplo, agréguelo y cárguelo en Blob Storage.

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 de .NET o Java, se usa un cliente de procesador de eventos (EventProcessorClient) y, en los SDK de Python y JavaScript, se usa EventHubConsumerClient.

En la mayoría de los escenarios de producción, se recomienda usar el cliente del procesador de eventos para leer y procesar eventos. Los clientes del procesador de eventos pueden trabajar de forma cooperativa en el contexto de un grupo de consumidores para un centro de eventos determinado. Los clientes gestionarán automáticamente la distribución y el equilibrio del trabajo a medida que las instancias estén disponibles o no disponibles para el grupo.

Seguimiento de la propiedad de la 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 de manera uniforme entre todas las instancias activas del procesador de eventos asociadas con 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 agregación o actualización de una entrada en un almacén de puntos de control. Todas las instancias del procesador de eventos se comunican periódicamente con este almacén para actualizar su propio estado de procesamiento y obtener información sobre otras instancias activas. Estos datos se utilizan para equilibrar la carga entre los procesadores activos.

Recibir mensajes

Al crear un procesador de eventos, se especifican las funciones que procesan eventos y errores. Cada llamada a la función que procesa eventos entrega un único evento de una partición específica. Es su responsabilidad administrar este evento. Si desea asegurarse de que el consumidor procese cada mensaje al menos una vez, debe escribir su propio código con lógica de reintento. Pero tenga cuidado con los mensajes engañosos.

Se recomienda que lo haga relativamente rápido. Es decir, use el menor procesamiento posible. Si necesita escribir en el almacenamiento y realizar algunas tareas de enrutamiento, es mejor utilizar dos grupos de consumidores y disponer de dos procesadores de eventos.

Creación de punto de comprobación

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. 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 que fue previamente confirmado 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 control.

Seguridad para subprocesos e instancias de procesador

De forma predeterminada, la función que procesa los eventos se llama secuencialmente para una partición determinada. Los eventos posteriores y las llamadas a esta función desde la misma partición se ponen en cola en segundo plano, ya que la bomba de eventos continúa ejecutándose en segundo plano en otros subprocesos. Los eventos de diferentes particiones se pueden procesar simultáneamente y cualquier estado compartido al que se acceda entre particiones debe sincronizarse.