# architect Guide alle decisioni (decision-guides) - Full Documentation # Utilizzo degli strumenti e degli schemi giusti per le architetture basate sugli eventi ## Panoramica Le architetture basate sugli eventi supportano la produzione e il consumo efficienti degli eventi, che comunicano le modifiche dello stato del sistema o dell'applicazione. Queste architetture consentono connessioni flessibili tra i sistemi e supportano processi e aggiornamenti quasi in tempo reale che funzionano tra i sistemi. Benché i vantaggi delle architetture basate sugli eventi siano facili da vedere, i dettagli dell'implementazione non sono sempre altrettanto chiari. Quali funzionalità è necessario considerare negli schemi architettonici basati sugli eventi? Quali problemi specifici risolvono questi schemi? Quali considerazioni speciali valgono per le soluzioni e quali sono gli schemi ottimali per affrontarle? Questa guida presenta gli schemi utilizzati per creare architetture basate sugli eventi ottimali quando si utilizzano le tecnologie Salesforce. Vengono inoltre discussi gli strumenti per gli eventi disponibili in Salesforce e vengono forniti consigli sugli strumenti per una selezione di casi d'uso. Per informazioni sulle integrazioni a livello di dati che coinvolgono Salesforce, vedere la nostra [Guida alle decisioni](/docs/architect/it-it/decision-guides/guide/data-integration). ## Takeaway - **Utilizzare architetture basate sugli eventi per i processi che non richiedono risposte sincrone alle richieste.** Gli schemi descritti in questa guida sono progettati per la coerenza, la scalabilità e il riutilizzo dei dati, che consentono di ridurre al minimo l'indebitamento tecnico man mano che il panorama applicativo dell'organizzazione si evolve. (Per ulteriori informazioni, vedere [Well-Architected - Throughput](/docs/architect/it-it/well-architected/guide/reliable#rendimento)). - **Se MuleSoft o un'altra soluzione Enterprise Service Bus (ESB) fa parte del panorama esistente, utilizzarla dove possibile.** Queste soluzioni sono progettate appositamente per supportare schemi di architettura basati sugli eventi e dispongono di potenti funzionalità che consentono di riutilizzare le integrazioni in tutta l'azienda. - **Utilizzare l'API Pub/Sub per qualsiasi schema di pubblicazione/abbonamento futuro anziché creare i propri handler eventi utilizzando altre API, inclusa Streaming API.** Ora che l'API Pub/Sub è disponibile in generale, utilizzarla per eventuali nuovi schemi di pubblicazione/abbonamento. Pianificare la migrazione delle comunicazioni degli eventi esistenti utilizzando altre API piattaforma, ad esempio Streaming API o servizi Apex personalizzati, all'API Pub/Sub quando possibile. - **Eventi piattaforma e Acquisizione dati di modifica (CDC) sono i meccanismi preferiti per pubblicare le modifiche di record e campi che devono essere consumate da altri sistemi.** Non è consigliabile utilizzare PushTopic ed eventi generici per le nuove implementazioni. Salesforce continuerà a supportare PushTopic ed eventi generici nell'ambito delle funzionalità correnti, ma non prevede di effettuare ulteriori investimenti in questa tecnologia. ## Prodotti nell'ambito
| Salesforce Platform è una piattaforma completa basata sull'intelligenza artificiale che unifica dipendenti, agenti autonomi dell'intelligenza artificiale, dati aziendali e applicazioni in un unico sistema affidabile per migliorare la produttività e l'esperienza dei clienti. Consente la creazione di un'"azienda autentica" collegando le app Customer 360, Data Cloud e Slack per l'automazione end-to-end. | |
![]() |
MuleSoft è la piattaforma di integrazione leader di Salesforce che consente alle organizzazioni di connettere applicazioni, dati e dispositivi in ambienti locali e cloud. MuleSoft è una piattaforma che offre all'IT le piattaforme per sbloccare i dati tra i sistemi, sviluppare framework di integrazione e automazione scalabili e creare esperienze connesse e differenziate in modo rapido. |
| Punto Decisione | Guida |
|---|---|
| Notifiche quasi in tempo reale | Gli schemi di architettura basati sugli eventi come pubblicazione/abbonamento, fanout e streaming tendono a funzionare bene negli scenari in cui più applicazioni devono essere informate delle modifiche dello stato o degli aggiornamenti dei record quasi in tempo reale. |
| Elaborazione parallela | Schemi come pubblicazione/abbonamento tendono a funzionare bene negli scenari in cui volumi elevati di dati o messaggi molto complessi richiedono la distribuzione del carico di elaborazione tra più sistemi. |
| Letture a volume elevato | Gli schemi Messaggi passati e Area di attesa sono comunemente utilizzati negli scenari in cui le organizzazioni subiscono picchi e il volume dei messaggi prodotti può superare la capacità degli abbonati di elaborarli immediatamente. |
| Scritture a volume elevato | Gli schemi Streaming e Area di attesa funzionano bene in molti scenari in cui le organizzazioni sperimentano un aumento del numero di messaggi prodotti. |
| Invio degli stessi dati a sistemi diversi | Benché la pubblicazione/abbonamento sia una soluzione piuttosto comune per le organizzazioni che necessitano di inviare gli stessi dati a più sistemi, può essere affrontata dalla maggior parte degli schemi descritti qui. Assicurarsi di esaminarli in dettaglio per trovare la misura migliore. |
| Introduzione frequente di nuovi sistemi o dispositivi | Gli schemi di pubblicazione/abbonamento, streaming e inserimento in area di attesa tendono a funzionare bene per gli scenari in cui il panorama generale tende a essere in movimento, con nuovi sistemi e dispositivi aggiunti regolarmente. In questo scenario, un nuovo sistema o dispositivo deve semplicemente diventare abbonato al bus degli eventi o associato a un'area di attesa per iniziare a ricevere messaggi anziché richiedere un'integrazione point-to-point personalizzata. |
| Dispositivi IoT | Poiché i dispositivi IoT in genere forniscono aggiornamenti frequenti e possono anche generare un'impennata di messaggi in alcuni scenari, gli schemi Streaming e Area di attesa tendono a funzionare bene quando li integrano in un panorama IT. |
| Dispositivi e sistemi mobili offline | I dispositivi mobili che devono lavorare in aree con accesso a Internet di bassa qualità o inesistente o sistemi che potrebbero essere offline al momento della consegna dei messaggi beneficeranno dello schema di inserimento in area di attesa, che consente loro di connettersi alle aree di attesa e recuperare tutti i messaggi pertinenti una volta che sono di nuovo online. |
| Punto Decisione | Guida/Domande da porre |
|---|---|
| Requisiti aziendali | Esiste una reale esigenza aziendale per una delle funzionalità descritte nella sezione [Quando utilizzare un'architettura basata sugli eventi] (#when-to-use-an-event-driven-architecture)? |
| Requisiti tecnici | L'integrazione che si sta progettando è adatta a uno schema diverso, ad esempio virtualizzazione dei dati, batch o richiesta/risposta? In altre parole, stai cercando di inserire un piolo quadrato in un foro rotondo? |
| Processi che richiedono agli esseri umani di attendere le risposte | Qualsiasi integrazione che prevede un essere umano in attesa di una risposta dal sistema di destinazione non è adatta alle architetture basate sugli eventi, poiché sono progettate per l'esecuzione asincrona e non possono garantire un tempo di risposta. Prima di implementare le soluzioni tecniche, valutare se processi di questo tipo sono ottimali per la propria organizzazione. Vedere [Well-Architected - Process Design](/docs/architect/it-it/well-architected/guide/automated#progettazione-dei-processi) per ulteriori informazioni. |
| Modificare raramente i dati di origine | Se i dati nel sistema di origine cambiano così di rado che gli aggiornamenti periodici sono sufficienti, è probabile semplificare l'architettura utilizzando [batch pattern] (https://developer.salesforce.com/docs/atlas.en-us.integration_patterns_and_practices.meta/integration_patterns_and_practices/integ_pat_batch_data_sync.htm) anziché schemi basati sugli eventi. |
| Requisiti di implementazione | La maggior parte dei sistemi coinvolti nella soluzione supporta architetture basate sugli eventi? Che cosa sarebbe necessario per utilizzare architetture basate sugli eventi con i sistemi che non le supportano (ad esempio, aggiornamenti, personalizzazioni o middleware)? Quale livello di impegno sarebbe necessario per soddisfare tali requisiti? |
| Stabilità della struttura del messaggio | Con che frequenza sarà necessario modificare le strutture dei messaggi? Quali sistemi saranno interessati da tale modifica e quale sarà il processo di risanamento? |
| Governance organizzativa | Esiste una struttura di governance per garantire che tutti gli stakeholder siano informati e in grado di intervenire sulle modifiche alle strutture dei messaggi, ai trigger e ad altre decisioni relative all'architettura e ai processi? |
| Insiemi di competenze richiesti | Il personale ha esperienza con le architetture basate sugli eventi e sa come supportarle? |
| Schema | Quasi in tempo reale | Copia messaggio univoco | Consegna garantita | Ridurre le dimensioni dei messaggi | Trasforma dati |
|---|---|---|---|---|---|
| Pubblica / Abbonati | ✓ | ✓ | ✓ | ||
| Fanout | ✓ | ✓ | ✓ | ||
| Messaggi passati | ✓ | ✓ | ✓ | ✓ | |
| Streaming | ✓ | ✓ | ✓ | ||
| Area di attesa | ✓ | ✓ | ✓ |
| Strumento | Descrizione | Competenze richieste | |
|---|---|---|---|
| MuleSoft | Anypoint Platform | Piattaforma che consente l'integrazione dei dati utilizzando livelli di API. | Pro-code |
| Connettore Salesforce Pub/Sub | Connettore per l'API Pub/Sub, che offre un'unica interfaccia per la pubblicazione e l'abbonamento a eventi piattaforma, eventi di monitoraggio evento in tempo reale ed eventi di acquisizione dati di modifica. | Pro-code | |
| Connettore JMS MuleSoft Anypoint | Connettore che consente di inviare e ricevere messaggi ad aree di attesa e argomenti per qualsiasi servizio di messaggistica che implementa la specifica JMS (Java Message Service). | Pro-code | |
| MuleSoft Anypoint Apache Kafka Connector | Connettore per spostare i dati tra Apache Kafka e applicazioni e servizi aziendali. | Pro-code | |
| Connettore MuleSoft Anypoint Solace | Un connettore per i broker di eventi Solace PubSub+ con integrazione API nativa utilizzando JCSMP Java SDK | Pro-code | |
| Connettore MuleSoft Anypoint MQ | Un servizio di messaggistica cloud multi-tenant che consente ai clienti di eseguire messaggi asincroni avanzati tra le loro applicazioni. | Pro-code | |
| Connettore MuleSoft Anypoint MQTT | Un'estensione MuleSoft compatibile con il protocollo MQTT (Message Queuing Telemetry Transport) v3.x. | Pro-code | |
| Connettore MuleSoft Anypoint AMQP | Un connettore che consente all'applicazione di pubblicare e utilizzare messaggi utilizzando un broker compatibile con AMQP 0.9.1. | Pro-code | |
| API MuleSoft Anypoint basata sugli eventi (sincronizzazione) | Linguaggio indipendente dal settore che supporta la pubblicazione di API basate sugli eventi separandole in livelli evento, canale e trasporto. | Pro-code | |
| MuleSoft Anypoint MQ | Servizio di messaggistica cloud multitenant che consente ai clienti di eseguire messaggi asincroni avanzati tra le loro applicazioni. | Pro-code | |
| Stream di dati MuleSoft Anypoint | Framework disponibile in MuleSoft Anypoint per la pubblicazione e l'abbonamento ai dati in streaming. | Pro-code | |
| Salesforce Platform | Apache Kafka su Heroku | Componente aggiuntivo Heroku che fornisce Apache Kafka come servizio con integrazione completa della piattaforma nella piattaforma Heroku. | Pro-code |
| Modifica acquisizione dati | Registro eventi di modifica, che pubblica le modifiche ai record Salesforce. Le modifiche includono la creazione di un nuovo record, gli aggiornamenti di un record esistente, l'eliminazione di un record e l'annullamento dell'eliminazione di un record. | Da codice basso a codice pro | |
| Messaggi in uscita | Azioni che inviano messaggi XML a endpoint esterni quando i valori dei campi vengono aggiornati in Salesforce. | Basso codice | |
| Eventi piattaforma | Messaggi sicuri e scalabili contenenti dati di eventi personalizzati. | Da codice basso a codice pro | |
| Pub/Sub API | API che abilita abbonamenti a eventi piattaforma, eventi di acquisizione dati di modifica e/o eventi di Monitoraggio evento in tempo reale. | Pro-code | |
| Relay evento | Abilita l'invio di eventi piattaforma ed eventi acquisizione dati di modifica da Salesforce ad Amazon EventBridge. Tenere presente che i relay evento si connettono solo ad AWS Eventbridge. | Basso codice | |
#### Strumenti pertinenti allo schema di pubblicazione/iscrizione
| Flusso e comportamento dell'evento | Considerazioni sul payload | ||||||
|---|---|---|---|---|---|---|---|
| Strumenti disponibili | Competenze richieste | Pubblica tramite | Abbonamento tramite | Periodo di riproduzione | Struttura payload | Limiti del payload | |
| MuleSoft | Anypoint Platform | Pro-code | APIs | APIs | Come configurato | Definito dall'utente | Nessuno |
| Connettore Salesforce Pub/Sub | Pro-code | APIs | APIs | Come configurato | Definito dall'utente | Nessuno | |
| Connettore JMS MuleSoft Anypoint | Pro-code | APIs | APIs | Come configurato | Definito dall'utente | Nessuno | |
| MuleSoft Anypoint Apache Kafka Connector | Pro-code | APIs | APIs | Come configurato | Definito dall'utente | Nessuno | |
| Connettore MuleSoft Anypoint Solace | Pro-code | APIs | APIs | Come configurato | Definito dall'utente | Nessuno | |
| Connettore MuleSoft Anypoint MQ | Pro-code | APIs | APIs | Come configurato | Definito dall'utente | Nessuno | |
| Connettore MuleSoft Anypoint MQTT | Pro-code | APIs | APIs | Come configurato | Definito dall'utente | Nessuno | |
| Connettore MuleSoft Anypoint AMQP | Pro-code | APIs | APIs | Come configurato | Definito dall'utente | Nessuno | |
| API MuleSoft Anypoint basata sugli eventi (sincronizzazione) | Pro-code | APIs | APIs | Come configurato | Definito dall'utente | Nessuno | |
| MuleSoft Anypoint MQ | Pro-code | APIs | APIs | Come configurato | Definito dall'utente | Nessuno | |
| Salesforce Platform | Apache Kafka su Heroku | Pro-code | API, modifiche dei record in Heroku Postgres | N/D | 1-6 settimane | Definito dall'utente | Definito dall'utente |
| Modifica acquisizione dati | Da codice basso a codice pro | Modifiche record | Apex, API, componenti Web Lightning (LWC) | 3 giorni | Predefinito | 1 MB | |
| Messaggi in uscita* | Basso codice | Regole di flusso e di flusso di lavoro | N/D | 24 ore | Definito dall'utente | 100 notifiche per messaggio | |
| Eventi piattaforma | Da codice basso a codice pro | API, Apex, Flusso | Apex, API, Flusso, LWC | 3 giorni | Definito dall'utente | 1 MB | |
| Pub/Sub API | Pro-code | API o API Pub/Sub, Apex, Flusso | API Pub/Sub | 3 giorni | Definito dall'utente | 1 MB | |
| Relay evento** | Basso codice | Eventi piattaforma, Acquisizione dati modifica | API | 3 giorni | Definito dall'utente | 1 MB | |
| *Salesforce continuerà a supportare i messaggi in uscita nell'ambito delle attuali funzionalità, ma non prevede di effettuare ulteriori investimenti in questa tecnologia. **I relay evento si connettono solo ad AWS Eventbridge | |||||||
#### Strumenti pertinenti allo schema Fanout
| Flusso e comportamento dell'evento | Considerazioni sul payload | ||||||
|---|---|---|---|---|---|---|---|
| Strumenti disponibili | Competenze richieste | Pubblica tramite | Abbonamento tramite | Periodo di riproduzione | Struttura payload | Limiti del payload | |
| MuleSoft | Connettore JMS MuleSoft Anypoint | Pro-code | APIs | APIs | Come configurato | Definito dall'utente | Nessuno |
| Connettore Salesforce Pub/Sub | Pro-code | APIs | APIs | Come configurato | Definito dall'utente | Nessuno | |
| MuleSoft Anypoint Apache Kafka Connector | Pro-code | APIs | APIs | Come configurato | Definito dall'utente | Nessuno | |
| Connettore MuleSoft Anypoint Solace | Pro-code | APIs | APIs | Come configurato | Definito dall'utente | Nessuno | |
| Connettore MuleSoft Anypoint MQ | Pro-code | APIs | APIs | Come configurato | Definito dall'utente | Nessuno | |
| Connettore MuleSoft Anypoint MQTT | Pro-code | APIs | APIs | Come configurato | Definito dall'utente | Nessuno | |
| Connettore MuleSoft Anypoint AMQP | Pro-code | APIs | APIs | Come configurato | Definito dall'utente | Nessuno | |
| MuleSoft Anypoint MQ | Pro-code | APIs | APIs | Come configurato | Definito dall'utente | Nessuno | |
| Salesforce Platform | Apache Kafka su Heroku | Pro-code | API, modifiche dei record in Heroku Postgres | N/D | 1-6 settimane | Definito dall'utente | Definito dall'utente |
| Modifica acquisizione dati | Da codice basso a codice pro | Modifiche record | Apex, API, componenti Web Lightning (LWC) | 3 giorni | Predefinito | 1 MB | |
| Eventi piattaforma | Da codice basso a codice pro | API, Apex, Flusso | Apex, API, Flusso, LWC | 3 giorni | Definito dall'utente | 1 MB | |
| Pub/Sub API | Pro-code | API Pub/Sub o Apex, API, Flusso | API Pub/Sub | 3 giorni | Definito dall'utente | 1 MB | |
| Relay evento* | Basso codice | Eventi piattaforma, Acquisizione dati modifica | API | 3 giorni | Definito dall'utente | 1 MB | |
| *I relay evento inviano i dati solo ad AWS Eventbridge | |||||||
#### Strumenti pertinenti allo schema dei messaggi passati
| Flusso e comportamento dell'evento | Considerazioni sul payload | ||||||
|---|---|---|---|---|---|---|---|
| Strumenti disponibili | Competenze richieste | Pubblica tramite | Abbonamento tramite | Periodo di riproduzione | Struttura payload | Limiti del payload | |
| MuleSoft | MuleSoft Anypoint Apache Kafka Connector | Pro-code | APIs | APIs | Come configurato | Definito dall'utente | Nessuno |
| Connettore Salesforce Pub/Sub | Pro-code | APIs | APIs | Come configurato | Definito dall'utente | Nessuno | |
| Salesforce Platform | Apache Kafka su Heroku | Pro-code | API, modifiche dei record in Heroku Postgres | N/D | 1-6 settimane | Definito dall'utente | Definito dall'utente |
| Modifica acquisizione dati | Da codice basso a codice pro | Modifiche record | Apex, API, componenti Web Lightning (LWC) | 3 giorni | Predefinito | 1 MB | |
| Eventi piattaforma | Da codice basso a codice pro | API, Apex, Flusso | Apex, API, Flusso, LWC | 3 giorni | Definito dall'utente | 1 MB | |
| Pub/Sub API | Pro-code | API Pub/Sub o API, flusso Apex | API Pub/Sub | 3 giorni | Definito dall'utente | 1 MB | |
| Relay evento* | Basso codice | Eventi piattaforma, Acquisizione dati modifica | API | 3 giorni | Definito dall'utente | 1 MB | |
| *I relay evento inviano i dati solo ad AWS Eventbridge | |||||||
#### Strumenti pertinenti allo schema di streaming
| Flusso e comportamento dell'evento | Considerazioni sul payload | ||||||
|---|---|---|---|---|---|---|---|
| Strumenti disponibili | Competenze richieste | Pubblica tramite | Abbonamento tramite | Periodo di riproduzione | Struttura payload | Limiti del payload | |
| MuleSoft | Stream di dati MuleSoft Anypoint | Pro-code | APIs | APIs | Come configurato | Definito dall'utente | Nessuno |
| Connettore Salesforce Pub/Sub | Pro-code | APIs | APIs | Come configurato | Definito dall'utente | Nessuno | |
| MuleSoft Anypoint Apache Kafka Connector | Pro-code | APIs | APIs | Come configurato | Definito dall'utente | Nessuno | |
| Salesforce Platform | Apache Kafka su Heroku | Pro-code | API, modifiche dei record in Heroku Postgres | N/D | 1-6 settimane | Definito dall'utente | Definito dall'utente |
| Pub/Sub API | Pro-code | API Pub/Sub o API, flusso Apex | API Pub/Sub | 3 giorni | Definito dall'utente | 1 MB | |
#### Strumenti pertinenti allo schema di area di attesa
| Flusso e comportamento dell'evento | Considerazioni sul payload | ||||||
|---|---|---|---|---|---|---|---|
| Strumenti disponibili | Competenze richieste | Pubblica tramite | Abbonamento tramite | Periodo di riproduzione | Struttura payload | Limiti del payload | |
| MuleSoft | MuleSoft Anypoint MQ | Pro-code | APIs | APIs | Come configurato | Definito dall'utente | Nessuno |
| Connettore Salesforce Pub/Sub | Pro-code | APIs | APIs | Come configurato | Definito dall'utente | Nessuno | |
| MuleSoft Anypoint Apache Kafka Connector | Pro-code | APIs | APIs | Come configurato | Definito dall'utente | Nessuno | |
| Connettore MuleSoft Anypoint MQ | Pro-code | APIs | APIs | Come configurato | Definito dall'utente | Nessuno | |
| Connettore MuleSoft Anypoint MQTT | Pro-code | APIs | APIs | Come configurato | Definito dall'utente | Nessuno | |
| Connettore MuleSoft Anypoint AMQP | Pro-code | APIs | APIs | Come configurato | Definito dall'utente | Nessuno | |
| Salesforce Platform | Apache Kafka su Heroku | Pro-code | API, modifiche dei record in Heroku Postgres | N/D | 1-6 settimane | Definito dall'utente | Definito dall'utente |
| Modifica acquisizione dati | Da codice basso a codice pro | Modifiche record | Apex, API, componenti Web Lightning (LWC) | 3 giorni | Predefinito | 1 MB | |
| Eventi piattaforma | Da codice basso a codice pro | API, Apex, Flusso | Apex, API, Flusso, LWC | 3 giorni | Definito dall'utente | 1 MB | |
| Pub/Sub API | Pro-code | API o API Pub/Sub, Apex, Flusso | API Pub/Sub | 3 giorni | Definito dall'utente | 1 MB | |
| Relay evento* | Basso codice | Eventi piattaforma, Acquisizione dati modifica | API | 3 giorni | Definito dall'utente | 1 MB | |
| *I relay evento inviano i dati solo ad AWS Eventbridge | |||||||
| Flusso | Salesforce Flow è un potente strumento di automazione point-and-click che consente agli utenti di creare processi aziendali complessi, schermate e logica visivamente utilizzando Flow Builder, senza scrivere codice. Automatizza operazioni come l'aggiornamento dei dati, l'invio di email e la guida degli utenti, offrendo flessibilità attraverso tipi come Flussi schermata (interazione dell'utente) e Flussi attivati (eventi record/pianificati). |
| Apex | Salesforce Apex è un linguaggio di programmazione proprietario orientato agli oggetti per la piattaforma Salesforce, simile a Java, utilizzato per creare logiche aziendali personalizzate, automatizzare i processi ed estendere le funzionalità CRM principali oltre gli strumenti dichiarativi. |
Man mano che l'ambito e la complessità dell'applicazione Salesforce aumentano, impegnarsi in un unico punto di ingresso principale, Flusso attivato da record o Trigger Apex. Evitare di suddividere le automazioni in più meccanismi in un unico oggetto Salesforce, poiché ciò causa una scarsa manutenibilità e una governance frammentata.
### La matrice di selezione della densità
Utilizzare questa matrice per determinare lo standard architettonico richiesto per l'oggetto Salesforce.
- Il **flusso attivato da** record è la soluzione preferita per una bassa densità di automazione. Offre un equilibrio di potenza e accessibilità ideale per automazioni semplici e indipendenti l'una dall'altra.
- **Lo schema ibrido (Record-Triggered Flow with Invocable Apex)** è una scelta potente e manutenibile per le automazioni a media densità con complessità crescente. Questo schema consente ai team di mantenere coreografie ordinate in un flusso dichiarativo delegando al contempo le operazioni complesse di calcolo ad Apex, bilanciando l'accessibilità con le prestazioni.
- **I trigger Apex** forniscono i componenti base necessari per una solida base architettonica per supportare automazioni ad alta densità. Le prestazioni, il controllo granulare e l'astrazione e il polimorfismo orientati agli oggetti di Apex sono più adatti per gestire la complessità e la scala di questi scenari.
| Livello di densità | Quantità automazione | Volume di dati (dimensioni batch) | Dependance Sprawl (Diffusione delle dipendenze) | Standard architettonico |
|---|---|---|---|---|
| Basso | < 15 Automazioni |
Standard Interazioni dell'interfaccia utente basate sugli utenti o piccoli carichi API (1-200 record) |
Discreto Logica autonoma. 0–1 operazioni DML a valle sullo stesso oggetto o su un oggetto correlato. |
Flusso attivato da record |
| Medio | 15–30 Automazioni |
Modera Elaborazione batch standard (con logica che richiede un'attenta messa in blocco) |
Accoppiato Parent/Child aggiorna da 2 a 4 operazioni DML a valle. Rischio di ricorsione |
Schema ibrido Flusso + Apex invocabile |
| Alto | > 30 Automazioni |
Alto Grandi volumi di dati con caricamenti API in blocco (2.000 - 10.000+ record) |
Complesso e ricorsivo Grafico delle dipendenze profonde (5+ operazioni DML a valle). Rischio di loop di ricorsione triangolari |
Framework di metadati trigger Apex |
| Capacità | Flusso attivato da record | Trigger Apex |
|---|---|---|
| Velocità di consegna e manutenzione | Consigliato L'interfaccia utente visiva di Flow Builder consente agli amministratori e ad altri generatori dichiarativi di creare e modificare l'automazione più rapidamente rispetto alla scrittura, al test e alla distribuzione di Apex Code. Questa interfaccia consente a una gamma più ampia di membri del team di offrire valore aziendale e riduce la dipendenza da risorse per sviluppatori specializzate per operazioni semplici. |
Richiede esperienza Apex richiede sviluppatori di software esperti per implementare, testare e gestire il codice. |
| Modularità | Disponibile I flussi attivati da record sono modulari per impostazione predefinita. Anziché la logica monolitica, i team creano flussi discreti per esigenze specifiche e li coreografano insieme utilizzando Explorer trigger di flusso. Questa modularità consente la modifica isolata e l'estensione semplice, riducendo notevolmente il costo di proprietà a lungo termine. |
Disponibile Apex è suddiviso in moduli funzionali in base alla progettazione. Ogni classe Apex è destinata a implementare un singolo modulo di funzionalità. |
| Visibilità e governance | Consigliato La natura visiva del flusso offre una rappresentazione intuitiva della logica aziendale. Explorer trigger di flusso offre una visualizzazione consolidata di tutti i flussi di un oggetto, semplificando la comprensione, il governo e la risoluzione dei problemi per architetti e amministratori senza leggere il codice. |
Richiede esperienza L'utilizzo di un framework di metadati per organizzare i trigger è vantaggioso, ma Apex richiede un team di sviluppo disciplinato per mantenere il codice organizzato e manutenibile. |
| Elaborazione in blocco dei dati ad alte prestazioni | Sconsigliato Esiste un rischio elevato di superare i limiti del governor quando si ha a che fare con logica complessa o volumi di dati elevati. |
Consigliato Apex Code viene eseguito più vicino ai servizi principali della piattaforma e offre agli sviluppatori un controllo avanzato sull'ottimizzazione delle query, la gestione dei dati e l'efficienza algoritmica. Ciò si traduce in prestazioni e scalabilità migliori, soprattutto in scenari complessi che coinvolgono volumi di dati elevati. |
| Logica e strutture di dati solide | Disponibile L'elemento Trasforma flusso può essere utile per alcune operazioni di elaborazione complesse. Tuttavia, il flusso non dispone di strutture di dati native Map and Set (Mappa e imposta), il che rende l'elaborazione dei dati complessa complessa complessa e inefficiente dal punto di vista computazionale. |
Consigliato Apex offre accesso completo ai loop Map, Set e programmatic per una manipolazione dei dati altamente efficiente e sicura in blocco. Essendo un linguaggio di programmazione completo, Apex offre anche l'accesso a costrutti logici complessi, strutture di dati e schemi di progettazione che possono aiutare a risolvere problemi aziendali complessi in modo manutenibile ed efficiente. Apex include una ricca libreria standard di funzioni avanzate (ad esempio, BusinessHours, Crypto) attualmente non disponibili negli strumenti dichiarativi. |
| Controllo delle transazioni | Non disponibile Il flusso non fornisce alcun accesso a `Database.savepoint`, `Database.rollback` o a operazioni DML parzialmente riuscite per conferme o rollback parziali delle transazioni. |
Disponibile Apex offre un controllo completo e granulare sull'integrità delle transazioni e su scenari di ripristino degli errori complessi. |
| Distribuzione email | Consigliato L'invio di avvisi tramite email preconfigurati da un flusso attivato da record è semplice e scalabile. Gli avvisi tramite email personalizzati possono essere creati e distribuiti in fase di esecuzione. I messaggi email personalizzati sono soggetti a limiti giornalieri. |
Disponibile Apex può generare e inviare messaggi email personalizzati. Tutte le email inviate da Apex sono soggette ai limiti giornalieri. |
| Applicazione di protezioni piattaforma | Consigliato Il flusso include protezioni incorporate, ad esempio la bulkificazione automatica e i tentativi automatici. Queste protezioni aumentano la velocità di calcolo e impediscono insidie nelle prestazioni che altrimenti richiedono una codifica manuale complessa. |
Implementazione manuale richiesta Le protezioni come la creazione in blocco devono essere codificate in modo esplicito (ad esempio, la gestione delle raccolte ed evitare SOQL all'interno dei loop). I tentativi automatici non sono nativi dei trigger e richiedono una complessa logica personalizzata per essere implementati. |
| Elaborazione asincrona | Disponibile Il flusso offre meccanismi semplici per le automazioni che richiedono una transazione separata in un percorso asincrono. Queste automazioni sono soggette a limiti giornalieri. |
Disponibile Apex consente il controllo completo tramite Acquisizione dati di modifica ed eventi in area di attesa gestiti da un abbonato trigger disaccoppiato. |
| Elaborazione pianificata | Consigliato I percorsi pianificati del flusso offrono una funzionalità di pianificazione unica e potente (ad esempio, "attiva 3 giorni prima della data di chiusura"). Questa funzionalità include l'annullamento automatico e la riprogrammazione se i dati del record cambiano. Queste automazioni sono soggette a limiti giornalieri. |
Non disponibile Un trigger Apex non può pianificare in modo nativo un evento temporale specifico del record con annullamento automatico. Sebbene esista Apex pianificato, si tratta di un meccanismo fondamentalmente diverso che viene eseguito in un momento specifico e non viene pianificato durante l'elaborazione di un singolo record come parte di un trigger. |
| Ordinamento e coreografia | Disponibile Explorer trigger di flusso consente agli amministratori di definire un ordine di esecuzione relativo per più flussi sullo stesso oggetto. |
Disponibile Un framework trigger offre un controllo granulare sull'ordine esatto delle automazioni. |
| Aggiornamenti di campo dello stesso record | Disponibile (prima del salvataggio) Il flusso attivato da record è l'opzione dichiarativa più efficace per aggiornare il record di attivazione prima della conferma DML iniziale. |
Disponibile (prima del salvataggio) Apex offre le prestazioni più elevate con un sovraccarico minimo. |
| CRUD oggetti incrociati | Disponibile (dopo il salvataggio) Il flusso è adatto per operazioni DML tra oggetti semplici, di bassa complessità. |
Disponibile (dopo il salvataggio) Apex offre un controllo superiore su deduplica, gestione degli errori e prestazioni per le operazioni DML oggetti incrociate. |
| Deduplicazione di calcoli costosi | Disponibile Il flusso eccelle nell'eliminazione delle query ridondanti e delle istruzioni DML tramite il blocco automatico. Tuttavia, lo stato non può essere memorizzato nella cache o condiviso tra trigger di flusso diversi o tra più chiamate dello stesso flusso all'interno di una sola transazione. Questa limitazione può diventare importante in scenari di prestazioni estreme. |
Consigliato Apex fornisce meccanismi per deduplicare operazioni costose. Gli sviluppatori possono sfruttare il caching transazionale utilizzando proprietà e variabili statiche e il caching a livello di piattaforma utilizzando la cache piattaforma per archiviare e riutilizzare i dati. Queste tecniche sono importanti per ridurre il consumo dei limiti del governor transazionale, ad esempio le query SOQL, e garantire prestazioni e scalabilità elevate. |
| Gestione errori personalizzati | Disponibile L'elemento CustomError può bloccare un'operazione di salvataggio e visualizzare un messaggio all'utente. |
Consigliato Il metodo addError() offre una messaggistica di errore flessibile a livello di campo e condizionale. |
| Caso d'uso | Descrizione | Best-Fit | Motivo |
|---|---|---|---|
| Elaborazione batch ad alte prestazioni | Qualsiasi automazione che deve elaborare migliaia di record in modo efficiente | Apex | Apex fornisce API complete per l'interfacciamento con la piattaforma e per la velocità di stampa. |
| Elaborazione dati complessa | Scenari che richiedono una manipolazione avanzata dei dati | Apex | Apex fornisce strutture di dati, ad esempio Mappa e Imposta, che non sono disponibili in modo nativo in Flusso e possono essere fondamentali per scrivere codice efficiente e sicuro in blocco. |
| Controllo transazionale | Meccanismi di controllo come savepoint, rollback e conferme parziali | Apex | Apex fornisce l'accesso a meccanismi come Database.savepoint e Database.rollback e ha la capacità di elaborare operazioni DML parzialmente riuscite. |
| Convalida personalizzata sofisticata | Convalida dei dati in più campi di un record | Apex | Sebbene il flusso possa impedire il salvataggio con l'elemento 'CustomError', non è disponibile in tutti i tipi di flusso, inclusi i sottoflussi. Il metodo Apex addError() fornisce più messaggi di errore specifici del campo che possono essere aggiunti a un record in qualsiasi momento durante l'elaborazione del trigger. |
| Logica moderatamente complessa in un processo semplice | Logica e manipolazione dei dati di moderata complessità, semplificate da una libreria standard di funzioni avanzate, che si verificano nell'ambito di un processo semplice | Flusso + Apex | Il flusso attivato da record funge da livello di orchestrazione, mentre le operazioni di elevata complessità sono incapsulate in Apex invocabile. |
| Logica da semplice a moderatamente complessa | Manipolazione dei dati di complessità da bassa a moderata, con aggiornamenti dei trigger sia agli oggetti dati principali che a quelli correlati | Flusso | Il flusso è in genere l'opzione da seguire, poiché è basato su un modello dichiarativo che lo rende accessibile sia agli amministratori che agli sviluppatori. |
| Notifiche e messaggi in uscita | Invio di email e messaggi in uscita | Flusso | Il flusso consente di inviare avvisi tramite email e messaggi in uscita sulle modifiche dei record in modo semplice e altamente scalabile. |
| Elaborazione pianificata | Automazione in una data futura e dinamica (ad esempio, 3 giorni prima di una data di chiusura) | Flusso | I percorsi pianificati rappresentano un punto di forza unico per il flusso, poiché la piattaforma gestisce automaticamente la pianificazione, l'annullamento e la riprogrammazione di questi percorsi se i dati del record cambiano. |
### L'alternativa al lavoro pianificato
Come indica il diagramma di flusso, quando ci si trova di fronte a operazioni DML a volume elevato ma non è possibile utilizzare Acquisizione dati di modifica (forse a causa dei limiti degli oggetti), la scelta architettonica migliore è spesso evitare completamente un processo invocato da trigger.
Valutare invece la possibilità di utilizzare un processo pianificato. Può essere un flusso pianificato o Apex pianificato. I passaggi obbligatori sono:
1. Eseguire un aggiornamento semplice e a basso costo nel trigger sincrono. Ad esempio, impostare un campo `Status__c` su "elaborazione in sospeso" o inserire un record correlato a basso costo, ad esempio un post Chatter, per indicare che il record deve essere elaborato.
2. Creare un processo pianificato, un flusso pianificato o Apex pianificato, che viene eseguito periodicamente, ad esempio ogni 15 minuti o ogni ora.
3. Fare in modo che la query del processo pianificata per tutti i record nello stato In sospeso, eseguire la logica complessa in un contesto controllato a volume elevato e quindi aggiornare i record come elaborati.
Questo schema separa completamente l'elaborazione pesante dal salvataggio sincrono dell'utente, non è soggetto al limite di un processo per transazione di un batch attivato da trigger e offre una soluzione altamente scalabile e governabile per i requisiti non in tempo reale.
Se la latenza di un processo pianificato non è accettabile per i requisiti aziendali e si è ancora costretti a non utilizzare CDC o un trigger in attesa, ciò indica una significativa non corrispondenza architettonica. A questo punto occorre considerare diversi meccanismi. Rivalutando la progettazione dell'applicazione di base si possono trarre alcune conclusioni, ad esempio:
- Acquisto del componente aggiuntivo per rimuovere i limiti degli oggetti CDC.
- È fondamentale mettere in discussione il requisito aziendale di determinare se l'elaborazione quasi in tempo reale è davvero un "must-have" o se la latenza di un processo pianificato è un compromesso accettabile per la stabilità della piattaforma.
## Considerazioni non funzionali
### Complessità
Il livello di complessità di un'implementazione fa parte del costo totale di proprietà di una soluzione, nonché della sua capacità di adattarsi alle mutevoli esigenze aziendali. La complessità può influire su qualsiasi implementazione se non vengono seguite le procedure consigliate. Nella sezione _Procedure consigliate correlate_ di questo documento sono riportati i consigli per ridurre la complessità della soluzione, inclusi questi schemi:
- Schema ibrido: Apex invocabile per logica complessa nel flusso
- Utilizzo di un framework di metadati per trigger Apex
- Mega-flussi vs. Più flussi
### Processi e standard
La documentazione è importante tanto quanto l'automazione stessa. Non solo garantisce la manutenibilità, ma è anche fondamentale per l'intelligenza artificiale e gli strumenti basati sugli agenti. La documentazione consente di comprendere e gestire i processi aziendali.
**Nel flusso**
- Stabilire una convenzione di denominazione coerente per tutti gli elementi e le variabili.
- Utilizzare il campo Descrizione del flusso per spiegarne lo scopo generale, i criteri di attivazione e l'esito previsto.
- Utilizzare il campo Descrizione per ogni singolo elemento (ad esempio, `Get Records`, `Action`, `Transform`). Questa procedura è il modo migliore per trasmettere l'intento. È particolarmente importante per le azioni invocabili e i sottoflussi, dove la descrizione è il punto principale per spiegare la complessa logica eseguita dall'azione.
**In Apex**
- Commentare chiaramente il codice per spiegare il _perché_ della logica, non solo il _cosa_.
- Se si utilizza un framework basato sui metadati, assicurarsi che i record dei metadati includano e compilino un campo Descrizione in formato leggibile per spiegare le operazioni di ogni classe di handler e quando deve essere eseguita.
DevOps e il controllo sorgente fanno parte di un ciclo di vita di sviluppo maturo. Utilizzare sempre uno strumento di controllo sorgente come Git per i progetti Salesforce. Sia le classi Apex che i flussi Salesforce sono metadati che definiscono la logica aziendale e devono essere modificati e gestiti.
Nel contesto della gestione delle automazioni attivate da record, una pipeline DevOps moderna offre vantaggi essenziali.
- **Controlli di qualità automatici:** Strumenti come [Salesforce Code Analyzer](https://developer.salesforce.com/docs/platform/salesforce-code-analyzer/overview) possono essere configurati per l'esecuzione automatica nelle opportunità in corso di realizzazione. L'analisi statica può rilevare schemi problematici in entrambi gli strumenti di automazione prima che vengano promossi, segnalando problemi come elementi di `Get Records` inefficienti all'interno di un loop di flusso o query di `SOQL` all'interno di un loop Apex per il loop, che sono cause comuni di deterioramento delle prestazioni.
- **Prevenzione della regressione:** Man mano che la densità di automazione aumenta, la modifica a una classe Flusso o Apex può avere conseguenze indesiderate per altre automazioni sullo stesso oggetto. Una strategia di test DevOps efficace, in cui i test Apex automatici vengono eseguiti in base a qualsiasi modifica proposta, è il modo più affidabile per assicurarsi che una nuova versione del flusso non interrompa la logica Apex esistente (e viceversa).
- **Collaborazione e visibilità:** Il controllo sorgente è la "singola fonte della verità". Consente ad amministratori e sviluppatori di lavorare sull'automazione per lo stesso oggetto in parallelo. Offre anche un itinerario di controllo prezioso: quando un processo di produzione si interrompe, è possibile vedere immediatamente _chi_ ha modificato l'automazione, _quando_ l'ha modificata e, tramite messaggi di conferma, _perché_ l'ha modificata.
Per i team con un mix di amministratori e sviluppatori, [DevOps Center](https://help.salesforce.com/s/articleView?id=platform.devops_center_overview.htm&type=5) fornisce un'interfaccia unificata che aiuta a coreografare tutte queste fasi, rendendo un processo di sviluppo scalabile e basato sul controllo sorgente accessibile a tutti i membri del team.
Questa disciplina combinata di documentazione e DevOps garantisce la salute e la manutenibilità a lungo termine dell'organizzazione, a vantaggio di ogni architetto e amministratore che vi segue.
## Procedure consigliate correlate
La guida alle decisioni riportata sopra è consigliabile prima di pianificare l'implementazione. Ha lo scopo di aiutare l'utente a scegliere il prodotto migliore per i propri casi d'uso. Dopo la selezione del prodotto, è importante conoscere le procedure consigliate esistenti per l'implementazione.
### Sfruttare lo schema ibrido: Apex invocabile per logica complessa nel flusso
Il principio _One Tool Per Object_ è fondamentale per la gestione dell'automazione ad alta densità, ma non lo si interpreta come una scelta binaria tra uno stack puramente dichiarativo o puramente programmatico. Un modello architetturale più efficace e manutenibile sfrutta un modello ibrido: posizionare il flusso attivato da record come livello di orchestrazione, incapsulando al contempo le operazioni di elevata complessità in Apex invocabile.
#### Il livello orchestrazione: Flusso
Il flusso attivato da record funge da livello di orchestrazione per il processo aziendale. È titolare dei criteri di immissione e del contesto di esecuzione (_cosa_ e _quando_). Mantenendo la logica decisionale e l'instradamento all'interno di questo livello, la topologia dei processi dell'architettura rimane trasparente e gestibile tramite Explorer trigger di flusso, evitando che la logica aziendale critica venga oscurata nel codice.
#### Il componente complesso: Apex invocabile
Un esempio comune di componente complesso è l'implementazione dei calcoli del contratto sul livello di servizio (SLA) per i record Caso. Poiché l'oggetto BusinessHours e la relativa logica, essenziali per calcoli accurati che escludono le ore non lavorative e i giorni festivi, non sono accessibili in modo nativo in Flusso, viene utilizzata una classe Apex dedicata. Questa classe, spesso denominata `ServiceLevelAgreementCalculator`, è progettata con un unico metodo statico, annotato con `@InvocableMethod`, per calcolare l'orario di ufficio trascorso, determinare se il contratto sul livello di servizio è "Entro il target" o "Violato" e restituire un output strutturato. Questo approccio incapsula la complessa logica ad alte prestazioni di Apex consentendo al contempo di eseguirla e integrarla senza problemi nel livello di orchestrazione dichiarativa di un flusso attivato da record.
Una volta definita, la classe di `ServiceLevelAgreementCalculator` Apex è disponibile per l'uso all'interno di un flusso attivato da record:
Questo schema dimostra una rigorosa separazione delle preoccupazioni. Il livello dichiarativo viene utilizzato per gestire il ciclo di vita delle transazioni e l'orchestrazione, mentre il codice viene utilizzato per l'esecuzione di elevata complessità. Considerando il codice come un'utilità funzionale anziché come la base, bilanciamo prestazioni e manutenibilità.
#### Vantaggi chiave con lo schema ibrido
**Modularità**: La decisione si allontana dalla singolarità dell'utilizzo di Apex o Flusso per l'intero processo. L'architettura incapsula invece la logica complessa in unità discrete, sicure in blocco e testabili in modo indipendente. Queste unità funzionano come componenti riutilizzabili consumati dallo strato dichiarativo, garantendo le scale di automazione senza complicare la progettazione architettonica.
**Riutilizzabilità**: La logica viene disaccoppiata dall'evento trigger. Un'unità di codice ben progettata (ad esempio un `InvocableMethod`) viene scritta una sola volta ma utilizzata in più punti di ingresso: Flussi attivati da record, flussi schermata o integrazioni esterne. Questo riutilizzo del codice elimina lo sviluppo ridondante.
**Gestibilità**: La logica del flusso del processo rimane visibile e gestibile all'interno del flusso dichiarativo. Questa centralizzazione riduce drasticamente il sovraccarico di debug e garantisce che l'ordine di esecuzione del sistema sia deterministico e trasparente.
#### Limitazioni e compromessi dello schema ibrido
Sebbene il modello ibrido di utilizzo di Apex invocabile da Flusso sia potente, non è un approccio adatto a tutti. Gli architetti devono essere consapevoli delle limitazioni e dei compromessi specifici prima di impegnarsi in una soluzione ibrida.
- **Nessun supporto prima del salvataggio**: Questa è la limitazione più importante. Le azioni invocabili sono disponibili solo nel contesto dopo il salvataggio (flussi per azioni e record correlati). Non possono essere utilizzati nel contesto prima del salvataggio ad alte prestazioni (flussi per aggiornamenti rapidi dei campi). Pertanto, questo schema non può essere utilizzato per delegare gli aggiornamenti di campo dello stesso record. Eseguire questo lavoro ad alte prestazioni utilizzando elementi Flusso nativi in un flusso before-save o all'interno di un trigger Apex before-context.
- **Nessun supporto dopo l'annullamento dell'eliminazione:** Attualmente, il flusso attivato da record non supporta il contesto di annullamento dell'eliminazione. Se un oggetto Salesforce ha un requisito aziendale per eseguire l'automazione quando un record viene ripristinato dal Cestino, l'unica soluzione è un trigger Apex.
- **Overhead delle prestazioni in scenari a volume elevato:** La transizione dal runtime del flusso al runtime Apex non è un'operazione a costo zero. Benché in genere sia veloce, l'esecuzione di un'azione invocabile dal runtime del flusso non è altrettanto veloce dal punto di vista computazionale dell'esecuzione nativa che rimane interamente all'interno di un trigger Apex. Per la maggior parte delle automazioni a media densità, questo micro-overhead è un compromesso trascurabile e utile per una maggiore accessibilità. Tuttavia, per gli scenari estremamente performanti e a volume elevato, un framework solo Apex puro avrà un vantaggio in termini di velocità di calcolo.
### Strategie per l'automazione legacy
Mentre l'euristica della densità di automazione fornisce indicazioni definitive per la nuova architettura greenfield, la realtà degli ambienti Salesforce aziendali è spesso più sfumata. Nelle organizzazioni mature, è comune trovare flussi attivati da record e trigger Apex che operano sullo stesso oggetto Salesforce. Questo scenario è distinto dallo schema ibrido spiegato in precedenza: qui, i flussi e i trigger Apex non sono accoppiati né progettati per funzionare insieme.
Questa coesistenza è spesso il risultato dell'evoluzione delle capacità della piattaforma o del debito tecnico legacy. Sebbene questo sia uno stato operativo tollerato, gli architetti devono trattarlo come un compromesso calcolato anziché come uno stato finale.
L'orchestrazione frammentata causa un notevole sovraccarico di governance e manutenzione, rendendo le attività di sviluppo, test e gestione degli incidenti disgiunte e farraginose. Ciò determina un aumento del Time to Resolution (TTR) e della complessità operativa.
- Per i nuovi oggetti Salesforce, attenersi al principio della densità di automazione come guida principale.
- Per gli oggetti Salesforce esistenti con impronta ibrida e doppio trigger Apex e punti di ingresso del flusso attivati da record, valutare la densità e quindi eseguire l'architettura per il refactoring a uno stato ibrido manutenibile.
- Per una bassa densità, rifattorizzare i trigger Apex in flussi attivati da record e specificare l'ordine di esecuzione, riportandoli a un unico punto di ingresso dell'automazione.
- Per una densità media, rifattorizzare i flussi mega complessi in un sottoinsieme di flussi, con il giusto ordine di esecuzione. Introdurre trigger Apex solo quando è assolutamente necessario, ad esempio per supportare dopo l'annullamento dell'eliminazione del contesto.
- Per una densità elevata, preferire l'implementazione dei trigger Apex.
### Utilizzo di un framework di metadati per trigger Apex
Man mano che i processi aziendali di un'organizzazione sulla piattaforma Salesforce maturano, il volume e la complessità dell'automazione attivata da record aumentano inevitabilmente. Una procedura ottimale fondamentale è mantenere _un trigger Apex per oggetto Salesforce_. Questa regola è fondamentale perché la piattaforma non garantisce l'ordine di esecuzione di più trigger sullo stesso oggetto per lo stesso evento. Questa limitazione può causare comportamenti non deterministici, condizioni di gara e problemi di difficile risoluzione dei problemi.
Tuttavia, l’adesione al principio _one trigger_ introduce una sfida architettonica: come gestire e orchestrare tutta la logica aziendale richiamata da quel singolo punto di ingresso in modo manutenibile e scalabile.
#### Limitazioni degli handler trigger Classic
La prima evoluzione di questa architettura è stato lo schema Classic Trigger Handler. In questo approccio, il singolo trigger Apex delega tutta la sua logica a una classe di handler corrispondente (ad esempio, `OpportunityTriggerHandler`). Questo metodo separa la logica dal file trigger e offre agli sviluppatori un controllo deterministico sull'ordine di esecuzione all'interno dei metodi della classe handler (ad esempio, `afterInsert()`).
Sebbene sia un miglioramento, questo schema spesso porta a classi di handler monolitici. Con il passare del tempo, man mano che si aggiungono ulteriori requisiti aziendali, la classe diventa grande, difficile da gestire e difficile da testare isolatamente. L'ordine di esecuzione di tutti i singoli processi è codificato all'interno di un unico metodo, rendendo la classe soggetta a conflitti di unione, aumentando notevolmente il sovraccarico di governance e manutenzione in un ambiente aziendale di grandi dimensioni.
#### Soluzione: Framework di trigger basato sui metadati
Per risolvere i problemi principali della modularità e dell'orchestrazione, gli architetti passano a un **trigger framework basato** sui metadati. Si tratta di un salto architettonico significativo che separa la logica di automazione stessa dalla configurazione di _come_ e _quando_ viene eseguita.
Questo framework si basa su tre vantaggi chiave:
- **Partizionamento:** Anziché una singola classe di handler, la logica aziendale centrale è suddivisa in piccole classi Apex atomiche (ad esempio, una classe `RecalculateAccountValues` o una classe `NotifySalesLeads`), con ciascuna classe che aderisce al _principio responsabilità unica_. Questa modularità semplifica il test, il debug e la comprensione della logica separatamente.
- **Ordine e coreografia:** L'ordine di esecuzione non è più codificato in Apex. È invece definito in modo dichiarativo dai record di configurazione, in genere memorizzati in un tipo di metadati personalizzato (ad esempio, `TriggerAction__mdt`). Ciò consente agli amministratori di riordinare, aggiungere o rimuovere le azioni di automazione semplicemente modificando un record di metadati, che non richiede una distribuzione o una modifica del codice.
- **Funzionalità di bypass:** Il framework offre funzionalità di bypass granulari standardizzate. Ogni azione di automazione può essere configurata tramite il relativo record di metadati per essere disattivata globalmente o ignorata per utenti amministrativi specifici facendo riferimento a un'autorizzazione personalizzata.
Il trigger Apex singolo per l'oggetto funge quindi solo da dispatcher dinamico. Non contiene alcuna logica aziendale, ma istanzia una classe di `MetadataTriggerHandler` centrale. Questo handler esegue query sui record di metadati personalizzati per determinare dinamicamente la sequenza di esecuzione e invocare le classi Apex atomiche corrette nell'ordine prescritto. L'automazione è unificata sotto un unico livello trasparente e controllabile.
### Deduplicazione di operazioni costose nella transazione
Un vantaggio importante dell'utilizzo di Apex in un framework solido è la possibilità di gestire lo stato delle transazioni e ottimizzare le prestazioni eliminando il lavoro ridondante. Man mano che la logica si accumula, è comune che automazioni diverse all'interno dell'ordine di salvataggio eseguano in modo indipendente le stesse operazioni costose, consumando limiti del governor preziosi e aumentando il tempo di operazione DML.
Il framework è progettato per affrontare questo problema con due strategie principali:
- **Gestione condivisa dello stato:** Nell'ambito di una singola transazione Apex, le proprietà statiche e le variabili vengono utilizzate per memorizzare nella cache i dati. Ciò garantisce che un'operazione costosa, ad esempio una query `SOQL` per un'impostazione di configurazione, venga eseguita una sola volta, anche se la logica di automazione viene richiamata più volte in diversi record o fasi del trigger. Il consumo dei limiti delle transazioni è significativamente ridotto.
- **Utilizzo della cache piattaforma:** Per andare oltre il semplice caching intra-transazioni, utilizzare la cache della piattaforma per evitare di eseguire query sull'intero database per determinati dati. Questa cache in memoria gestita è ideale per recuperare dati non primitivi, letti spesso nella codebase e immutabili nel corso di una transazione (ad esempio profili, ruoli, orari di ufficio). Utilizzando l'interfaccia `Cache.CacheBuilder`, il sistema controlla prima la cache ed esegue la query sul database solo se i dati non sono presenti, ottimizzando le prestazioni e la scalabilità.
### Utilizzo di Prima del salvataggio per gli aggiornamenti dello stesso record
Utilizzare sempre un aggiornamento prima del salvataggio quando l'automazione deve solo modificare i valori dei campi del record che avvia la transazione. Questo vale sia per gli aggiornamenti di campo veloce nel flusso (che vengono eseguiti prima del salvataggio) che per la logica before-context nei trigger Apex (prima dell'inserimento, prima dell'aggiornamento).
Questo schema è performante, indipendentemente dallo strumento utilizzato, perché evita una seconda operazione DML e un ciclo di salvataggio ricorsivo. Le modifiche vengono apportate al record in memoria _prima_ che venga confermato nel database e vengono salvate come parte della transazione originale. Viene eliminato il sovraccarico di un secondo salvataggio, che altrimenti eseguirebbe nuovamente l'intero ordine di salvataggio e attiverebbe nuovamente tutta l'automazione.
### Impedire la ricorsione incontrollata
La ricorsione incontrollata è un'insidia comune nei trigger dopo l'aggiornamento, in cui la logica di un trigger esegue un aggiornamento DML che a sua volta provoca la riattivazione dello stesso trigger. Questo crea un loop infinito che alla fine termina con un'eccezione del limite governor. Mentre i flag booleani statici o le raccolte di ID record elaborati sono stati storicamente utilizzati per impedire tale ricorsione, uno schema più preciso e robusto è quello di bloccare la logica confrontando i valori dei campi tra la nuova e la vecchia versione del record stesso.
Eseguire la logica solo se un campo specifico di interesse è stato effettivamente modificato. Ciò impedisce al trigger di eseguire la sua logica nelle operazioni DML successive all'interno della stessa transazione in cui i dati critici rimangono invariati.
#### Controllo della ricorsione nel flusso attivato da record
In un flusso attivato da record, impedire la ricorsione incontrollata impostando l'esecuzione del flusso solo quando il record viene aggiornato per soddisfare i requisiti della condizione:
Se si sceglie di utilizzare una formula di criteri di immissione nel flusso, è possibile evitare la ricorsione in fuga confrontando la variabile globale `$Record` (che rappresenta i nuovi valori) con la variabile globale `$RecordPrior` (che rappresenta i valori originali prima del salvataggio). Ad esempio, per assicurarsi che un flusso venga eseguito solo se il campo Ammontare di un'opportunità è stato modificato, utilizzare questo criterio nei criteri di immissione:
```
$Record.Amount != $Record__Prior.Amount
```
#### Controllo della ricorsione in Apex
Confrontare i valori dei campi della nuova versione del record, `Trigger.new`, con i valori dei campi della vecchia versione del record, `Trigger.oldMap`, per vedere se si è verificata la modifica specifica desiderata. Questo approccio garantisce che l'automazione sia idempotente e venga eseguita solo quando necessario, rendendo il sistema più efficiente e prevenendo loop ricorsivi catastrofici.
### Ignorare l'automazione
Un'organizzazione Salesforce ben progettata richiede un meccanismo coerente e affidabile per ignorare l'automazione. Non si tratta di una funzione facoltativa, ma di un requisito operativo fondamentale per mantenere l'integrità dei dati e abilitare le operazioni amministrative.
Un framework di bypass è essenziale per alcuni scenari:
- Quando si caricano grandi volumi di dati, l'attivazione di trigger per ogni record può rallentare drasticamente il processo, causare eccezioni ai limiti e creare record e notifiche correlati errati. Un bypass consente di inserire i dati in modo pulito ed efficiente.
- Un utente integrazione può avere la necessità di sincronizzare i dati di un sistema di record esterno. L'automazione che normalmente viene attivata per una modifica avviata dall'utente (ad esempio, l'invio di un messaggio email, la creazione di un'operazione) può essere indesiderata o ridondante quando la modifica ha origine da un altro sistema.
- Gli amministratori o il personale di assistenza potrebbero dover eseguire aggiornamenti correttivi sui record. Un meccanismo di bypass consente di apportare queste modifiche senza attivare l'automazione aziendale standard, che potrebbe avere conseguenze indesiderate.
**Autorizzazioni personalizzate**: Lo standard moderno e scalabile per l'implementazione della logica di bypass sono le autorizzazioni personalizzate. Questi sono superiori ai metodi precedenti per diversi motivi:
- **Flessibilità:** Le autorizzazioni personalizzate possono essere assegnate agli utenti tramite gli insiemi di autorizzazioni. Questa procedura è in linea con il moderno modello di sicurezza e accesso di Salesforce, consentendo un'assegnazione granulare e flessibile. Un bypass può essere concesso a un utente specifico o anche temporaneamente con una data/ora di scadenza specifica.
- **Gestibilità:** L'uso delle autorizzazioni personalizzate evita il codificaggio dei profili o degli utenti in una logica di automazione. Se il ruolo di un utente cambia o un nuovo profilo deve ignorare l'accesso, la modifica è una semplice assegnazione di insiemi di autorizzazioni, non una modifica del codice o del flusso che richiede una distribuzione.
- **Scalabilità:** Le autorizzazioni personalizzate offrono un framework scalabile per la gestione delle eccezioni in una base di utenti complessa. Possono essere assegnati agli utenti tramite insiemi di autorizzazioni, gruppi di insiemi di autorizzazioni o profili. La loro associazione a un insieme di autorizzazioni o a un profilo è rappresentabile anche nei metadati di origine.
**Modelli di implementazione**: Applicare uno schema di bypass coerente a tutte le automazioni attivate da record dell'organizzazione.
**Ignorare un flusso attivato da record**: Il modo più efficiente per ignorare un flusso è impedirne l'esecuzione. A questo scopo, aggiungere una condizione ai criteri di immissione del flusso.
- Nell'elemento iniziale del flusso attivato da record, impostare Requisiti della condizione su La formula valuta True.
- Nel Generatore di formule, incorporare una verifica dell'autorizzazione personalizzata utilizzando la variabile globale `$Permission`. Combinare il controllo con i criteri di immissione esistenti.
- Schema di formula:
```
( ) && NOT($Permission.Bypass_This_Flow)
```
- Questo schema garantisce che il flusso venga eseguito solo se all'utente _non_ è assegnata l'autorizzazione personalizzata specificata. Questo controllo viene eseguito prima ancora di creare l'intervista del flusso, rendendolo l'approccio più efficace.
**Ignorare un trigger framework Apex**: In Apex, integrare la logica di bypass direttamente nel framework di trigger basato sui metadati, consentendo un controllo granulare.
- Il tipo di metadati personalizzato `TriggerAction__mdt` deve includere un campo di testo, ad esempio `BypassPermission__c`.
- Nella classe `MetadataTriggerHandler`, prima di eseguire dinamicamente un'azione, il codice deve leggere il valore di questo campo.
- Se il campo è compilato, l'handler utilizza il metodo `FeatureManagement.checkPermission()` per determinare se l'utente corrente in esecuzione dispone dell'autorizzazione personalizzata specificata.
- Se `checkPermission()` restituisce true, l'handler salta quell'azione specifica e passa a quella successiva nella sequenza.
- Questo schema è efficace perché consente sia un bypass globale (se tutti i record `TriggerAction__mdt` fanno riferimento alla stessa autorizzazione) che un bypass granulare per azione (se record diversi fanno riferimento a autorizzazioni diverse o se alcuni non dispongono di alcuna autorizzazione di bypass).
### Mega-flussi vs. Più flussi
È un anti-schema per consolidare tutta l'automazione di un oggetto in un unico enorme flusso. Il consolidamento in un flusso anziché la suddivisione della logica in più flussi ben condizionati non ha un impatto significativo sulle prestazioni. I guadagni di prestazioni più significativi provengono da:
- Utilizzo dei flussi before-save per gli aggiornamenti di campo dello stesso record.
- Scrivere condizioni di immissione precise per garantire che i flussi siano esclusi dall'esecuzione per le modifiche che non influiscono sul loro caso d'uso specifico.
[Flow Trigger Explorer](https://trailhead.salesforce.com/content/learn/modules/record-triggered-flows/meet-flow-trigger-explorer) consente di assegnare un valore ordine a ogni flusso di un oggetto, garantendo un ordine di esecuzione sequenziale.
## Risorse
| Apex | Flusso | Operazioni |
|---|---|---|
| Competenze richieste | Requisiti di licenza aggiuntivi | |
|---|---|---|
| Moduli dinamici | Codice basso | No |
| Flusso schermata | Codice basso | No |
| OmniStudio | Codice basso + Codice pro | Richiede il pacchetto Settori |
| Flusso schermata + componenti Web Lightning | Codice basso + Codice pro | No |
| Componenti Web Lightning | Codice professionale | No |
| Impatto oggetto | Determinare se il modulo funzionerà su un singolo oggetto o se dovrà funzionare su più oggetti. |
| Ambito e navigazione del modulo | Determinare se tutti i campi del modulo si adatteranno logicamente a un'unica schermata o se gli utenti devono essere in grado di spostarsi tra più schermate. |
| Posizione | Identificare la posizione o le posizioni in cui si desidera incorporare il modulo, che può variare da un'app Salesforce a un'app mobile o persino a un sito Web esterno. |
| Controller | Identificare le azioni o la logica da eseguire in background mentre gli utenti interagiscono con il modulo, incluse le trasformazioni dei dati e le integrazioni con sistemi esterni. |
| Convalida | Determinare se sono presenti ulteriori requisiti di convalida degli input che vanno oltre la convalida a livello di sistema standard fornita da Salesforce. |
| Sicurezza | Determinare se il modulo deve controllare l'accesso dell'utente prima di eseguire determinate operazioni, se si desidera controllare chi può accedere al modulo e se si desidera controllare dove può essere incorporato il modulo. |
| Progettazione di interazioni | Identificare i tipi di interazioni o condizioni che devono attivare risposte dinamiche all'interno del modulo. |
| Stile | Determinare il livello di sofisticazione per lo stile desiderato e CSS. |
| Layout | Identificare i requisiti di layout del modulo in termini di numero richiesto di colonne, schede, fisarmoniche e capacità di visualizzare blocchi di dati ripetuti. |
| Traduzione | Determinare se il modulo dovrà essere localizzato in altre lingue. |
| Automazione test interfaccia utente | Determinare se i processi DevOps richiederanno che il modulo venga sottoposto a test di unità automatici o a test end-to-end automatici |
| Metriche | Identificare i modi in cui si desidera tenere traccia dell'utilizzo del modulo, incluse le visualizzazioni pagina, la quantità di tempo trascorso sul modulo, le percentuali di completamento e le percentuali di successo |
| Imballaggio e distribuzione | Determinare come distribuire o distribuire il modulo dopo che è stato creato. |
| Oggetto singolo | Oggetto incrociato | Oggetto Agnostico | |
|---|---|---|---|
| Moduli dinamici | Disponibile | Disponibile | Non disponibile |
| Flusso schermata | Disponibile | Disponibile | Disponibile |
| OmniStudio | Disponibile | Disponibile | Disponibile |
| Flusso schermata + LWC | Disponibile | Disponibile | Disponibile |
| LWC | Disponibile | Disponibile | Disponibile |
_OmniStudio_](/docs/architect/it-it/reference-diagrams/guide/omnistudio-integrations)
### Ambito e navigazione del modulo
Se è possibile ottenere tutti gli input utente da un modulo a schermata singola, iniziare con i moduli dinamici. Tuttavia, sebbene i moduli dinamici nelle pagine dei record possano utilizzare la funzione Percorso per rappresentare in modo poco chiaro le varie fasi del processo aziendale, è possibile che non si adatti alla maggior parte dei casi d'uso.
#### Domande da porre:
- È necessaria una schermata singola o l'utente dovrà spostarsi tra più schermate per completare un'operazione?
- Si desidera che gli utenti visualizzino una rappresentazione visiva dello stato di avanzamento della compilazione del modulo?
- Agli utenti verrà richiesto di compilare le informazioni su ogni schermata in un ordine specifico o di spostarsi avanti e indietro tra le schermate in base alle esigenze?
| Schermata singola | Modulo multischermo | Indicatori di avanzamento | Navigazione saltata tra fasi / schermate | |
|---|---|---|---|---|
| Moduli dinamici | Disponibile | Non disponibile | Disponibile | Non disponibile |
| Flusso schermata | Disponibile | Disponibile | Disponibile | Non disponibile |
| OmniStudio | Disponibile | Disponibile | Disponibile | Disponibile |
| Flusso schermata + LWC | Disponibile | Disponibile | Disponibile | Disponibile |
| LWC | Disponibile | Non ideale | Non ideale | Non ideale |
| Pagina record Lightning | Pagina iniziale o pagina dell'app Lightning | Siti Experience Cloud Aura | Siti Experience Cloud LWR | Snap incorporati | Barra delle utilità | Azione specifica dell'oggetto | Azione globale | App mobile Salesforce** | Field Service Mobile | Mobile SDK | App e siti esterni | LWC personalizzato | |
|---|---|---|---|---|---|---|---|---|---|---|---|---|---|
| Moduli dinamici | Disponibile | Non disponibile | Non disponibile | Non disponibile | Non disponibile | Non disponibile | Non disponibile | Non disponibile | Disponibile | Non disponibile | Non disponibile | Non disponibile | Non disponibile |
| Flusso schermata | Disponibile | Disponibile | Disponibile | Disponibile | Disponibile | Disponibile | Disponibile | Roadmap | Disponibile | Disponibile*** | Non disponibile | Roadmap | Disponibile |
| OmniStudio | Disponibile | Disponibile | Disponibile | Non disponibile | Non disponibile | Disponibile | Non disponibile | Non disponibile | Disponibile | Non disponibile | Non disponibile | Disponibile | Disponibile |
| Flusso schermata + LWC | Disponibile | Disponibile | Disponibile | Disponibile | Disponibile | Disponibile | Disponibile | Roadmap | Disponibile | Non disponibile | Non disponibile | Non ideale | Disponibile |
| LWC | Disponibile | Disponibile | Disponibile | Disponibile | Disponibile | Disponibile | Roadmap | Roadmap | Disponibile | Roadmap | Roadmap | Disponibile | Disponibile |
| *I flussi possono essere incorporati nei siti Experience Cloud LWR, ma è necessario tenere presenti alcune considerazioni. **I flussi e i componenti LWC sono supportati nell'app mobile Salesforce, ma l'app mobile Salesforce non supporta tutti i modi in cui è possibile incorporare flussi e componenti LWC. Ad esempio, le azioni specifiche degli oggetti sono supportate nell'app mobile, ma le voci della barra delle utilità non lo sono. ***L'app mobile Field Service non supporta molte delle funzionalità più recenti del flusso poiché è progettata a partire da un Motore di flusso e Runtime flusso schermata precedenti e presenta modifiche speciali per il funzionamento offline. |
|||||||||||||
_Lightning Out sui siti esterni_](/docs/architect/it-it/reference-diagrams/guide/lightning-out-on-external-sites)
I componenti Web Lightning non sono attualmente supportati come azioni (specifiche degli oggetti o globali), ma come soluzione si può racchiudere un componente LWC in un componente Aura (in modo molto simile ai flussi). I componenti LWC possono anche lanciare flussi con il componente [Lightning-flow](https://developer.salesforce.com/docs/component-library/bundle/lightning-flow/documentation).
OmniStudio eccelle nell'esposizione dei contenuti ai siti esterni tramite la funzione OmniOut. Con OmniStudio e OmniOut è possibile compilare i moduli OmniScript e i componenti FlexCard in componenti standard ed eseguirli fuori piattaforma in siti o app di terze parti.
Nessuna delle tecnologie dei moduli trattate in questa guida è oggi ufficialmente supportata nei modelli Mobile SDK. Se Mobile SDK è essenziale per il proprio caso d'uso, è meglio creare il modulo in modo nativo nell'applicazione mobile o creare una pagina Visualforce, pur tenendo presente la guida al [fattore di forma](/docs/architect/it-it/well-architected/guide/engaging#fattore-di-forma) ben progettato di Salesforce.
**Nota sulla roadmap:** Il team Mobile SDK sta lavorando attivamente al supporto dei componenti LWC all'interno delle pagine Visualforce.
### Controller
I moduli dinamici sono perfetti se è necessario utilizzare i valori del modulo per creare o aggiornare un record. Per qualsiasi funzionalità oltre a questa, è necessario utilizzare Flusso, OmniStudio o LWC. Queste funzionalità possono includere un livello di decisione o iterazione o la generazione di post o email Slack utilizzando gli input del modulo.
#### Domande da porre:
- Quali azioni o logica si desidera eseguire dietro le quinte?
- Il modello di dati contiene dati gerarchici?
- Il modulo dovrà completare le operazioni all'interno di una singola transazione o in più transazioni?
- È necessario integrarsi con sistemi esterni?
- Quali sono i requisiti di riutilizzabilità e modularità?
| Registro & azioni | Gestione gerarchica dei dati | Operazione con una sola transazione | Operazione su più transazioni | Integrazione | Design modulare e riutilizzo | Pacchetti | |
|---|---|---|---|---|---|---|---|
| Moduli dinamici | Non disponibile | Non disponibile | Non disponibile | Non disponibile | Non disponibile | Non disponibile | Disponibile |
| Flusso schermata | Disponibile | Roadmap | Disponibile | Disponibile | Disponibile | Disponibile | Disponibile |
| OmniStudio | Disponibile | Disponibile | Disponibile | Disponibile | Disponibile | Disponibile | Non disponibile |
| Flusso schermata + LWC | Disponibile | Disponibile | Disponibile | Disponibile | Disponibile | Disponibile | Disponibile |
| LWC | Disponibile | Disponibile | Disponibile | Disponibile | Disponibile | Disponibile | Disponibile |
_Interazione dei componenti Web Lightning tramite adattatori per cavi_](/docs/architect/it-it/reference-diagrams/guide/lightning-web-components-interaction-via-wire-adapters)
Come accennato in precedenza, OmniStudio utilizza Procedure di integrazione e Data Mapper per acquisire e trasformare facilmente i dati esterni e interni a Salesforce. Brilla nell'appiattimento e nell'espansione delle serie di dati con vari livelli di relazioni grazie a numerose funzioni senza codice che è possibile utilizzare.
**Nota sulla roadmap:** Il flusso supporterà presto la possibilità di up-inserire raccolte di record e di gestire i dati gerarchici.
Flusso, OmniStudio e LWC si integrano tutti con Apex, quindi è possibile chiudere facilmente eventuali lacune in qualsiasi soluzione si scelga. Ad esempio, se è necessario filtrare i record da un LWC è sempre possibile utilizzare l'adattatore per fili per Apex per creare query SOQL complesse. Se si è influenzati dalla storia basata sui clic, considerare Flusso o OmniStudio come valide alternative a un controller Apex per le esigenze lato server.
Una domanda secondaria è se si desidera confermare immediatamente le azioni o rinviarle a una particolare parte del modulo. Questo è particolarmente rilevante se si utilizza un modulo multipagina. Il flusso consente di combinare facilmente gli input di più moduli (schermate del flusso) e di utilizzarli molto più avanti nella procedura guidata (flusso) per eseguire alcune operazioni. Si consiglia infatti di progettare i flussi proprio in questo modo (eseguire le azioni alla fine) nel caso in cui l'utente salti avanti e indietro tra le schermate, modificando le risposte.
#### Controllo delle operazioni
Le transazioni e i [limiti del governor](https://developer.salesforce.com/docs/atlas.en-us.apexcode.meta/apexcode/apex_gov_limits.htm) sono uno stile di vita in Salesforce Platform. Se il caso d'uso è abbastanza semplice, potrebbe non essere altrettanto importante controllare in quale transazione si verifica una determinata operazione. Tuttavia, esistono alcuni casi d'uso in cui è possibile combinare più operazioni in un'unica [transazione](/docs/architect/it-it/fundamentals/guide/architecture-basics#transazioni) anziché eseguirle in più transazioni. Alcuni esempi:
- **Per ritirare o non ritirare**: Questa è la domanda. Si supponga che il modulo crei più record in background. Se non viene creato il terzo record, è necessario ritirarne i primi due? Se ogni azione è indipendente l'una dall'altra, è possibile eseguirla in transazioni separate. Tuttavia, se sono dipendenti e si desidera che l'errore di uno esegua anche il ritiro degli altri, implementarli in un'unica transazione. Se il modulo è in Flusso, è possibile utilizzare l'elemento Rollback in un percorso di errore per ritirare la transazione e garantire l'integrità dei dati.
- **Impatto a valle sui limiti del governor**: Soprattutto quando il modulo crea o aggiorna un record, tenere presenti le implicazioni a valle di tale operazione. Quali processi, regole di flusso di lavoro, trigger di flusso, trigger Apex o altri elementi dell'ordine di salvataggio verranno attivati in base a questa modifica del record? E in che modo queste modifiche collettive influiscono sui limiti del governor consumati in quella transazione? Se una particolare modifica del record comporterebbe numerose modifiche a valle che influiscono sui limiti, valutare se è opportuno isolare la modifica del record nella propria transazione.
- **Elaborazione batch**: Anche nel contesto di un'interfaccia utente, può essere necessario raggruppare in batch più aggiornamenti. Si supponga che il modulo multischermo esegua l'iterazione su un gruppo di record di grandi dimensioni. Anziché confermare un aggiornamento di record dopo ogni schermata, attendere di aver raccolto gli aggiornamenti per tutti i record e quindi inviare una richiesta per aggiornare tutti i record.
Quando si utilizzano i moduli dinamici per creare o modificare un record, si esegue sempre una sola operazione, che è sempre l'inizio di una nuova transazione.
Quando si crea un flusso schermata, si ha un controllo significativo su ciò che accade in una determinata transazione. Le schermate e le azioni locali fungono da confini tra le transazioni. Di seguito è riportato un riepilogo generale della gestione delle transazioni nell'architettura del flusso schermata.
1. L'utente finale interagisce con una schermata e quindi fa clic su **Avanti**.
2. Il client invia una richiesta all'API con gli input.
3. L'API riceve la richiesta e viene aperta una transazione e una connessione al database. L'API chiama quindi il motore di flusso per invocare la richiesta.
4. Il motore di flusso prende il sopravvento e segue il percorso appropriato nella definizione del flusso, fino a quando non colpisce un nodo Schermata o Azione locale. Il motore restituisce quindi le informazioni su quel nodo all'API.
5. L'API crea un oggetto risposta che contiene i dettagli della schermata successiva da visualizzare e restituisce l'oggetto al client. A questo punto vengono confermate le modifiche al database (avvio dell'[esecuzione dell'ordine](/docs/architect/it-it/fundamentals/guide/architecture-basics#manipolazione-del-database) di salvataggio) e la connessione al database e la transazione vengono chiuse.
6. Il client utilizza la risposta API per visualizzare la schermata successiva con cui l'utente può interagire.
7. Ripetere il passaggio 1.
In altre parole, le schermate "interrompono" le transazioni. In questo caso, vengono confermate tutte le azioni in sospeso o DML, la transazione precedente viene chiusa e viene avviata una nuova transazione.
La progettazione corretta, ovvero le operazioni raggruppate in una determinata transazione, è la chiamata. Vediamo alcuni esempi.
_Integrazioni esterne tramite API MuleSoft e bot RPA_](/docs/architect/it-it/reference-diagrams/guide/external-integrations-via-mulesoft-apis-and-rpa-bots)
Se l'API ha uno schema OpenAPI, creare un servizio esterno.
Integrazioni esterne tramite OpenAPIIntegrazioni esterne alle API con schemi OpenAPI [
\_\_](/docs/architect/it-it/reference-diagrams/guide/external-integrations-to-apis-with-openapi-schemas)
In caso contrario, utilizzare la funzione Chiamata HTTP nel flusso o Azione HTTP in OmniStudio. La chiamata HTTP del flusso è basata su Servizi esterni.
Integrazioni esterne tramite HTTPIntegrazioni esterne tramite HTTP [
\_\_](/docs/architect/it-it/reference-diagrams/guide/external-integrations-via-http)
OmniStudio dispone di una serie completa di funzionalità di integrazione che possono effettuare chiamate a sistemi esterni con le procedure di integrazione e trasformare i dati con Data Mapper. (Per ulteriori informazioni, vedere [Impatto sugli oggetti](#impatto-oggetto))
Indipendentemente dal fatto che venga implementata con Apex personalizzato o un servizio esterno, una chiamata è una chiamata. Ecco cosa devi sapere.
1. Una chiamata può richiedere molto tempo.
2. Quando una chiamata viene eseguita in modo sincrono, viene eseguita mentre è aperta una transazione del database.
3. Salesforce non consente di mantenere aperta una transazione del database se sono presenti operazioni del database in sospeso.
La limitazione principale da tenere presente è il pericolo delle cosiddette **_transazioni sporche_**, in cui si esegue un'operazione di creazione, aggiornamento o eliminazione e quindi, nella stessa transazione, si esegue una chiamata. Questo schema non è consentito a causa della considerazione #3 di cui sopra, che ovviamente esiste a causa delle considerazioni #1 e #2.
In Flusso, è possibile aggirare questa limitazione interrompendo la transazione. Ricordare che sia le schermate che le azioni locali reintroducono il contesto del browser, interrompendo la transazione. Sebbene sia possibile utilizzare schermate e azioni locali quando si utilizzano chiamate esterne, si consiglia di abilitare Controllo transazione nelle impostazioni avanzate invocabili. Controllo transazione è una funzione delle azioni invocabili che consente di terminare automaticamente la transazione prima di effettuare una chiamata. È possibile abilitare il controllo delle transazioni selezionando Avvia sempre una nuova transazione nella sezione Avanzate di un'azione invocata.
L'impatto delle chiamate sulla transazione è meno complicato con LWC. In generale, le operazioni sui dati verranno eseguite utilizzando Lightning Data Service (LDS) e quindi un controller Apex per effettuare la chiamata esterna. Questo design protegge dalle transazioni sporche, poiché la chiamata LDS è isolata in una transazione separata dalla chiamata Apex.
_Per una guida più approfondita sulle chiamate Apex, i servizi esterni e le funzionalità di integrazione dei dati in generale, vedere la [Architect's Guide to Data Integration with Salesforce](/docs/architect/it-it/decision-guides/guide/data-integration)._
#### Riutilizzabilità e modularità
I moduli dinamici non supportano il riutilizzo. Ogni modulo dinamico è collegato a una pagina di record Lightning specifica per un oggetto specifico (anche se è possibile assegnare la pagina di record Lightning a più app, profili e così via).
Così come è possibile scrivere librerie, utilità e componenti destinati a essere utilizzati in più altri componenti, è possibile applicare schemi di progettazione simili quando si creano flussi con la potenza dei **_sottoflussi_**. Salvare i flussi in bucket più piccoli e modulari e quindi chiamarli da altri flussi utilizzando l'elemento Sottoflusso. Se la progettazione lo richiede, è possibile creare un flusso che sia indipendente che utile come sottoflusso di un altro flusso.
OmniStudio è per sua natura progettato per la modularità. Mappatori di dati, OmniScript, FlexCard e Procedure di integrazione sono tutti creati in modo indipendente e possono funzionare in modo intercambiabile. Inoltre, le FlexCard possono essere create come componenti LWC che possono essere incorporati in altri LWC, OmniScript, pagine di record e siti Experience Cloud.
Flussi schermata, OmniScript e LWC possono essere tutti creati per essere riutilizzati e incorporati in una varietà di posizioni, inclusi siti esterni e applicazioni Lightning Out. Quando si progettano le soluzioni in modo che siano [componibili](/docs/architect/it-it/well-architected/guide/composable) si ottengono ulteriori vantaggi come l'adattabilità e la stabilità.
### Convalida
Tutte le tecnologie utilizzate per creare o aggiornare un record sono conformi alla convalida a livello di sistema, sia che si tratti di regole di convalida classiche o di convalida personalizzate incorporate in un trigger Apex. Indipendentemente dalla tecnologia utilizzata per eseguire una modifica del record, ogni modifica passa attraverso l'ordine di salvataggio. Ciò significa che, oltre alle regole di convalida, la modifica del record viene elaborata da un numero qualsiasi di flussi prima o dopo il salvataggio, prima o dopo trigger, regole di inoltro al livello superiore, regole di assegnazione e altro ancora. Se non l'avete già fatto, assicuratevi di inserire nei preferiti e di acquisire familiarità con l'[ordine di esecuzione](https://developer.salesforce.com/docs/atlas.en-us.apexcode.meta/apexcode/apex_triggers_order_of_execution.htm) Apex.
#### Domande da porre:
- Il modulo ha ulteriori requisiti oltre alla convalida a livello di sistema?
- Sarà necessario impostare i campi in modo che siano obbligatori o di sola lettura in modo dinamico all'interno del modulo?
| Rispettare la convalida a livello di sistema | Convalida a livello di campo personalizzata specifica di questo modulo | Convalida a livello di campo personalizzata | |
|---|---|---|---|
| Moduli dinamici | Disponibile | Non disponibile | Non disponibile |
| Flusso schermata | Disponibile | Non disponibile | Roadmap |
| OmniStudio | Disponibile | Disponibile | Disponibile |
| Flusso schermata + LWC | Disponibile | Disponibile | Disponibile |
| LWC | Disponibile | Disponibile | Disponibile |
| Elevazione delle autorizzazioni utente | Controllo degli utenti autorizzati | Limitazione delle posizioni consentite | |
|---|---|---|---|
| Moduli dinamici | Non disponibile | Disponibile | Non disponibile |
| Flusso schermata | Disponibile | Disponibile | Non disponibile |
| OmniStudio | Non disponibile | Disponibile | Non disponibile** |
| Flusso schermata + LWC | Disponibile | Disponibile | Non disponibile |
| LWC | Disponibile* | Disponibile | Disponibile |
| * Richiede Apex **Anche se gli OmniScript non possono avere un insieme specificato di posizioni di destinazione, le FlexCard possono averlo. |
|||
| Esecuzione di operazioni sui dati fuori schermo | Valori condizionali e calcoli | Visibilità condizionale | Requisito condizionale | Formattazione condizionale | Stato di sola lettura condizionale | Stato disabilitato condizionale | |
|---|---|---|---|---|---|---|---|
| Moduli dinamici | Non disponibile | Non disponibile | Disponibile | Non disponibile | Roadmap | Non disponibile | Non disponibile |
| Flusso schermata | Disponibile | Disponibile** | Disponibile | Disponibile* | Non disponibile | Disponibile** | Disponibile** |
| OmniStudio | Disponibile | Disponibile | Disponibile | Disponibile | Disponibile | Disponibile | Disponibile |
| Flusso schermata + LWC | Disponibile | Disponibile | Disponibile | Disponibile | Disponibile | Disponibile | Disponibile |
| LWC | Disponibile | Disponibile | Disponibile | Disponibile | Disponibile | Disponibile | Disponibile |
| *Limitato ai componenti che utilizzano un selettore di risorse e non una casella di controllo statica ** Beta limitata |
|||||||
\_\_](/docs/architect/it-it/reference-diagrams/guide/lightning-web-components-off-screen-data-operations)
**Visibilità:** La visibilità può essere controllata dinamicamente in tutti gli strumenti di creazione dei moduli. I moduli dinamici, Flow Builder e OmniStudio risolvono questo problema con le funzioni di visibilità dei componenti. In questo modo è possibile visualizzare o nascondere i campi in modo dichiarativo in base ad altri valori del modulo o indipendentemente dal fatto che l'utente si trovi su un dispositivo mobile.
- Con i moduli dinamici, la visibilità può essere controllata in base ai valori dei campi dei record, ai record correlati tramite campi di ricerca e al fattore di forma.
- Con Flusso, è possibile basare una regola di visibilità su altri input nella schermata, nonché su altre risorse compilate in precedenza nel flusso come formule o valori di altri record.
- **Regole basate sul dispositivo:** Non è ovvio fin dall'inizio, ma è possibile utilizzare una formula per visualizzare o nascondere un particolare campo quando l'utente è su un dispositivo mobile. Scrivere una formula del flusso che controlli il valore della variabile globale \$User.UIThemeDisplayed. Se il valore è Theme4t, l'utente si trova nell'app mobile Salesforce.
- **Valutazione di altre risorse:** I riferimenti manuali alle variabili e alle formule vengono valutati solo sul server. Quindi, qualsiasi valore abbia quella risorsa quando la schermata viene visualizzata per la prima volta è il valore che avrà finché non si passa a un'altra schermata. Durante la navigazione, il runtime del flusso invia una richiesta al motore di flusso (il server) e recupera i valori più recenti delle variabili e delle formule manuali. Se si prevede che la regola di visibilità si aggiorni quando l'utente passa attraverso una singola schermata (ad esempio, onblur), assicurarsi di fare riferimento solo ai valori degli altri componenti della schermata.
- Con OmniStudio, è possibile visualizzare o nascondere i componenti in modo condizionale impostando una proprietà di visualizzazione condizionale. Tuttavia, non è possibile aggiungere più di una proprietà di visualizzazione condizionale per un input.
**Stati di input condizionali:** Se è necessario controllare dinamicamente altre proprietà, ad esempio se un campo è obbligatorio, disabilitato o di sola lettura, sono disponibili alcune opzioni. Come previsto, LWC offre un controllo completo e reattivo sullo stato di input. Con i componenti Flusso schermata reattivi, è possibile controllare dinamicamente attributi di componenti come Sola lettura, Disabilitato e Obbligatorio per i componenti standard che lo supportano, mentre OmniStudio supporta l'intera gamma di attributi specifici dei componenti. Se le proprie esigenze richiedono Flusso e il componente non supporta uno stato attributo specifico, è possibile creare un componente LWC incorporabile per ottenere uno stato di input dinamico.
Se è necessario controllare dinamicamente qualsiasi altra proprietà, ad esempio se un campo è obbligatorio o di sola lettura, la soluzione migliore a breve termine è LWC, in cui si ha il controllo completo. Ciò è particolarmente vero se sono presenti requisiti personalizzati per la gestione di onblur o onclick.
LWC reattivi nei flussi schermata: Quando si creano componenti LWC che possono sia reagire che modificare altri componenti in un flusso schermata, consultare questa guida alle [procedure consigliate per](https://developer.salesforce.com/blogs/2023/02/lwc-best-practices-for-screen-flows) i flussi schermata per assicurarsi che i componenti si integrino bene nel motore di runtime del flusso e funzionino come previsto in futuro.
| Gestione eventi standard (onblur, onfocus) | Gestione evento personalizzata | |
|---|---|---|
| Moduli dinamici | Non disponibile | Non disponibile |
| Flusso schermata | Non disponibile | Non disponibile |
| OmniStudio | Non disponibile | Disponibile* |
| Flusso schermata + LWC | Disponibile | Disponibile |
| LWC | Disponibile | Disponibile |
| * Runtime standard OmniStudio non supporta Pub/Sub, ma supporta Windows postMessage | ||
| Stile diretto | Temi di organizzazioni e Generatore di esperienze | Stile pixel perfetto | |
|---|---|---|---|
| Moduli dinamici | Non disponibile | Disponibile | Non disponibile |
| Flusso schermata | Non disponibile | Disponibile | Roadmap |
| OmniStudio | Disponibile* | Non disponibile | Disponibile |
| Flusso schermata + LWC | Non disponibile | Disponibile | Disponibile |
| LWC | Non disponibile | Disponibile | Disponibile |
| * Solo schede Flex | |||
| 2 colonne | 4 colonne | Oltre 4 colonne | Blocchi ripetuti di dati | Contenitori scheda | Contenitori per fisarmonica | |
|---|---|---|---|---|---|---|
| Moduli dinamici | Disponibile | Non disponibile | Non disponibile | Non disponibile | Disponibile | Disponibile |
| Flusso schermata | Disponibile | Disponibile | Non disponibile | Disponibile | Non disponibile | Disponibile |
| OmniStudio | Disponibile | Disponibile | Disponibile | Disponibile | Disponibile* | Disponibile |
| Flusso schermata + LWC | Disponibile | Disponibile | Disponibile | Disponibile | Disponibile | Disponibile |
| LWC | Disponibile | Disponibile | Disponibile | Disponibile | Disponibile | Disponibile |
| *Le schede possono essere utilizzate se si incorporano dati in una FlexCard in un OmniScript | ||||||
| Etichette immesse nel Generatore | Etichette nel codice | |
|---|---|---|
| Moduli dinamici | Disponibile* | Non disponibile |
| Flusso schermata | Disponibile | Disponibile |
| OmniStudio | Disponibile | Disponibile |
| Flusso schermata + LWC | Disponibile | Disponibile |
| LWC | Non disponibile | Disponibile |
| *Solo intestazioni sezione campo | ||
| Test di unità | Automazione end-to-end | |
|---|---|---|
| Moduli dinamici | Non disponibile | Disponibile* |
| Flusso schermata | Non disponibile | Disponibile* |
| OmniStudio | Disponibile* | Disponibile* |
| Flusso schermata + LWC | Disponibile* | Disponibile* |
| LWC | Disponibile | Disponibile |
| * Richiede codice | ||
| Visualizzazioni pagina | Tempo trascorso sul modulo | Tracciamento del completamento del modulo | Monitoraggio della percentuale di successo | |
|---|---|---|---|---|
| Moduli dinamici | Disponibile** | Non disponibile | Non disponibile | Non disponibile |
| Flusso schermata | Disponibile | Disponibile* | Disponibile | Disponibile |
| OmniStudio | Disponibile | Disponibile* | Disponibile | Disponibile |
| Flusso schermata + LWC | Disponibile | Disponibile* | Disponibile | Disponibile |
| LWC | Disponibile** | Disponibile* | Disponibile | Disponibile |
| *Disponibile quando è abilitato Runtime OmniStudio basato su pacchetto ** Disponibile monitorando l'utilizzo delle pagine Lightning controllanti |
||||
| Pacchetti gestiti di prima generazione (1GP) | Pacchetti gestiti di seconda generazione (2GP) | Pacchetti sbloccati | Serie di modifiche | DevOps Center | |
|---|---|---|---|---|---|
| Moduli dinamici | Disponibile | Disponibile | Disponibile | Disponibile | Disponibile |
| Flusso schermata | Disponibile | Disponibile | Disponibile | Disponibile | Disponibile |
| OmniStudio | Non disponibile | Non disponibile | Non disponibile | Non disponibile* | Non disponibile* |
| Flusso schermata + LWC | Disponibile | Disponibile | Disponibile | Disponibile | Disponibile |
| LWC | Disponibile | Disponibile | Disponibile | Disponibile | Disponibile |
| *Utilizzare Area di lavoro IDX per distribuire le soluzioni OmniStudio ad altre organizzazioni. | |||||
| Salesforce Lightning Platform è una piattaforma completa basata sull'intelligenza artificiale che unifica dipendenti, agenti autonomi dell'intelligenza artificiale, dati aziendali e applicazioni in un unico sistema affidabile per migliorare la produttività e l'esperienza dei clienti. Consente la creazione di un'"azienda autentica" collegando le app Customer 360, Data Cloud e Slack per l'automazione end-to-end. |
| Approccio | Descrizione | Competenze richieste | Licenze e limiti |
|---|---|---|---|
| Apex in area di attesa | Utilizzare per processi che comportano operazioni di database di lunga durata o chiamate a servizi Web esterni. Queueable Apex offre funzioni come ID processo, supporto per tipi non primitivi e concatenamento dei processi. | Pro-code | Il numero di licenze può aumentare i limiti. |
| Batch Apex | Creare processi complessi e di lunga durata che coinvolgono milioni di record suddividendo l'insieme di record ed elaborandolo in blocchi gestibili. | Pro-code | Il numero di licenze può aumentare i limiti. |
| Apex pianificato | Eseguire Apex a un'ora pianificata definita da un'espressione cron. Sebbene l'atto di pianificare Apex tramite l'espressione cron sia un processo asincrono, il codice sottostante viene eseguito in modo sincrono all'avvio del processo. | Pro-code | Il numero di licenze può aumentare i limiti. |
| Chiamate continuazione Apex | Eseguire chiamate dai metodi Apex in esecuzione in un contesto di transazione sincrona. | Pro-code | No |
| Percorso asincrono (flussi attivati da record) | Eseguire un'operazione che si desidera eseguire nel proprio tempo. Evitare errori DML misti che si verificano quando si aggiorna un valore di un record correlato che non fa parte del record che ha attivato un flusso. | Basso codice | Il numero e il tipo di licenze possono aumentare i limiti. |
| Percorso pianificato (dopo l'impegno dei flussi) | Eseguire l'esecuzione in un momento pianificato dinamicamente dopo un evento di attivazione, ad esempio quando viene creato, aggiornato o eliminato un record. | Basso codice | Il numero e il tipo di licenze possono aumentare i limiti. |
| Flussi pianificati | Eseguire un flusso in background a un'ora specificata e con una frequenza ripetuta (giornaliera, settimanale o una volta) per eseguire azioni su un batch di record. | Basso codice | Il numero e il tipo di licenze possono aumentare i limiti. |
| Trigger evento piattaforma | Associare liberamente Salesforce a sistemi esterni e comunicare tra componenti asincroni all'interno di Salesforce Platform. | Low-code + Pro-code | Per i casi d'uso di eventi piattaforma a volume elevato è necessaria una licenza aggiuntiva |
| Modifica acquisizione dati | Acquisire ed elaborare gli eventi di modifica in modo asincrono dopo la conferma della transazione del database. | Pro-code | Per scalare al di sopra dell'allocazione di base è necessaria una licenza aggiuntiva. |
| Bulk API | Inserire, aggiornare, inserire con aggiornamento, eseguire query o eliminare molti record in modo asincrono ed elaborare i risultati in un secondo momento. | Pro-code | Ci sono dei limiti. |
| Azioni Lightning | Consente alle pagine Lightning di interagire con il server senza costringere gli utenti ad aggiornare completamente la pagina. | Basso codice | No |
| Competenze richieste | Alcuni degli strumenti descritti in questa guida richiedono codice, mentre altri possono essere configurati in modo dichiarativo. Quando si valutano le opzioni disponibili, pensare alle competenze dei membri del team. Tenere presente che anche se gli sviluppatori sono disponibili per l'implementazione iniziale (ad esempio tramite un partner di implementazione), potrebbe essere necessario modificare le soluzioni in futuro. Se il team di manutenzione non dispone di sviluppatori, un'opzione low-code può essere più adatta. |
| Tipo di limiti della piattaforma applicati | Determinare il tipo di limiti che si applicano all'esecuzione. Durante la progettazione delle soluzioni, riflettere attentamente su come il volume e la frequenza delle transazioni verranno conteggiati ogni giorno nei limiti stabiliti dal governor per l'approccio scelto. Calcolare il numero di esecuzioni che si verificheranno ogni giorno. Assicurarsi che i valori calcolati rientrino nei limiti associati agli strumenti selezionati. |
| Latenza | Determinare la velocità con cui i risultati dell'elaborazione saranno disponibili nella piattaforma. Per alcuni approcci, i cambiamenti saranno quasi immediati, mentre per altri possono essere minuti o ore. |
| Caso d'uso | Descrizione | Approccio di prima scelta | Motivo |
|---|---|---|---|
| Elaborazione batch ad alte prestazioni | Qualsiasi automazione che deve elaborare migliaia o milioni di record in modo efficiente | Batch Apex | Batch Apex fornisce API complete per l'interfacciamento con la piattaforma e per la velocità di stampa. |
| Processo di pulitura dati | Un processo eseguito regolarmente o su richiesta che pulisce i dati. Gli esempi includono l'annullamento della duplicazione, la verifica dell'indirizzo o il consolidamento dei dati. | Batch Apex | Batch Apex fornisce API complete per l'interfacciamento con la piattaforma e per la velocità di stampa. |
| Nightly Roll-up Job (Lavoro di roll-up notturno) | Processo che calcola i dati di roll-up al termine di una giornata lavorativa. | Batch Apex | Batch Apex fornisce API complete per l'interfacciamento con la piattaforma e per la velocità di stampa. |
| Logica attivata da record | Eseguire la logica in risposta a un aggiornamento di record. | Varia | Vedere la guida alle decisioni associata, Automazione eventi attivati da record. Include un albero decisionale per i casi d'uso asincroni, tra cui Apex inseribile in area di attesa, Apex batch, Apex pianificato, Flusso pianificato, Flussi percorso asincrono e Acquisizione dati di modifica. |
| Aggiornamenti a catena tramite un grafico a oggetti | Consente di completare rapidamente l'azione di salvataggio di un utente, rinviando l'esecuzione asincrona degli aggiornamenti a catena ad altri oggetti. | Apex in area di attesa | Queueable Apex dispone di potenti funzioni di concatenazione che consentono alla logica di suddividere una catena di aggiornamenti in una serie di transazioni asincrone. |
| Elaborazione pianificata specifica del record | Automazione in una data futura e dinamica specifica del record (ad esempio, 3 giorni prima di una data di chiusura). | Flusso con un percorso pianificato | I percorsi pianificati rappresentano un punto di forza unico per il flusso, poiché la piattaforma gestisce automaticamente la pianificazione, l'annullamento e la riprogrammazione di questi percorsi se i dati del record cambiano. |
| Invocazione di più servizi esterni lenti in parallelo | Durante un'esecuzione sincrona, più servizi esterni vengono richiamati in parallelo per ottimizzare il tempo di esecuzione complessivo. | Chiamate continuazione Apex | Consentendo l'esecuzione parallela di più callout a esecuzione lenta si riduce al minimo il tempo complessivo per completare il lavoro. |
| Migrazione dei dati dei record da un sistema esterno | Spostare grandi quantità di record in Salesforce Platform da un sistema esterno. Un processo singolo o pianificato regolarmente. | API in bulco | Questo è l'approccio più efficiente e rispettoso dei limiti per la migrazione dei dati. |
| Esecuzione di logica aggiuntiva in un sistema esterno | Schema Fire-and-forget che prevede la notifica di un evento sulla piattaforma a un sistema esterno e quindi l'elaborazione asincrona dell'evento. | Eventi piattaforma o acquisizione dati modifica | Un modello pub-sub funziona meglio qui e consente al sistema esterno di elaborare l'evento quando è pronto. Per ulteriori dettagli su questo schema, vedere Architettura basata sugli eventi. |
Ora, scomponi il diagramma e inizia a costruire i pezzi.
## Pianificazione con flusso pianificato
Flusso pianificato offre diversi vantaggi come meccanismo di pianificazione:
- I flussi pianificati possono essere inseriti in pacchetti e distribuiti come metadati. Questo non è vero per i processi pianificati tramite Apex (o tramite la pagina Processi pianificati).
- L'elemento Attesa è fondamentale per i framework che richiedono chiamate. Utilizzandola nel flusso, le chiamate non sono necessarie nella parte Invocabile del framework.
- La granularità della pianificazione soddisfa i requisiti: l'intervallo minimo per i flussi pianificati è giornaliero. Se è necessaria una frequenza più alta (ad esempio, oraria), riconsiderare Flusso pianificato per questo requisito.
Un'altra considerazione quando si configura il flusso pianificato è il gating dell'ambiente. Prima di invocare l'azione Apex, aggiungere un elemento Decisione che valuta la variabile `{!$Api.Enterprise_Server_URL_100}`. Ciò garantisce che il processo venga eseguito solo negli ambienti previsti, ad esempio UAT e Produzione. Questo schema è importante perché i Sandbox vengono aggiornati di frequente o creati di recente durante l'SDLC e, senza un controllo esplicito dell'ambiente, un flusso pianificato potrebbe essere eseguito involontariamente in ambienti in cui il framework non è progettato per l'esecuzione. L'uso dell'operatore `contains` nell'elemento Decisione rende l'impostazione resiliente alle future creazioni Sandbox o modifiche degli URL.
Infine, considerare in che modo il framework dovrebbe acquisire gli errori. Aggiungere sempre un percorso di errore quando il flusso chiama un'azione; ad esempio, è possibile collegare i guasti all'azione "Aggiungi voce registro" [di Nebula Logger](https://www.nebulalogger.com/). Nebula Logger scrive i registri negli oggetti personalizzati, quindi i clienti devono sapere che i dati dei registri consumano memoria dell'organizzazione: per impostazione predefinita, i registri vengono memorizzati per 14 giorni all'interno di un'organizzazione e quindi puliti; questo periodo di conservazione è configurabile. Nebula Logger utilizza anche Eventi piattaforma per pubblicare i registri, quindi le voci di registro vengono salvate indipendentemente dalla transazione di elaborazione dati principale, in modo da garantire l'acquisizione degli errori anche se l'azione Flusso principale o Apex viene ritirata. I clienti devono valutare il volume dei registri previsto e i requisiti di conservazione quando valutano l'aggiunta di un framework di registrazione.
Ecco come si presenta il flusso:
Passiamo alle prime parti di Apex Code con il requisito di pianificazione ora soddisfatto.
## Creazione di un'interfaccia fase
Definire un'interfaccia `Step`:
```java
public interface Step {
void execute();
void finalize();
String getName();
Boolean shouldRestart();
}
```
Per questo articolo, l'interfaccia `step` viene visualizzata come classe esterna per chiarezza. Il framework è flessibile: i team possono organizzare l'interfaccia e le relative implementazioni utilizzando qualsiasi schema di creazione pacchetti Apex preferito, a condizione che tutte le classi Fase facciano riferimento alla stessa interfaccia.
Ci sono alcune cose da notare sui metodi definiti nella nostra interfaccia:
- La `execute`, anche se al momento non richiede argomenti, migliora quando si passa una classe di `State` (o interfaccia) per orchestrare i dati tra le fasi quando l'ordine è importante.
- `getName` potrebbe restituire un valore `System.Type` anziché un `String`. L'obiettivo è fornire al livello di orchestrazione un modo per registrare i nomi delle fasi senza esporre altre proprietà.
Ecco la prima implementazione concreta che mostra come questi pezzi si adattano. Con un'eccezione in seguito, si consiglia di utilizzare Queueable Apex per implementare l'elaborazione asincrona in Apex; Batch Apex è in genere inutile (e i metodi di `@future` sono scoraggiati). Queueable Apex si avvia rapidamente e, con i cursori Apex, presenta molti vantaggi rispetto a Batch Apex.
### Un'implementazione Apex Cursor-Like
I [cursori Apex](https://developer.salesforce.com/docs/atlas.en-us.apexcode.meta/apexcode/apex_cursors.htm) offrono un'alternativa moderna al modello Apex batch tradizionale. Analogamente all'elaborazione batch, un'implementazione Cursore può recuperare i record in blocchi (fino a 2.000 per batch). Tuttavia, i Cursori consentono più recuperi all'interno di una singola transazione, consentendo una produttività significativamente superiore per le operazioni a volume elevato.
Quando si adottano i Cursori come parte di questo framework, i team devono essere consapevoli delle limitazioni attuali dei test e della possibilità di falsificazione. Il comportamento del cursore nei test può essere diverso dal comportamento di produzione, quindi è importante progettare strategie di test che evitino di affidarsi ai componenti interni del cursore e convalidino invece la logica di orchestrazione ai confini. Man mano che la piattaforma si evolve, queste aree continueranno a migliorare, ma le linee guida principali rimangono: I cursori offrono prestazioni superiori e un sovraccarico di orchestrazione ridotto rispetto ad Apex batch per molti casi d'uso.
Per definire un confine chiaro tra il Cursore fornito dal sistema e il proprio codice, si consiglia di creare una rappresentazione simile al Cursore quando si implementa l'interfaccia `Step`. Considerare questo codice:
```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