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 )

  1. Faça o download de uma distribuição Kafka binária (pelo menos V3.1.0).

  2. 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.

  1. 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#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();

    }

}

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.