Cómo migrar de Kafka a Pub/Sub Lite

Este documento es útil si consideras migrar de Apache Kafka autoadministrado a Pub/Sub Lite.

Descripción general de Pub/Sub Lite

Pub/Sub Lite es un servicio de mensajería de gran volumen creado para un costo de operación bajo. Pub/Sub Lite ofrece almacenamiento regional y zonal, además de capacidad aprovisionada previamente. En Pub/Sub Lite, puedes elegir temas de Lite zonales o regionales. Los temas Lite regionales ofrecen el mismo ANS de disponibilidad que los temas de Pub/Sub. Sin embargo, existen diferencias de confiabilidad entre Pub/Sub y Pub/Sub Lite en términos de replicación de mensajes.

Para obtener más información sobre Pub/Sub y Pub/Sub Lite, consulta ¿Qué es Pub/Sub?.

Para obtener más información sobre las regiones y zonas compatibles con Lite, consulta Ubicaciones de Pub/Sub Lite.

Terminología en Pub/Sub Lite

A continuación, se incluyen algunos términos clave de Pub/Sub Lite.

  • Mensaje. Datos que se mueven a través del servicio de Pub/Sub Lite.

  • Tema. Es un recurso denominado que representa un feed de mensajes. En Pub/Sub Lite, puedes optar por crear un tema Lite regional o zonal. Los temas regionales de Pub/Sub Lite almacenan datos en dos zonas de una sola región. Los temas zonales de Pub/Sub Lite replican los datos en una sola zona.

  • Reserva. Es un grupo con nombre de capacidad de procesamiento que comparten varios temas de Lite en una región.

  • Suscripción: Un recurso con nombre que representa un interés en recibir mensajes de un tema Lite en particular. Una suscripción es similar a un grupo de consumidores en Kafka que solo se conecta a un solo tema.

  • Suscriptor. Un cliente de Pub/Sub Lite que recibe mensajes de un tema Lite y en una suscripción específica. Una suscripción puede tener varios clientes de suscriptores. En ese caso, los mensajes se distribuyen entre los clientes suscriptores. En Kafka, un suscriptor se llama consumidor.

  • Publicador. Una aplicación que crea mensajes y los envía (publica) a un tema Lite específico. Un tema puede tener varios publicadores. En Kafka, un publicador se denomina productor.

Diferencias entre Kafka y Pub/Sub Lite

Si bien Pub/Sub Lite es conceptualmente similar a Kafka, es un sistema diferente con una API más limitada que se enfoca más en la transferencia de datos. Si bien las diferencias son irrelevantes para la transferencia y el procesamiento de transmisiones, existen algunos casos de uso específicos en los que estas diferencias son importantes.

Kafka como base de datos

A diferencia de Kafka, Pub/Sub Lite actualmente no admite la publicación transactional ni la compactación de registros, aunque sí es idempotente. Estas funciones de Kafka son más útiles cuando usas Kafka como base de datos que como sistema de mensajería. Si usas Kafka principalmente como base de datos, considera ejecutar tu propio clúster de Kafka o usar una solución de Kafka administrada, como Confluent Cloud. Si ninguna de estas soluciones es una opción, también puedes considerar usar una base de datos escalable horizontalmente, como Cloud Spanner.

Flujos de Kafka

Kafka Streams es un sistema de procesamiento de datos compilado en Kafka. Si bien permite la inserción de clientes consumidores, requiere acceso a todas las operaciones de administrador. Kafka Streams también usa las propiedades de la base de datos de transacciones de Kafka para almacenar metadatos internos. Por lo tanto, actualmente, Pub/Sub Lite no se puede usar para aplicaciones de Kafka Streams.

Apache Beam es un sistema de procesamiento de datos de transmisión similar que está integrado en Kafka, Pub/Sub y Pub/Sub Lite. Puedes ejecutar canalizaciones de Beam de forma completamente administrada con Dataflow o en tus clústeres preexistentes de Apache Flink y Apache Spark.

Supervisar

Los clientes de Kafka pueden leer métricas del servidor. En Pub/Sub Lite, las métricas relevantes para el comportamiento de los publicadores y suscriptores se administran a través de Cloud Monitoring sin configuración adicional.

Administración de capacidad

La capacidad de un tema de Kafka está determinada por la capacidad del clúster. La replicación, la compactación de claves y la configuración por lotes determinan la capacidad necesaria para entregar cualquier tema determinado en el clúster de Kafka. La capacidad de procesamiento de un tema de Kafka está limitada por la capacidad de las máquinas en las que se ejecutan los agentes. Por el contrario, debes definir la capacidad de almacenamiento y la capacidad de procesamiento para un tema de Pub/Sub Lite. La capacidad de almacenamiento de Pub/Sub Lite es una propiedad configurable del tema. La capacidad de procesamiento se basa en la capacidad de la reserva configurada y en los límites inherentes o configurados por partición.

Autenticación y seguridad

Apache Kafka admite varios mecanismos de autenticación y encriptación abiertos. Con Pub/Sub Lite, la autenticación se basa en el sistema de IAM. La seguridad se garantiza mediante la encriptación en reposo y en tránsito. Obtén más información sobre la autenticación de Pub/Sub Lite en la sección de flujo de trabajo de migración, más adelante en este documento.

Asigna propiedades de Kafka a propiedades de Pub/Sub Lite

Kafka tiene muchas opciones de configuración que controlan la estructura del tema, los límites y las propiedades del agente. En esta sección, se analizan algunos de los más comunes que son útiles para la transferencia de datos, junto con sus equivalentes en Pub/Sub Lite. Como Pub/Sub Lite es un sistema administrado, no tienes que considerar muchas propiedades de agente.

Propiedades de configuración del tema

Propiedad de Kafka Propiedad de Pub/Sub Lite Descripción
retention.bytes Almacenamiento por partición Todas las particiones de un tema de Lite tienen la misma capacidad de almacenamiento configurada. La capacidad de almacenamiento total de un tema Lite es la suma de la capacidad de almacenamiento de todas las particiones del tema.
retention.ms Período de retención de mensajes Es la cantidad máxima de tiempo durante la que un tema de Lite almacena mensajes. Si no especificas un período de retención de mensajes, el tema de Lite almacenará los mensajes hasta que excedas la capacidad de almacenamiento.
flush.ms, acks No se puede configurar en Pub/Sub Lite Las publicaciones no se confirman hasta que se garantiza que se conservarán en el almacenamiento replicado.
max.message.bytes No se puede configurar en Pub/Sub Lite 3.5 MiB es el tamaño máximo de mensaje que se puede enviar a Pub/Sub Lite. Los tamaños de los mensajes se calculan de una manera repetible.
message.timestamp.type No se puede configurar en Pub/Sub Lite Cuando se usa la implementación del consumidor, se elige la marca de tiempo del evento cuando está presente o se usa la marca de tiempo de publicación en su lugar. Las marcas de tiempo de publicación y de evento están disponibles cuando se usa Beam.

Para obtener más información sobre las propiedades de los temas de Lite, consulta Propiedades de un tema de Lite.

Propiedades de configuración del productor

Pub/Sub Lite admite el protocolo de red del productor. Algunas propiedades cambian el comportamiento de las bibliotecas cliente de Cloud del productor. En la siguiente tabla, se analizan algunas de las más comunes.

Propiedad de Kafka Propiedad de Pub/Sub Lite Descripción
auto.create.topics.enable No se puede configurar en Pub/Sub Lite Crea un tema y una suscripción que sean aproximadamente equivalentes a un grupo de consumidores para un solo tema en Pub/Sub Lite. Puedes usar la consola, gcloud CLI, la API o las bibliotecas cliente de Cloud.
key.serializer, value.serializer No se puede configurar en Pub/Sub Lite

Obligatorio cuando se usa el productor de Kafka o una biblioteca equivalente que se comunica con el protocolo de red.

batch.size Compatibilidad con Pub/Sub Lite Se admite el procesamiento por lotes. El valor recomendado para este valor es de 10 MiB para obtener un mejor rendimiento.
linger.ms Compatibilidad con Pub/Sub Lite Se admite el procesamiento por lotes. El valor recomendado para este valor es de 50 ms para obtener el mejor rendimiento.
max.request.size Compatibilidad con Pub/Sub Lite El servidor impone un límite de 20 MiB por lote. Establece este valor en menos de 20 MiB en tu cliente de Kafka.
enable.idempotence Compatibilidad con Pub/Sub Lite
compression.type No se admite en Pub/Sub Lite Debes establecer este valor de forma explícita en none.

Propiedades de configuración del consumidor

Pub/Sub Lite admite el protocolo de red de consumidor. Algunas propiedades cambian el comportamiento de las bibliotecas cliente de Cloud para consumidores. Algunas comunes se analizan en la siguiente tabla.

Propiedad de Kafka Descripción
key.deserializer, value.deserializer

Obligatorio cuando se usa el consumidor de Kafka o una biblioteca equivalente que se comunica con el protocolo de red.

auto.offset.reset Esta configuración no es compatible ni es necesaria. Se garantiza que las suscripciones tengan una ubicación de offset definida después de su creación.
message.timestamp.type La marca de tiempo de publicación siempre está disponible en Pub/Sub Lite y se garantiza que no disminuya por partición. Las marcas de tiempo de los eventos pueden estar presentes o no, según si se adjuntaron al mensaje cuando se publicó. Las marcas de tiempo de publicación y de evento están disponibles al mismo tiempo cuando se usa Dataflow.
max.partition.fetch.bytes, max.poll.records Impone un límite flexible en la cantidad de registros y bytes que se muestran a partir de las llamadas a poll() y la cantidad de bytes que se muestran a partir de las solicitudes de recuperación internas. El valor predeterminado de "max.partition.fetch.bytes" de 1 MiB puede limitar la capacidad de procesamiento de tu cliente. Considera aumentar este valor.

Compara las funciones de Kafka y Pub/Sub Lite

En la siguiente tabla, se comparan las funciones de Apache Kafka con las de Pub/Sub Lite:

Función Kafka Pub/Sub Lite
Ordenamiento de mensajes
Anulación de duplicación de mensajes Sí, con Dataflow
Suscripciones de inserción No Sí, con la exportación de Pub/Sub
Transacciones No
Almacenamiento de mensajes Limitado por el almacenamiento de máquinas disponible Ilimitado
Repetición de mensajes
Registro y supervisión Administración automática Automatizado con Cloud Monitoring
Procesamiento de transmisión Sí, con Kafka Streams, Apache Beam o Dataproc. Sí, con Beam o Dataproc.

En la siguiente tabla, se compara la funcionalidad que se aloja a sí misma con Kafka y qué funcionalidad administra Google mediante Pub/Sub Lite:

Función Kafka Pub/Sub Lite
Disponibilidad Implementa Kafka manualmente en ubicaciones adicionales. Se implementan en todo el mundo. Consulta las ubicaciones.
Recuperación ante desastres Diseña y mantén tu propia copia de seguridad y replicación. Administrado por Google.
Administración de la infraestructura Implementa y opera máquinas virtuales (VM) o máquinas de forma manual Mantén el control de versiones y los parches coherentes. Administrado por Google.
Planificación de la capacidad Planifica de forma manual las necesidades de almacenamiento y procesamiento por adelantado. Administrado por Google. Puedes aumentar el procesamiento y el almacenamiento en cualquier momento.
Asistencia Ninguno Asistencia y personal de guardia disponibles las 24 horas.

Comparación de costos de Kafka y Pub/Sub Lite

La forma en que estimas y administras los costos en Pub/Sub Lite es diferente que en Kafka. Los costos de un clúster Kafka local o en la nube incluyen el costo de las máquinas, el disco, las herramientas de redes, los mensajes entrantes y salientes. También incluye los costos generales de administrar y mantener estos sistemas y la infraestructura relacionada. Cuando administras un clúster de Kafka, debes actualizar las máquinas de forma manual, planificar la capacidad del clúster y, además, implementar la recuperación ante desastres, que incluye una planificación y pruebas extensas. Debes agregar todos estos costos para determinar el costo total de propiedad (TCO) real.

Los precios de Pub/Sub Lite incluyen el costo de reserva (bytes publicados, bytes suscritos, bytes que controla el proxy de Kafka) y el costo del almacenamiento aprovisionado. Pagas exactamente por los recursos que reservás, además de los cargos por mensajes salientes. Puedes usar la calculadora de precios para obtener una estimación de tus costos.

Flujo de trabajo de migración

Para migrar un tema de un clúster de Kafka a Pub/Sub Lite, sigue las siguientes instrucciones.

Configura recursos de Pub/Sub Lite

  1. Crea una reserva de Pub/Sub Lite para la capacidad de procesamiento esperada de todos los temas que migrarás.

    Usa la calculadora de precios de Pub/Sub Lite para calcular las métricas de rendimiento agregado de tus temas de Kafka existentes. Para obtener más información sobre cómo crear reservas, consulta Crea y administra reservas de Lite.

  2. Crea un tema de Pub/Sub Lite para cada tema correspondiente en Kafka.

    Para obtener más información sobre cómo crear temas de Lite, consulta Crea y administra temas de Lite.

  3. Crea una suscripción a Pub/Sub Lite para cada par de tema y grupo de consumidores correspondiente en el clúster de Kafka.

    Por ejemplo, para un grupo de consumidores llamado consumers que consume desde topic-a y topic-b, debes crear una suscripción consumers-a adjunta a topic-a y una suscripción consumers-b adjunta a topic-b. Para obtener más información sobre cómo crear suscripciones, consulta Crea y administra suscripciones Lite.

Cómo autenticarse en Pub/Sub Lite

Según el tipo de cliente de Kafka, elige uno de los siguientes métodos:

Clientes de Kafka basados en Java versión 3.1.0 o posterior con compilación nueva

Para clientes de Kafka basados en Java de la versión 3.1.0 o posterior que se puedan volver a compilar en la instancia en la que ejecutas el cliente de Kafka:

  1. Instala el paquete com.google.cloud:pubsublite-kafka-auth.

  2. Obtén los parámetros necesarios para autenticarte en Pub/Sub Lite con la ayuda de com.google.cloud.pubsublite.kafka.ClientParameters.getParams.

    El método getParams() (consulta una muestra de código) inicializa las siguientes configuraciones de JAAS y SASL como parámetros para autenticarse en 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 de Kafka basados en Java que ejecutan la versión 3.1.0 o posterior sin volver a compilar

En el caso de los clientes de Kafka que admiten KIP-768, admitimos la autenticación OAUTHBEARER de solo configuración que usa una secuencia de comandos de Sidecar de Python. Estas versiones incluyen la versión 3.1.0 de Java de enero de 2022 o una posterior.

Realiza los siguientes pasos en la instancia en la que ejecutas tu cliente de Kafka:

  1. Instala Python 3.6 o una versión posterior.

    Consulta Cómo instalar Python.

  2. Instala el paquete de autenticación de Google: pip install google-auth

    Esta biblioteca simplifica los diversos mecanismos de autenticación de servidor a servidor para acceder a las APIs de Google. Consulta la página google-auth.

  3. Ejecuta la secuencia de comandos kafka_gcp_credentials.py.

    Esta secuencia de comandos inicia un servidor HTTP local y recupera las credenciales predeterminadas de Google Cloud en el entorno con google.auth.default().

    El principal en las credenciales recuperadas debe tener el permiso pubsublite.locations.openKafkaStream para el proyecto de Google Cloud que usas y la ubicación a la que te conectas. Los roles de publicador (roles/pubsublite.publisher) y suscriptor (roles/pubsublite.subscriber) de Pub/Sub Lite tienen este permiso obligatorio. Agrega estos roles a tu principal.

    Las credenciales se usan en la autenticación SASL/OAUTHBEARER para el cliente de Kafka.

    Los siguientes parámetros son obligatorios en tus propiedades para autenticarte en Pub/Sub Lite desde el cliente de 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";
    

    Reemplaza PROJECT_ID por el ID de tu proyecto que ejecuta Pub/Sub Lite.

Todos los demás clientes sin volver a compilar

Para todos los demás clientes, sigue estos pasos:

  1. Descarga un archivo JSON de clave de cuenta de servicio para la cuenta de servicio que deseas usar para tu cliente.

  2. Usa base64-encode para codificar el archivo de la cuenta de servicio y usarlo como cadena de autenticación.

    En sistemas Linux o macOS, puedes usar el comando base64 (a menudo instalado de forma predeterminada) de la siguiente manera:

    base64 < my_service_account.json > password.txt
    

    Puedes usar el contenido del archivo de contraseña para la autenticación con los siguientes parámetros.

    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";
    

    Reemplaza PROJECT_ID por el ID de tu proyecto que ejecuta Pub/Sub.

    librdkafka

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

    Reemplaza PROJECT_ID por el ID de tu proyecto que ejecuta Pub/Sub.

Cómo clonar datos con Kafka Connect

El equipo de Pub/Sub Lite mantiene una implementación de un sink de Kafka Connect. Puedes configurar esta implementación para copiar datos de un tema de Kafka a un tema de Pub/Sub Lite con un clúster de Kafka Connect.

Para configurar el conector para que realice la copia de datos, consulta Conector de Kafka de grupo de Pub/Sub.

Si quieres asegurarte de que la afinidad de particiones no se vea afectada por el proceso de migración, asegúrate de que el tema de Kafka y el tema de Pub/Sub Lite tengan la misma cantidad de particiones y de que la propiedad pubsublite.ordering.mode esté configurada en KAFKA. Esto hace que el conector enrute los mensajes a la partición de Pub/Sub Lite con el mismo índice que la partición de Kafka en la que se publicaron originalmente.

Migra consumidores

El modelo de recursos de Pub/Sub Lite es diferente al de Kafka. En particular, a diferencia de un grupo de consumidores, una suscripción es un recurso explícito y se asocia con exactamente un tema. Debido a esta diferencia, en cualquier lugar de la API de Kafka Consumer que requiera que se pase un topic, se debe pasar la ruta de acceso de suscripción completa.

Además de las configuraciones de SASL para el cliente de Kafka, también se requiere la siguiente configuración cuando se usa la API de consumidor de Kafka para interactuar con Pub/Sub Lite.

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

Reemplaza REGION por la región en la que existe tu suscripción a Pub/Sub Lite.

Antes de iniciar el primer trabajo de consumidor de Pub/Sub Lite para una suscripción determinada, puedes iniciar (pero no esperar) una operación de búsqueda de administrador para establecer la ubicación inicial de tu consumidor.

Cuando inicias tus consumidores, se vuelven a conectar al desplazamiento actual en la fila de mensajes. Ejecuta los clientes antiguos y los nuevos en paralelo durante el tiempo que sea necesario para verificar su comportamiento y, luego, desactiva los clientes consumidores anteriores.

Migra productores

Además de las configuraciones de SASL para el cliente de Kafka, también se requiere lo siguiente como parámetro de productor cuando se usa la API de Kafka Producer para interactuar con Pub/Sub Lite.

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

Reemplaza REGION por la región en la que existe tu tema de Pub/Sub Lite.

Después de migrar todos los consumidores del tema para leer desde Pub/Sub Lite, mueve el tráfico del productor para escribir directamente en Pub/Sub Lite.

Migra gradualmente los clientes productores para que escriban en el tema de Pub/Sub Lite en lugar del tema de Kafka.

Reinicia los clientes de productor para que detecten las configuraciones nuevas.

Inhabilita Kafka Connect

Después de migrar todos los productores para escribir directamente en Pub/Sub Lite, el conector ya no copia datos.

Puedes rechazar la instancia de Kafka Connect.

Soluciona problemas de conexiones de Kafka

Dado que los clientes de Kafka se comunican a través de un protocolo de red personalizado, no podemos proporcionar mensajes de error para las fallas en todas las solicitudes. Confía en los códigos de error que se envían como parte del mensaje.

Para ver más detalles sobre los errores que se producen en el cliente, configura el nivel de registro del prefijo org.apache.kafka en FINEST.

Capacidad de procesamiento baja y aumento de la lista de tareas pendientes

Existen varios motivos por los que podrías ver una baja productividad y un aumento de la lista de tareas pendientes. Un motivo podría ser la capacidad insuficiente.

Puedes configurar la capacidad de procesamiento a nivel del tema o con las reservas. Si se configura una capacidad de procesamiento insuficiente para la suscripción y la publicación, se limita la capacidad de procesamiento correspondiente para la suscripción y la publicación.

La métrica topic/flow_control_status para los publicadores y la métrica subscription/flow_control_status para los suscriptores indican este error de capacidad de procesamiento. La métrica proporciona los siguientes estados:

  • NO_PARTITION_CAPACITY: Este mensaje indica que se alcanzó el límite de rendimiento por partición.

  • NO_RESERVATION_CAPACITY: Este mensaje indica que se alcanzó el límite de rendimiento por reserva.

Puedes ver los gráficos de uso de la cuota de publicación y suscripción del tema o la reserva, y verificar si el uso está cerca del 100% o lo alcanzó.

Para resolver este problema, aumenta la capacidad de procesamiento del tema o la reserva.

Mensaje de error de autorización de temas fallida

Para publicar con la API de Kafka, el agente de servicio de Lite debe tener los permisos correctos para publicar en el tema de Pub/Sub Lite.

Obtienes el error TOPIC_AUTHORIZATION_FAILED en tu cliente en el caso de que no tengas los permisos correctos para publicar en el tema de Pub/Sub Lite.

Para resolver el problema, verifica si el agente de servicio Lite del proyecto pasó en la configuración de autenticación.

Mensaje de error de tema no válido

Para suscribirse con la API de Kafka, se debe pasar la ruta de acceso de suscripción completa a todos los lugares en los que se espera un topic en la API de consumidor de Kafka.

Recibirás el error INVALID_TOPIC_EXCEPTION en tu cliente de consumidor si no pasas una ruta de suscripción con el formato correcto.

Solicitud no válida cuando no se usan reservas

Para usar la compatibilidad con el protocolo de red de Kafka, es necesario que todos los temas tengan una reserva asociada para cobrar por el uso.