Establecimiento de cuotas de Kafka

Las cuotas de Kafka imponen límites en las solicitudes de producción y consumo para controlar los recursos de intermediario utilizados por los clientes. Las cuotas de Kafka permiten a un administrador imponer límites en el rendimiento de red que pueden consumir las aplicaciones de productor y consumidor individuales.

Acerca de las cuotas de Kafka

Si se deja sin restricciones, es posible que un pequeño número de consumidores o productores monopolizen el rendimiento de red disponible para la instancia de servicio.

Los intermediarios de Kafka dan soporte a cuotas que imponen límites de velocidad para evitar que los clientes saturen la red o monopolizen los recursos del intermediario. Para obtener más información, consulte la Documentación deApache Kafka.

Las cuotas de Kafka se pueden configurar para limitar el uso del ancho de banda de red, Kafka mide este rendimiento en bytes por segundo. Si se encuentra que el rendimiento en una ventana de 30 segundos supera una cuota configurada, Kafka calcula un retardo suficiente para llevar el rendimiento dentro del límite de cuota.

A continuación, los intermediarios de Kafka envían la información de retardo a los clientes como parte de las respuestas de protocolo Kafka estándar. Un cliente cooperativo, respetando el contrato de protocolo, espera este retraso antes de realizar nuevas solicitudes; un cliente no cooperativo puede no respetar la solicitud de regulación, pero en tal caso, el intermediario no lee las solicitudes del cliente hasta que haya transcurrido el retraso de regulación (lo que puede provocar tiempos de espera excedidos en el cliente no cooperativo).

La siguiente información se aplica a las cuotas:

  • Podrán definirse cuotas separadas para productores y consumidores.
  • De forma predeterminada, las cuotas de cliente son ilimitadas.
  • Las cuotas se aplican por intermediario, en lugar de por clúster.
  • Se aplica una cuota a todos los clientes que comparten una única identidad de usuario.
  • Se puede aplicar una cuota al usuario 'default', por lo que se aplica a cualquier usuario, incluso para el que no se ha establecido ninguna cuota específica de usuario.

Métricas de cliente

El cliente Java también expone información de regulación con las siguientes métricas por intermediario:

  • producir-tiempo-regulador-máx
  • producir-regulador-tiempo-promedio
  • capch-throttle-time-max
  • capch-throttle-time-avg

Establecimiento de cuotas de cliente

El plan de empresa IBM® Event Streams for IBM Cloud® permite el uso de la API Kafka para establecer y describir cuotas en clústeres Kafka V3.1.x. Para obtener más información, consulte la sección Operaciones de cuota de la API REST de administración de IBM® Event Streams for IBM Cloud®.

Con referencia a la documentación de Kafka sobre cuotas, solo se da soporte a los tipos de cuota de rendimiento (tipos de cuota "producer_byte_rate" y "consumer_byte_rate") aplicados a la entidad "user" (o el "usuario predeterminado").

Los tipos de cuota "client-id", "request" y "controller-mutation" no están soportados como cuotas configurables por el usuario. En Event Streams, una identidad de usuario autenticada se representa mediante un ID de IBM Cloud® Identity and Access Management. Puesto que las cuotas de Kafka se aplican por ID de Cloud Identity and Access Management, un grupo de claves de API puede compartir una sola cuota, si todas pertenecen al mismo ID de servicio de Cloud Identity and Access Management.

Para obtener el ID de Cloud Identity and Access Management de un ID de servicio de Cloud Identity and Access Management (IAM), se puede utilizar la CLI de IBM Cloud.

ibmcloud iam service-id ServiceId-12345678-aaaa-bbbb-cccc-1234567890ab --output json

Consulte la salida de ejemplo siguiente:

{

    "active":true,

    "jti":"...",

    "iam_id":"iam-ServiceId-12345678-aaaa-bbbb-cccc-1234567890ab",

    "realmId":"iam",

     ....

}

Correlación de cuotas en un clúster de IBM Event Streams Enterprise

Las cuotas de API de Kafka son por intermediario, sin embargo, la capacidad del plan Enterprise se describe como un rendimiento por clúster. Por lo tanto, si desea limitar un usuario a 10 MB/s en total, aplique una cuota de 10/n MB/s a cada intermediario (donde n es el número de intermediarios del clúster).

Para encontrar el número de intermediarios en un clúster, puede utilizar la llamada KafkaAdminClient.describeCluster.

Para obtener más información, consulte la documentación deJava.

El número de intermediarios también se puede encontrar utilizando el script de shell kafka-configs.sh empaquetado en la distribución de Apache Kafka.

bin/kafka-configs.sh --command-config command-config.properties --bootstrap-server "kafka-0.blah.cloud:9093" --describe --entity-type brokers

Autorización de Event Streams

Para tener autorización para establecer cuotas de cliente, un usuario debe tener el rol de Gestor en el recurso "cluster" en Cloud Identity and Access Management.

Un conjunto de credenciales creado con la interfaz de usuario de Event Streams con el rol de gestor en la instancia también tiene el rol de gestor en el clúster. Por lo tanto, puede crear, suprimir y modificar temas además de establecer cuotas. Cualquier usuario autenticado tiene un rol de lector implícito en el clúster y puede describir las cuotas.

Para crear un conjunto de credenciales que puedan gestionar temas, grupos y participar en transacciones, pero que no tengan autorización para establecer cuotas, una política de acceso de IAM que tenga el rol de Gestor en los tipos de recurso "topic", "group" y "txnid" y el rol de Lector en "cluster" deben estar asociados con el ID de servicio.

Ejemplo: Gestión de cuotas con el script the kafka-config.sh (clienteApache )

  1. Descargue una distribución Kafka binaria (al menos V3.1.0).

  2. Cree un archivo de propiedades (denominado command-config.properties en los siguientes ejemplos de líneas de mandatos) que contenga las entradas siguientes (sustituyendo "myapikey" por la clave de API real).

sasl.jaas.config=org.apache.kafka.common.security.plain.PlainLoginModule required username="token" password="myapikey";

security.protocol=SASL_SSL

sasl.mechanism=PLAIN

ssl.protocol=TLSv1.2

ssl.enabled.protocols=TLSv1.2

ssl.endpoint.identification.algorithm=HTTPS

Para obtener más información, consulte Configuración del cliente de API de Kafka.

  1. Trabaje con los siguientes ejemplos de uso.

    • Modificar cuotas para el usuario:
    bin/kafka-configs.sh --command-config command-config.properties --bootstrap-server "kafka-0.blah.cloud:9093" --alter --add-config 'producer_byte_rate=1024,
    consumer_byte_rate=2048' --entity-type users --entity-name iam-ServiceId-12345678-aaaa-bbbb-cccc-1234567890ab
    

    Se ha completado la actualización de la configuración para el usuario iam-ServiceId-12345678-aaaa-bbbb-cccc-1234567890ab.

    • Describir cuotas para el usuario:
    bin/kafka-configs.sh --command-config command-config.properties --bootstrap-server "kafka-0.blah.cloud:9093" --describe --entity-type users --entity-name
    iam-ServiceId-12345678-aaaa-bbbb-cccc-1234567890ab
    

    Las configuraciones de cuota para el usuario principal iam-ServiceId-12345678-aaaa-bbbb-cccc-1234567890ab son consumer_byte_rate=2048.0 y producer_byte_rate=1024.0.

    • Eliminar cuotas para el usuario:
    bin/kafka-configs.sh --command-config command-config.properties --bootstrap-server "kafka-0.blah.cloud:9093" --alter --delete-config       'producer_byte_rate,consumer_byte_rate' --entity-type users --entity-name iam-ServiceId-12345678-aaaa-bbbb-cccc-1234567890ab
    

    Se ha completado la actualización de la configuración para el usuario iam-ServiceId-12345678-aaaa-bbbb-cccc-1234567890ab.

    • Describa todas las cuotas que se han establecido en cualquier usuario, incluido el usuario predeterminado:
    bin/kafka-configs.sh --command-config command-config.properties --bootstrap-server "kafka-0.blah.cloud:9093" --describe --entity-type users
    
    • Modificar cuotas para el usuario predeterminado:
    bin/kafka-configs.sh --command-config command-config.properties --bootstrap-server "kafka-0.blah.cloud:9093" --alter --add-config 'producer_byte_rate=1024,
    consumer_byte_rate=2048' --entity-type users --entity-default
    

    Se ha completado la actualización de la configuración predeterminada para los usuarios del clúster.

    • Eliminar cuotas para el usuario predeterminado:
    bin/kafka-configs.sh --command-config command-config.properties --bootstrap-server "kafka-0.blah.cloud:9093" --alter --delete-config 'producer_byte_rate,
    consumer_byte_rate' --entity-type users --entity-default
    

    Se ha completado la actualización de la configuración predeterminada para los usuarios del clúster.

Ejemplo: Modificación del uso de cuota de rendimiento a través de la API de Java

El ejemplo siguiente es un breve fragmento de código de ejemplo que muestra cómo invocar el método KafkaAdminClient.alterclientQuotas.

https://kafka.apache.org/32/javadoc/org/apache/kafka/clients/admin/KafkaAdminClient.html#alterClientQuotas(java.util.Collection,org.apache.kafka.clients.admin.AlterClientQuotas
Options)

import java.util.*;

import org.apache.kafka.clients.CommonClientConfigs;

import org.apache.kafka.clients.admin.*;

import org.apache.kafka.common.config.*;

import org.apache.kafka.common.quota.*;

class Snippet {

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

        // Kafka client configuration properties.

        String mybootstrap = "...";   // from the bootstrap_endpoints of the service credentials

        String myapikey = "...";      // from the apikey of the service credentials

        Properties properties = new Properties();

        properties.put(CommonClientConfigs.BOOTSTRAP_SERVERS_CONFIG, mybootstrap);

        properties.put(CommonClientConfigs.SECURITY_PROTOCOL_CONFIG, "sasl_ssl");

        properties.put(SslConfigs.SSL_ENABLED_PROTOCOLS_CONFIG, "TLSv1.2");

        properties.put(SslConfigs.SSL_PROTOCOL_CONFIG, "TLSv1.2");

        properties.put(SaslConfigs.SASL_MECHANISM, "PLAIN");

        properties.put(SaslConfigs.SASL_JAAS_CONFIG,

                "org.apache.kafka.common.security.plain.PlainLoginModule " +

                        "required username=\"token\" password=\"" + myapikey + "\";");

        AdminClient admin = AdminClient.create(properties);

        String iamID = "iam-ServiceId-12345678-aaaa-bbbb-cccc-1234567890ab"; //set iam id of target user to set quotas to

        // if null is used instead of the iamID string, the following quota alteration will be applied to the default user

        // add quotas 

        ClientQuotaEntity entity = new ClientQuotaEntity(

                Collections.singletonMap(ClientQuotaEntity.USER, iamID));

        ClientQuotaAlteration alteration = new ClientQuotaAlteration(entity,

                Arrays.asList(new ClientQuotaAlteration.Op("consumer_byte_rate", 1000.0),

                        new ClientQuotaAlteration.Op("producer_byte_rate", 1000.0)));

        admin.alterClientQuotas(Arrays.asList(alteration)).all().get();

        // describe quotas

        DescribeClientQuotasResult describeClientQuotasFuture = admin.describeClientQuotas(ClientQuotaFilter.all());

        System.out.println(describeClientQuotasFuture.entities().get());

        //remove quotas (set them to null)

        entity = new ClientQuotaEntity(Collections.singletonMap(ClientQuotaEntity.USER, iamID));

        alteration = new ClientQuotaAlteration(entity,

                Arrays.asList(new ClientQuotaAlteration.Op("consumer_byte_rate", null),

                        new ClientQuotaAlteration.Op("producer_byte_rate", null)));

        admin.alterClientQuotas(Arrays.asList(alteration)).all().get();

    }

}

Sucesos de IBM Cloud Activity Tracker

Siempre que se actualizan las cuotas de rendimiento, se genera un suceso de configuración Event Streams, que se puede supervisar en IBM Cloud® Activity Tracker.

Para obtener más información sobre cómo configurar sucesos de Activity Tracker para Event Streams, consulte la documentación de Activity Tracker.