Prácticas recomendadas para Pub/Sub a BigQuery

En esta página se describen las prácticas recomendadas para optimizar una canalización de Dataflow que lee de Pub/Sub y escribe en BigQuery. En función de tu caso de uso, las siguientes sugerencias pueden mejorar el rendimiento.

Soluciones iniciales para las acumulaciones de la canalización

Cuando un flujo de procesamiento de Pub/Sub a BigQuery experimenta un creciente retraso y no puede seguir el ritmo de los mensajes entrantes, puedes tomar las siguientes medidas inmediatas:

  • Aumenta el plazo de confirmación de Pub/Sub: en la suscripción de Pub/Sub asociada, aumenta el plazo de confirmación a un valor ligeramente superior al tiempo máximo de procesamiento de mensajes previsto. De esta forma, se evita que los mensajes se vuelvan a enviar prematuramente mientras se siguen procesando.
  • Ampliar los trabajadores: si el recuento de mensajes no reconocidos y el backlog de suscripciones aumentan rápidamente, es probable que la capacidad de procesamiento de la canalización sea insuficiente. Aumenta el número de trabajadores de Dataflow para gestionar el volumen de mensajes.
  • Habilita el tiempo de espera exponencial: habilita el tiempo de espera exponencial para mejorar la forma en que la canalización gestiona los reintentos de problemas transitorios, lo que la hace más resistente.

Optimizaciones de código y de la canalización a largo plazo

Para mantener el rendimiento y la estabilidad, se recomienda hacer los siguientes cambios en la arquitectura y el código:

  • Reduce las llamadas getTable a BigQuery: un número excesivo de llamadas al método getTable puede provocar limitaciones de frecuencia y cuellos de botella en el rendimiento. Para mitigar este problema:
    • Almacena en caché la información sobre la existencia de la tabla en la memoria del trabajador para evitar llamadas repetidas a la misma tabla.
    • Llamadas por lotes getTable por paquete en lugar de por cada elemento individual.
    • Refactoriza el código de la canalización para que no sea necesario comprobar la existencia de la tabla en cada mensaje.
  • Usa la API Storage Write de BigQuery: en las canalizaciones de streaming que escriben en BigQuery, migra de las inserciones de streaming estándar a la API Storage Write. La API Storage Write ofrece un mejor rendimiento y cuotas significativamente más altas.
  • Usa el antiguo ejecutor de Dataflow para tareas de alta cardinalidad: en las tareas que procesan un número muy elevado de claves únicas (alta cardinalidad), el antiguo ejecutor de Dataflow puede ofrecer un mejor rendimiento que el ejecutor v2, a menos que se necesiten transformaciones entre lenguajes.
  • Optimizar el espacio de claves: el rendimiento puede disminuir cuando las canalizaciones operan con millones de claves activas. Ajusta la lógica de la canalización para que funcione en un espacio de claves más pequeño y fácil de gestionar.

Gestión de recursos, cuotas y configuración

La asignación y la configuración adecuadas de los recursos son fundamentales para el buen estado de la canalización:

  • Gestionar las cuotas de forma proactiva: monitoriza las cuotas y solicita aumentos para las que puedan alcanzarse durante los eventos de escalado. Por ejemplo, supongamos que se dan los siguientes eventos de escalado:
    • Si se llama a los métodos TableService.getTable o tabledata.insertAll con una frecuencia alta, se puede superar el número máximo de consultas por segundo (CPS). Para obtener más información sobre los límites y cómo solicitar más cuota, consulta Cuotas y límites de BigQuery.
    • Las cuotas de Compute Engine para las direcciones IP y las CPUs en uso pueden superar los límites máximos. Para obtener más información sobre los límites y cómo solicitar más cuota, consulta la descripción general de las cuotas y los límites de Compute Engine.
  • Optimiza la configuración de los trabajadores: para evitar errores de falta de memoria y mejorar la estabilidad:

Siguientes pasos