La suscripción y el envío permiten enviar inmediatamente los datos listos al cliente. Esto reduce la latencia que provoca el sondeo mediante la API Get y disminuye la carga del servicio de cola generada por las consultas. Sin embargo, esta función tiene cierta complejidad porque involucra varios conceptos adicionales. Este tema describe cómo usar la función de suscripción y envío del servicio de cola.
Consumidor
Un consumidor es un programa cliente que se suscribe a datos del servicio de cola. Cuando el cliente usa la API Watch para solicitar datos, se crea un objeto de consumidor en el servicio de cola. Los parámetros de la API (como el tamaño de ventana y las etiquetas) se utilizan como atributos del consumidor. Consulte el estado del consumidor mediante la API Attribute. Ejemplo:
[OK] Attributes:
consumers.list.[0] : Id: default_group.u1, Index: 0, Pending: 0, Status: Complete, Idle: 2.091s, Window: 0, Slots: 0, AutoCommit: true
consumers.list.[1] : Id: default_group.u2, Index: 0, Pending: 0, Status: Complete, Idle: 1.124s, Window: 0, Slots: 0, AutoCommit: true
consumers.stats.total : 2
consumers.stats.total indica el número total de consumidores. consumers.list es la lista de consumidores. La siguiente tabla describe las columnas:
|
Parámetro |
Descripción |
|
Id |
El ID del consumidor, con el formato |
|
Index |
El índice de los datos que consume el consumidor. |
|
Pending |
La cantidad de datos en proceso que el consumidor actual no ha confirmado. |
|
Status |
El estado del consumidor. Valores válidos:
|
|
Window |
El tamaño de la ventana del consumidor, que corresponde a la cantidad máxima de datos enviados. |
|
Slots |
El número de ventanas inactivas. Un valor de 0 indica que la ventana está ocupada. |
|
AutoCommit |
Indica si se confirman automáticamente los datos después de enviarlos. |
|
Tags |
Las condiciones de filtro del consumidor. Nota
Cuando use la API Watch con etiquetas, asegúrese de que todos los consumidores del mismo grupo utilicen las mismas etiquetas. |
Si ejecuta la etiqueta de datos al usar la API Watch, verá una columna adicional llamada Tags. Por ejemplo:
consumers.list.[0] : Id: ..., Pending: 0, ..., Window: ..., Tags: tags[foo=bar]
Esta columna indica las etiquetas de datos a las que se suscribe el consumidor. Los datos se entregan al consumidor solo cuando cumplen con las condiciones establecidas.
Grupo de consumidores
Un grupo de consumidores es un conjunto de consumidores que se suscriben al servicio de cola con las mismas condiciones de filtro. Los consumidores dentro del mismo grupo no pueden tener el mismo nombre, pero los de grupos distintos sí pueden compartirlo.
Dentro de un mismo grupo, los datos se distribuyen equitativamente entre cada consumidor. Entre grupos diferentes, los datos se envían en paralelo a los consumidores de cada grupo. Por ejemplo:
Los consumidores del mismo grupo reciben datos diferentes.
Los consumidores de grupos distintos reciben los mismos datos.
Si un consumidor elimina datos mediante la API, estos se borran inmediatamente y los consumidores de otros grupos no podrán recibirlos.
Consulte el estado de los consumidores en el servicio de cola mediante la API Attribute. A continuación se muestra un ejemplo:
groups.list.[0] : Id: default_group, Index: 0, Pending: 0, Delivered: 0, Consumers: 1
groups.list.[1] : Id: group, Index: 0, Pending: 0, Delivered: 1, Consumers: 0
groups.list es la lista de consumidores. La siguiente tabla describe las columnas:
|
Parámetro |
Descripción |
|
Id |
El ID del grupo de consumidores. |
|
Index |
El índice que consume el grupo de consumidores actual, que corresponde al mayor índice de los consumidores dentro del grupo. |
|
Pending |
La cantidad de datos en proceso que el grupo de consumidores actual no ha confirmado. |
|
Delivered |
El número de mensajes enviados. |
|
Consumers |
La cantidad de datos consumidos en el grupo de consumidores. |
No existe límite en el número de grupos de consumidores, pero estos no se limpian automáticamente. Una vez creados, conservan su estado.
Uso de consumidores y grupos de consumidores
Declare el consumidor y el grupo de consumidores mediante encabezados HTTP en la API Watch, o bien al inicializar su cliente en el SDK. También puede obtener la clave del encabezado HTTP si utiliza la API Attributes.
meta.header.group : X-EAS-QueueService-Gid
meta.header.user : X-EAS-QueueService-Uid
Declare el ID del consumidor y el ID del grupo de consumidores al que desea unirse mediante X-EAS-QueueService-Uid y X-EAS-QueueService-Gid, respectivamente.
Confirmación y negativo
El servicio de cola admite dos métodos de consumo: Commit y Negative. Ambos operan sobre el índice de datos (Index), pero tienen semánticas diferentes.
Commit indica que el consumidor recibió los datos y completó su procesamiento, por lo que se puede enviar el siguiente lote.
-
Negative indica que el consumidor recibió los datos pero no puede procesarlos. El servicio de cola decide si envía el siguiente lote según el código de error. En el modo Negative, declare la causa y el código de error en texto para que los datos se envíen a otros consumidores. La siguiente tabla enumera los códigos de error especiales que el servicio de cola puede manejar:
Código
Descripción
Shutdown
Indica que el consumidor está saliendo y que el servicio de cola dejará de enviarle datos.
Reequilibrio de datos
Es posible que no pueda confirmar datos en los siguientes escenarios:
Durante una actualización continua del servicio de predicción, algunos consumidores finalizan y quedan datos en proceso que no se pueden confirmar.
Ocurre un error interno y el consumidor falla.
El consumidor no puede procesar los datos recibidos y ejecuta una confirmación negativa (Negative).
El servicio de cola redistribuye estos datos no procesados entre otros consumidores. Este mecanismo se denomina reequilibrio de datos. El reequilibrio se realiza en los siguientes casos:
Cualquier consumidor entra en estado Exit.
El consumidor no recibe nuevos datos aunque la ventana tenga espacio available.
El servicio de cola mantiene un contador de entregas para cada dato. Cada vez que se reequilibra y distribuye un dato, el contador aumenta. Si durante el reequilibrio se detecta que el contador de entregas de un dato superó el máximo permitido, el dato se considera mensaje muerto. El servicio de cola ejecuta entonces la directiva configurada para mensajes muertos. De forma predeterminada, los datos se envían a la cola final.
Cola final
La cola final es una cola auxiliar que almacena datos que no se enviaron a los consumidores (como mensajes muertos o datos de control personalizados). Es una instancia de cola dentro del servicio de cola y utiliza la misma API. Cada cola de entrada y salida tiene su propia cola final.
La cola final y la cola estándar comparten la longitud máxima de la cola. Si la longitud máxima es 10 y la cola estándar ocupa 6 espacios, la cola final podrá tener como máximo 4. Si la cola final está llena, cualquier intento de escritura devolverá un error de longitud de cola. Por ello, supervise y limpie periódicamente la cola final.
Al llamar a la API, declare el acceso a la cola final si agrega el siguiente encabezado HTTP:
X-EAS-QueueService-Access-Rear: true