Configurando Cotas Kafka
As cotas do Kafka impingem limites nas solicitações de produção e consumo para controlar os recursos do broker usados pelos clientes Kafka cotas habilitam um administrador a impor limites no rendimento de rede que pode ser consumido por produtor
individual e aplicativos de consumo.
Sobre as cotas Kafka
Se deixada sem restrições, é possível que um pequeno número de consumidores ou produtores monopolize o rendimento de rede disponível para a sua instância de serviço.
Kafka intermediários suportam cotas que impõem limites de taxa para evitar que os clientes saturem a rede ou monopolizem os recursos do intermediário. Para obter mais informações, consulte o
Apache Kafka..
Kafka cotas podem ser configuradas para limitar o uso de largura de banda da rede, Kafka mede este rendimento em bytes por segundo. Se rendimento acima de uma janela de 30 second é encontrado para exceder uma cota configurada, Kafka calcula
um atraso suficiente para trazer rendimento dentro do limite de cotas.
Os corretores Kafka então enviam as informações de atraso para os clientes como parte das respostas do protocolo padrão Kafka. Um cliente cooperativo, respeitando o contrato de protocolo, aguarda por esse atraso antes de fazer novos pedidos;
um cliente não cooperativo pode não respeitar a solicitação de regulagem, mas, em tal caso, o corretor não lê os pedidos do cliente até que o atraso de regulagem tenha decorrido (o que pode causar tempos de descontração no cliente não cooperativo).
As informações a seguir são aplicáveis às cotas:
- Podem ser definidas cotas separadas para produtores e consumidores.
- Por padrão, as cotas do cliente são ilimitadas.
- As cotas são aplicadas por intermediário, em vez de por cluster.
- Uma cota é aplicada a todos os clientes que compartilham uma única identidade de usuário.
- Uma cota pode ser aplicada ao usuário 'padrão', portanto, ela se aplica a qualquer usuário, mesmo para quem nenhuma cota específica do usuário foi definida.
Métricas do Cliente
O cliente Java também expõe informações de regulagem com as seguintes métricas por intermediário:
- produzir-throttle-time-max
- produzir-throttle-time-avg
- busca-regulagem-tempo-máx
- busca-regulagem-tempo-avg
Configurando cotas do cliente
O plano corporativo IBM® Event Streams for IBM Cloud® permite o uso da API Kafka para configurar e descrever cotas em clusters Kafka V3.1.x. Para obter mais informações, consulte a seção Operações de cota da API de REST do administrador do IBM® Event Streams for IBM Cloud®.
Com referência à documentação Kafka sobre cotas, apenas os tipos de cotas de rendimento ("producer_byte_rate" e os tipos de cotas "consumer_byte_rate") aplicados
à entidade "user" (ou o "usuário padrão") são suportados.
A entidade "cliente-id", o "request" e os tipos de cotas "controller-mutation" não são suportados como cotas setáveis pelo usuário. Em Event Streams, uma identidade de usuário autenticada é representada por um ID
IBM Cloud® Identity and Access Management. Como as cotas Kafka são aplicadas por Cloud Identity and Access Management ID, uma cota única pode ser compartilhada por um grupo de chaves API, se estas todas pertencem ao mesmo ID de serviço Cloud
Identity and Access Management.
Para obter o ID Cloud Identity and Access Management de um ID de serviço Cloud Identity and Access Management (IAM), a CLI IBM Cloud pode ser usada.
ibmcloud iam service-id ServiceId-12345678-aaaa-bbbb-cccc-1234567890ab --output json
Veja a saída de exemplo a seguir:
{
"active":true,
"jti":"...",
"iam_id":"iam-ServiceId-12345678-aaaa-bbbb-cccc-1234567890ab",
"realmId":"iam",
....
}
Mapeando cotas para um cluster do IBM Event Streams Enterprise
As cotas da API Kafka são por intermediário, no entanto a capacidade de plano Enterprise é descrita como um per-cluster throughput. Portanto,
se você deseja limitar um usuário a 10 MB/s no total, você aplica uma cota de 10/n MB/s a cada intermediário (onde n é o número de intermediários no cluster).
Para encontrar o número de intermediários em um cluster, você pode usar a chamada KafkaAdminClient.describeCluster.
Para obter mais informações, consulte a documentação Java.
O número de intermediários também pode ser encontrado usando o script shell kafka-configs.sh empacotado na distribuição Apache Kafka.
bin/kafka-configs.sh --command-config command-config.properties --bootstrap-server "kafka-0.blah.cloud:9093" --describe --entity-type brokers
Event Streams autorização
Para ser autorizado a configurar cotas de clientes, um usuário deve ter a função Gerente no recurso "cluster" em Cloud Identity and Access Management.
Um conjunto de credenciais criado com a UI Event Streams com a função Gerente na instância também tem o papel de Gerente no cluster. Assim, você é capaz de criar, excluir e alterar tópicos além de configurar cotas. Qualquer usuário autenticado
tem um papel de Reader implícito no cluster e é capaz de descrever cotas.
Para criar um conjunto de credenciais que podem gerenciar tópicos, grupos e participar de transações mas não são authrorizados para configurar cotas, uma política de acesso IAM que tem função de Gerente em tipos de recursos "tópico",
"grupo" e "txnid" e Reader em "cluster" deve ser associada ao ID de serviço.
Exemplo: Gerenciando cotas com script the kafka-config.sh (clienteApache )
-
Faça o download de uma distribuição Kafka binária (pelo menos V3.1.0).
-
Crie um arquivo de propriedades (denominado command-config.properties nos exemplos de linhas de comandos a seguir), contendo as entradas a seguir (substituindo "myapikey" pela chave 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 obter mais informações, consulte Configurando a API do seu cliente Kafka.
-
Trabalhe com os exemplos de uso a seguir.
- Alterar cotas para o usuário:
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
Concluída a configuração de atualização para o usuário iam-ServiceId-12345678-aaaa-bbbb-cccc-1234567890ab.
- Descrever cotas para o usuário:
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
As configurações de cotas para o usuário-principal iam-ServiceId-12345678-aaaa-bbbb-cccc-1234567890ab são consumer_byte_rate=2048.0 e producer_byte_rate=1024.0.
- Remover cotas para o usuário:
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
Configuração de atualização concluída para o usuário iam-ServiceId-12345678-aaaa-bbbb-cccc-1234567890ab.
- Descreva todas as cotas que foram definidas para qualquer usuário, incluindo o usuário padrão:
bin/kafka-configs.sh --command-config command-config.properties --bootstrap-server "kafka-0.blah.cloud:9093" --describe --entity-type users
- Alterar cotas para o usuário padrão:
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
Concluída a configuração padrão de atualização para usuários no cluster.
- Remover cotas para o usuário padrão:
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
Concluída a configuração padrão de atualização para usuários no cluster.
Exemplo: Alter rendimento de cota de transferência através da API Java
O exemplo a seguir é um trecho de amostra curto mostrando como chamar o método 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();
}
}
Eventos do IBM Cloud Activity Tracker
Sempre que as cotas de rendimento são atualizadas, um evento de configuração Event Streams é gerado, que pode ser monitorado em IBM Cloud® Activity Tracker.
Para obter mais informações sobre como configurar Activity Tracker eventos para Event Streams, veja a documentação do rastreador de atividades.