# architect Guides de décision (decision-guides) - Full Documentation # Utilisation des outils et schémas appropriés pour les architectures pilotées par les événements ## Vue d'ensemble Les architectures pilotées par l'événement prennent en charge la production et la consommation efficaces d'événements, qui communiquent les changements d'état du système ou de l'application. Ces architectures permettent des connexions flexibles entre les systèmes, et prennent en charge les processus et les mises à jour en temps quasi réel qui fonctionnent entre les systèmes. Les avantages des architectures pilotées par l'événement sont faciles à voir, mais les détails d'implémentation ne sont pas toujours aussi clairs. Quelles capacités devez-vous prendre en compte dans les modèles architecturaux pilotés par l'événement ? Quels problèmes spécifiques ces schémas résolvent-ils ? Quelles considérations particulières s'appliquent à vos solutions et quels sont les modèles optimaux pour les résoudre ? Ce guide présente les modèles utilisés pour élaborer des architectures pilotées par les événements optimales lors de l'utilisation de technologies Salesforce. Il traite également des outils de concours complet disponibles dans Salesforce et fournit des recommandations d'outils pour une sélection de cas d'utilisation. Pour plus d'informations sur les intégrations au niveau des données impliquant Salesforce, consultez notre [Data Integration Decision Guide](/docs/architect/fr-fr/decision-guides/guide/data-integration). ## Points à retenir - **Utilisez des architectures pilotées par l'événement pour les processus qui ne nécessitent pas de réponses synchrones aux requêtes.** Les schémas présentés dans ce guide sont conçus pour la cohérence, l'évolutivité et la réutilisation des données, ce qui permet de réduire au minimum les dettes techniques à mesure que le paysage applicatif de votre organisation évolue. (Pour plus d'informations, consultez [Bien archivé - Débit](/docs/architect/fr-fr/well-architected/guide/reliable#débit)). - **Si MuleSoft ou une autre solution Enterprise Service Bus (ESB) fait partie de votre paysage existant, utilisez-la dans la mesure du possible.** Ces solutions sont spécialement conçues pour prendre en charge les modèles d'architecture pilotée par l'événement et offrent de puissantes capacités qui permettent de réutiliser les intégrations dans votre entreprise. - **Utilisez l'API Pub/Sub pour les futurs modèles de publication/abonnement au lieu d'élaborer vos propres gestionnaires d'événements en utilisant d'autres API, notamment l'API Streaming.** L'API Pub/Sub étant désormais globalement disponible, utilisez-la pour tous les nouveaux modèles de publication/abonnement. Planifiez la migration des communications d'événements existantes en utilisant d'autres API de plate-forme, telles que l'API Streaming ou des services Apex personnalisés, vers l'API Pub/Sub lorsque cela est possible. - **Les événements de plate-forme et la Capture des données de modification (CDC) sont les mécanismes privilégiés pour publier les modifications des enregistrements et des champs qui doivent être consommés par d'autres systèmes.** Nous recommandons de ne pas utiliser PushTopic et des événements génériques pour les nouvelles implémentations. Salesforce continuera de prendre en charge PushTopic et les événements génériques dans les limites des capacités fonctionnelles actuelles, mais n'envisage pas d'autres investissements dans cette technologie. ## Produits dans la portée
| Salesforce Platform est une plate-forme complète pilotée par l’IA qui unifie les employés, les agents IA autonomes, les données de l’entreprise et les applications dans un système unique et de confiance pour améliorer la productivité et l’expérience client. Il permet la création d'une "entreprise agentique" en connectant les applications Customer 360, Data Cloud, et Slack pour une automatisation de bout en bout. | |
![]() |
MuleSoft est la plate-forme d'intégration leader de Salesforce qui permet aux organisations de connecter des applications, des données et des appareils à travers des environnements sur site et cloud. MuleSoft est une plate-forme qui fournit aux TI les plates-formes nécessaires pour déverrouiller les données entre les systèmes, développer des infrastructures d'intégration et d'automatisation évolutives, et créer rapidement des expériences connectées différenciées. |
| Point de décision | Guide |
|---|---|
| Notifications en temps quasi réel | Les modèles d'architecture pilotée par l'événement, tels que publier/s'abonner, fanout et streaming, fonctionnent généralement bien dans les scénarios où plusieurs applications doivent être notifiées en temps quasi réel des changements de statut ou des mises à jour d'enregistrement. |
| Traitement parallèle | Les modèles tels que publier/s'abonner fonctionnent généralement bien dans les scénarios où des volumes de données importants ou des messages très complexes nécessitent de distribuer la charge de traitement entre plusieurs systèmes. |
| Lectures à haut volume | Les modèles Messages transmis et File d'attente sont fréquemment utilisés dans les situations où les organisations subissent des augmentations et où le volume de messages produits peut dépasser la capacité des abonnés à les traiter immédiatement. |
| Écritures à haut volume | Les schémas Streaming et Queuing fonctionnent bien dans de nombreux scénarios où les organisations subissent une augmentation du nombre de messages produits. |
| Envoi des mêmes données à différents systèmes | Bien que publier/s'abonner tende à être une solution assez courante pour les organisations qui doivent envoyer les mêmes données à plusieurs systèmes, elle peut être traitée par la plupart des modèles couverts ici. Assurez-vous de les examiner en détail pour trouver le meilleur ajustement. |
| Introduction fréquente de nouveaux systèmes ou dispositifs | Les schémas Publier/S'abonner, Streaming et File d'attente fonctionnent généralement bien dans les scénarios où le paysage global tend à évoluer, avec de nouveaux systèmes et appareils ajoutés régulièrement. Dans ce scénario, un nouveau système ou appareil doit simplement devenir abonné au bus d'événement ou associé à une file d'attente, pour commencer à recevoir des messages plutôt que de demander une intégration point à point personnalisée. |
| Appareils Internet des objets | Les appareils Internet des objets fournissent généralement des mises à jour fréquentes et peuvent également générer une augmentation des messages dans certains scénarios. Par conséquent, les modèles Streaming et Queuing fonctionnent généralement bien lors de leur intégration dans un paysage informatique. |
| Appareils et systèmes mobiles hors ligne | Les appareils mobiles qui doivent travailler dans des zones avec un accès Internet de faible qualité ou inexistant, ou des systèmes qui peuvent être hors ligne au moment de la remise des messages, bénéficieront du modèle Queuing, qui leur permet de se connecter à leurs files d'attente et de récupérer tous les messages pertinents une fois de retour en ligne. |
| Point de décision | Guide/Questions à poser |
|---|---|
| Exigences métiers | Existe-t-il un réel besoin métier pour l'une des fonctionnalités décrites dans la section [Quand utiliser une architecture pilotée par un événement] (#quand-utiliser-une-architecture-pilotée-par-un-événement) ? |
| Prescriptions techniques | L'intégration que vous concevez correspond-elle à un schéma différent, par exemple virtualisation des données, lot ou requête/réponse ? En d'autres termes, essayez-vous d'insérer une cheville carrée dans un trou rond ? |
| Processus exigeant que les humains attendent des réponses | Toute intégration impliquant un humain attendant une réponse du système cible n'est pas adaptée aux architectures pilotées par l'événement, car elles sont conçues pour une exécution asynchrone et ne peuvent pas garantir un temps de réponse. Déterminez si de tels processus sont optimaux pour votre organisation avant d'implémenter des solutions techniques. Pour plus d'informations, consultez [Well-Architected - Process Design](/docs/architect/fr-fr/well-architected/guide/automated#conception-de-processus). |
| Données sources souvent modifiées | Si les données de votre système source changent si rarement que les mises à jour périodiques sont suffisantes, vous pouvez probablement simplifier votre architecture en utilisant [batch patterns] (https://developer.salesforce.com/docs/atlas.en-us.integration_patterns_and_practices.meta/integration_patterns_and_practices/integ_pat_batch_data_sync.htm) au lieu de modèles pilotés par l'événement. |
| Exigences de mise en œuvre | La majorité des systèmes impliqués dans votre solution prennent-ils en charge les architectures pilotées par les événements ? Que faudrait-il pour utiliser des architectures pilotées par l'événement avec les systèmes qui ne les prennent pas en charge (par exemple, mises à niveau, personnalisations ou middleware) ? Quel niveau d'effort serait nécessaire pour satisfaire à ces exigences? |
| Stabilité de la structure du message | À quelle fréquence vos structures de messages doivent-elles changer ? Quels systèmes seront touchés par un tel changement et quel sera le processus d'assainissement? |
| Gouvernance organisationnelle | Avez-vous mis en place une structure de gouvernance pour vous assurer que toutes les parties prenantes sont informées des changements apportés aux structures de messages, aux déclencheurs et à d'autres décisions liées à l'architecture et aux processus, et qu'elles sont en mesure d'y contribuer ? |
| Ensembles de compétences requis | Votre personnel a-t-il de l'expérience avec les architectures pilotées par les événements et saura-t-il comment les prendre en charge ? |
| Modèle | Temps quasi réel | Copie de message unique | Garantie de livraison | Réduire la taille du message | Transformation des données |
|---|---|---|---|---|---|
| Publier / S'abonner | ✓ | ✓ | ✓ | ||
| Fanout | ✓ | ✓ | ✓ | ||
| Messages transmis | ✓ | ✓ | ✓ | ✓ | |
| Streaming | ✓ | ✓ | ✓ | ||
| Mise en file d'attente | ✓ | ✓ | ✓ |
| Outil | Description | Compétences requises | |
|---|---|---|---|
| MuleSoft | Anypoint Platform | Plate-forme qui active l'intégration de données en utilisant des couches d'API. | Pro-code |
| Connecteur Salesforce Pub/Sub | Connecteur pour l'API Pub/Sub, qui fournit une interface unique de publication et d'abonnement aux événements de plate-forme, aux événements de surveillance des événements en temps réel et aux événements de capture des données de modification. | Pro-code | |
| Connecteur MuleSoft Anypoint JMS | Connecteur qui permet d'envoyer et de recevoir des messages dans des files d'attente et des rubriques pour n'importe quel service de messagerie qui implémente la spécification Java Message Service (JMS). | Pro-code | |
| Connecteur MuleSoft Anypoint Apache Kafka | Connecteur permettant de déplacer des données entre Apache Kafka et des applications et services d'entreprise. | Pro-code | |
| MuleSoft Anypoint Solace Connecteur | Un connecteur pour les courtiers d'événements Solace PubSub+ avec une intégration d'API native utilisant le kit de développement Java JCSMP | Pro-code | |
| Connecteur MuleSoft Anypoint MQ | Un service de messagerie cloud multilocataire qui permet aux clients d'effectuer une messagerie asynchrone avancée entre leurs applications. | Pro-code | |
| Connecteur MQTT MuleSoft Anypoint | Une extension MuleSoft conforme au protocole MQTT (Message Queuing Telemetry Transport) v3.x. | Pro-code | |
| Connecteur MuleSoft Anypoint AMQP | Un connecteur qui permet à votre application de publier et de consommer des messages en utilisant un courtier conforme AMQP 0.9.1. | Pro-code | |
| API MuleSoft Anypoint Event-Driven (ASync) | Langage agnostique du secteur d'activité qui prend en charge la publication d'API pilotées par l'événement en les séparant en couches événement, canal et transport. | Pro-code | |
| MuleSoft Anypoint MQ | Service de messagerie cloud multitenant qui permet aux clients d'effectuer une messagerie asynchrone avancée entre leurs applications. | Pro-code | |
| Flux de données MuleSoft Anypoint | Infrastructure disponible dans MuleSoft Anypoint pour la publication et l'abonnement à des données en continu. | Pro-code | |
| Salesforce Platform | Apache Kafka sur Heroku | Complément Heroku qui fournit Apache Kafka en tant que service avec une intégration complète de la plate-forme à la plate-forme Heroku. | Pro-code |
| Capture des données | Journal des événements de modification, qui publie les modifications apportées aux enregistrements Salesforce. Les modifications comprennent la création d'un enregistrement, la mise à jour d'un enregistrement existant, la suppression d'un enregistrement et l'annulation de la suppression d'un enregistrement. | Code faible à code pro | |
| Messages sortants | Actions qui envoient des messages XML à des points de terminaison externes lorsque les valeurs de champ sont mises à jour dans Salesforce. | Code faible | |
| Événements de plate-forme | Messages sécurisés et évolutifs contenant des données d'événement personnalisées. | Code faible à code pro | |
| API Pub/Sub | API qui active les abonnements aux événements de plate-forme, aux événements Capture des données de modification et/ou aux événements Surveillance des événements en temps réel. | Pro-code | |
| Relais d'événements | Permet l'envoi d'événements de plate-forme et d'événements de capture des données de modification depuis Salesforce vers Amazon EventBridge. Notez que les relais d'événements se connectent uniquement à AWS Eventbridge. | Code faible | |
#### Outils relatifs au schéma Publier/S'abonner
| Flux et comportement des événements | Considérations relatives à la charge de travail | ||||||
|---|---|---|---|---|---|---|---|
| Outils disponibles | Compétences requises | Publier via | S'abonner via | Période de relecture | Structure de la charge utile | Limites de charge utile | |
| MuleSoft | Anypoint Platform | Pro-code | API | API | Configuré | Utilisateur défini | Aucun |
| Connecteur Salesforce Pub/Sub | Pro-code | API | API | Configuré | Utilisateur défini | Aucun | |
| Connecteur MuleSoft Anypoint JMS | Pro-code | API | API | Configuré | Utilisateur défini | Aucun | |
| Connecteur MuleSoft Anypoint Apache Kafka | Pro-code | API | API | Configuré | Utilisateur défini | Aucun | |
| MuleSoft Anypoint Solace Connecteur | Pro-code | API | API | Configuré | Utilisateur défini | Aucun | |
| Connecteur MuleSoft Anypoint MQ | Pro-code | API | API | Configuré | Utilisateur défini | Aucun | |
| Connecteur MQTT MuleSoft Anypoint | Pro-code | API | API | Configuré | Utilisateur défini | Aucun | |
| Connecteur MuleSoft Anypoint AMQP | Pro-code | API | API | Configuré | Utilisateur défini | Aucun | |
| API MuleSoft Anypoint Event-Driven (ASync) | Pro-code | API | API | Configuré | Utilisateur défini | Aucun | |
| MuleSoft Anypoint MQ | Pro-code | API | API | Configuré | Utilisateur défini | Aucun | |
| Salesforce Platform | Apache Kafka sur Heroku | Pro-code | API, changements d'enregistrement dans Heroku Postgres | S.O. | 1 à 6 semaines | Utilisateur défini | Utilisateur défini |
| Capture des données | Code faible à code pro | Modifications d'enregistrement | Apex, API, Composants Web Lightning (LWC) | 3 jours | Prédéfini | 1 MB | |
| Messages sortants* | Code faible | Règles de flux et de workflow | S.O. | 24 heures | Utilisateur défini | 100 notifications par message | |
| Événements de plate-forme | Code faible à code pro | API, Apex, Flux | Apex, API, flux, LWC | 3 jours | Utilisateur défini | 1 MB | |
| API Pub/Sub | Pro-code | API Pub/Sub ou API, Apex, Flux | API Pub/Sub | 3 jours | Utilisateur défini | 1 MB | |
| Relais d'événements** | Code faible | Événements de plate-forme, Capture des données de modification | API | 3 jours | Utilisateur défini | 1 MB | |
| *Salesforce continuera de prendre en charge les messages sortants dans les limites des capacités fonctionnelles actuelles, mais n'envisage pas d'autres investissements dans cette technologie. **Les relais d'événements se connectent uniquement à AWS Eventbridge | |||||||
#### Outils relatifs au modèle Fanout
| Flux et comportement des événements | Considérations relatives à la charge de travail | ||||||
|---|---|---|---|---|---|---|---|
| Outils disponibles | Compétences requises | Publier via | S'abonner via | Période de relecture | Structure de la charge utile | Limites de charge utile | |
| MuleSoft | Connecteur MuleSoft Anypoint JMS | Pro-code | API | API | Configuré | Utilisateur défini | Aucun |
| Connecteur Salesforce Pub/Sub | Pro-code | API | API | Configuré | Utilisateur défini | Aucun | |
| Connecteur MuleSoft Anypoint Apache Kafka | Pro-code | API | API | Configuré | Utilisateur défini | Aucun | |
| MuleSoft Anypoint Solace Connecteur | Pro-code | API | API | Configuré | Utilisateur défini | Aucun | |
| Connecteur MuleSoft Anypoint MQ | Pro-code | API | API | Configuré | Utilisateur défini | Aucun | |
| Connecteur MQTT MuleSoft Anypoint | Pro-code | API | API | Configuré | Utilisateur défini | Aucun | |
| Connecteur MuleSoft Anypoint AMQP | Pro-code | API | API | Configuré | Utilisateur défini | Aucun | |
| MuleSoft Anypoint MQ | Pro-code | API | API | Configuré | Utilisateur défini | Aucun | |
| Salesforce Platform | Apache Kafka sur Heroku | Pro-code | API, changements d'enregistrement dans Heroku Postgres | S.O. | 1 à 6 semaines | Utilisateur défini | Utilisateur défini |
| Capture des données | Code faible à code pro | Modifications d'enregistrement | Apex, API, Composants Web Lightning (LWC) | 3 jours | Prédéfini | 1 MB | |
| Événements de plate-forme | Code faible à code pro | API, Apex, Flux | Apex, API, flux, LWC | 3 jours | Utilisateur défini | 1 MB | |
| API Pub/Sub | Pro-code | API Pub/Sub ou Apex, API, flux | API Pub/Sub | 3 jours | Utilisateur défini | 1 MB | |
| Relais d'événements* | Code faible | Événements de plate-forme, Capture des données de modification | API | 3 jours | Utilisateur défini | 1 MB | |
| *Les relais d'événements envoient uniquement des données à AWS Eventbridge | |||||||
#### Outils relatifs au modèle Messages transmis
| Flux et comportement des événements | Considérations relatives à la charge de travail | ||||||
|---|---|---|---|---|---|---|---|
| Outils disponibles | Compétences requises | Publier via | S'abonner via | Période de relecture | Structure de la charge utile | Limites de charge utile | |
| MuleSoft | Connecteur MuleSoft Anypoint Apache Kafka | Pro-code | API | API | Configuré | Utilisateur défini | Aucun |
| Connecteur Salesforce Pub/Sub | Pro-code | API | API | Configuré | Utilisateur défini | Aucun | |
| Salesforce Platform | Apache Kafka sur Heroku | Pro-code | API, changements d'enregistrement dans Heroku Postgres | S.O. | 1 à 6 semaines | Utilisateur défini | Utilisateur défini |
| Capture des données | Code faible à code pro | Modifications d'enregistrement | Apex, API, Composants Web Lightning (LWC) | 3 jours | Prédéfini | 1 MB | |
| Événements de plate-forme | Code faible à code pro | API, Apex, Flux | Apex, API, flux, LWC | 3 jours | Utilisateur défini | 1 MB | |
| API Pub/Sub | Pro-code | API Pub/Sub ou API, flux Apex | API Pub/Sub | 3 jours | Utilisateur défini | 1 MB | |
| Relais d'événements* | Code faible | Événements de plate-forme, Capture des données de modification | API | 3 jours | Utilisateur défini | 1 MB | |
| *Les relais d'événements envoient uniquement des données à AWS Eventbridge | |||||||
#### Outils correspondant au schéma de diffusion en continu
| Flux et comportement des événements | Considérations relatives à la charge de travail | ||||||
|---|---|---|---|---|---|---|---|
| Outils disponibles | Compétences requises | Publier via | S'abonner via | Période de relecture | Structure de la charge utile | Limites de charge utile | |
| MuleSoft | Flux de données MuleSoft Anypoint | Pro-code | API | API | Configuré | Utilisateur défini | Aucun |
| Connecteur Salesforce Pub/Sub | Pro-code | API | API | Configuré | Utilisateur défini | Aucun | |
| Connecteur MuleSoft Anypoint Apache Kafka | Pro-code | API | API | Configuré | Utilisateur défini | Aucun | |
| Salesforce Platform | Apache Kafka sur Heroku | Pro-code | API, changements d'enregistrement dans Heroku Postgres | S.O. | 1 à 6 semaines | Utilisateur défini | Utilisateur défini |
| API Pub/Sub | Pro-code | API Pub/Sub ou API, flux Apex | API Pub/Sub | 3 jours | Utilisateur défini | 1 MB | |
#### Outils relatifs au schéma de mise en file d'attente
| Flux et comportement des événements | Considérations relatives à la charge de travail | ||||||
|---|---|---|---|---|---|---|---|
| Outils disponibles | Compétences requises | Publier via | S'abonner via | Période de relecture | Structure de la charge utile | Limites de charge utile | |
| MuleSoft | MuleSoft Anypoint MQ | Pro-code | API | API | Configuré | Utilisateur défini | Aucun |
| Connecteur Salesforce Pub/Sub | Pro-code | API | API | Configuré | Utilisateur défini | Aucun | |
| Connecteur MuleSoft Anypoint Apache Kafka | Pro-code | API | API | Configuré | Utilisateur défini | Aucun | |
| Connecteur MuleSoft Anypoint MQ | Pro-code | API | API | Configuré | Utilisateur défini | Aucun | |
| Connecteur MQTT MuleSoft Anypoint | Pro-code | API | API | Configuré | Utilisateur défini | Aucun | |
| Connecteur MuleSoft Anypoint AMQP | Pro-code | API | API | Configuré | Utilisateur défini | Aucun | |
| Salesforce Platform | Apache Kafka sur Heroku | Pro-code | API, changements d'enregistrement dans Heroku Postgres | S.O. | 1 à 6 semaines | Utilisateur défini | Utilisateur défini |
| Capture des données | Code faible à code pro | Modifications d'enregistrement | Apex, API, Composants Web Lightning (LWC) | 3 jours | Prédéfini | 1 MB | |
| Événements de plate-forme | Code faible à code pro | API, Apex, Flux | Apex, API, flux, LWC | 3 jours | Utilisateur défini | 1 MB | |
| API Pub/Sub | Pro-code | API Pub/Sub ou API, Apex, Flux | API Pub/Sub | 3 jours | Utilisateur défini | 1 MB | |
| Relais d'événements* | Code faible | Événements de plate-forme, Capture des données de modification | API | 3 jours | Utilisateur défini | 1 MB | |
| *Les relais d'événements envoient uniquement des données à AWS Eventbridge | |||||||
| Flux | Salesforce Flow est un puissant outil d'automatisation par pointer-cliquer qui permet aux utilisateurs d'élaborer visuellement des processus métiers, des écrans et une logique complexes en utilisant Flow Builder, sans écrire de code. Il automatise des tâches telles que la mise à jour des données, l'envoi d'e-mails et le guidage des utilisateurs, offrant ainsi de la flexibilité à travers des types tels que Flux d'écran (interaction utilisateur) et Flux déclenchés (enregistrement/événements planifiés). |
| Apex | Salesforce Apex est un langage de programmation propriétaire et orienté objet pour la plate-forme Salesforce, similaire à Java, utilisé pour élaborer une logique métier personnalisée, automatiser les processus et étendre les fonctionnalités CRM de base au-delà des outils déclaratifs. |
À mesure que l'étendue et la complexité de votre application Salesforce augmentent, engagez-vous vers un point d'entrée principal unique, soit Flux déclenché par un enregistrement, soit Déclencheurs Apex. Évitez de partitionner les automatisations entre plusieurs mécanismes dans un seul objet Salesforce, car cela entraîne une mauvaise maintenabilité et une gouvernance fragmentée.
### Matrice de sélection de la densité
Utilisez cette matrice afin de déterminer la norme architecturale requise pour votre objet Salesforce.
- Le **flux déclenché par** un enregistrement est la solution préférée pour une faible densité d'automatisation. Il offre un équilibre de puissance et d'accessibilité idéal pour des automatisations simples et indépendantes les unes des autres.
- **Le schéma hybride (flux déclenché par un enregistrement avec Apex invocable)** est un choix puissant et maintenable pour les automatisations à densité moyenne avec une complexité croissante. Ce schéma permet aux équipes de maintenir une chorégraphie ordonnée dans Flux déclaratif tout en déléguant des opérations lourdes en calcul à Apex, en équilibrant l'accessibilité avec les performances.
- Les **déclencheurs Apex** fournissent les blocs de construction nécessaires à une fondation architecturale solide pour soutenir les automatisations à haute densité. Les performances, le contrôle granulaire, ainsi que l'abstraction orientée objet et le polymorphisme d'Apex sont mieux adaptés pour gérer la complexité et l'échelle de ces scénarios.
| Niveau de densité | Quantité d'automatisation | Volume de données (taille du lot) | Sprawl de dépendance | Norme architecturale |
|---|---|---|---|---|
| Faible | < 15 Automatisations |
Standard Interactions de l'interface utilisateur pilotées par l'utilisateur ou petites charges d'API (1 à 200 enregistrements) |
Discret Logique autonome. 0 à 1 opérations DML en aval sur le même objet ou un objet associé. |
Flux déclenché par un enregistrement |
| Moyen | 15–30 Automatisations |
Modérer Traitement par lot standard (avec une logique nécessitant un traitement en masse minutieux) |
Couplé Parent/Enfant met à jour 2 à 4 opérations DML en aval. Risque de récursion |
Modèle hybride Flux + Apex invocable |
| Élevée | > 30 Automatisations |
Élevée Volumes de données importants avec des chargements d'API en masse (2 000 à plus de 10 000 enregistrements) |
Complexe et récursif Graphique de dépendance profonde (5+ opérations DML en aval). Risque de boucles de récursion triangulaires |
Infrastructure de métadonnées de déclencheur Apex |
| Capacité | Flux déclenché par un enregistrement | Déclencheur Apex |
|---|---|---|
| Rapidité de livraison et d'entretien | Recommandé L'interface utilisateur visuelle de Flow Builder permet aux administrateurs et autres générateurs déclaratifs de créer et de modifier des automatisations plus rapidement que l'écriture, le test et le déploiement d'un code Apex. Cette interface permet à un plus grand nombre de membres de l'équipe d'offrir de la valeur métier et réduit la dépendance aux ressources spécialisées pour les développeurs pour de simples tâches. |
Expertise requise Apex nécessite des développeurs de logiciels correctement qualifiés pour implémenter, tester et maintenir le code. |
| Modularité | Disponible Les flux déclenchés par un enregistrement sont modulaires par défaut. Au lieu d'une logique monolithique, les équipes élaborent des flux discrets pour des exigences spécifiques et les chorégraphient ensemble en utilisant l'Explorateur de déclencheur de flux. Cette modularité permet une modification isolée et une extension simple, réduisant considérablement le coût à long terme de propriété. |
Disponible Apex est divisé en modules fonctionnels par conception. Chaque classe Apex est destinée à implémenter un seul module de fonctionnalité. |
| Visibilité et gouvernance | Recommandé La nature visuelle de Flux offre une représentation intuitive de la logique métier. L'Explorateur de déclencheur de flux fournit une vue consolidée de tous les flux d'un objet, ce qui facilite la compréhension, la gouvernance et le dépannage des architectes et des administrateurs sans lire de code. |
Expertise requise L'utilisation d'une infrastructure de métadonnées pour organiser les déclencheurs est avantageuse, mais Apex nécessite une équipe de développement disciplinée pour garder le code organisé et maintenable. |
| Traitement en masse des données haute performance | Non recommandé Le risque d'atteindre les limites du gouverneur est élevé lorsqu'il s'agit d'une logique complexe ou de volumes de données importants. |
Recommandé Le code Apex exécute au plus près des services de base de la plate-forme et offre aux développeurs un contrôle renforcé sur l'optimisation des requêtes, le traitement des données et l'efficacité algorithmique. Cela améliore les performances et l'échelle, en particulier dans les scénarios complexes impliquant des volumes de données importants. |
| Logique robuste et structures de données | Disponible L'élément Transformation de flux peut faciliter certaines tâches de traitement complexes. Cependant, Flow n'a pas de structures de données Map et Set natives, ce qui rend le traitement des données complexes lourd et inefficace sur le plan informatique. |
Recommandé Apex fournit un accès complet aux boucles Map, Set et programmatic pour une manipulation des données très efficace et sécurisée en masse. En tant que langage de programmation complet, Apex permet également d'accéder à des constructions logiques complexes, des structures de données et des modèles de conception qui peuvent aider à résoudre des problèmes métiers complexes de manière maintenable et efficace. Apex inclut une riche bibliothèque standard de fonctions avancées (par exemple, BusinessHours, Crypto) qui n'est pas disponible actuellement dans les outils déclaratifs. |
| Contrôle des transactions | Non disponible Le flux ne fournit aucun accès à `Database.savepoint`, `Database.rollback` ou aux opérations DML partiellement réussies pour des validations de transaction partielles ou des annulations. |
Disponible Apex fournit un contrôle complet et précis de l'intégrité des transactions et des scénarios complexes de reprise après erreur. |
| Distribution des e-mails | Recommandé L'envoi d'alertes par e-mail préconfigurées à partir d'un flux déclenché par un enregistrement est facile et évolutif. Des alertes par e-mail personnalisées peuvent être élaborées et distribuées à l'exécution. Les e-mails personnalisés sont soumis à des limites quotidiennes en envois. |
Disponible Apex peut générer et envoyer des e-mails personnalisés. Tous les e-mails envoyés depuis Apex sont soumis aux limites quotidiennes en envois. |
| Application des garanties de la plate-forme | Recommandé Le flux inclut des protections intégrées, telles que la mise en masse automatique et les tentatives automatiques. Ces mesures augmentent la vitesse de valorisation et évitent les problèmes de performance qui nécessitent un codage manuel complexe. |
Application manuelle requise Les mesures de protection telles que le traitement en masse doivent être explicitement codées (par exemple, gérer les collections et éviter le SOQL dans les boucles). Les tentatives automatiques ne sont pas natives de déclencheurs et nécessitent une logique personnalisée complexe à implémenter. |
| Traitement asynchrone | Disponible Le flux offre des mécanismes faciles pour les automatisations qui nécessitent une transaction séparée dans un parcours asynchrone. Ces automatisations sont soumises à des limitations quotidiennes. |
Disponible Apex permet un contrôle total via la Capture des données de modification et les événements qui peuvent être mis en file d'attente et qui sont gérés par un abonné au déclencheur découplé. |
| Traitement planifié | Recommandé Les parcours planifiés du flux offrent une capacité de planification unique et puissante (par exemple, « déclencher 3 jours avant la date de fermeture »). Cette capacité inclut l'annulation et la replanification automatiques si les données de l'enregistrement changent. Ces automatisations sont soumises à des limitations quotidiennes. |
Non disponible Un déclencheur Apex ne peut pas planifier nativement un événement temporel, spécifique à un enregistrement, avec une annulation automatique. Apex planifié existe, mais il s'agit d'un mécanisme fondamentalement différent qui est exécuté à une heure spécifique et qui n'est pas planifié pendant le traitement d'un enregistrement individuel dans le cadre d'un déclencheur. |
| Commande et chorégraphie | Disponible L'Explorateur de déclencheur de flux permet aux administrateurs de définir un ordre d'exécution relatif pour plusieurs flux dans le même objet. |
Disponible Une infrastructure de déclencheur permet de contrôler avec précision l'ordre exact des automatisations. |
| Mises à jour du même champ d'enregistrement | Disponible (avant la sauvegarde) Le flux déclenché par un enregistrement est l'option déclarative la plus performante pour mettre à jour l'enregistrement déclenchant avant l'engagement DML initial. |
Disponible (avant la sauvegarde) Apex fournit l'offre la plus performante avec un minimum de frais généraux. |
| CRUD inter-objets | Disponible (après la sauvegarde) Le flux convient aux opérations DML inter-objets simples et peu complexes. |
Disponible (après la sauvegarde) Apex offre un contrôle supérieur de la déduplication, du traitement des erreurs et des performances pour les opérations DML inter-objets. |
| Déduplication du calcul coûteux | Disponible Le flux excelle dans l'élimination des requêtes redondantes et des instructions DML via le traitement en masse automatique. Cependant, l'état ne peut pas être mis en cache ou partagé entre différents déclencheurs de flux ou entre plusieurs invocations du même flux dans une seule transaction. Cette limitation peut devenir importante dans des scénarios de performance extrême. |
Recommandé Apex fournit des mécanismes de déduplication des opérations coûteuses. Les développeurs peuvent exploiter la mise en cache transactionnelle en utilisant des propriétés et des variables statiques, et la mise en cache au niveau de la plate-forme en utilisant Cache de la plate-forme, pour stocker et réutiliser des données. Ces techniques sont importantes pour réduire la consommation des limites du gouverneur transactionnel, telles que les requêtes SOQL, et garantir des performances et une évolutivité élevées. |
| Gestion des erreurs personnalisées | Disponible L'élément CustomError peut bloquer une opération d'enregistrement et afficher un message pour l'utilisateur. |
Recommandé La méthode addError() fournit un message d'erreur flexible au niveau du champ et conditionnel. |
| Cas d'utilisation | Description | Best-Fit | Justification |
|---|---|---|---|
| Traitement par lot hautement performant | Toute automatisation qui doit traiter efficacement des milliers d'enregistrements | Apex | Apex fournit des API riches pour l'interface avec la plate-forme et pour la vitesse brute. |
| Traitement complexe des données | Scénarios qui nécessitent une manipulation avancée des données | Apex | Apex fournit des structures de données, telles que Map et Set, qui ne sont pas disponibles en natif dans Flow, et peuvent être critiques pour écrire un code performant et sécurisé en masse. |
| Contrôle transactionnel | Mécanismes de contrôle tels que les points de sauvegarde, les annulations et les validations partielles | Apex | Apex permet d'accéder à des mécanismes tels que Database.savepoint et Database.rollback, et a la possibilité de traiter les opérations DML partiellement réussies. |
| Validation personnalisée sophistiquée | Validation des données dans plusieurs champs d'un enregistrement | Apex | Bien que Flux puisse empêcher l'enregistrement avec l'élément `CustomError`, il n'est pas disponible dans tous les types de flux, y compris les flux secondaires. La méthode Apex addError() fournit plusieurs messages d'erreur spécifiques à un champ qui peuvent être ajoutés à un enregistrement à tout moment pendant le traitement du déclencheur. |
| Logique moyennement complexe dans un processus simple | Logique et manipulation de données de complexité modérée, simplifiée par une bibliothèque standard de fonctions avancées, survenant dans le cadre d'un processus simple | Flux + Apex | Le flux déclenché par un enregistrement agit en tant que couche d'orchestration, tandis que les opérations hautement complexes sont encapsulées dans Apex invocable. |
| Logique simple à moyennement complexe | Manipulation de données de complexité faible à modérée, avec des mises à jour de déclencheur pour les objets de données principaux et associés | Flux | Le flux est généralement l'option incontournable, car il est basé sur un modèle déclaratif qui le rend accessible aux administrateurs et aux développeurs. |
| Notifications et messages sortants | Envoi d'e-mails et de messages sortants | Flux | Le flux facilite et adapte considérablement l'envoi d'alertes par e-mail et de messages sortants lors de modifications d'enregistrement. |
| Traitement planifié | Automatisation à une date future et dynamique (par exemple, 3 jours avant une date de fermeture) | Flux | Les parcours planifiés offrent une force unique à Flux, car la plate-forme gère automatiquement la planification, l'annulation et la replanification de ces parcours si les données de l'enregistrement changent. |
### Alternative de tâche planifiée
Comme l'indique le diagramme, lorsque vous êtes confronté à des opérations DML à haut volume, mais que vous ne pouvez pas utiliser la Capture des données de modification (peut-être en raison des limitations des objets), le meilleur choix architectural est souvent d'éviter entièrement un processus invoqué par le déclencheur.
Vous pouvez à la place utiliser un processus planifié. Cela peut être soit un flux planifié, soit Apex planifié. Les étapes requises sont :
1. Effectuez une mise à jour simple et économique dans le déclencheur synchrone. Par exemple, définissez un champ de `Status__c` sur « traitement en attente » ou insérez un enregistrement associé peu coûteux, par exemple une publication Chatter, pour indiquer que l'enregistrement doit être traité.
2. Créez une tâche planifiée, soit un flux planifié ou Apex planifié, qui est exécutée périodiquement, par exemple toutes les 15 minutes ou toutes les heures.
3. Définissez la requête de tâche planifiée pour tous les enregistrements à l'état en attente, exécutez la logique complexe dans un contexte contrôlé à haut volume, puis mettez à jour les enregistrements tels qu'ils sont traités.
Ce schéma découple totalement le traitement lourd de l'enregistrement synchrone de l'utilisateur, n'est pas soumis à la limite d'une tâche par transaction d'un lot déclenché par un déclencheur, et offre une solution hautement évolutive et gouvernable pour les exigences en temps réel.
Si la latence d'une tâche planifiée n'est pas acceptable pour les exigences métiers, et que vous êtes toujours contraint d'utiliser CDC ou une file d'attente déclenchée par un déclencheur, cela indique un décalage architectural important. À ce stade, différents mécanismes doivent être envisagés. La réévaluation de la conception de l'application principale peut conduire à certaines conclusions, notamment :
- Achat du complément pour retirer les limites en objets CDC.
- Défiant fondamentalement l'exigence métier de déterminer si le traitement en temps quasi réel est vraiment un « must-have » ou si la latence d'une tâche planifiée est un compromis acceptable pour la stabilité de la plate-forme.
## Considérations non fonctionnelles
### Complexité
Le niveau de complexité d'une implémentation fait partie du coût total de possession d'une solution, ainsi que de sa capacité à s'adapter aux exigences métiers changeantes. La complexité peut impacter n'importe quelle implémentation si les meilleures pratiques ne sont pas respectées. La section _Meilleures pratiques connexes_ de ce document contient des recommandations pour réduire la complexité de votre solution, notamment les modèles suivants :
- Modèle hybride : Apex invocable pour une logique complexe dans un flux
- Utilisation d'une infrastructure de métadonnées pour les déclencheurs Apex
- Mega-Flows vs. Flux multiples
### Processus et normes
La documentation est aussi importante que l'automatisation elle-même. Il garantit non seulement la maintenabilité, mais il est également essentiel pour l'IA et les outils basés sur l'agent. La documentation vous aide à comprendre et à gérer vos processus métiers.
**Dans Flux**
- Établissez une convention de nommage cohérente pour tous les éléments et variables.
- Utilisez le champ Description du flux pour expliquer son objet global, les critères de déclenchement et le résultat escompté.
- Utilisez le champ Description de chaque élément individuel (par exemple, `Get Records`, `Action`, `Transform`). Cette pratique est la meilleure façon de transmettre l'intention. Elle est particulièrement importante pour les actions invocables et les flux secondaires, où la description est l'emplacement principal pour expliquer la logique complexe exécutée par l'action.
**Dans Apex**
- Commentez clairement votre code pour expliquer le _pourquoi_ de votre logique, pas seulement le _quoi_.
- Si vous utilisez une infrastructure pilotée par les métadonnées, assurez-vous que vos enregistrements de métadonnées contiennent et remplissent un champ Description lisible par l'utilisateur pour expliquer ce que fait chaque classe gestionnaire et quand elle doit être exécutée.
Le DevOps et le contrôle du code source font partie d'un cycle de vie de développement mature. Utilisez toujours un outil de contrôle de code source tel que Git pour des projets Salesforce. Les classes Apex et les flux Salesforce sont des métadonnées qui définissent votre logique métier, et ils doivent être contrôlés et gérés par version.
Dans le contexte de la gestion des automatisations déclenchées par un enregistrement, un pipeline DevOps moderne offre des avantages essentiels.
- **Contrôles de qualité automatisés :** Des outils tels que [Salesforce Code Analyzer](https://developer.salesforce.com/docs/platform/salesforce-code-analyzer/overview) peuvent être configurés pour être exécutés automatiquement dans votre pipeline. L ' analyse statique peut détecter des modèles problématiques dans les deux outils d ' automatisation avant qu ' ils ne soient promus, en signalant des problèmes tels que des éléments de `Get Records` inefficaces dans une boucle de flux ou des requêtes `SOQL` dans une boucle Apex for, qui sont des causes courantes de dégradation des performances.
- **Prévention de la régression :** À mesure que votre densité d'automatisation augmente, un changement vers une classe Flux ou Apex peut avoir des conséquences involontaires sur d'autres automatisations dans le même objet. Une stratégie de test DevOps robuste, dans laquelle des tests Apex automatisés sont exécutés contre toute modification proposée, est la méthode la plus fiable pour s'assurer qu'une nouvelle version de flux ne rompe pas la logique Apex existante (et inversement).
- **Collaboration et visibilité :** Le contrôle de la source est la « source unique de vérité ». Il permet aux administrateurs et aux développeurs de travailler en parallèle sur l'automatisation d'un même objet. Il fournit également une piste d'audit inestimable : lorsqu'un processus de production est rompu, vous pouvez déterminer instantanément _qui_ a modifié l'automatisation, _quand_ ils l'ont modifiée et - via des messages d'engagement - _pourquoi_ ils l'ont modifiée.
[DevanOps Center](https://help.salesforce.com/s/articleView?id=platform.devops_center_overview.htm&type=5) fournit une interface unifiée qui facilite la chorégraphie de toutes ces étapes pour permettre à tous les membres de l ' équipe d ' accéder à un processus de développement évolutif, basé sur le contrôle des sources.
Cette discipline combinée de documentation et de DevOps garantit la santé et la maintenance à long terme de votre organisation, ce qui profitera à chaque architecte et administrateur qui vous suit.
## Meilleures pratiques associées
Le guide de décision ci-dessus est préférable avant de planifier votre implémentation. Il vise à vous aider à choisir le meilleur produit pour vos cas d'utilisation. Après la sélection du produit, il est important de comprendre les meilleures pratiques existantes pour votre implémentation.
### Exploitez le modèle hybride : Apex invocable pour une logique complexe dans un flux
Le principe _Un outil par objet_ est essentiel pour gérer l'automatisation à haute densité, mais ne l'interprètez pas comme un choix binaire entre une pile purement déclarative ou purement programmatique. Un schéma architectural plus efficace et plus maintenable exploite un modèle Hybride: positionnez Flux déclenché par un enregistrement en tant que couche d'orchestration, tout en encapsulant les opérations hautement complexes au sein d'Apex invocable.
#### La couche Orchestration : Flux
Le flux déclenché par un enregistrement sert de couche orchestrative au processus métier. Il est propriétaire des critères d'entrée et du contexte d'exécution (le _quoi_ et _quand_). En conservant la logique de décision et l'acheminement au sein de cette couche, la topologie des processus de l'architecture reste transparente et gérable via l'Explorateur de déclencheur de flux, ce qui évite que la logique métier critique soit masquée dans le code.
#### Le composant Complexe : Apex invocable
Un exemple courant de composant complexe est l'implémentation de calculs d'accord de niveau de service (SLA) pour des enregistrements Requête. Comme l'objet BusinessHours et sa logique associée — critique pour des calculs précis qui excluent les heures non travaillées et les congés — n'est pas accessible en natif dans Flux, une classe Apex dédiée est utilisée. Cette classe, souvent appelée `ServiceLevelAgreementCalculator`, est conçue avec une méthode statique unique, annotée avec `@InvocableMethod`, pour calculer les heures ouvrables écoulées, déterminer si l'accord de niveau de service est « Dans les limites de l'objectif » ou « Atteint », et renvoyer une sortie structurée. Cette approche encapsule la logique complexe et performante dans Apex tout en permettant son exécution transparente et son intégration dans la couche d'orchestration déclarative d'un flux déclenché par un enregistrement.
Une fois la classe `ServiceLevelAgreementCalculator` Apex définie, elle peut être utilisée dans un flux déclenché par un enregistrement :
Ce schéma démontre une stricte séparation des préoccupations. La couche déclarative est utilisée pour gérer le cycle de vie et l'orchestration des transactions, tandis que le code est utilisé pour l'exécution complexe. En traitant le code comme un utilitaire fonctionnel plutôt que comme la fondation, nous équilibrons les performances et la maintenabilité.
#### Principaux gains avec le schéma hybride
**Modularité**: La décision pivote loin de la singularité d'utiliser Apex ou Flux pour l'ensemble du processus. À la place, l'architecture encapsule une logique complexe dans des unités discrètes, sûres en masse et testables indépendamment. Ces unités fonctionnent comme des composants réutilisables consommés par la couche déclarative, assurant les échelles d'automatisation sans compliquer la conception architecturale.
**Réutilisabilité**: La logique est découplée de l'événement déclencheur. Une unité de code bien conçue (telle qu'une `InvocableMethod`) est écrite une seule fois, mais exploitée à travers plusieurs points d'entrée : Flux déclenchés par un enregistrement, flux d'écran ou intégrations externes. Cette réutilisation de code élimine les développements redondants.
**Maintenabilité**: La logique de flux de processus reste visible et gérable dans le flux déclaratif. Cette centralisation réduit considérablement les frais de débogage et garantit que l'ordre d'exécution du système est déterministe et transparent.
#### Limitations et compromis du modèle hybride
Bien que le modèle hybride d'utilisation Apex invocable de Flux soit puissant, il ne s'agit pas d'une approche unique. Les architectes doivent être conscients des limitations et des compromis spécifiques avant de s'engager dans une solution hybride.
- **Aucun support avant la sauvegarde**: C'est la limite la plus critique. Les actions invocables sont disponibles uniquement dans le contexte après la sauvegarde (flux d'actions et d'enregistrements associés). Ils ne peuvent pas être utilisés dans le contexte très performant avant la sauvegarde (flux de mises à jour de champ rapides). Par conséquent, ce modèle ne peut pas être utilisé pour déléguer les mises à jour de champ du même enregistrement. Exécutez ce travail très performant en utilisant des éléments Flux natifs dans un flux avant la sauvegarde ou dans un déclencheur Apex avant le contexte.
- **Aucun support after-undelete :** Actuellement, le flux déclenché par un enregistrement ne prend pas en charge le contexte after-undelete. Si un Objet Salesforce a une exigence métier pour exécuter une automatisation lorsqu'un enregistrement est restauré depuis la corbeille, un déclencheur Apex est la seule solution.
- **Frais généraux de performance dans les scénarios à haut volume :** Le passage de l'exécution Flux à l'exécution Apex n'est pas une opération à coût nul. Bien que généralement rapide, l'action de tomber dans une Action invocable à partir de l'exécution de Flux n'est pas aussi rapide en calcul que l'exécution native qui reste entièrement dans un déclencheur Apex. Pour la plupart des automatisations à densité moyenne, ce micro-coût est un compromis négligeable et intéressant pour l'accessibilité accrue. Cependant, pour des scénarios extrêmement performants et à haut volume, une infrastructure Apex uniquement pure aura un avantage de vitesse de calcul brute.
### Stratégies pour l'automatisation héritée
Bien que l'heuristique de densité de l'automatisation fournisse des orientations définitives pour une architecture nouvelle, la réalité des environnements Salesforce d'entreprise est souvent plus nuancée. Dans les organisations matures, il est courant de trouver des flux déclenchés par un enregistrement et des déclencheurs Apex fonctionnant sur le même Objet Salesforce. Ce scénario est distinct du schéma hybride expliqué précédemment: ici, les flux et les déclencheurs Apex ne sont pas couplés ni conçus pour fonctionner ensemble.
Cette coexistence est souvent le résultat de l'évolution des capacités de la plate-forme ou de la dette technique héritée. Bien que cet état opérationnel soit toléré, les architectes doivent le traiter comme un compromis calculé plutôt que comme un état final.
L'orchestration fragmentée entraîne des coûts de gouvernance et de maintenance importants, ce qui rend les activités de développement, de test et de gestion des incidents difficiles et complexes. Cela entraîne une augmentation du délai de résolution (TTR) et de la complexité opérationnelle.
- Pour les nouveaux objets Salesforce, suivez le principe de densité d'automatisation comme guide principal.
- Pour les objets Salesforce existants avec une empreinte hybride et un déclencheur Apex double et des points d'entrée de flux déclenchés par un enregistrement, évaluez la densité, puis architectez pour refactoriser à un état hybride maintenable.
- Pour une faible densité, refactorisez Apex déclenche des flux déclenchés par un enregistrement, et spécifiez l'ordre d'exécution, en les amenant à un point d'entrée d'automatisation unique.
- Pour une densité moyenne, refactorisez les méga-flux complexes dans un sous-ensemble de flux, avec le bon ordre d'exécution. Introduisez des déclencheurs Apex uniquement lorsque cela est absolument nécessaire, par exemple pour prendre en charge le contexte after undelete.
- Pour une densité élevée, privilégiez l'implémentation de déclencheurs Apex.
### Utilisation d'une infrastructure de métadonnées pour les déclencheurs Apex
À mesure que les processus métiers d'une organisation sur Salesforce Platform mûrissent, le volume et la complexité de l'automatisation déclenchée par un enregistrement augmentent inévitablement. Une meilleure pratique fondamentale consiste à maintenir _un déclencheur Apex par objet Salesforce_. Cette règle est critique, car la plate-forme ne garantit pas l'ordre d'exécution de plusieurs déclencheurs sur le même objet pour le même événement. Cette limitation peut entraîner un comportement non déterministe, des conditions de course et des problèmes difficiles à déboguer.
Cependant, adhérer au principe du _unique déclencheur_ introduit un défi architectural: comment gérer et orchestrer de manière maintenable et évolutive toute la logique métier invoquée à partir de ce point d'entrée unique.
#### Limitations des gestionnaires de déclencheur Classic
La première évolution de cette architecture a été le modèle Classic Trigger Handler. Dans cette approche, le déclencheur Apex unique délègue toute sa logique à une classe gestionnaire correspondante (par exemple, `OpportunityTriggerHandler`). Cette méthode sépare la logique du fichier déclencheur et fournit aux développeurs un contrôle déterministe sur l'ordre d'exécution dans les méthodes de la classe gestionnaire (par exemple, `afterInsert()`).
Bien qu'une amélioration, ce modèle conduit souvent à des classes de gestionnaire monolithiques. Au fil du temps, à mesure que les exigences métiers augmentent, la classe devient grande, difficile à gérer et difficile à tester isolément. L'ordre d'exécution de tous les processus individuels est codé en dur dans une seule méthode, ce qui rend la classe sujette aux conflits de fusion, augmentant considérablement les coûts de gouvernance et de maintenance dans un environnement de grande entreprise.
#### La solution : Infrastructure de déclencheurs pilotés par les métadonnées
Pour résoudre les problèmes fondamentaux de modularité et d'orchestration, les architectes adoptent une **infrastructure de déclencheurs** pilotée par les métadonnées. Il s'agit d'un saut architectural important qui dissocie la logique d'automatisation elle-même de la configuration de _son_ exécution et _de sa date_ d'exécution.
Ce cadre repose sur trois avantages clés :
- **Partitionnement :** Au lieu d ' une seule classe gestionnaire, la logique métier de base est divisée en petites classes Apex atomiques (par exemple, une classe `RecalculateAccountValues` ou une classe `NotifySalesLeads`), chaque classe adhérant au _principe de responsabilité_ unique. Cette modularité facilite le test, le débogage et la compréhension isolés de la logique.
- **Ordre et chorégraphie :** L'ordre d'exécution n'est plus codé en dur dans Apex. À la place, il est défini par déclaration par des enregistrements de configuration, généralement stockés dans un type de métadonnées personnalisées (par exemple, `TriggerAction__mdt`). Cela permet aux administrateurs de réorganiser, d'ajouter ou de retirer des actions d'automatisation simplement en modifiant un enregistrement de métadonnées, ce qui ne nécessite pas de déploiement ni de changement de code.
- **Contourner la fonctionnalité :** L'infrastructure fournit une fonctionnalité de contournement standardisée et précise. Chaque action d'automatisation peut être configurée via son enregistrement de métadonnées pour être désactivée globalement, ou contournée pour des utilisateurs administratifs spécifiques en référençant une autorisation personnalisée.
Le déclencheur Apex unique de l'objet sert alors uniquement de répartiteur dynamique. Il ne contient aucune logique métier, mais instancie à la place une classe `MetadataTriggerHandler` centrale. Ce gestionnaire interroge les enregistrements de métadonnées personnalisées pour déterminer dynamiquement la séquence d'exécution et invoquer les classes Apex atomiques correctes dans l'ordre prescrit. L'automatisation est unifiée sous une couche unique, transparente et gouvernable.
### Déduplication des opérations coûteuses dans la transaction
Un avantage important de l'utilisation Apex dans une infrastructure robuste est la possibilité de gérer l'état transactionnel et d'optimiser les performances en éliminant le travail redondant. À mesure que la logique s'accumule, il est fréquent que différentes automatisations dans l'ordre d'enregistrement exécutent indépendamment les mêmes opérations coûteuses, ce qui consomme des limites importantes du gouverneur et augmente le temps d'opération DML.
Le cadre est conçu pour répondre à ce besoin avec deux stratégies principales :
- **Gestion d'état partagée :** Dans le cadre d'une transaction Apex unique, les propriétés et les variables statiques sont exploitées pour mettre en cache les données. Ainsi, une opération coûteuse, par exemple une requête `SOQL` pour un paramètre de configuration, n'est exécutée qu'une seule fois, même si la logique d'automatisation est invoquée plusieurs fois dans différents enregistrements ou phases du déclencheur. La consommation de limites transactionnelles est considérablement réduite.
- **Utilisation du cache de la plate-forme :** Pour aller au-delà de la simple mise en cache intra-transaction, utilisez le cache de la plate-forme afin d'éviter d'interroger certaines données dans la base de données complète. Ce cache géré en mémoire est idéal pour récupérer des données non primitives, lues fréquemment dans la base de code et immuables tout au long d'une transaction (par exemple, profils, rôles, heures ouvrables). En utilisant l'interface `Cache.CacheBuilder`, le système vérifie d'abord le cache et exécute la requête de base de données uniquement si les données sont absentes, ce qui optimise les performances et l'évolutivité.
### Utilisation de Before-Save pour les mises à jour du même enregistrement
Utilisez toujours une mise à jour avant la sauvegarde lorsque votre automatisation doit modifier uniquement les valeurs de champ dans l'enregistrement qui démarre la transaction. Cela s'applique aussi bien aux mises à jour de champ rapide dans Flux (qui s'exécutent avant la sauvegarde) qu'à la logique avant le contexte dans Déclencheurs Apex (avant l'insertion, avant la mise à jour).
Ce schéma est performant, quel que soit l'outil utilisé, car il évite une deuxième opération DML et un cycle d'enregistrement récursif. Les modifications sont apportées à l'enregistrement en mémoire _avant_ son engagement dans la base de données et sont enregistrées dans le cadre de la transaction d'origine. Les frais généraux d'une deuxième sauvegarde, qui autrement réexécuterait l'ordre de sauvegarde complet et déclencherait de nouveau toute l'automatisation, sont éliminés.
### Prévention de la récursion incontrôlée
La récursion non contrôlée est un piège courant dans les déclencheurs après mise à jour, où la logique d'un déclencheur effectue une mise à jour DML qui entraîne à son tour le déclenchement du même déclencheur. Cela crée une boucle infinie qui se termine par une exception de limite du gouverneur. Bien que des indicateurs booléens statiques ou des collections d'ID d'enregistrement traités aient toujours été utilisés pour empêcher une telle récursion, un modèle plus précis et plus robuste consiste à lier la logique en comparant les valeurs de champ entre la nouvelle et l'ancienne version de l'enregistrement lui-même.
Exécutez la logique uniquement si un champ d'intérêt spécifique a changé. Cela empêche le déclencheur d'exécuter sa logique sur les opérations DML suivantes dans la même transaction où les données critiques restent inchangées.
#### Contrôle de la récursion dans un flux déclenché par un enregistrement
Dans un flux déclenché par un enregistrement, empêchez la récursion incontrôlée en définissant l'exécution du flux uniquement lorsque l'enregistrement est mis à jour pour remplir les conditions requises :
Si vous choisissez d'utiliser une formule de critères d'entrée dans votre flux, vous pouvez empêcher une récursion galopante en comparant la variable globale `$Record` (représentant les nouvelles valeurs) à la variable globale `$RecordPrior` (représentant les valeurs d'origine avant l'enregistrement). Par exemple, pour vous assurer qu'un flux est exécuté uniquement si le champ Montant d'une opportunité a changé, utilisez-le dans les critères d'entrée :
```
$Record.Amount != $Record__Prior.Amount
```
#### Contrôle de la récursion dans Apex
Comparez les valeurs de champ de la nouvelle version de l'enregistrement, `Trigger.new`, aux valeurs de champ de l'ancienne version de l'enregistrement, `Trigger.oldMap`, pour déterminer si la modification spécifique que vous recherchez s'est produite. Cette approche garantit que l'automatisation est idempotente et exécutée uniquement lorsque nécessaire, ce qui rend le système plus efficace et évite les boucles récursives catastrophiques.
### Contournement de l'automatisation
Une organisation Salesforce bien architecturée nécessite un mécanisme cohérent et fiable pour contourner l'automatisation. Il ne s'agit pas d'une fonctionnalité facultative, mais d'une exigence opérationnelle essentielle pour préserver l'intégrité des données et activer les tâches administratives.
Un cadre de contournement est essentiel pour certains scénarios :
- Lors du chargement de volumes de données importants, le déclenchement de déclencheurs pour chaque enregistrement peut ralentir considérablement le processus, entraîner des exceptions de limite et créer des enregistrements et des notifications associés erronés. Un contournement permet d'insérer les données proprement et efficacement.
- Un utilisateur de l'intégration peut avoir besoin de synchroniser des données à partir d'un système d'enregistrement externe. L'automatisation normalement déclenchée pour une modification initiée par l'utilisateur (par exemple, envoyer un e-mail, créer une tâche) peut être indésirable ou redondante lorsque la modification provient d'un autre système.
- Les administrateurs ou le personnel de support peuvent avoir à effectuer des mises à jour correctives sur les enregistrements. Un mécanisme de contournement leur permet d'effectuer ces modifications sans déclencher l'automatisation métier standard, ce qui pourrait avoir des conséquences inattendues.
**Autorisations personnalisées**: La norme moderne et évolutive pour l'implémentation d'une logique de contournement est celle des autorisations personnalisées. Elles sont supérieures aux anciennes méthodes pour plusieurs raisons :
- **Flexibilité :** Des autorisations personnalisées peuvent être attribuées à des utilisateurs via des ensembles d'autorisations. Cette pratique s'aligne sur le modèle moderne de sécurité et d'accès de Salesforce, ce qui permet une attribution granulaire et flexible. Un contournement peut être accordé à un utilisateur spécifique, ou même temporairement avec une date/heure d'expiration spécifique.
- **Maintenabilité :** L'utilisation d'autorisations personnalisées évite de coder en dur des profils ou des utilisateurs dans une logique d'automatisation. Si le rôle d'un utilisateur change ou si un nouveau profil doit contourner l'accès, la modification est une simple attribution d'ensemble d'autorisations, pas une modification de code ou de flux qui nécessite un déploiement.
- **Évolutivité :** Les autorisations personnalisées offrent une infrastructure évolutive pour gérer les exceptions dans une base d'utilisateurs complexe. Ils peuvent être attribués à des utilisateurs via un ensemble d'autorisations, des groupes d'ensembles d'autorisations ou des profils. Leur association à un ensemble d'autorisations ou à un profil peut également être représentée dans les métadonnées sources.
**Schémas d'implémentation**: Appliquez un modèle de contournement cohérent à toutes les automatisations déclenchées par un enregistrement dans l'organisation.
**Contournement d'un flux déclenché par un enregistrement**: La méthode la plus efficace pour contourner un flux est d'empêcher son exécution. Pour ce faire, ajoutez une condition aux critères d'entrée du flux.
- Dans l'élément Démarrer du flux déclenché par l'enregistrement, définissez Exigences de condition sur Formule évalue sur True.
- Dans le générateur de formule, incorporez une vérification de l'autorisation personnalisée en utilisant la variable globale `$Permission`. Combinez la vérification à vos critères d'entrée existants.
- Modèle de formule :
```
( ) && NOT($Permission.Bypass_This_Flow)
```
- Ce modèle garantit que le flux est exécuté uniquement si l'utilisateur _n'_a pas l'autorisation personnalisée spécifiée attribuée. Ce contrôle est effectué avant même la création de l'interview de flux, ce qui en fait l'approche la plus performante.
**Contournement d'une infrastructure de déclencheurs Apex**: Dans Apex, intégrez la logique de contournement directement à l'infrastructure de déclencheur pilotée par les métadonnées, ce qui permet un contrôle granulaire.
- Le type de métadonnées personnalisées `TriggerAction__mdt` doit inclure un champ de texte, par exemple `BypassPermission__c`.
- Dans la classe `MetadataTriggerHandler`, avant d'exécuter dynamiquement une action, le code doit lire la valeur de ce champ.
- Si le champ est rempli, le gestionnaire utilise la méthode `FeatureManagement.checkPermission()` pour déterminer si l'utilisateur actif actuel dispose de l'autorisation personnalisée spécifiée.
- Si `checkPermission()` renvoie true, le gestionnaire ignore cette action spécifique et passe à la suivante dans la séquence.
- Ce modèle est puissant, car il permet à la fois un contournement global (si tous les enregistrements `TriggerAction__mdt` référencent la même autorisation) et un contournement granulaire par action (si différents enregistrements référencent différentes autorisations, ou si certains n'ont aucune autorisation de contournement du tout).
### Mega-Flows vs. Flux multiples
C'est un anti-schéma pour consolider toute l'automatisation d'un objet en un seul méga-flux massif. La consolidation en un seul flux par opposition à la séparation d'une logique en plusieurs flux bien conditionnés n'a pas d'impact majeur sur les performances. Les gains de performance les plus importants proviennent des éléments suivants :
- Utilisation de flux avant la sauvegarde pour les mises à jour de champ du même enregistrement.
- Écriture de conditions d'entrée précises afin d'empêcher l'exécution de flux avec des modifications qui n'impactent pas leur cas d'utilisation spécifique.
[L'Explorateur de déclencheur](https://trailhead.salesforce.com/content/learn/modules/record-triggered-flows/meet-flow-trigger-explorer) de flux permet d'attribuer une valeur d'ordre à chaque flux d'un objet, garantissant ainsi un ordre d'exécution séquentiel.
## Ressources
| Apex | Flux | Opérations |
|---|---|---|
| Compétences requises | Exigences de licence supplémentaires | |
|---|---|---|
| Formulaires dynamiques | Code faible | Non |
| Flux d'écran | Code faible | Non |
| OmniStudio | Code bas + Code pro | Package Industries requis |
| Flux d'écran + Composants Web Lightning | Code bas + Code pro | Non |
| Composants Web Lightning | Code Pro | Non |
| Impact sur l'objet | Déterminez si votre formulaire fonctionne avec un seul objet ou doit fonctionner avec plusieurs objets. |
| Étendue du formulaire et navigation | Déterminez si tous les champs de votre formulaire s'adapteront logiquement à un seul écran ou si les utilisateurs doivent pouvoir naviguer entre plusieurs écrans. |
| Emplacement | Identifiez l'emplacement ou les emplacements où vous souhaitez incorporer le formulaire, qui peut aller d'une application Salesforce à une application mobile ou même à un site Web externe. |
| Contrôleur | Identifiez les actions ou la logique à exécuter en arrière-plan lorsque les utilisateurs interagissent avec votre formulaire, y compris les transformations de données et les intégrations à des systèmes externes. |
| Validation | Déterminez si vous avez ou non des exigences de validation d'entrée supplémentaires qui vont au-delà de la validation au niveau système standard fournie par Salesforce. |
| Sécurité | Déterminez si votre formulaire doit vérifier l'accès de l'utilisateur avant d'effectuer certaines opérations, si vous souhaitez contrôler qui peut accéder au formulaire et si vous souhaitez contrôler l'emplacement où le formulaire peut être incorporé. |
| Conception des interactions | Identifiez les types d'interaction ou de condition qui doivent déclencher des réponses dynamiques dans votre formulaire. |
| Style | Déterminez le niveau de sophistication de votre style et CSS souhaité. |
| Présentation | Identifiez les exigences de présentation de votre formulaire en termes de nombre requis de colonnes, d'onglets, d'accordéons et de possibilité d'afficher des blocs de données récurrents. |
| Traduction | Déterminez si votre formulaire doit être traduit dans d'autres langues. |
| Automatisation des tests d'interface utilisateur | Déterminez si vos processus DevOps nécessitent que votre formulaire soit soumis à des tests unitaires automatisés ou à des tests de bout en bout automatisés. |
| Métriques | Identifiez comment vous souhaitez suivre l'utilisation de votre formulaire, notamment les vues de page, le temps consacré au formulaire, les taux de réalisation et les taux de réussite |
| Empaquetage et déploiement | Déterminez comment vous souhaitez distribuer ou déployer votre formulaire une fois élaboré. |
| Objet unique | Objet croisé | Objet agnostique | |
|---|---|---|---|
| Formulaires dynamiques | Disponible | Disponible | Non disponible |
| Flux d'écran | Disponible | Disponible | Disponible |
| OmniStudio | Disponible | Disponible | Disponible |
| Flux d'écran + Composant Web Lightning | Disponible | Disponible | Disponible |
| LWC | Disponible | Disponible | Disponible |
_Intégrations OmniStudio_](/docs/architect/fr-fr/reference-diagrams/guide/omnistudio-integrations)
### Étendue et navigation du formulaire
Si vous pouvez obtenir toutes vos entrées utilisateur à partir d'un formulaire à écran unique, commencez par les Formulaires dynamiques. Cependant, bien que les formulaires dynamiques dans les pages d'enregistrement puissent utiliser la fonctionnalité Parcours pour représenter vaguement les diverses étapes de votre processus métier, elle peut ne pas correspondre à la majorité de vos cas d'utilisation.
#### Questions à poser :
- Avez-vous besoin d'un seul écran ou l'utilisateur doit-il naviguer entre plusieurs écrans pour réaliser une tâche ?
- Voulez-vous que vos utilisateurs affichent une représentation visuelle de leur progression dans le processus de remplissage de votre formulaire ?
- Vos utilisateurs devront-ils remplir les informations de chaque écran dans un ordre spécifique ou pourront-ils passer d'un écran à l'autre si nécessaire ?
| Écran unique | Formulaire à écrans multiples | Indicateurs de progression | Navigation entre les étapes / les écrans | |
|---|---|---|---|---|
| Formulaires dynamiques | Disponible | Non disponible | Disponible | Non disponible |
| Flux d'écran | Disponible | Disponible | Disponible | Non disponible |
| OmniStudio | Disponible | Disponible | Disponible | Disponible |
| Flux d'écran + Composant Web Lightning | Disponible | Disponible | Disponible | Disponible |
| LWC | Disponible | Pas idéal | Pas idéal | Pas idéal |
| Page d'enregistrement Lightning | Page d'accueil Lightning ou page d'application | Sites Experience Cloud Aura | Sites Experience Cloud LWR | Snap incorporés | Barre d'utilitaires | Action spécifique à un objet | Action globale | Application mobile Salesforce** | Field Service Mobile | Mobile SDK | Sites et applications externes | Composant Web Lightning personnalisé | |
|---|---|---|---|---|---|---|---|---|---|---|---|---|---|
| Formulaires dynamiques | Disponible | Non disponible | Non disponible | Non disponible | Non disponible | Non disponible | Non disponible | Non disponible | Disponible | Non disponible | Non disponible | Non disponible | Non disponible |
| Flux d'écran | Disponible | Disponible | Disponible | Disponible | Disponible | Disponible | Disponible | Roadmap | Disponible | Disponible*** | Non disponible | Roadmap | Disponible |
| OmniStudio | Disponible | Disponible | Disponible | Non disponible | Non disponible | Disponible | Non disponible | Non disponible | Disponible | Non disponible | Non disponible | Disponible | Disponible |
| Flux d'écran + Composant Web Lightning | Disponible | Disponible | Disponible | Disponible | Disponible | Disponible | Disponible | Roadmap | Disponible | Non disponible | Non disponible | Pas idéal | Disponible |
| LWC | Disponible | Disponible | Disponible | Disponible | Disponible | Disponible | Roadmap | Roadmap | Disponible | Roadmap | Roadmap | Disponible | Disponible |
| *Les flux peuvent être incorporés à des sites Experience Cloud LWR, mais vous devez tenir compte des considérations ci-dessous. **Les flux et les composants Web Lightning sont pris en charge dans l'application mobile Salesforce, mais l'application mobile Salesforce ne prend pas en charge toutes les méthodes d'incorporation de flux et de composants Web Lightning. Par exemple, les actions spécifiques à un objet sont prises en charge sur un appareil mobile, mais pas les éléments de la barre d'utilitaires. ***L'application mobile Field Service ne prend pas en charge la plupart des dernières fonctionnalités de flux, car elle est conçue à partir d'un ancien Moteur de flux et d'une ancienne Exécution de flux d'écran. Elle a été spécialement modifiée pour fonctionner hors ligne. |
|||||||||||||
_Lightning Out sur les sites externes_](/docs/architect/fr-fr/reference-diagrams/guide/lightning-out-on-external-sites)
Actuellement, les composants Web Lightning ne sont pas pris en charge en tant qu'actions rapides (spécifiques à un objet ou globales), mais comme solution de contournement, vous pouvez envelopper un composant LWC dans un composant Aura (un peu comme vous le pouvez avec des flux). Les composants LWC peuvent également lancer des flux avec le composant [Lightning-flow](https://developer.salesforce.com/docs/component-library/bundle/lightning-flow/documentation).
OmniStudio excelle dans l'exposition de contenus à vos sites externes via la fonctionnalité OmniOut. Avec OmniStudio et OmniOut, vous pouvez compiler vos formulaires Omniscript et composants FlexCard dans des composants standard et les exécuter hors plate-forme dans des sites ou des applications tiers.
Aucune des technologies de formulaire présentées dans ce guide n'est officiellement prise en charge dans les modèles Mobile SDK aujourd'hui. Si le kit de développement Mobile SDK est essentiel à votre cas d'utilisation, vous feriez mieux d'élaborer votre formulaire en natif dans votre application mobile ou d'élaborer une page Visualforce, tout en gardant à l'esprit le guide du [facteur de forme](/docs/architect/fr-fr/well-architected/guide/engaging#facteur-de-forme) Salesforce Well-Architected.
**Note de la feuille de route :** L'équipe Mobile SDK travaille activement sur la prise en charge des composants Web Lightning dans les pages Visualforce.
### Contrôleur
Les formulaires dynamiques sont parfaits si vous devez utiliser les valeurs de votre formulaire pour créer ou mettre à jour un enregistrement. Pour toutes les capacités au-delà, vous devez exploiter Flow, OmniStudio ou LWC. Ces capacités peuvent inclure une couche de décision ou d'itération, ou la génération de publications ou d'e-mails Slack en utilisant les entrées du formulaire.
#### Questions à poser :
- Quelles actions ou logiques souhaitez-vous exécuter en arrière-plan ?
- Votre modèle de données contient-il des données hiérarchiques ?
- Votre formulaire devra-t-il effectuer ses opérations dans une seule transaction ou dans plusieurs transactions ?
- Avez-vous besoin d'intégrer des systèmes externes ?
- Quelles sont vos exigences en matière de réutilisabilité et de modularité ?
| Journal et actions | Gestion des données hiérarchiques | Fonctionnement dans une seule transaction | Opération sur plusieurs transactions | Intégration | Conception et réutilisation modulaires | Emballage | |
|---|---|---|---|---|---|---|---|
| Formulaires dynamiques | Non disponible | Non disponible | Non disponible | Non disponible | Non disponible | Non disponible | Disponible |
| Flux d'écran | Disponible | Roadmap | Disponible | Disponible | Disponible | Disponible | Disponible |
| OmniStudio | Disponible | Disponible | Disponible | Disponible | Disponible | Disponible | Non disponible |
| Flux d'écran + Composant Web Lightning | Disponible | Disponible | Disponible | Disponible | Disponible | Disponible | Disponible |
| LWC | Disponible | Disponible | Disponible | Disponible | Disponible | Disponible | Disponible |
\_\_](/docs/architect/fr-fr/reference-diagrams/guide/lightning-web-components-interaction-via-wire-adapters)
Comme mentionné ci-dessus, OmniStudio utilise des procédures d'intégration et Data Mapper pour récupérer et transformer aisément des données externes et internes à Salesforce. Il brille dans l'aplatissement et l'expansion des jeux de données avec divers niveaux de relations grâce à de nombreuses fonctions sans code que vous pouvez utiliser.
**Note de la feuille de route :** Flow va bientôt prendre en charge la mise à jour/insertion de collections d'enregistrements, ainsi que la gestion des données hiérarchiques.
Flow, OmniStudio et LWC s'intègrent tous à Apex. Par conséquent, vous pouvez aisément combler les écarts dans la solution que vous choisissez. Par exemple, si vous avez besoin de filtrer les enregistrements d'un LWC vous pouvez toujours utiliser l'adaptateur wire pour Apex afin de créer des requêtes SOQL complexes. Si vous êtes influencé par le récit basé sur le clic, considérez Flow ou OmniStudio comme des alternatives viables à un contrôleur Apex pour vos besoins côté serveur.
Une deuxième question est de savoir si vous souhaitez engager immédiatement des actions ou les reporter à une partie particulière de votre formulaire. Cela est particulièrement important si vous utilisez un formulaire de plusieurs pages. Le flux facilite la combinaison des entrées de plusieurs formulaires (écrans de flux) et leur utilisation beaucoup plus tard dans l'assistant (flux) pour effectuer certaines opérations. En fait, nous recommandons de concevoir des flux de cette façon (exécuter des actions à la fin) au cas où l'utilisateur rebondirait entre les écrans, changeant ses réponses.
#### Contrôle des opérations
Les transactions et les [limites du gouverneur](https://developer.salesforce.com/docs/atlas.en-us.apexcode.meta/apexcode/apex_gov_limits.htm) sont un mode de vie sur Salesforce Platform. Si votre cas d'utilisation est assez simple, il peut ne pas être aussi important de contrôler la transaction dans laquelle une opération particulière se produit. Cependant, il existe quelques cas d'utilisation dans lesquels vous pouvez combiner plusieurs opérations dans une seule [transaction](/docs/architect/fr-fr/fundamentals/guide/architecture-basics#transactions) plutôt que de les exécuter dans plusieurs transactions. Quelques exemples :
- **Pour annuler ou ne pas annuler**: Telle est la question. Supposons que votre formulaire crée plusieurs enregistrements en arrière-plan. Si la création du troisième enregistrement échoue, les deux premiers enregistrements doivent-ils être annulés ? Si chacune de vos actions est indépendante, n'hésitez pas à les exécuter dans des transactions séparées. Cependant, si elles sont dépendantes et que vous souhaitez que l'échec de l'une annule également les autres, implémentez-les dans une transaction unique. Si votre formulaire est dans Flux, vous pouvez utiliser l'élément Restaurer dans un chemin Défaut pour annuler votre transaction et garantir l'intégrité des données.
- **Impact en aval sur les limites du gouverneur**: En particulier, lorsque votre formulaire crée ou met à jour un enregistrement, tenez compte des implications en aval de cette opération. Quels processus, règles de workflow, déclencheurs de flux, déclencheurs Apex ou autres éléments de l'ordre d'enregistrement vont se déclencher en fonction de ce changement d'enregistrement ? Quel est l'impact de ces changements collectifs sur les limites du gouverneur consommées dans cette transaction ? Si un changement d'enregistrement particulier entraîne de nombreuses modifications en aval qui impactent vos limites, vous pouvez isoler ce changement d'enregistrement dans sa propre transaction.
- **Traitement par lot**: Même dans un contexte d'interface utilisateur, il peut être nécessaire de regrouper plusieurs mises à jour par lot. Supposons que votre formulaire à écrans multiples itère sur un grand nombre d'enregistrements. Au lieu de valider une mise à jour d'enregistrement après chaque écran, attendez d'avoir collecté les mises à jour de tous les enregistrements, puis soumettez une requête pour mettre à jour tous les enregistrements.
Lorsque vous utilisez des Formulaires dynamiques pour créer ou modifier un enregistrement, vous n'exécutez qu'une seule opération, qui marque toujours le début d'une nouvelle transaction.
Lors de l'élaboration d'un flux d'écran, vous avez un contrôle important sur ce qui se passe dans une transaction donnée. Les écrans et les actions locales agissent en tant que frontières entre les transactions. Voici un résumé général de la gestion des transactions dans l'architecture de flux d'écran.
1. L'utilisateur interagit avec un écran, puis clique sur **Suivant**.
2. Le client publie une requête à l'API avec les entrées.
3. L'API reçoit la requête, et une transaction et une connexion à la base de données sont ouvertes. L'API appelle ensuite le moteur de flux pour invoquer la requête.
4. Le moteur de flux prend le relais et suit le chemin approprié dans la définition du flux, jusqu'à ce qu'il atteigne un nœud Écran ou Action locale. Le moteur renvoie ensuite des informations sur ce nœud à l'API.
5. L'API crée un objet de réponse qui contient les détails de l'écran suivant à restituer, puis renvoie cet objet au client. À ce stade, les modifications de la base de données sont validées (récupérer l'[exécution de commande](/docs/architect/fr-fr/fundamentals/guide/architecture-basics#manipulation-de-la-base-de-données)), et la connexion à la base de données et la transaction sont fermées.
6. Le client utilise la réponse d'API pour restituer l'écran suivant avec lequel l'utilisateur peut interagir.
7. Répétez l'étape 1.
En d'autres termes, les écrans « cassent » les transactions. Dans ce cas, toutes les actions en attente ou DML sont engagées, la transaction précédente est fermée et une nouvelle transaction démarre.
La conception appropriée, c'est-à-dire les opérations que vous regroupez dans une transaction donnée, est votre choix. Examinons quelques exemples.
_Intégrations externes via des API MuleSoft et des robots RPA_](/docs/architect/fr-fr/reference-diagrams/guide/external-integrations-via-mulesoft-apis-and-rpa-bots)
Si l'API a un schéma OpenAPI, créez un Service externe.
[
_Intégrations externes à des API avec des schémas OpenAPI_](/docs/architect/fr-fr/reference-diagrams/guide/external-integrations-to-apis-with-openapi-schemas)
Sinon, utilisez la fonctionnalité Appel externe HTTP dans Flux ou Action HTTP dans OmniStudio. L'appel externe HTTP du flux est piloté par les Services externes.
[
_Intégrations externes via HTTP_](/docs/architect/fr-fr/reference-diagrams/guide/external-integrations-via-http)
OmniStudio offre un riche ensemble de capacités d'intégration qui peuvent appeler des systèmes externes avec des procédures d'intégration et transformer les données avec Data Mapper. (pour plus d'informations, consultez [Impact sur l'](#impact-de-lobjet)objet)
Que vous l'implémentiez avec Apex personnalisé ou un service externe, un appel externe est un appel externe. Voici ce que vous devez savoir.
1. Un appel externe peut être long.
2. Lorsqu'un appel externe est exécuté de façon synchrone, il est exécuté alors qu'une transaction de base de données est ouverte.
3. Salesforce ne permet pas de garder une transaction de base de données ouverte si vous avez des opérations de base de données en attente.
La principale limitation à prendre en compte est le danger des **_transactions sales_**, dans lesquelles vous effectuez une opération de création, de mise à jour ou de suppression, puis exécutez un appel externe dans la même transaction. Ce modèle n'est pas autorisé en raison de la considération #3 ci-dessus, qui existe bien sûr en raison des considérations #1 et #2.
Dans Flux, vous pouvez contourner cette limitation en rompant la transaction. Notez que les écrans et les actions locales réintroduisent le contexte du navigateur, ce qui rompt la transaction. Bien que vous puissiez utiliser des écrans et des actions locales lors de l'utilisation d'appels externes, nous recommandons d'activer le Contrôle des transactions dans les paramètres avancés invocables. Le contrôle des transactions est une fonctionnalité d'actions invocables qui permet de terminer automatiquement la transaction avant qu'un appel externe soit passé. Vous pouvez activer le Contrôle des transactions en sélectionnant Toujours démarrer une nouvelle transaction dans la section Avancé d'une action invoquée.
L'impact des appels externes sur la transaction est moins compliqué avec LWC. D'une manière générale, vous effectuez vos opérations de données en utilisant le Lightning Data Service (LDS), puis utilisez un contrôleur Apex pour passer l'appel externe. Cette conception vous protège des transactions sales, puisque l'appel LDS est isolé dans sa propre transaction séparée de l'appel externe Apex.
_Pour plus d'informations sur les appels externes Apex, les services externes et les capacités d'intégration de données en général, consultez le [Architect's Guide to Data Integration with Salesforce](/docs/architect/fr-fr/decision-guides/guide/data-integration)._
#### Réutilisabilité et modularité
Les formulaires dynamiques ne prennent pas en charge la réutilisation. Chaque Formulaire dynamique est lié à une page d'enregistrement Lightning spécifique pour un objet spécifique (vous pouvez toutefois attribuer cette page d'enregistrement Lightning à plusieurs applications, profils, etc.).
De la même façon que vous pouvez écrire des bibliothèques, des utilitaires et des composants destinés à être utilisés dans plusieurs autres composants, vous pouvez appliquer des modèles de conception similaires en créant des flux avec la puissance des **_flux secondaires_**. Enregistrez vos flux dans des compartiments plus petits et plus modulaires, puis appelez-les à partir d'autres flux en utilisant l'élément Flux secondaire. Si votre conception l'exige, vous pouvez élaborer un flux autonome et utile en tant que flux secondaire d'un autre flux.
OmniStudio est intrinsèquement construit pour la modularité. Les mappeurs de données, les Omniscripts, les FlexCards et les procédures d'intégration sont tous élaborés indépendamment et peuvent fonctionner de façon interchangeable. En plus de cela, les FlexCards peuvent être élaborées en tant que composants LWC qui peuvent être incorporés à d'autres composants LWC, Omniscripts, pages d'enregistrement et sites Experience Cloud.
Les flux d'écran, les Omniscripts et les Composants Web Lightning peuvent tous être conçus pour être réutilisés et incorporés à divers emplacements, y compris des sites externes et des applications Lightning Out. Lorsque vous concevez vos solutions pour qu'elles soient [composables](/docs/architect/fr-fr/well-architected/guide/composable), vous bénéficiez d'avantages supplémentaires tels que l'adaptabilité et la stabilité.
### Validation
Toutes les technologies utilisées pour créer ou mettre à jour un enregistrement adhèrent à la validation au niveau du système, qu'il s'agisse de règles de validation classiques ou d'une validation personnalisée intégrée à un déclencheur Apex. Quelle que soit la technologie utilisée pour effectuer un changement d'enregistrement, chaque modification passe par l'ordre d'enregistrement. Cela signifie qu'en plus des règles de validation, le changement d'enregistrement est traité par n'importe quel nombre de flux avant ou après la sauvegarde, avant ou après les déclencheurs, les règles d'escalade, les règles d'attribution, et plus encore. Si ce n’est déjà fait, assurez-vous de mettre l’[ordre d’exécution](https://developer.salesforce.com/docs/atlas.en-us.apexcode.meta/apexcode/apex_triggers_order_of_execution.htm) Apex dans vos favoris et de vous familiariser avec lui.
#### Questions à poser :
- Votre formulaire a-t-il des exigences supplémentaires que la validation au niveau système ?
- Devrez-vous définir dynamiquement des champs obligatoires ou en lecture seule dans le formulaire ?
| Respecter la validation au niveau système | Validation au niveau du champ personnalisée spécifique à ce formulaire | Validation au niveau du champ personnalisée | |
|---|---|---|---|
| Formulaires dynamiques | Disponible | Non disponible | Non disponible |
| Flux d'écran | Disponible | Non disponible | Roadmap |
| OmniStudio | Disponible | Disponible | Disponible |
| Flux d'écran + Composant Web Lightning | Disponible | Disponible | Disponible |
| LWC | Disponible | Disponible | Disponible |
| Augmentation des autorisations utilisateur | Contrôle des utilisateurs qui ont accès | Restriction des emplacements autorisés | |
|---|---|---|---|
| Formulaires dynamiques | Non disponible | Disponible | Non disponible |
| Flux d'écran | Disponible | Disponible | Non disponible |
| OmniStudio | Non disponible | Disponible | Non disponible** |
| Flux d'écran + Composant Web Lightning | Disponible | Disponible | Non disponible |
| LWC | Disponible* | Disponible | Disponible |
| * Nécessite Apex **Les Omniscripts ne peuvent pas avoir un ensemble d'emplacements cibles spécifié, mais les FlexCards peuvent. |
|||
| Exécution d'opérations de données hors écran | Valeurs conditionnelles et calculs | Visibilité conditionnelle | Exigence conditionnelle | Mise en forme conditionnelle | État Lecture seule conditionnelle | État désactivé conditionnel | |
|---|---|---|---|---|---|---|---|
| Formulaires dynamiques | Non disponible | Non disponible | Disponible | Non disponible | Roadmap | Non disponible | Non disponible |
| Flux d'écran | Disponible | Disponible** | Disponible | Disponible* | Non disponible | Disponible** | Disponible** |
| OmniStudio | Disponible | Disponible | Disponible | Disponible | Disponible | Disponible | Disponible |
| Flux d'écran + Composant Web Lightning | Disponible | Disponible | Disponible | Disponible | Disponible | Disponible | Disponible |
| LWC | Disponible | Disponible | Disponible | Disponible | Disponible | Disponible | Disponible |
| *Limité aux composants qui utilisent un sélecteur de ressource et non une case à cocher statique **Bêta limitée |
|||||||
_Composants Web Lightning Opérations de données hors écran_](/docs/architect/fr-fr/reference-diagrams/guide/lightning-web-components-off-screen-data-operations)
**Visibilité :** La visibilité peut être contrôlée dynamiquement dans tous les outils de création de formulaires. Les formulaires dynamiques, Flow Builder et OmniStudio répondent à ce problème avec les fonctionnalités de visibilité des composants. Vous pouvez ainsi afficher ou masquer par déclaration des champs basés sur d'autres valeurs du formulaire ou si l'utilisateur est sur un appareil mobile ou non.
- Avec les formulaires dynamiques, la visibilité peut être contrôlée en fonction des valeurs de champ d'enregistrement, des enregistrements associés via des champs de référence et du facteur de forme.
- Avec Flux, vous pouvez baser une règle de visibilité sur d'autres entrées à l'écran, ainsi que sur d'autres ressources remplies précédemment dans le flux, notamment des formules ou des valeurs d'autres enregistrements.
- **Règles basées sur l'appareil :** Ce n'est pas évident dès le départ, mais vous pouvez utiliser une formule pour afficher ou masquer un champ particulier lorsque l'utilisateur est sur un appareil mobile. Écrivez une formule de flux qui vérifie la valeur de la variable globale \$User.UIThemeDisplayed. Si la valeur est Theme4t, l'utilisateur est dans l'application mobile Salesforce.
- **Évaluation d'autres ressources :** Les références manuelles de variables et de formules sont évaluées uniquement sur le serveur. Par conséquent, quelle que soit la valeur de cette ressource lors de la restitution initiale de l'écran, elle sera définie jusqu'à ce que vous accédiez à un autre écran. Lors de la navigation, l'exécution du flux soumet une requête au moteur de flux (le serveur) et récupère les toutes dernières valeurs des variables manuelles et des formules. Si vous souhaitez que votre règle de visibilité soit mise à jour lorsque l'utilisateur traverse un écran unique (par exemple, onblur), assurez-vous de référencer uniquement les valeurs des autres composants de l'écran.
- Avec OmniStudio, vous pouvez afficher ou masquer des composants sous certaines conditions en configurant une Propriété Vue conditionnelle. Cependant, vous ne pouvez pas ajouter plusieurs propriétés de vue conditionnelle pour une entrée.
**États d'entrée conditionnels :** Si vous devez contrôler dynamiquement d'autres propriétés, par exemple si un champ est obligatoire, désactivé ou en lecture seule, vous avez plusieurs options. Comme prévu, LWC vous donne un contrôle complet et réactif de votre état d'entrée. Avec les composants Flux d'écran réactifs, vous pouvez contrôler dynamiquement les attributs de composants tels que Lecture seule, Désactivé et Obligatoire pour les composants standard qui le prennent en charge, tandis qu'OmniStudio prend en charge l'éventail complet des attributs spécifiques au composant. Si vos exigences exigent un flux et que le composant ne prend pas en charge un état d'attribut spécifique, vous pouvez créer un composant Web Lightning incorporable pour obtenir un état d'entrée dynamique.
Si vous devez contrôler dynamiquement d'autres propriétés, par exemple si un champ est obligatoire ou en lecture seule, votre meilleur pari à court terme est LWC, où vous avez le contrôle total. Cela est particulièrement vrai si vous avez des exigences sur mesure pour gérer onblur ou onclick.
Composants Web Lightning réactifs dans les flux d'écran : Lors de l'élaboration de composants Web Lightning capables de réagir et de modifier d'autres composants dans un flux d'écran, consultez ce guide [LWC Best Practices for Screen Flows](https://developer.salesforce.com/blogs/2023/02/lwc-best-practices-for-screen-flows) pour vous assurer que vos composants s'intègrent correctement au moteur d'exécution du flux et fonctionnent normalement à l'avenir.
| Traitement des événements standard (onblur, onfocus) | Traitement des événements personnalisés | |
|---|---|---|
| Formulaires dynamiques | Non disponible | Non disponible |
| Flux d'écran | Non disponible | Non disponible |
| OmniStudio | Non disponible | Disponible* |
| Flux d'écran + Composant Web Lightning | Disponible | Disponible |
| LWC | Disponible | Disponible |
| *L'exécution OmniStudio Standard ne prend pas en charge Pub/Sub, mais prend en charge Windows postMessage | ||
| Style direct | Thèmes d'organisation et Générateur d'expérience | Style parfait | |
|---|---|---|---|
| Formulaires dynamiques | Non disponible | Disponible | Non disponible |
| Flux d'écran | Non disponible | Disponible | Roadmap |
| OmniStudio | Disponible* | Non disponible | Disponible |
| Flux d'écran + Composant Web Lightning | Non disponible | Disponible | Disponible |
| LWC | Non disponible | Disponible | Disponible |
| * Cartes Flex uniquement | |||
| 2 colonnes | 4 colonnes | Au-delà de 4 colonnes | Répéter des blocs de données | Conteneurs d'onglets | Conteneurs en accordéon | |
|---|---|---|---|---|---|---|
| Formulaires dynamiques | Disponible | Non disponible | Non disponible | Non disponible | Disponible | Disponible |
| Flux d'écran | Disponible | Disponible | Non disponible | Disponible | Non disponible | Disponible |
| OmniStudio | Disponible | Disponible | Disponible | Disponible | Disponible* | Disponible |
| Flux d'écran + Composant Web Lightning | Disponible | Disponible | Disponible | Disponible | Disponible | Disponible |
| LWC | Disponible | Disponible | Disponible | Disponible | Disponible | Disponible |
| *Les onglets peuvent être utilisés en incorporant des données à une FlexCard dans un Omniscript | ||||||
| Étiquettes saisies dans le Générateur | Étiquettes dans le code | |
|---|---|---|
| Formulaires dynamiques | Disponible* | Non disponible |
| Flux d'écran | Disponible | Disponible |
| OmniStudio | Disponible | Disponible |
| Flux d'écran + Composant Web Lightning | Disponible | Disponible |
| LWC | Non disponible | Disponible |
| *En-têtes de section de champ uniquement | ||
| Tests unitaires | Automatisation de bout en bout | |
|---|---|---|
| Formulaires dynamiques | Non disponible | Disponible* |
| Flux d'écran | Non disponible | Disponible* |
| OmniStudio | Disponible* | Disponible* |
| Flux d'écran + Composant Web Lightning | Disponible* | Disponible* |
| LWC | Disponible | Disponible |
| *Nécessite un code | ||
| Vues de page | Temps passé sur le formulaire | Suivre la saisie du formulaire | Suivi du taux de réussite | |
|---|---|---|---|---|
| Formulaires dynamiques | Disponible** | Non disponible | Non disponible | Non disponible |
| Flux d'écran | Disponible | Disponible* | Disponible | Disponible |
| OmniStudio | Disponible | Disponible* | Disponible | Disponible |
| Flux d'écran + Composant Web Lightning | Disponible | Disponible* | Disponible | Disponible |
| LWC | Disponible** | Disponible* | Disponible | Disponible |
| *Disponible lorsque Exécution OmniStudio basée sur un package est activée ** Disponible en suivant l'utilisation de la page Lightning parente |
||||
| Packages gérés de première génération (1GP) | Packages gérés de deuxième génération (2GP) | Packages déverrouillés | Ensembles de modifications | DevOps Center | |
|---|---|---|---|---|---|
| Formulaires dynamiques | Disponible | Disponible | Disponible | Disponible | Disponible |
| Flux d'écran | Disponible | Disponible | Disponible | Disponible | Disponible |
| OmniStudio | Non disponible | Non disponible | Non disponible | Non disponible* | Non disponible* |
| Flux d'écran + Composant Web Lightning | Disponible | Disponible | Disponible | Disponible | Disponible |
| LWC | Disponible | Disponible | Disponible | Disponible | Disponible |
| * Utilisez le Workbench IDX pour déployer les solutions OmniStudio dans d'autres organisations. | |||||
Maintenant, décomposez ce diagramme et commencez à construire les pièces.
## Planification avec un flux planifié
Le flux planifié offre plusieurs avantages en tant que mécanisme de planification :
- Les flux planifiés peuvent être empaquetés et déployés en tant que métadonnées. Ce n'est pas vrai pour les tâches planifiées via Apex (ou via la page Tâches planifiées).
- L'élément Attente est essentiel pour les infrastructures qui nécessitent une légende. En l'utilisant dans Flux, les appels externes ne sont pas nécessaires dans la partie Invocable de l'infrastructure.
- La granularité de la planification remplit les exigences : l'intervalle minimal pour les flux planifiés est quotidien. Si vous avez besoin d'une fréquence plus élevée (par exemple, toutes les heures), reconsidérez Flux planifié pour cette exigence.
Une autre considération lors de la configuration du flux planifié est le portage de l'environnement. Avant d'invoquer l'action Apex, ajoutez un élément Décision qui évalue la variable `{!$Api.Enterprise_Server_URL_100}`. Cela garantit que la tâche est exécutée uniquement dans les environnements prévus, tels que UAT et Production. Ce schéma est important, car les sandbox sont fréquemment actualisées ou créées pendant le développement de l'infrastructure, et sans vérification explicite de l'environnement, un flux planifié peut involontairement être exécuté dans des environnements où l'infrastructure n'est pas conçue pour être exécutée. L'utilisation de l'opérateur `contains` dans l'élément Décision rend la configuration résiliente aux futures créations de sandbox ou aux changements d'URL.
Enfin, déterminez comment l'infrastructure doit capturer les échecs. Ajoutez toujours un chemin de défaut lorsque Flux appelle n'importe quelle action. Vous pouvez par exemple câbler les défauts à l'action « Ajouter une entrée au journal » [de Nebula Logger](https://www.nebulalogger.com/). Nebula Logger écrit des journaux dans des objets personnalisés. Par conséquent, les clients doivent savoir que les données des journaux consomment du stockage dans l'organisation. Par défaut, les journaux sont stockés pendant 14 jours dans une organisation, puis nettoyés. Cette période de rétention est configurable. Nebula Logger utilise également les événements de plate-forme pour publier des journaux. Par conséquent, les entrées dans les journaux sont enregistrées indépendamment de la transaction de traitement des données principale. Cela garantit la capture des échecs, même si l'action principale Flux ou Apex est annulée. Les clients doivent évaluer le volume de consignation attendu et les exigences de rétention en envisageant l'ajout d'une infrastructure de consignation.
Le flux se présente comme suit :
Passons aux premiers bouts de code Apex avec l'exigence de planification désormais satisfaite.
## Création d'une interface d'étape
Définissez une interface de `Step` :
```java
public interface Step {
void execute();
void finalize();
String getName();
Boolean shouldRestart();
}
```
Pour cet article, l'interface de `step` est affichée en tant que classe externe pour plus de clarté. L'infrastructure elle-même est flexible. Les équipes peuvent organiser l'interface et ses implémentations en utilisant n'importe quel modèle d'empaquetage Apex de leur choix, à condition que toutes les classes Étape référencent la même interface.
Voici quelques points à noter concernant les méthodes définies dans notre interface :
- La `execute`, bien que sans argument pour le moment, s'améliore lorsque nous passons une classe (ou interface) de `State` pour orchestrer les données entre les étapes lorsque l'ordre importe.
- `getName` peut renvoyer une valeur de `System.Type` au lieu d'une `String`. L'objectif est de fournir à la couche d'orchestration un moyen de consigner les noms d'étape sans exposer d'autres propriétés.
Voici la première mise en œuvre concrète qui montre comment ces pièces s’agencent. À une exception près plus loin, nous recommandons d'utiliser Apex Queueable pour implémenter le traitement asynchrone dans Apex; Apex par lot est généralement inutile (et les méthodes de `@future` sont déconseillées). Apex Queueable démarre rapidement et présente, avec les curseurs Apex, de nombreux avantages par rapport aux Apex batch.
### Une implémentation Apex semblable à un curseur
Les [curseurs Apex](https://developer.salesforce.com/docs/atlas.en-us.apexcode.meta/apexcode/apex_cursors.htm) offrent une alternative moderne au modèle Apex traditionnel par lot. De la même façon qu'un traitement par lot, une implémentation de curseur peut récupérer des enregistrements par segments (jusqu'à 2000 par lot). Cependant, les curseurs autorisent plusieurs récupérations dans une seule transaction, ce qui augmente considérablement le débit pour les opérations à grand volume.
Lors de l'adoption des curseurs dans ce cadre, les équipes doivent être conscientes des limitations actuelles en matière de test et de moquabilité. Le comportement du curseur dans les tests peut différer de celui de la production. Par conséquent, il est important de concevoir des stratégies de test qui évitent de dépendre des internes du curseur et valident à la place la logique d'orchestration aux frontières. À mesure que la plate-forme évoluera, ces domaines continueront de s'améliorer, mais les orientations principales demeurent les suivantes : Les curseurs offrent des performances supérieures et réduisent les surcharges d'orchestration par rapport à Apex par lot pour de nombreux cas d'utilisation.
Pour définir une frontière claire entre le curseur fourni par le système et votre propre code, nous recommandons de créer une représentation de type curseur lors de l'implémentation de l'interface de `Step`. Tenez compte du code suivant :
```java
public inherited sharing abstract class CursorStep implements Step {
private static final Integer MAX_CHUNK_SIZE = 2000;
protected Cursor cursor;
private Integer chunkSize = System.Limits.getLimitDMLRows();
private Integer position = 0;
protected abstract Cursor getCursor();
protected abstract void innerExecute(List