Migrar do Kafka para o Pub/Sub Lite

Este documento é útil se você estiver pensando em migrar do Apache Kafka autogerenciado para o Pub/Sub Lite.

Visão geral do Pub/Sub Lite

O Pub/Sub Lite é um serviço de mensagens com alto volume criado para baixo custo de operação. O Pub/Sub Lite oferece armazenamento zonal e regional, além de capacidade pré-provisionada. No Pub/Sub Lite, é possível escolher tópicos Lite zonais ou regionais. Os tópicos regionais Lite oferecem o mesmo SLA de disponibilidade dos tópicos do Pub/Sub. No entanto, há diferenças de confiabilidade entre o Pub/Sub e o Pub/Sub Lite em termos de replicação de mensagens.

Para saber mais sobre o Pub/Sub e o Pub/Sub Lite, consulte O que é o Pub/Sub.

Para saber mais sobre as regiões e zonas com suporte para o Lite, consulte Locais do Pub/Sub Lite.

Terminologia no Pub/Sub Lite

Confira a seguir alguns termos-chave do Pub/Sub Lite.

  • Mensagem. Dados que são transferidos pelo serviço do Pub/Sub Lite.

  • Tópico. Um recurso nomeado que representa um feed de mensagens. No Pub/Sub Lite, é possível criar um tópico Lite regional ou zonal. Os tópicos regionais do Pub/Sub Lite armazenam dados em duas zonas de uma única região. Os tópicos zonais do Pub/Sub Lite replicam dados em apenas uma zona.

  • Reserva. Um pool nomeado de capacidade de processamento compartilhado por vários tópicos do Lite em uma região.

  • Assinatura: um recurso nomeado que representa um interesse em receber mensagens de um tópico específico do Lite. Uma assinatura é semelhante a um grupo de consumidores no Kafka que se conecta apenas a um único tópico.

  • Assinante. Um cliente do Pub/Sub Lite que recebe mensagens de um tópico do Lite e de uma assinatura especificada. Uma assinatura pode ter vários clientes de assinantes. Nesse caso, as mensagens são equilibradas entre os clientes assinantes. No Kafka, um assinante é chamado de consumidor.

  • Editor. Um aplicativo que cria mensagens e as envia (publica) em um tópico específico do Lite. Um tópico pode ter vários editores. No Kafka, um editor é chamado de produtor.

Diferenças entre o Kafka e o Pub/Sub Lite

Embora o Pub/Sub Lite seja conceitualmente semelhante ao Kafka, ele é um sistema diferente com uma API mais restrita e mais focada na ingestão de dados. Embora as diferenças sejam irrelevantes para a transferência e o processamento de streams, há alguns casos de uso específicos em que essas diferenças são importantes.

O Kafka como um banco de dados

Ao contrário do Kafka, o Pub/Sub Lite não oferece suporte a publicação transacional ou compactação de registros, embora ofereça suporte à idempotencia. Esses recursos do Kafka são mais úteis quando você usa o Kafka como um banco de dados do que como um sistema de mensagens. Se você usa o Kafka principalmente como um banco de dados, considere executar seu próprio cluster Kafka ou usar uma solução Kafka gerenciada, como o Confluent Cloud. Se nenhuma dessas soluções for uma opção, considere usar um banco de dados escalonável horizontalmente, como o Cloud Spanner.

Fluxos do Kafka

O Kafka Streams é um sistema de processamento de dados criado com base no Kafka. Embora ele permita a injeção de clientes de consumo, ele exige acesso a todas as operações de administrador. O Kafka Streams também usa as propriedades do banco de dados transacional do Kafka para armazenar metadados internos. Portanto, o Pub/Sub Lite não pode ser usado atualmente para aplicativos do Kafka Streams.

O Apache Beam é um sistema de processamento de dados de streaming semelhante, integrado ao Kafka, ao Pub/Sub e ao Pub/Sub Lite. É possível executar pipelines do Beam de maneira totalmente gerenciada com o Dataflow ou em clusters do Apache Flink e do Apache Spark (links em inglês).

Monitoramento

Os clientes do Kafka podem ler métricas do lado do servidor. No Pub/Sub Lite, as métricas relevantes para o comportamento do editor e do assinante são gerenciadas pelo Cloud Monitoring sem configuração adicional.

Gerenciamento de capacidade

A capacidade de um tópico do Kafka é determinada pela capacidade do cluster. A replicação, a compactação de chaves e as configurações em lote determinam a capacidade necessária para atender a qualquer tópico no cluster do Kafka. A capacidade de um tópico do Kafka é limitada pela capacidade das máquinas em que os agentes estão em execução. Por outro lado, você precisa definir a capacidade de armazenamento e de throughput para um tópico do Pub/Sub Lite. A capacidade de armazenamento do Pub/Sub Lite é uma propriedade configurável do tópico. A capacidade de throughput é baseada na capacidade da reserva configurada e nos limites inerentes ou configurados por partição.

Autenticação e segurança

O Apache Kafka oferece suporte a vários mecanismos de autenticação e criptografia abertos. Com o Pub/Sub Lite, a autenticação é baseada no sistema IAM. A segurança é garantida pela criptografia em repouso e em trânsito. Leia mais sobre a autenticação do Pub/Sub Lite na seção "Fluxo de trabalho de migração", mais adiante neste documento.

Mapear propriedades do Kafka para propriedades do Pub/Sub Lite

O Kafka tem muitas opções de configuração que controlam a estrutura do tópico, os limites e as propriedades do agente. Alguns comuns úteis para ingestão de dados são discutidos nesta seção, com os equivalentes no Pub/Sub Lite. Como o Pub/Sub Lite é um sistema gerenciado, não é necessário considerar muitas propriedades do corretor.

Propriedades de configuração do tópico

Propriedade do Kafka Propriedade do Pub/Sub Lite Descrição
retention.bytes Armazenamento por partição Todas as partições em um tópico do Lite têm a mesma capacidade de armazenamento configurada. A capacidade total de armazenamento de um tópico do Lite é a soma da capacidade de armazenamento de todas as partições no tópico.
retention.ms Período de armazenamento de mensagens O tempo máximo que um tópico do Lite armazena mensagens. Se você não especificar um período de armazenamento de mensagens, o tópico do Lite vai armazenar mensagens até exceder a capacidade de armazenamento.
flush.ms, acks Não é possível configurar no Pub/Sub Lite As publicações não são confirmadas até que sejam garantidas no armazenamento replicado.
max.message.bytes Não é possível configurar no Pub/Sub Lite 3,5 MiB é o tamanho máximo da mensagem que pode ser enviada ao Pub/Sub Lite. Os tamanhos das mensagens são calculados de uma maneira repetível.
message.timestamp.type Não é possível configurar no Pub/Sub Lite Ao usar a implementação do consumidor, o carimbo de data/hora do evento é escolhido quando está presente ou o carimbo de data/hora de publicação é usado em vez dele. Os carimbos de data/hora de publicação e de evento estão disponíveis ao usar o Beam.

Para saber mais sobre as propriedades do tópico do Lite, consulte Propriedades de um tópico do Lite.

Propriedades de configuração do produtor

O Pub/Sub Lite oferece suporte ao protocolo de fio do produtor. Algumas propriedades mudam o comportamento das bibliotecas de cliente do Cloud do produtor. Algumas comuns são discutidas na tabela a seguir.

Propriedade do Kafka Propriedade do Pub/Sub Lite Descrição
auto.create.topics.enable Não é possível configurar no Pub/Sub Lite Crie um tópico e uma assinatura que sejam aproximadamente equivalentes a um grupo de consumidores para um único tópico no Pub/Sub Lite. Use o console, CLI gcloud, a API ou as bibliotecas de cliente do Cloud.
key.serializer, value.serializer Não é possível configurar no Pub/Sub Lite

Obrigatório ao usar o Kafka Producer ou a biblioteca equivalente que se comunica usando o protocolo de transmissão.

batch.size Suporte no Pub/Sub Lite O processamento em lote é aceito. O valor recomendado para esse valor é de 10 MiB para melhor desempenho.
linger.ms Suporte no Pub/Sub Lite O processamento em lote é aceito. O valor recomendado para esse valor é 50 ms para melhor desempenho.
max.request.size Suporte no Pub/Sub Lite O servidor impõe um limite de 20 MiB por lote. Defina esse valor como menor que 20 MiB no cliente Kafka.
enable.idempotence Suporte no Pub/Sub Lite
compression.type Não tem suporte no Pub/Sub Lite Defina esse valor explicitamente como none.

Propriedades de configuração do consumidor

O Pub/Sub Lite oferece suporte ao protocolo de linha do consumidor. Algumas propriedades mudam o comportamento das bibliotecas de cliente do consumidor do Cloud. Algumas delas são discutidas na tabela a seguir.

Propriedade do Kafka Descrição
key.deserializer, value.deserializer

Obrigatório ao usar o consumidor do Kafka ou uma biblioteca equivalente que se comunica usando o protocolo de transmissão.

auto.offset.reset Essa configuração não é necessária nem compatível. As assinaturas têm um local de deslocamento definido após a criação.
message.timestamp.type O carimbo de data/hora de publicação está sempre disponível no Pub/Sub Lite e não diminui em cada partição. Os carimbos de data/hora do evento podem ou não estar presentes, dependendo se eles foram anexados à mensagem quando ela foi publicada. Os carimbos de data/hora de publicação e de evento estão disponíveis ao mesmo tempo ao usar o Dataflow.
max.partition.fetch.bytes, max.poll.records Impõe um limite flexível ao número de registros e bytes retornados de chamadas de poll() e ao número de bytes retornados de solicitações de busca internas. O padrão de "max.partition.fetch.bytes" de 1 MiB pode limitar a capacidade de processamento do cliente. Considere aumentar esse valor.

Comparar os recursos do Kafka e do Pub/Sub Lite

A tabela a seguir compara os recursos do Apache Kafka com os do Pub/Sub Lite:

Recurso Kafka Pub/Sub Lite
Ordenação das mensagens Sim Sim
Eliminação de mensagens duplicadas Sim Sim, usando o Dataflow
Enviar inscrições Não Sim, usando a exportação do Pub/Sub
Transações Sim Não
Armazenamento de mensagens Limitado pelo armazenamento de máquina disponível Ilimitado
Repetição da mensagem Sim Sim
Geração de registros e monitoramento Autogerenciado Automatizado com o Cloud Monitoring
Processamento de stream Sim, com o Kafka Streams, o Apache Beam ou o Dataproc. Sim, com o Beam ou o Dataproc.

A tabela a seguir compara qual funcionalidade é hospedada automaticamente com o Kafka e qual é gerenciada pelo Google usando o Pub/Sub Lite:

Recurso Kafka Pub/Sub Lite
Disponibilidade Implante o Kafka manualmente em outros locais. Implantado em todo o mundo. Consulte locais.
Recuperação de desastres Projete e mantenha seu próprio backup e replicação. Gerenciado pelo Google.
Gerenciamento de infraestrutura Implementar e operar manualmente máquinas virtuais (VMs) ou máquinas. Mantenha versões e patches consistentes. Gerenciado pelo Google.
Planejamento de capacidade Planeje manualmente as necessidades de armazenamento e computação com antecedência. Gerenciado pelo Google. É possível aumentar a capacidade de computação e o armazenamento a qualquer momento.
Suporte Nenhuma. Suporte 24 horas por telefone e equipe disponível.

Comparação de custo do Kafka e do Pub/Sub Lite

A maneira como você estima e gerencia os custos no Pub/Sub Lite é diferente da Kafka. Os custos de um cluster do Kafka no local ou na nuvem incluem o custo de máquinas, discos, redes, mensagens de entrada e saída. Ele também inclui custos gerais de gerenciamento e manutenção desses sistemas e da infraestrutura relacionada. Ao gerenciar um cluster Kafka, é necessário fazer upgrade manual das máquinas, planejar a capacidade do cluster e implementar a recuperação de desastres, que inclui planejamento e teste extensivos. É preciso agregar todos esses custos para determinar o verdadeiro custo total de propriedade (TCO).

Os preços do Pub/Sub Lite incluem o custo de reserva (bytes publicados, bytes inscritos, bytes processados pelo proxy do Kafka) e o custo do armazenamento provisionado. Você paga exatamente pelos recursos que reservar, além das cobranças de mensagens enviadas. Use a calculadora de preços para estimar os custos.

Fluxo de trabalho de migração

Para migrar um tópico de um cluster do Kafka para o Pub/Sub Lite, siga as instruções abaixo.

Configurar recursos do Pub/Sub Lite

  1. Crie uma reserva do Pub/Sub Lite para a taxa de transferência esperada de todos os tópicos que você está migrando.

    Use a calculadora de preços do Pub/Sub Lite para calcular as métricas de throughput agregado dos seus tópicos do Kafka. Para mais informações sobre como criar reservas, consulte Criar e gerenciar reservas do Lite.

  2. Crie um tópico do Pub/Sub Lite para cada tópico correspondente no Kafka.

    Para mais informações sobre como criar tópicos do Lite, consulte Criar e gerenciar tópicos do Lite.

  3. Crie uma assinatura do Pub/Sub Lite para cada par de tópico e grupo de consumidores correspondente no cluster do Kafka.

    Por exemplo, para um grupo de consumidores chamado consumers que consome de topic-a e topic-b, é necessário criar uma assinatura consumers-a anexada a topic-a e uma assinatura consumers-b anexada a topic-b. Para mais informações sobre como criar assinaturas, consulte Criar e gerenciar assinaturas do Lite.

Fazer autenticação no Pub/Sub Lite

Com base no tipo do cliente Kafka, escolha um dos seguintes métodos:

Clientes Kafka baseados em Java versão 3.1.0 ou mais recente com reconstrução

Para clientes Kafka baseados em Java da versão 3.1.0 ou mais recente que podem ser recriados na instância em que você está executando o cliente Kafka:

  1. Instale o pacote com.google.cloud:pubsublite-kafka-auth.

  2. Receba os parâmetros necessários para autenticação no Pub/Sub Lite com a ajuda de com.google.cloud.pubsublite.kafka.ClientParameters.getParams.

    O método getParams() (confira um exemplo de código ) inicializa as seguintes configurações de JAAS e SASL como parâmetros para autenticação no Pub/Sub Lite:

    security.protocol=SASL_SSL
    sasl.mechanism=OAUTHBEARER
    sasl.oauthbearer.token.endpoint.url=http://localhost:14293
    sasl.jaas.config=org.apache.kafka.common.security.oauthbearer.secured.OAuthBearerLoginCallbackHandler
    

Clientes do Kafka baseados em Java que executam a versão 3.1.0 ou mais recente sem precisar ser recriados

Para clientes Kafka compatíveis com KIP-768, oferecemos suporte à autenticação OAUTHBEARER somente de configuração que usa um script sidecar Python. Essas versões incluem a de janeiro de 2022 Java versão 3.1.0 ou mais recente.

Siga as etapas abaixo na instância em que você está executando o cliente do Kafka:

  1. Instale o Python 3.6 ou uma versão mais recente.

    Consulte Como instalar o Python.

  2. Instale o pacote de autenticação do Google: pip install google-auth

    Essa biblioteca simplifica os vários mecanismos de autenticação de servidor para servidor para acessar as APIs do Google. Consulte a página google-auth.

  3. Execute o script kafka_gcp_credentials.py.

    Esse script inicia um servidor HTTP local e extrai as credenciais padrão do Google Cloud no ambiente usando google.auth.default().

    O principal nas credenciais buscadas precisa ter a permissão pubsublite.locations.openKafkaStream para o projeto do Google Cloud que você está usando e o local ao qual você está se conectando. Os papéis de editor do Pub/Sub Lite (roles/pubsublite.publisher) e assinante do Pub/Sub Lite (roles/pubsublite.subscriber) têm essa permissão necessária. Adicione esses papéis ao seu principal.

    As credenciais são usadas na autenticação SASL/OAUTHBEARER para o cliente Kafka.

    Os parâmetros a seguir são necessários nas suas propriedades para autenticar no Pub/Sub Lite pelo cliente Kafka:

    security.protocol=SASL_SSL
    sasl.mechanism=OAUTHBEARER
    sasl.oauthbearer.token.endpoint.url=localhost:14293
    sasl.login.callback.handler.class=org.apache.kafka.common.security.oauthbearer.secured.OAuthBearerLoginCallbackHandler
    sasl.jaas.config=org.apache.kafka.common.security.oauthbearer.OAuthBearerLoginModule \
      required clientId="unused" clientSecret="unused" \
      extension_pubsubProject="PROJECT_ID";
    

    Substitua PROJECT_ID pelo ID do projeto que executa o Pub/Sub Lite.

Todos os outros clientes sem reconstrução

Para todos os outros clientes, siga estas etapas:

  1. Faça o download de um arquivo JSON da chave da conta de serviço para a conta de serviço que você pretende usar no cliente.

  2. Codifique o arquivo da conta de serviço usando a codificação base64 como sua string de autenticação.

    Em sistemas Linux ou macOS, use o comando base64 (geralmente instalado por padrão) da seguinte maneira:

    base64 < my_service_account.json > password.txt
    

    É possível usar o conteúdo do arquivo de senha para autenticação com os parâmetros a seguir.

    Java

    security.protocol=SASL_SSL
    sasl.mechanism=PLAIN
    sasl.jaas.config=org.apache.kafka.common.security.plain.PlainLoginModule required \
     username="PROJECT_ID" \
     password="contents of base64 encoded password file";
    

    Substitua PROJECT_ID pelo ID do projeto que executa o Pub/Sub.

    librdkafka

    security.protocol=SASL_SSL
    sasl.mechanism=PLAIN
    sasl.username=PROJECT_ID
    sasl.password=contents of base64 encoded password file
    

    Substitua PROJECT_ID pelo ID do projeto que executa o Pub/Sub.

Clonar dados usando o Kafka Connect

A equipe do Pub/Sub Lite mantém uma implementação de um coletor do Kafka Connect. É possível configurar essa implementação para copiar dados de um tópico do Kafka para um tópico do Pub/Sub Lite usando um cluster do Kafka Connect.

Para configurar o conector para realizar a cópia de dados, consulte Conector do Kafka do grupo do Pub/Sub.

Se você quiser garantir que a afinidade de partição não seja afetada pelo processo de migração, verifique se o tópico do Kafka e o do Pub/Sub Lite têm o mesmo número de partições e se a propriedade pubsublite.ordering.mode está definida como KAFKA. Isso faz com que o conector roteie mensagens para a partição do Pub/Sub Lite com o mesmo índice da partição do Kafka em que elas foram publicadas originalmente.

Migrar consumidores

O modelo de recursos do Pub/Sub Lite é diferente do Kafka. Mais importante, ao contrário de um grupo de consumidores, uma assinatura é um recurso explícito e está associada a exatamente um tópico. Devido a essa diferença, qualquer lugar na API Consumer do Kafka que exija que um topic seja transmitido, o caminho de assinatura completo precisa ser transmitido.

Além das configurações SASL para o cliente Kafka, as configurações a seguir também são necessárias ao usar a API Consumer Kafka para interagir com o Pub/Sub Lite.

bootstrap.servers=REGION-kafka-pubsub.googleapis.com:443
group.id=unused

Substitua REGION pela região em que sua assinatura do Pub/Sub Lite está.

Antes de iniciar o primeiro job de consumidor do Pub/Sub Lite para uma determinada assinatura, você pode iniciar (mas não esperar) uma operação de busca de administrador para definir o local inicial do consumidor.

Quando você inicia os consumidores, eles se reconectam ao deslocamento atual no atraso de mensagens. Execute os clientes antigos e novos em paralelo pelo tempo que for necessário para verificar o comportamento deles e, em seguida, desative os clientes consumidores antigos.

Migrar produtores

Além das configurações SASL para o cliente Kafka, o seguinte também é necessário como um parâmetro de produtor ao usar a API Kafka Producer para interagir com o Pub/Sub Lite.

bootstrap.servers=REGION-kafka-pubsub.googleapis.com:443

Substitua REGION pela região em que o tópico do Pub/Sub Lite existe.

Depois de migrar todos os consumidores do tópico para ler do Pub/Sub Lite, mova o tráfego do produtor para gravar diretamente no Pub/Sub Lite.

Migrar gradualmente os clientes de produtores para gravar no tópico do Pub/Sub Lite em vez do tópico do Kafka.

Reinicie os clientes do produtor para escolher novas configurações.

Desligar o Kafka Connect

Depois de migrar todos os produtores para gravar diretamente no Pub/Sub Lite, o conector não copia mais dados.

Você pode desativar a instância do Kafka Connect.

Resolver problemas de conexões do Kafka

Como os clientes do Kafka se comunicam por um protocolo de transmissão personalizado, não podemos fornecer mensagens de erro para falhas em todas as solicitações. Use os códigos de erro enviados como parte da mensagem.

Para conferir mais detalhes sobre os erros que ocorrem no cliente, defina o nível de registro do prefixo org.apache.kafka como FINEST.

Baixa capacidade e aumento do backlog

Há vários motivos para você ter uma baixa taxa de transferência e um acúmulo crescente. Um motivo pode ser a capacidade insuficiente.

É possível configurar a capacidade de transferência no nível do tópico ou usando reservas. Se a capacidade de throughput for insuficiente para a assinatura e a publicação, a throughput correspondente para a assinatura e a publicação será limitada.

Esse erro de throughput é indicado pela métrica topic/flow_control_status para editores e pela métrica subscription/flow_control_status para assinantes. A métrica fornece os seguintes estados:

  • NO_PARTITION_CAPACITY: essa mensagem indica que o limite de throughput por partição foi atingido.

  • NO_RESERVATION_CAPACITY: essa mensagem indica que o limite de throughput por reserva foi atingido.

Você pode conferir os gráficos de uso da cota de publicação e assinatura do tópico ou reserva e verificar se a utilização está em 100% ou próximo disso.

Para resolver esse problema, aumente a capacidade de transferência do tópico ou da reserva.

Mensagem de erro de falha na autorização do tópico

A publicação usando a API Kafka exige que o agente de serviço do Lite tenha as permissões corretas para publicar no tópico do Pub/Sub Lite.

Você vai receber o erro TOPIC_AUTHORIZATION_FAILED no cliente se não tiver as permissões corretas para publicar no tópico do Pub/Sub Lite.

Para resolver o problema, verifique se o agente de serviço Lite do projeto foi transmitido na configuração de autenticação.

Mensagem de erro de tópico inválido

A assinatura usando a API Kafka exige a transmissão do caminho de assinatura completo em todos os lugares em que um topic é esperado na API Consumer Kafka.

Você vai receber o erro INVALID_TOPIC_EXCEPTION no cliente do consumidor se não transmitir um caminho de assinatura bem formatado.

Solicitação inválida quando não se usa reservas

O uso do suporte ao protocolo de fio do Kafka exige que todos os tópicos tenham uma reserva associada para cobrar pelo uso.