Ce qui cède en premier lorsque les limites d'API sont ignorées

Une entreprise qui gère simultanément trois intégrations – une synchronisation ERP nocturne, un Webhook depuis un système de paiement, et un tableau de bord externe qui extrait des données toutes les cinq minutes – ne connaît pas une défaillance progressive. Son fonctionnement est optimal jusqu'à ce qu'elle dépasse un seuil, après quoi chaque appel d'API supplémentaire est rejeté avec le code REQUEST_LIMIT_EXCEEDED jusqu'à la réinitialisation quotidienne. Il n'existe pas d'alerte préventive intégrée ; seule une interface de tableau de bord est disponible, si un processus de surveillance a été mis en œuvre.

Cet échec diffère de la plupart des échecs des projets Salesforce, car il ne dépend pas d'un code de mauvaise qualité ou d'une conception inadéquate. Il résulte d'une accumulation : une nouvelle intégration est toujours développée en fonction de l'état actuel, sans vérifier la consommation quotidienne du budget par les processus existants. En conséquence, la cinquième intégration "casse" les quatre précédentes, bien qu'aucune d'elles n'ait été modifiée.

Cartographie des limites réellement pertinentes

Toutes les limites de Salesforce n'ont pas la même importance pour la planification des intégrations. Celles qui déterminent véritablement l'architecture sont les suivantes :

Type de limiteCe qu'elle mesureQui est affecté en premier
Requêtes API journalièresTotal des appels REST/SOAP sur 24 heuresToute intégration synchrone à haute fréquence
Lots Bulk APINombre de lots ouverts/journaliersProcessus Batch nocturnes alimentant des données historiques
Requêtes concurrentes de longue duréeRequêtes s'exécutant plus de 20 secondes simultanémentRapports volumineux ou Apex synchrone complexe
Livraison d'événements de plateformeVolume d'événements par jour et par abonnementArchitectures basées sur les événements entre Salesforce et des systèmes externes
Lignes SOQL par transactionLignes récupérées dans une seule transaction (50 000)Logique Apex exécutant des requêtes dans une boucle

Ce tableau n'est pas une documentation générique, mais un ordre de priorité. Une organisation planifiant une nouvelle intégration doit en premier lieu examiner les deux premières lignes, car ce sont celles qui sont effectivement bloquées en production. Les autres limites affectent principalement les performances, et non la disponibilité.

Budget d'appels : comment l'établir correctement

L'outil principal pour prévenir les blocages n'est pas la surveillance a posteriori, mais un budget d'API prédéfini pour chaque consommateur. Le principe est le suivant : chaque système externe, chaque utilisateur d'intégration et chaque processus planifié reçoit une allocation définie à partir du quota total, plutôt que de consommer "autant que nécessaire".

L'établissement du budget comprend trois étapes :

  1. Cartographie des consommateurs – Établir une liste de tous les processus qui appellent l'API : intégrations externes, Apex planifié, Data Loader manuel, outils de BI. Chaque processus doit disposer d'un utilisateur d'intégration distinct afin d'isoler la consommation dans l'Event Monitoring.
  2. Calcul de la charge, basée sur le volume d'activité et non sur des hypothèses – Déterminer le nombre d'enregistrements traités quotidiennement, le nombre d'appels requis par enregistrement (y compris la récupération des Listes Associées), et ce qui se passe durant les périodes de pointe (fin de trimestre, Black Friday, clôture de mois).
  3. Allocation d'une réserve – Ne pas distribuer 100 % du quota entre les processus existants. Conserver 15 % à 20 % comme réserve pour les processus d'urgence, les rapports ponctuels et la maintenance – sans cette réserve, le moindre ajout risquerait de pousser l'organisation au-delà des limites.

Pour approfondir la conception de la couche gérant ce budget au niveau de la plateforme, il est recommandé de consulter le Guide d'architecture CRM, qui présente la répartition entre la couche d'intégration et la couche métier.

REST vs Bulk : quand le passage est-il bénéfique ?

L’erreur la plus fréquente consiste à utiliser l’API REST standard pour des transferts de données à volume élevé, car c’est souvent la première à être mise en œuvre et à fonctionner dans une preuve de concept. Le problème survient lorsque le volume de données augmente : REST compte chaque requête (jusqu’à 200 enregistrements dans Composite) comme un appel distinct par rapport au quota, tandis que Bulk API 2.0 traite des lots pouvant atteindre 10 000 enregistrements et est comptabilisée à un coût significativement plus faible par enregistrement.

Une règle empirique pratique : si un seul processus met à jour plus d'environ 2 000 enregistrements en une seule exécution, le passage à Bulk API est presque toujours avantageux, même si cela implique de modifier le code client pour fonctionner de manière asynchrone avec un sondage sur l’état de la tâche plutôt qu'une réponse immédiate. Le coût est une latence plus élevée (quelques minutes au lieu de quelques secondes), ce qui rend Bulk inapproprié pour les processus nécessitant une décision en temps réel, comme la vérification des stocks avant la validation d'une commande.

Retour arrière et nouvelle tentative : prévention de l'auto-submersion

Lorsqu'un appel d'API échoue en raison d'un blocage de limite, la réaction instinctive de la plupart des équipes est de réessayer immédiatement. C'est précisément ce comportement qui transforme un blocage temporaire en une panne persistante : si dix processus essaient de nouveau au même moment, ils enfoncent le système plus profondément dans le blocage au lieu de lui permettre de se rétablir.

Un mécanisme de retour arrière (Backoff) approprié requiert la combinaison de trois éléments :

  • Backoff exponentiel - Le temps d'attente entre les tentatives est augmenté de manière exponentielle (par exemple 2, 4, 8, 16 secondes), au lieu de rester constant.
  • Jitter - Une légère addition aléatoire au temps d'attente, afin que les processus parallèles ne retentent pas exactement à la même seconde et ne créent pas une nouvelle vague de charge.
  • Disjoncteur (Circuit Breaker) - Après un certain nombre d'échecs consécutifs (par exemple cinq), le processus cesse complètement de tenter pendant une durée définie et signale l'incident au système de surveillance, au lieu de continuer à "frapper à la porte".

Sans disjoncteur, un processus exécuté toutes les cinq minutes et échouant de manière constante continuerait à essayer cent fois par jour et à consommer le quota uniquement pour des échecs – ce qui est exactement l'inverse de ce que le mécanisme est censé prévenir. Des détails supplémentaires sur la gestion des erreurs au niveau de l'intégration sont disponibles dans Gestion des erreurs d'intégration Salesforce.

Scénario : Commerce de détail avec trois points d'intégration

Imaginons une chaîne de commerce de détail de taille moyenne, environ 40 succursales, qui exploite Salesforce Service Cloud en conjonction avec un système POS et un système ERP pour la gestion des stocks. Trois intégrations sont actives : une synchronisation des stocks toutes les 15 minutes depuis l'ERP (environ 8 000 références), un Webhook du POS pour chaque transaction échouée (environ 300 par jour), et un tableau de bord externe pour Power BI qui extrait les données de service toutes les heures.

Le mois où le réseau a ajouté un nouveau programme de fidélité, une quatrième intégration a été mise en place : la vérification des points de fidélité en temps réel depuis chaque caisse, ajoutant environ 6 000 appels par jour. En l'espace de deux semaines, la synchronisation des stocks a commencé à échouer vers 14h-15h, l'heure de pointe des caisses. L'équipe a d'abord examiné l'ERP, pensant que le problème venait de là, mais les journaux Salesforce ont montré REQUEST_LIMIT_EXCEEDED précisément dans cette période.

La solution n'a pas été d'acquérir un quota supplémentaire, mais de revoir les priorités : la vérification des points de fidélité a été transférée vers Platform Cache pour les résultats non fréquemment modifiés, réduisant les appels d'environ 70 %, et la synchronisation des stocks est passée de REST à Bulk API avec une exécution toutes les 30 minutes au lieu de 15. Le résultat : même couverture métier, consommation de quota réduite d'environ 45 %, et une réelle réserve pour la croissance future.

Risques et mesures préventives spécifiques

RisqueComment il se manifeste concrètementMesure préventive
Nouvelle intégration non vérifiée par rapport au budget existantBlocage apparaissant uniquement après la mise en productionExigence de revue de capacité pour toute nouvelle intégration avant le Go Live
Réessai sans retour arrière (Backoff)Blocage temporaire se transformant en panne de plusieurs heuresBackoff exponentiel avec Jitter et Circuit Breaker chez chaque consommateur API
Utilisation de REST pour des volumes importantsUn processus unique consomme des dizaines de pour cent du quota quotidienPassage à Bulk API au-delà d'un seuil de volume prédéfini
Absence de séparation des utilisateurs d'intégrationImpossibilité de savoir quelle intégration consomme le quotaUtilisateur d'intégration dédié à chaque système externe, surveillé séparément
Absence de réserve dans le budgetLe moindre ajout entraîne un dépassementAllouer 15 %-20 % du quota en tant que réserve permanente non attribuée aux processus quotidiens

Liste de vérification avant d'ajouter une nouvelle intégration

  • ☐ Connaître le pourcentage du quota journalier consommé actuellement, par utilisateur d'intégration.
  • ☐ Évaluer le volume de pointe (non le volume moyen) de la nouvelle intégration.
  • ☐ Avoir choisi entre REST et Bulk API en fonction du seuil de volume, et non de la facilité de développement.
  • ☐ Disposer d'un mécanisme de Backoff avec Jitter et Circuit Breaker dans le code du consommateur.
  • ☐ Avoir défini une alerte lorsque la consommation du quota journalier dépasse 70 %.
  • ☐ Avoir examiné la possibilité d'utiliser Platform Cache pour réduire les appels répétitifs.
  • ☐ Disposer d'une réserve de 15 % à 20 % du quota non allouée au préalable.
  • ☐ Avoir désigné un propriétaire opérationnel qui reçoit l'alerte, et non seulement un journal technique.

Comment surveiller cela au quotidien

Une mesure fiable nécessite la combinaison de trois sources : Event Monitoring (ou Shield Event Monitoring) pour la consommation d'API réelle par utilisateur, les limites Apex dans le code lui-même (Limits.getLimitApiRequests()) pour une vérification locale en temps réel, et le tableau de bord intégré sous les informations de l'entreprise qui affiche la consommation par rapport au quota au niveau de l'organisation. Aucune de ces trois sources n'est suffisante seule : la première montre une tendance, la seconde prévient les défaillances dans un processus unique, et la troisième sert de vue d'ensemble quotidienne pour l'équipe des opérations.

Une métrique à suivre sur le long terme est non seulement la "consommation réelle", mais aussi le "taux de croissance mensuel de la consommation", car c'est ce qui permet de prévoir quand l'organisation atteindra la limite, au lieu de réagir après qu'un blocage se soit produit. Lorsque plusieurs systèmes sont interdépendants, il est pertinent d'examiner également le modèle d'intégration global par rapport à la Connexion de Salesforce aux systèmes ERP, ainsi que la question de l'implémentation – Flow vs Apex – qui influence également l'efficacité des appels, comme détaillé dans Salesforce Flow ou Apex.

Résumé

Les limites d'API de Salesforce ne sont pas un problème à résoudre au moment où il se manifeste, mais une variable à intégrer dès le premier jour dans toute décision d'intégration. Un budget d'appels documenté par utilisateur d'intégration, un choix conscient entre REST et Bulk en fonction du volume, et un mécanisme de "Backoff" pour prévenir l'auto-submersion – ces trois éléments combinés distinguent une organisation qui découvre le problème lorsqu'elle est déjà bloquée, d'une organisation qui anticipe son approche un mois à l'avance et agit en conséquence.