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 de alto volume criado para baixo custo de operação. O Pub/Sub Lite oferece armazenamento regional e zonal com capacidade pré-provisionada. No Pub/Sub Lite, é possível escolher tópicos zonais ou regionais do Lite. Os tópicos regionais do Lite oferecem o mesmo SLA de disponibilidade que os 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 regiões e zonas compatíveis com o Lite, consulte Locais do Pub/Sub Lite.

Terminologia no Pub/Sub Lite

Confira a seguir alguns dos principais termos do Pub/Sub Lite.

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

  • Tópico. Um recurso nomeado que representa um feed de mensagens. No Pub/Sub Lite, é possível criar um tópico do Lite por zona ou região. 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 compartilhada 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 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 assinantes. Nesse caso, a carga das mensagens é balanceada entre os clientes do assinante. No Kafka, um assinante é chamado de consumidor.

  • Editor. Um aplicativo que cria mensagens e as envia (publica) para 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, é um sistema diferente, com uma API mais restrita, mais focada na ingestão de dados. As diferenças são irrelevantes para ingestão e processamento de stream, mas há alguns casos de uso específicos em que elas são importantes.

Kafka como banco de dados

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

Streams do Kafka

Os streams do Kafka são um sistema de processamento de dados criado sobre o Kafka. Embora ele permita injeção de clientes consumidores, ele requer acesso a todas as operações do administrador. Ele 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 para aplicativos Kafka Streams no momento.

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

Monitorar

Os clientes 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 Kafka é determinada pela capacidade do cluster. As configurações de replicação, compactação de chaves e lote determinam a capacidade necessária para atender a qualquer tópico no cluster do Kafka. A capacidade de um tópico Kafka é limitada pela capacidade das máquinas em que os agentes estão em execução. Em contrapartida, você precisa definir a capacidade de armazenamento e a capacidade de 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 processamento é 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 abertos de autenticação e criptografia. 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 exemplos 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, você não precisa considerar muitas propriedades do agente.

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 de armazenamento total de um tópico do Lite é a soma da capacidade de armazenamento de todas as partições nele.
retention.ms Período de armazenamento de mensagens O período máximo em 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 armazenará as mensagens até que você exceda a capacidade de armazenamento.
flush.ms, acks Não configurável no Pub/Sub Lite As publicações não são confirmadas até que haja garantia de persistência no armazenamento replicado.
max.message.bytes Não configurável no Pub/Sub Lite 3,5 MiB é o tamanho máximo de mensagem que pode ser enviada ao Pub/Sub Lite. Os tamanhos das mensagens são calculados de maneira repetível.
message.timestamp.type Não configurável no Pub/Sub Lite Ao usar a implementação do consumidor, o carimbo de data/hora do evento é escolhido quando presente, ou o carimbo de data/hora da publicação é usado no lugar dele. Os carimbos de data/hora de publicação e de eventos estão disponíveis no 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 transferência do produtor. Algumas propriedades alteram 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 configurável no Pub/Sub Lite Crie um tópico e uma assinatura que sejam equivalentes a um grupo de consumidores para um único tópico no Pub/Sub Lite. É possível usar o console, a CLI gcloud, a API ou as bibliotecas de cliente do Cloud.
key.serializer e value.serializer Não configurável no Pub/Sub Lite

Obrigatório ao usar o Kafka Producer ou a biblioteca equivalente para comunicação por meio do protocolo com fio.

batch.size Compatível com o Pub/Sub Lite Não há suporte para lotes. O valor recomendado para esse valor é de 10 MiB para garantir o melhor desempenho.
linger.ms Compatível com o Pub/Sub Lite Não há suporte para lotes. O valor recomendado para esse valor é de 50 ms para garantir o melhor desempenho.
max.request.size Compatível com o 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 Compatível com o Pub/Sub Lite
compression.type Não compatível com o Pub/Sub Lite Defina explicitamente esse valor como none.

Propriedades de configuração do consumidor

O Pub/Sub Lite oferece suporte ao protocolo de transferência eletrônica do consumidor. Algumas propriedades alteram o comportamento das bibliotecas de cliente do Cloud de consumidor. Algumas comuns são discutidas na tabela a seguir.

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

Obrigatório ao usar o Kafka Consumer ou a biblioteca equivalente para comunicação usando o protocolo com fio.

auto.offset.reset Essa configuração não é compatível ou não é necessária. As assinaturas têm a garantia de ter um local de deslocamento definido depois de criadas.
message.timestamp.type O carimbo de data/hora da publicação está sempre disponível no Pub/Sub Lite e não diminui a cada partição. Os carimbos de data/hora dos eventos podem ou não estar presentes, dependendo se foram anexados à mensagem quando publicados. 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 para o número de registros e bytes retornados de chamadas "pol()" e do número de bytes retornados de solicitações de busca internas. O padrão para "max.partition.fetch.bytes" de 1MiB pode limitar a capacidade de processamento do seu 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 No Sim usando a exportação do Pub/Sub
Transações Sim No
Armazenamento de mensagens Limitado pelo armazenamento disponível da máquina Ilimitado
Repetição da mensagem Sim Sim
Geração de registros e monitoramento Autogerenciado Automatizado com o Cloud Monitoring
Processamento de stream Sim, com Kafka Streams, Apache Beam ou Dataproc. Sim, com o Beam ou o Dataproc.

A tabela a seguir compara quais funcionalidades são auto-hospedadas com o Kafka e quais são gerenciadas pelo Google usando o Pub/Sub Lite:

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

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

A maneira de estimar e gerenciar custos no Pub/Sub Lite é diferente do que é feito no Kafka. Os custos de um cluster Kafka no local ou na nuvem incluem o custo de máquinas, disco, rede, mensagens de entrada e de saída. Também estão incluídos custos gerais para gerenciar e manter esses sistemas e a infraestrutura relacionada. Ao gerenciar um cluster Kafka, você precisa fazer o 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 vários 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 Kafka) e o custo do armazenamento provisionado. Você paga exatamente pelos recursos reservados, além das cobranças das mensagens de saída. Use a calculadora de preços para ter uma estimativa dos custos.

Fluxo de trabalho de migração

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

Configurar recursos do Pub/Sub Lite

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

    Use a calculadora de preços do Pub/Sub Lite para determinar as métricas de capacidade agregadas dos tópicos do Kafka atuais. 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 grupo de consumidores e par de tópicos correspondentes 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 ver mais informações sobre como criar assinaturas, consulte Criar e gerenciar assinaturas do Lite.

Autenticar 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 posterior com recriação

Para clientes Kafka baseados em Java da versão 3.1.0 ou posterior 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. Consiga os parâmetros necessários para se autenticar no Pub/Sub Lite com a ajuda de com.google.cloud.pubsublite.kafka.ClientParameters.getParams.

    O método getParams() (consulte um exemplo de código) inicializa as seguintes configurações 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 Kafka baseados em Java executando a versão 3.1.0 ou posterior sem recriação

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

Siga estas etapas na instância em que o cliente Kafka está sendo executado:

  1. Instale o Python 3.6 ou superior.

    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 busca 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 a que você está se conectando. Os papéis de editor do Pub/Sub Lite (roles/pubsublite.publisher) e de 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 do cliente Kafka.

    Os parâmetros a seguir são necessários nas suas propriedades para autenticar no Pub/Sub Lite do 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 recriar

Para todos os outros clientes, siga estas etapas:

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

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

    Em sistemas Linux ou macOS, você pode usar 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 senhas 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 Kafka para um tópico do Pub/Sub Lite usando um cluster do Kafka Connect.

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

Se você quiser garantir que a afinidade da partição não seja afetada pelo processo de migração, verifique se os tópicos kafka e os tópicos 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 encaminhe mensagens para a partição do Pub/Sub Lite com o mesmo índice da partição kafka em que foram originalmente publicadas.

Migrar consumidores

O modelo de recurso do Pub/Sub Lite é diferente do modelo do Kafka. Mais especificamente, 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 Kafka Consumer que exija um topic para ser transmitido, o caminho completo da assinatura precisa ser transmitido.

Além das configurações de SASL para o cliente Kafka, as configurações a seguir também são necessárias ao usar a API Kafka Consumer 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, inicie, mas não aguarde enquanto, uma operação de busca de administrador para definir o local inicial do consumidor.

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

Migrar produtores

Além das configurações SASL para o cliente Kafka, os itens a seguir também são necessários 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 está o tópico do Pub/Sub Lite.

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

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

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

Desativar o Kafka Connect

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

É possível desativar a instância do Kafka Connect.

Resolver problemas de conexões Kafka

Como os clientes Kafka se comunicam por meio de 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 ver mais detalhes sobre erros que ocorrem no cliente, defina o nível de geração de registros do prefixo org.apache.kafka como FINEST.

Baixa capacidade de processamento e backlog crescente

Há vários motivos para você estar vendo baixa capacidade de processamento e um backlog crescente. Um dos motivos pode ser a capacidade insuficiente.

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

Esse erro na capacidade é sinalizado 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 capacidade por partição foi atingido.

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

É possível visualizar os gráficos de utilização para o tópico ou a cota de publicação de reserva, inscrever-se e verificar se a utilização está em 100% ou próximo a isso.

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

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

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

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

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

Mensagem de erro de tópico inválido

Para assinar usando a API Kafka, é necessário transmitir o caminho completo da assinatura para todos os locais em que um topic é esperado na API Kafka Consumer.

Você receberá o erro INVALID_TOPIC_EXCEPTION no seu cliente Consumer se não transmitir um caminho de assinatura bem formatado.

Solicitação inválida quando as reservas não estão sendo usadas

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