Bonnes pratiques pour Pub/Sub vers BigQuery

Cette page décrit les bonnes pratiques pour optimiser un pipeline Dataflow qui lit des données depuis Pub/Sub et écrit des données dans BigQuery. Selon votre cas d'utilisation, les suggestions suivantes peuvent vous aider à améliorer vos performances.

Solutions initiales pour les tâches en attente du pipeline

Lorsqu'un pipeline Pub/Sub vers BigQuery rencontre un backlog croissant et ne peut pas suivre le rythme des messages entrants, vous pouvez prendre les mesures immédiates suivantes :

  • Augmentez le délai de confirmation Pub/Sub : pour l'abonnement Pub/Sub associé, augmentez le délai de confirmation à une valeur légèrement supérieure au temps de traitement maximal prévu pour les messages. Cela empêche les messages d'être renvoyés prématurément alors qu'ils sont encore en cours de traitement.
  • Faites évoluer les nœuds de calcul : si le nombre de messages non confirmés et le backlog d'abonnement augmentent rapidement, la capacité de traitement du pipeline est probablement insuffisante. Augmentez le nombre de nœuds de calcul Dataflow pour gérer le volume de messages.
  • Activer l'intervalle exponentiel entre les tentatives : activez l'intervalle exponentiel entre les tentatives pour améliorer la façon dont le pipeline gère les nouvelles tentatives en cas de problèmes temporaires, ce qui le rend plus résilient.

Optimisations à long terme du code et des pipelines

Pour des performances et une stabilité durables, nous vous recommandons d'apporter les modifications d'architecture et de code suivantes :

  • Réduisez les appels getTable à BigQuery : un nombre excessif d'appels de méthode getTable peut entraîner une limitation du débit et des problèmes de performances. Pour atténuer ce problème :
    • Mettre en cache les informations sur l'existence des tables dans la mémoire du nœud de calcul pour éviter les appels répétés pour la même table.
    • Appels getTable par lot pour chaque bundle au lieu de chaque élément individuel.
    • Refactorisez le code du pipeline pour éliminer la nécessité de vérifier l'existence de la table pour chaque message.
  • Utilisez l'API BigQuery Storage Write : pour les pipelines de streaming qui écrivent dans BigQuery, migrez des insertions en flux continu standards vers l' API Storage Write. L'API Storage Write offre de meilleures performances et des quotas nettement plus élevés.
  • Utilisez l'ancien exécuteur Dataflow pour les jobs à cardinalité élevée : pour les jobs qui traitent un très grand nombre de clés uniques (cardinalité élevée), l'ancien exécuteur Dataflow peut offrir de meilleures performances que Runner v2, sauf si des transformations multilingues sont requises.
  • Optimisez l'espace de clés : les performances peuvent se dégrader lorsque les pipelines fonctionnent sur des millions de clés actives. Ajustez la logique du pipeline pour effectuer le travail sur un espace de clés plus petit et plus facile à gérer.

Gestion des ressources, des quotas et de la configuration

Une allocation et une configuration appropriées des ressources sont essentielles à la bonne santé du pipeline :

  • Gérez les quotas de manière proactive : surveillez les quotas et demandez des augmentations pour tous les quotas qui pourraient être atteints lors des événements de scaling. Par exemple, prenons les événements de scaling suivants :
    • Un taux d'appels élevé aux méthodes TableService.getTable ou tabledata.insertAll peut dépasser le nombre maximal de requêtes par seconde (RPS). Pour en savoir plus sur les limites et sur la façon de demander un quota plus élevé, consultez Quotas et limites de BigQuery.
    • Les quotas Compute Engine pour les adresses IP et les processeurs en cours d'utilisation peuvent dépasser les limites maximales. Pour en savoir plus sur les limites et sur la façon de demander un quota plus élevé, consultez la présentation des quotas et des limites de Compute Engine.
  • Optimisez la configuration des nœuds de calcul : pour éviter les erreurs de mémoire insuffisante (OOM) et améliorer la stabilité :
    • Utilisez des types de machines de nœud de calcul avec plus de mémoire.
    • Réduisez le nombre de threads par nœud de calcul.
    • Définissez un nombre de nœuds de calcul plus élevé pour répartir la charge de travail de manière plus uniforme et réduire l'impact sur les performances des événements d'autoscaling fréquents.

Étapes suivantes