Définition des quotas Kafka

Les quotas Kafka imposent des limites sur les demandes de production et de consommation pour contrôler les ressources de courtier utilisées par les clients. Les quotas Kafka permettent à un administrateur d'imposer des limites sur le débit du réseau qui peut être consommé par des applications de producteur et de consommateur individuelles.

A propos des quotas Kafka

S'il n'est pas limité, il est possible pour un petit nombre de consommateurs ou de producteurs de monopoliser le débit réseau disponible pour votre instance de service.

Les courtiers Kafka prennent en charge les quotas qui imposent des limites de débit pour empêcher les clients de saturer le réseau ou de monopoliser les ressources de courtier. Pour plus d'informations, voir le DocumentationApache Kafka.

Les quotas Kafka peuvent être configurés pour limiter l'utilisation de la bande passante du réseau. Kafka mesure ce débit en octets par seconde. Si le débit sur une fenêtre de 30 secondes dépasse un quota configuré, Kafka calcule un délai suffisant pour ramener le débit dans la limite du quota.

Les courtiers Kafka envoient ensuite les informations de retard aux clients dans le cadre des réponses de protocole Kafka standard. Un client coopératif, respectant le contrat de protocole, attend ce délai avant de faire de nouvelles demandes ; un client non coopératif peut ne pas respecter la demande de régulation, mais dans ce cas, le courtier ne lit pas les demandes de ce client jusqu'à ce que le délai de régulation soit écoulé (ce qui peut entraîner des délais d'attente sur le client non coopératif).

Les informations suivantes s'appliquent aux quotas:

  • Des quotas distincts peuvent être définis pour les producteurs et les consommateurs.
  • Par défaut, les quotas client sont illimités.
  • Les quotas sont appliqués par courtier plutôt que par cluster.
  • Un quota est appliqué à tous les clients qui partagent une identité d'utilisateur unique.
  • Un quota peut être appliqué à l'utilisateur "par défaut", de sorte qu'il s'applique à n'importe quel utilisateur, même pour lequel aucun quota spécifique à l'utilisateur n'a été défini.

Mesures du client

Le client Java expose également les informations de régulation avec les métriques par courtier suivantes:

  • produits-accélérateur-temps-max
  • produits-accélérateur-temps-moy.
  • fetch-throttle-time-max
  • fetch-throttle-time-moy

Définition des quotas client

Le plan IBM® Event Streams for IBM Cloud® Enterprise permet d'utiliser l'API Kafka pour définir et décrire des quotas sur les clusters Kafka V3.1.x. Pour plus d'informations, voir la section Opérations de quota de l'API REST d'administration IBM® Event Streams for IBM Cloud®.

En référence à la documentation Kafka sur les quotas, seuls les types de quota de débit (types de quota "producer_byte_rate" et "consumer_byte_rate") appliqués à l'entité "user" (ou "default user") sont pris en charge.

Les types de quota "client-id", "request" et "controller-mutation" ne sont pas pris en charge en tant que quotas paramétrables par l'utilisateur. Dans Event Streams, une identité d'utilisateur authentifié est représentée par un ID IBM Cloud® Identity and Access Management. Etant donné que les quotas Kafka sont appliqués par ID Cloud Identity and Access Management, un seul quota peut être partagé par un groupe de clés d'API, s'ils appartiennent tous au même ID de service Cloud Identity and Access Management.

Pour obtenir l'ID Cloud Identity and Access Management d'un ID de service Cloud Identity and Access Management (IAM), vous pouvez utiliser l'interface de ligne de commande IBM Cloud.

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

Voir l'exemple de sortie suivant :

{

    "active":true,

    "jti":"...",

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

    "realmId":"iam",

     ....

}

Mappage de quotas sur un cluster IBM Event Streams Enterprise

Les quotas d'API Kafka sont par courtier, mais la capacité du plan Enterprise est décrite comme un débit par cluster. Par conséquent, si vous souhaitez limiter un utilisateur à 10 Mo / s au total, vous appliquez un quota de 10/n à chaque courtier (où n est le nombre de courtiers dans le cluster).

Pour trouver le nombre de courtiers dans un cluster, vous pouvez utiliser l'appel KafkaAdminClient.describeCluster.

Pour plus d'informations, voir la documentationJava.

Le nombre de courtiers peut également être trouvé à l'aide du script shell kafka-configs.sh intégré dans la distribution Apache Kafka.

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

Autorisation Event Streams

Pour être autorisé à définir des quotas client, un utilisateur doit disposer du rôle Gestionnaire sur la ressource "cluster" dans Cloud Identity and Access Management.

Un ensemble de données d'identification créé avec l'interface utilisateur Event Streams avec le rôle Gestionnaire sur l'instance possède également le rôle Gestionnaire sur le cluster. Ainsi, vous pouvez créer, supprimer et modifier des rubriques en plus de définir des quotas. Tout utilisateur authentifié a un rôle de lecteur implicite sur le cluster et peut décrire les quotas.

Pour créer un ensemble de données d'identification pouvant gérer des sujets, des groupes et participer à des transactions mais qui ne sont pas authentifiées pour définir des quotas, une règle d'accès IAM ayant le rôle de gestionnaire sur les types de ressource "topic", "group" et "txnid" et le rôle de lecteur sur "cluster" doit être associée à l'ID de service.

Exemple: Gestion des quotas avec le script the kafka-config.sh (clientApache )

  1. Téléchargez une distribution binaire Kafka (au moins V3.1.0).

  2. Créez un fichier de propriétés (nommé command-config.properties dans les exemples de lignes de commande suivants), contenant les entrées suivantes (en remplaçant "myapikey" par la clé d'API réelle).

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

Pour en savoir plus, voir Configuration de votre client API Kafka.

  1. Utilisez les exemples d'utilisation suivants.

    • Modifier les quotas de l'utilisateur:
    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
    

    Mise à jour de la configuration de l'utilisateur iam-ServiceId-12345678-aaaa-bbbb-cccc-1234567890ab terminée.

    • Décrire les quotas de l'utilisateur:
    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
    

    Les configurations de quota pour user-principal iam-ServiceId-12345678-aaaa-bbbb-cccc-1234567890ab sont consumer_byte_rate=2048.0 et producer_byte_rate=1024.0.

    • Supprimer les quotas pour l'utilisateur:
    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
    

    Fin de la mise à jour de la configuration pour l'utilisateur iam-ServiceId-12345678-aaaa-bbbb-cccc-1234567890ab.

    • Décrivez tous les quotas qui ont été définis pour n'importe quel utilisateur, y compris l'utilisateur par défaut:
    bin/kafka-configs.sh --command-config command-config.properties --bootstrap-server "kafka-0.blah.cloud:9093" --describe --entity-type users
    
    • Modifiez les quotas pour l'utilisateur par défaut:
    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
    

    La mise à jour de la configuration par défaut pour les utilisateurs du cluster est terminée.

    • Supprimez les quotas pour l'utilisateur par défaut:
    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
    

    La mise à jour de la configuration par défaut pour les utilisateurs du cluster est terminée.

Exemple: modification de l'utilisation des quotas de débit via l'API Java

L'exemple suivant est un court fragment montrant comment appeler la méthode 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();

    }

}

Evénements IBM Cloud Activity Tracker

Chaque fois que des quotas de débit sont mis à jour, un événement de configuration Event Streams est généré, qui peut être surveillé dans IBM Cloud® Activity Tracker.

Pour plus d'informations sur la configuration des événements Activity Tracker pour Event Streams, voir la documentation d'Activity Tracker.