Limites, quotas et performance
État actuel des limites côté API B2B et recommandations pour maintenir la performance sous charge.
1. État actuel
L'API B2B n'expose pas aujourd'hui de rate-limit serveur standardisé :
- Pas d'en-tête
X-RateLimit-*sur les réponses. - Pas de réponse
429 Too Many Requestssystématique. - Pas de limites publiées par endpoint.
En pratique, les limites sont implicites :
- Timeouts ASP.NET Core côté serveur (120s par défaut).
- Concurrence côté DB (pool de connexions EF Core).
- Bande passante réseau entre MCM et votre infrastructure.
2. Bornes opérationnelles observées
Ces bornes sont empiriques — testées en staging/prod mais non garanties contractuellement. Vérifiez avec votre contact MCM pour vos cas de charge exceptionnelle.
| Opération | Volume testé sans dégradation | Commentaire |
|---|---|---|
ISyncClient.Sync | ~10 000 employés / appel | Avec emplois imbriqués. Au-delà, découper en lots |
IVotantsClient.MettreAJourDroitsDeVote | 40 000+ IDs / appel | Optimisé pour grands volumes |
IEmployesClient.UpdateCourriels | ~5 000 entrées / appel | Validation par entrée |
ISignatureClient.SearchSignaturesV2 | ~100 000 résultats retournés | Préférer fenêtre glissante au-delà |
GetAll* (employeurs, syndicats, formulaires) | ≤ 1 000 entités | Sans pagination — à utiliser avec parcimonie |
3. Recommandations de parallélisme
Appels unitaires en rafale
await Parallel.ForEachAsync(
items,
new ParallelOptions
{
MaxDegreeOfParallelism = 10, // 5-10 = sweet spot
CancellationToken = ct
},
async (item, innerCt) =>
{
await client.UpsertVotant(campagneId, item);
});
MaxDegreeOfParallelism = 10est une bonne valeur par défaut.- Au-delà de 20, vous risquez de saturer le pool de connexions HTTP de votre côté (
HttpClientpartagé) et la DB côté MCM. - Surveillez la latence P95 par appel. Si elle augmente > 2× sous charge, baissez le parallélisme.
Appels bulk
Un seul appel gras > N appels fins. Priorisez toujours :
ISyncClient.Syncpour les employés (plutôt queAddEmployeen boucle).IVotantsClient.MettreAJourDroitsDeVotepour les droits de vote en lot (plutôt queIListeElectoraleClient.MettreAJourDroitDeVoteunitaire).SearchSignaturesV2avec filtres riches (plutôt queGetSignaturesV2ParIdExternepour chaque membre).
4. Taille des charges utiles
Sérialisation
- JSON UTF-8, pas de compression automatique côté client (activable via
HttpClientmiddleware). - Pas de limite maximale explicite côté serveur, mais ASP.NET Core plafonne par défaut à ~30 Mo par requête.
Estimation
1 employé B2BUpsertEmployeDtoV2 avec 2 emplois + 1 adhésion ≈ 1.5 KB JSON
10 000 employés ≈ 15 MB JSON → dans la limite
Au-delà, découpez en lots de 5 000 ou utilisez la compression gzip (MCM accepte Content-Encoding: gzip).
5. Stratégies pour la haute volumétrie
Import initial (1M+ employés)
- Créer d'abord tous les syndicats et employeurs (ensemble petit, stable).
- Découper les employés en fichiers de 10 000.
- Boucler sur les fichiers avec un
Syncpar fichier, séquentiel (pas en parallèle — sinon contention DB côté MCM). - Logger les
B2BSyncResult.Erreurspour les corrections ultérieures. - Garder un état local (
LastBatchFinished) pour reprendre en cas d'interruption.
Sync incrémental (quotidien)
- Récupérer
LastSyncedAtdepuis votre stockage. - Extraire les employés modifiés depuis
LastSyncedAt. Syncen un seul appel (ou 2-3 lots) — rarement > 1 000 employés par jour.- Persister le nouveau
LastSyncedAtaprès succès complet.
Analyse / export (adhésions, consentements)
Fenêtre temporelle glissante — voir search-and-filtering.md §4.
6. Observabilité et alerting
À instrumenter côté consommateur :
| Métrique | Seuil d'alerte |
|---|---|
Taux d'erreur 5xx sur B2B | > 1 % sur 5 min |
| Latence P95 par endpoint | 2× baseline sur 10 min |
Taux de 429 (futur) | > 0.5 % |
Taille moyenne payload Sync | > 20 MB (signe d'un batch trop gros) |
Durée totale Sync | > 3 min (découper si possible) |
Exemple Serilog + OpenTelemetry :
using var activity = ActivitySource.StartActivity("mcm.sync");
activity?.SetTag("mcm.employes.count", employes.Count);
var sw = Stopwatch.StartNew();
var result = await syncClient.Sync(syndicats, employes, []);
activity?.SetTag("mcm.sync.durationMs", sw.ElapsedMilliseconds);
if (result.IsError)
{
activity?.SetStatus(ActivityStatusCode.Error, result.FirstError.Description);
logger.LogError("MCM Sync failed: {Code}", result.FirstError.Code);
}
7. Que faire en cas de dégradation côté MCM
- Baisser le parallélisme (de 10 à 5, voire 1 — séquentiel).
- Augmenter l'intervalle entre lots (1s → 5s entre appels).
- Activer le retry exponentiel — voir idempotency.md §2.
- Contacter MCM avec :
- Timestamp UTC du début de dégradation.
- Endpoint concerné (
POST b2b/v2/employe/Sync). - Volume / payload moyen.
- Codes d'erreur observés.
- Dégradation contrôlée de votre côté : si MCM est indisponible, mettez le sync en file d'attente plutôt que de perdre les événements.
8. Évolutions prévues
Cette section sera mise à jour quand MCM introduira des limites de débit explicites. À ce moment-là, ce guide exposera :
- Quotas par endpoint et par clé API.
- Format des en-têtes
X-RateLimit-Remaining/X-RateLimit-Reset. - Politique de
429+Retry-After.
En attendant, les recommandations ci-dessus sont les meilleures pratiques.
Voir aussi
- Guide — idempotence et retry
- Guide — recherche et filtrage (stratégies volumétrie)
- Référence SDK —
ISyncClient