Kafka-Kontingente festlegen
Kafka-Kontingente erzwingen Grenzwerte für Erzeugungs-und Konsumentenanforderungen, um die von Clients verwendeten Brokerressourcen zu steuern. Mit Kafka-Kontingenten kann ein Administrator Grenzwerte für den Netzdurchsatz erzwingen, der von einzelnen
Erzeuger-und Konsumentenanwendungen genutzt werden kann.
Informationen zu Kafka-Kontingenten
Ohne Einschränkungen ist es für eine kleine Anzahl von Konsumenten oder Produzenten möglich, den verfügbaren Netzdurchsatz für Ihre Serviceinstanz zu monopolisieren.
Kafka-Broker unterstützen Kontingente, die Ratenbegrenzungen erzwingen, um zu verhindern, dass Clients das Netz auslasten oder Brokerressourcen monopolisieren. Weitere Informationen finden Sie im
Dokumentation zuApache Kafka.
Kafka-Kontingente können konfiguriert werden, um die Netzbandbreitennutzung zu begrenzen. Kafka misst diesen Durchsatz in Byte pro Sekunde. Wenn festgestellt wird, dass der Durchsatz über 30 Sekunden ein konfiguriertes Kontingent überschreitet,
berechnet Kafka eine ausreichende Verzögerung, um den Durchsatz innerhalb des Kontingentgrenzwerts zu erreichen.
Kafka-Broker senden anschließend die Verzögerungsinformationen als Teil der Standardantworten des Kafka-Protokolls an Clients. Ein kooperativer Client, der den Protokollvertrag respektiert, wartet auf diese Verzögerung, bevor er neue Anforderungen
stellt. Ein nicht kooperativer Client berücksichtigt die Regulierungsanforderung möglicherweise nicht, aber in einem solchen Fall liest der Broker die Anforderungen dieses Clients erst, wenn die Regulierungsverzögerung abgelaufen ist (was
zu Zeitlimitüberschreitungen beim nicht kooperativen Client führen kann).
Die folgenden Informationen gelten für Kontingente:
- Für Erzeuger und Verbraucher können getrennte Quoten festgelegt werden.
- Standardmäßig sind Clientkontingente unbegrenzt.
- Kontingente werden pro Broker und nicht pro Cluster angewendet.
- Ein Kontingent wird auf alle Clients angewendet, die eine einzige Benutzeridentität gemeinsam nutzen.
- Ein Kontingent kann auf den Standardbenutzer angewendet werden, sodass es für jeden Benutzer gilt, auch wenn kein benutzerspezifisches Kontingent festgelegt wurde.
Clientmetriken
Der Java-Client stellt auch Regulierungsinformationen mit den folgenden brokerspezifischen Messwerten bereit:
- produzieren-drosseln-zeit-max
- PRODUZIEREN-REGULIEREN-ZEIT-DURCHSCHN.
- fetch-throttle-time-max
- fetch-throttle-time-avg
Clientkontingente festlegen
Der Unternehmensplan IBM® Event Streams for IBM Cloud® ermöglicht die Verwendung der API Kafka zum Festlegen und Beschreiben von Kontingenten in Kafka V3.1.x-Clustern. Weitere Informationen finden Sie im Abschnitt Kontingentoperationen der REST-Verwaltungs-API IBM® Event Streams for IBM Cloud®.
Mit Bezug auf die Kafka-Dokumentation zu Kontingenten werden nur Durchsatzkontingenttypen (Kontingenttypen "producer_byte_rate" und "consumer_byte_rate") unterstützt,
die auf die Entität "user" (oder den Standardbenutzer) angewendet werden.
Die Kontingenttypen "client-id", "request" und "controller-mutation" werden nicht als vom Benutzer festlegbare Kontingente unterstützt. In Event Streamswird eine authentifizierte Benutzeridentität durch eine IBM
Cloud® Identity and Access Management-ID dargestellt. Da Kafka-Quoten pro Cloud Identity and Access Management-ID angewendet werden, kann ein einzelnes Kontingent von einer Gruppe von API-Schlüsseln gemeinsam genutzt werden, wenn alle zu derselben
Cloud Identity and Access Management-Service-ID gehören.
Zum Abrufen der Cloud Identity and Access Management-ID einer Cloud Identity and Access Management (IAM)-Service-ID kann die IBM Cloud-CLI verwendet werden.
ibmcloud iam service-id ServiceId-12345678-aaaa-bbbb-cccc-1234567890ab --output json
Nachfolgend sehen Sie eine Beispielausgabe:
{
"active":true,
"jti":"...",
"iam_id":"iam-ServiceId-12345678-aaaa-bbbb-cccc-1234567890ab",
"realmId":"iam",
....
}
Kontingente einem IBM Event Streams Enterprise-Cluster zuordnen
Die Kafka-API-Kontingente sind pro Broker, aber die Kapazität des Enterprise-Plans wird als Durchsatz pro Cluster beschrieben. Wenn Sie
einen Benutzer auf insgesamt 10 MB/s begrenzen möchten, wenden Sie daher ein Kontingent von 10/n MB/s auf jeden Broker an (wobei n die Anzahl der Broker im Cluster ist).
Mit dem Aufruf KafkaAdminClient.describeCluster können Sie die Anzahl der Broker in einem Cluster ermitteln.
Weitere Informationen finden Sie in der Java-Dokumentation.
Die Anzahl der Broker kann auch mithilfe des Shell-Scripts kafka-configs.sh ermittelt werden, das in der Apache Kafka-Distribution gebündelt ist.
bin/kafka-configs.sh --command-config command-config.properties --bootstrap-server "kafka-0.blah.cloud:9093" --describe --entity-type brokers
Event Streams-Berechtigung
Damit ein Benutzer berechtigt ist, Clientkontingente festzulegen, muss er über die Rolle "Manager" für die Ressource "cluster" in Cloud Identity and Access Managementverfügen.
Eine Gruppe von Berechtigungsnachweisen, die mit der Benutzerschnittstelle Event Streams mit der Rolle 'Manager' für die Instanz erstellt wurden, hat auch die Rolle 'Manager' für den Cluster. Auf diese Weise können Sie Themen zusätzlich zum
Festlegen von Kontingenten erstellen, löschen und ändern. Jeder authentifizierte Benutzer hat eine implizierte Leserrolle im Cluster und kann Kontingente beschreiben.
Um eine Gruppe von Berechtigungsnachweisen zu erstellen, die Topics und Gruppen verwalten und an Transaktionen teilnehmen können, aber nicht autorisiert sind, um Kontingente festzulegen, muss der Service-ID eine IAM-Zugriffsrichtlinie mit der
Rolle "Manager" für die Ressourcentypen "topic", "group" und "txnid" und die Rolle "Reader" für "cluster" zugeordnet sein.
Beispiel: Kontingente mit dem Script the kafka-config.sh verwalten (Apache-Client)
-
Laden Sie eine Kafka binäre Verteilung herunter (mindestens V3.1.0).
-
Erstellen Sie eine Eigenschaftendatei (in den folgenden Befehlszeilenbeispielen command-config.properties ), die die folgenden Einträge enthält (ersetzen Sie "myapikey" durch den tatsächlichen API-Schlüssel).
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
Weitere Informationen finden Sie in Kafka-API-Client konfigurieren.
-
Verwenden Sie die folgenden Verwendungsbeispiele.
- Kontingente für Benutzer ändern:
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
Aktualisierung der Konfiguration für Benutzer iam-ServiceId-12345678-aaaa-bbbb-cccc-1234567890ab abgeschlossen.
- Kontingente für Benutzer beschreiben:
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
Die Kontingentkonfigurationen für Benutzer-Principal iam-ServiceId-12345678-aaaa-bbbb-cccc-1234567890ab sind consumer_byte_rate=2048.0 und producer_byte_rate=1024.0.
- Kontingente für Benutzer entfernen:
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
Aktualisierung der Konfiguration für Benutzer iam-ServiceId-12345678-aaaa-bbbb-cccc-1234567890ab abgeschlossen.
- Beschreiben Sie alle Kontingente, die auf einen beliebigen Benutzer festgelegt wurden, einschließlich des Standardbenutzers:
bin/kafka-configs.sh --command-config command-config.properties --bootstrap-server "kafka-0.blah.cloud:9093" --describe --entity-type users
- Ändern Sie Kontingente für den Standardbenutzer:
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
Die Aktualisierung der Standardkonfiguration für Benutzer im Cluster ist abgeschlossen.
- Entfernen Sie Kontingente für den Standardbenutzer:
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
Die Aktualisierung der Standardkonfiguration für Benutzer im Cluster ist abgeschlossen.
Beispiel: Durchsatzkontingentnutzung über die Java-API ändern
Das folgende Beispiel zeigt ein kurzes Beispielsnippet, das zeigt, wie die Methode KafkaAdminClient.alterclientQuotas aufgerufen wird.
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();
}
}
IBM Cloud Activity Tracker-Ereignisse
Wenn Durchsatzquoten aktualisiert werden, wird ein Event Streams-Konfigurationsereignis generiert, das in IBM Cloud® Activity Trackerüberwacht werden kann.
Weitere Informationen zum Konfigurieren von Activity Tracker-Ereignissen für Event Streamsfinden Sie in der Dokumentation zu Activity Tracker.