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 )
-
Téléchargez une distribution binaire Kafka (au moins V3.1.0).
-
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.
-
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
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.