{"id":33042,"date":"2025-05-22T11:16:38","date_gmt":"2025-05-22T09:16:38","guid":{"rendered":"https:\/\/www.codemotion.com\/magazine\/?p=33042"},"modified":"2025-05-26T12:55:29","modified_gmt":"2025-05-26T10:55:29","slug":"come-risolvere-il-dual-write-problem-nei-sistemi-distribuiti","status":"publish","type":"post","link":"https:\/\/www.codemotion.com\/magazine\/it\/backend-it\/come-risolvere-il-dual-write-problem-nei-sistemi-distribuiti\/","title":{"rendered":"Come risolvere il dual write problem nei sistemi distribuiti"},"content":{"rendered":"\n<p>In questo articolo, scoprirete come <a href=\"https:\/\/www.unipol.it\/homepage\">Unipol <\/a>ha affrontato l\u2019annoso tema del <strong>dual write problem<\/strong> nel contesto delle Architetture distribuite. Vengono presentate implementazioni di pattern come <strong>l&#8217;Outbox Table<\/strong>, il <strong>Saga<\/strong> e <strong>l&#8217;Idempotent Consumer,<\/strong>&nbsp; gi\u00e0 rilasciate in produzione e che, gi\u00e0 da diversi mesi, garantiscono la protezione da messaggi e dati duplicati.<\/p>\n\n\n\n<p>Vedrete, infine, come l\u2019implementazione dell\u2019sdk del tool open source <strong>OpenTelemetry <\/strong>permetta di rendere osservabili integrazioni tra sistemi che non lo sono &#8220;out of the box\u201d, in particolare rendendo continuit\u00e0 la rilevazione delle tracce.<\/p>\n\n\n\n<h2 class=\"wp-block-heading\" id=\"h-introduzione-all-architettura-ad-eventi-e-alle-integrazioni-asincrone\">Introduzione all\u2019architettura ad eventi e alle integrazioni asincrone<\/h2>\n\n\n\n<p>Nel contesto dei moderni sistemi informativi, l\u2019adozione di un\u2019architettura ad eventi rappresenta un passaggio cruciale per abilitare l\u2019evoluzione verso ecosistemi distribuiti, scalabili e reattivi. Le architetture monolitiche e sincrone, tipiche di molti sistemi legacy, presentano forti limitazioni in termini di scalabilit\u00e0, isolamento dei domini e resilienza agli errori. L\u2019approccio event-driven, al contrario, propone un modello di comunicazione decentrato, basato sull\u2019emissione e l\u2019ascolto di eventi tra servizi autonomi.<\/p>\n\n\n\n<p>In questo paradigma, i <strong>servizi producono eventi<\/strong> in risposta a cambiamenti di stato interni (ad esempio, la conferma di un ordine o la creazione di una nuova anagrafica) e <strong>altri servizi<\/strong> possono sottoscrivere questi eventi per reagire in modo asincrono.Questo consente di disaccoppiare i componenti, migliorando la manutenzione, la scalabilit\u00e0, la tolleranza ai guasti e l&#8217;evoluzione del sistema, permettendo di aggiungere nuovi consumer senza impatti sui componenti esistenti. Inoltre, gli eventi non devono necessariamente essere processati nell\u2019immediato: vengono accodati in broker (come Kafka, RabbitMQ, Azure Service Bus), il che consente retry e buffering naturali in caso di malfunzionamenti temporanei.<\/p>\n\n\n\n<p>L\u2019esperienza di Unipol mostra chiaramente come l\u2019introduzione di pattern evoluti come <strong>Outbox Table<\/strong>, <strong>Saga Coreografata<\/strong> e <strong>Idempotent Consumer&nbsp; <\/strong>abbia abilitato il passaggio a un\u2019architettura asincrona , superando i limiti di quelle sincrone, in particolare nel contesto di <strong>eventuali fallimenti parziali<\/strong>.<\/p>\n\n\n\n<figure class=\"wp-block-image\"><img decoding=\"async\" src=\"https:\/\/lh7-qw.googleusercontent.com\/docsz\/AD_4nXeiAII-g1wb2FJbC74mhGm-N8crGaOzN6OHZOHpLDd_M1TqCH7XbqOd1RmPJ2xel_vdkw1NFJNAe0dmkpmc6-LZcqN57Tyd1PcCwA3p7iRUG0G1h7TR18HKKGtGVHUn16SZLoyB?key=xb98CHRLVS7dU3HGaYKy6mXj\" alt=\"\"\/><\/figure>\n\n\n\n<h2 class=\"wp-block-heading\" id=\"h-cos-e-il-dual-write-problem\">Cos\u2019\u00e8 il Dual Write Problem<\/h2>\n\n\n\n<p>Il \u201cdual write problem\u201d \u00e8 un difetto strutturale che emerge quando due operazioni <strong>non sono eseguite all\u2019interno di un\u2019unica transazione atomica<\/strong>. Questo significa che esiste la concreta possibilit\u00e0 che <strong>una delle due riesca<\/strong> mentre <strong>l\u2019altra fallisca<\/strong>, generando <strong>incoerenze<\/strong> tra lo stato dell\u2019applicazione e le informazioni condivise con altri sistemi.<\/p>\n\n\n\n<p>Un esempio classico \u00e8 il seguente: un sistema salva su database una nuova polizza cliente e successivamente pubblica un evento OrderCreated. Se per qualche ragione (timeout, crash, errore del broker) l\u2019evento non viene pubblicato, <strong>i sistemi a valle non riceveranno l\u2019informazione<\/strong>, generando uno stato globale incoerente.&nbsp;<\/p>\n\n\n\n<p>Nel mondo enterprise, dove i sistemi parlano tra loro continuamente \u2013 CRM, contabilit\u00e0, logistica, customer care \u2013 l\u2019affidabilit\u00e0 nella propagazione dei dati \u00e8 fondamentale. Il dual write \u00e8 uno dei principali nemici di questa affidabilit\u00e0. Nella presentazione Unipol, il problema viene affrontato in profondit\u00e0, mostrando come in un sistema distribuito il rischio di duplicati e inconsistenze sia <strong>concreto e spesso sottovalutato<\/strong>.<\/p>\n\n\n\n<p>A rendere tutto pi\u00f9 critico \u00e8 la <strong>difficolt\u00e0 di rilevare questi errori<\/strong>: un\u2019applicazione che non pubblica un evento, o che lo pubblica due volte, non segnala necessariamente un errore immediato, ma crea un debito informativo che pu\u00f2 emergere solo giorni dopo, ad esempio con un cliente che non riceve una notifica o con un ordine elaborato due volte. La coerenza eventuale, tanto celebrata nell\u2019architettura distribuita, deve essere supportata da meccanismi robusti che compensino queste debolezze.<\/p>\n\n\n\n<p>Il dual write problem \u00e8 quindi una <strong>trappola silenziosa<\/strong>, che va gestita con consapevolezza e strumenti appropriati. \u00c8 proprio da qui che nasce l\u2019esigenza dei pattern come <strong>Outbox<\/strong>, <strong>Saga<\/strong> e <strong>Idempotent Consumer<\/strong>, strumenti che vedremo nei prossimi capitoli e che, insieme all\u2019osservabilit\u00e0, rappresentano il cuore della strategia adottata da Unipol per costruire un\u2019infrastruttura veramente resiliente.<\/p>\n\n\n\n<h2 class=\"wp-block-heading\" id=\"h-outbox-table-pattern-garantire-transazioni-atomiche\">Outbox Table Pattern: garantire transazioni atomiche<\/h2>\n\n\n\n<p>Per affrontare concretamente il problema del dual write, uno degli approcci pi\u00f9 efficaci e consolidati \u00e8 quello dell\u2019<strong>Outbox Table Pattern<\/strong>. Questo pattern nasce dall\u2019idea di spostare la responsabilit\u00e0 della comunicazione asincrona all\u2019interno della stessa transazione che coinvolge la scrittura dei dati principali.<\/p>\n\n\n\n<p>Immaginiamo un <a href=\"https:\/\/www.codemotion.com\/magazine\/it\/backend-it\/quarkus-guida-pratica-per-esporre-i-metadati-dei-microservizi\/\">microservizio <\/a>che riceve un ordine e lo salva nel proprio database. Invece di inviare direttamente un evento \u201cordine creato\u201d su Kafka o su un altro message broker, il servizio scrive un messaggio all\u2019interno di una <strong>tabella di outbox<\/strong>, strutturalmente simile a una coda, ma residente nello stesso database. In questo modo, sia l\u2019ordine che l\u2019evento vengono <strong>persistiti all\u2019interno della stessa transazione atomica<\/strong>. Se qualcosa va storto, tutto viene rollbackato: ordine ed evento si annullano a vicenda, garantendo la coerenza.<\/p>\n\n\n\n<p>Un processo separato, detto spesso <strong>message relay o publisher<\/strong>, si occupa di leggere periodicamente la tabella outbox e inviare i messaggi al sistema di messaggistica esterno. Una volta che il messaggio \u00e8 stato correttamente inviato e ricevuto, l\u2019entry nella tabella pu\u00f2 essere marcata come \u201cspedita\u201d o rimossa.&nbsp;<\/p>\n\n\n\n<p>Nel caso di Unipol, questa strategia \u00e8 stata adottata per garantire la consistenza tra il dominio delle polizze e i sistemi esterni di notifica e rendicontazione. I team hanno implementato l\u2019outbox come parte integrante del modello di dominio, sfruttando framework come MyBatis per rendere la scrittura del messaggio un&#8217;operazione quasi trasparente dal punto di vista del codice.<\/p>\n\n\n\n<p>Una delle figure che meglio rappresenta questo pattern \u00e8 una <strong>pipeline di scrittura unica con ramo secondario asincrono<\/strong>, e potremmo suggerire come immagine una <strong>tabella SQL con colonna \u201cpayload\u201d affiancata a uno stream Kafka<\/strong>, collegati da un processore intermedio. Questa visualizzazione aiuta a comprendere che, pur essendo separata la logica di pubblicazione, la persistenza \u00e8 unica e affidabile.<\/p>\n\n\n\n<h2 class=\"wp-block-heading\" id=\"h-outbox-table-pattern-garantire-transazioni-atomiche-0\">Outbox Table Pattern: garantire transazioni atomiche<\/h2>\n\n\n\n<p>In un mondo perfetto, ogni modifica al sistema avverrebbe in modo sincrono e atomico, garantendo che i dati siano sempre coerenti e affidabili. Tuttavia, nei sistemi distribuiti, questa garanzia \u00e8 difficile da mantenere. \u00c8 proprio in questo contesto che nasce l\u2019esigenza dell\u2019<strong>Outbox Table Pattern<\/strong>, una strategia capace di evitare il famigerato \u201cdual write problem\u201d grazie a un approccio semplice ma efficace.<\/p>\n\n\n\n<h3 class=\"wp-block-heading\" id=\"h-la-logica-dietro-l-outbox\">La logica dietro l\u2019Outbox<\/h3>\n\n\n\n<p>Il cuore del pattern consiste nel separare i dati da scrivere nei sistemi esterni (come un broker di messaggi) all\u2019interno di una tabella speciale chiamata <em>outbox<\/em>, che vive nello stesso database transazionale dell\u2019entit\u00e0 da aggiornare. Cos\u00ec facendo, si evita di scrivere direttamente su un sistema esterno (ad esempio Kafka o RabbitMQ) all\u2019interno della stessa transazione del database principale, eliminando alla radice il rischio di inconsistenze dovute a errori parziali.<\/p>\n\n\n\n<p>Durante una transazione, l\u2019applicazione salva sia i dati di business sia il messaggio da inviare all\u2019esterno all\u2019interno della tabella outbox. Solo dopo che la transazione \u00e8 stata confermata, un componente separato \u2013 il <em>message relayer<\/em> \u2013 legge i messaggi dalla tabella e li pubblica nel sistema esterno.<\/p>\n\n\n\n<h3 class=\"wp-block-heading\" id=\"h-un-esempio-concreto-da-unipol\">Un esempio concreto da Unipol<\/h3>\n\n\n\n<p>Nel caso di Unipol, questo pattern \u00e8 stato adottato per sincronizzare eventi tra sistemi eterogenei, riducendo il rischio di eventi fantasma o perdite di messaggi nei processi core, ad esempio durante la generazione di contratti assicurativi o la notifica di eventi verso sistemi documentali. L\u2019approccio ha permesso non solo di migliorare l\u2019affidabilit\u00e0, ma anche di incrementare la visibilit\u00e0 delle operazioni effettuate, sfruttando audit trail e strumenti di osservabilit\u00e0 come Dynatrace.<\/p>\n\n\n\n<figure class=\"wp-block-image\"><img decoding=\"async\" src=\"https:\/\/lh7-qw.googleusercontent.com\/docsz\/AD_4nXcMD6Y3lb0_EqPrq-HXXL3Q0gax_u9MF3HXXBEVBv6GGEfCy4Iv7Moata0Mmd0FXIwOdaZYi1XWQFa_Qfe_9k1ORIkrGhKMvzCHr7htiEc8U3_xWBKUkQF33t2VVjKz0x_1KV-_Aw?key=xb98CHRLVS7dU3HGaYKy6mXj\" alt=\"\"\/><figcaption class=\"wp-element-caption\">Database per service<\/figcaption><\/figure>\n\n\n\n<h2 class=\"wp-block-heading\" id=\"h-saga-pattern-l-esecuzione-ordinata-di-operazioni-distribuite\">Saga Pattern: l\u2019esecuzione ordinata di operazioni distribuite<\/h2>\n\n\n\n<p>Un altro tassello fondamentale nella gestione affidabile dei processi distribuiti \u00e8 il <strong>Saga Pattern<\/strong>, utilizzato per coordinare transazioni distribuite in assenza di un vero e proprio <em>two-phase commit<\/em>. Quando un flusso di business si estende su pi\u00f9 microservizi, \u00e8 necessario garantire che ogni step venga eseguito nel giusto ordine, gestendo anche gli eventuali fallimenti intermedi.<\/p>\n\n\n\n<h3 class=\"wp-block-heading\" id=\"h-cos-e-una-saga\">Cos\u2019\u00e8 una &#8216;saga&#8217;?<\/h3>\n\n\n\n<p>Una saga \u00e8 composta da una sequenza di operazioni locali, ciascuna delle quali pu\u00f2 essere compensata da un\u2019operazione inversa. In caso di errore, si avvia un processo di rollback parziale attraverso <em>compensating transactions<\/em> che annullano le modifiche gi\u00e0 eseguite.<\/p>\n\n\n\n<p>Le saga possono essere <strong>coreografate<\/strong>, dove i partecipanti si coordinano tramite eventi, oppure <strong>orchestrate<\/strong>, dove un servizio centrale controlla l\u2019intero flusso. In contesti di alta resilienza, la coreografia \u00e8 spesso preferita per evitare colli di bottiglia e single point of failure.<\/p>\n\n\n\n<h3 class=\"wp-block-heading\"><strong>L\u2019esperienza di Unipol<\/strong><\/h3>\n\n\n\n<p>In scenari come la gestione di polizze multicanale o la notifica di cambiamento stato, Unipol ha adottato saghe coreografate per mantenere consistenza e tracciabilit\u00e0, soprattutto in flussi critici dove l\u2019ordine delle operazioni \u00e8 fondamentale ma deve essere mantenuto in ambienti eterogenei.<\/p>\n\n\n\n<p>Questa architettura ha dimostrato di essere particolarmente robusta in condizioni di carico elevato o in presenza di integrazioni asincrone con terze parti, dove le latenze possono variare significativamente.<\/p>\n\n\n\n<h2 class=\"wp-block-heading\" id=\"h-idempotent-consumer-pattern-protezione-contro-i-messaggi-duplicati\">Idempotent Consumer Pattern: protezione contro i messaggi duplicati<\/h2>\n\n\n\n<p>Anche con l\u2019adozione di buone pratiche, il rischio di ricevere pi\u00f9 volte lo stesso messaggio \u00e8 sempre presente. \u00c8 qui che entra in gioco il <strong>Idempotent Consumer Pattern<\/strong>, una strategia che permette a un sistema di elaborare lo stesso messaggio pi\u00f9 volte senza effetti collaterali.<\/p>\n\n\n\n<h3 class=\"wp-block-heading\">Perch\u00e9 l\u2019idempotenza \u00e8 fondamentale<\/h3>\n\n\n\n<p>In un sistema distribuito, la duplicazione dei messaggi pu\u00f2 avvenire per molteplici motivi: retry automatici, errori di rete, o crash temporanei del consumer. Se non gestiti correttamente, questi duplicati possono portare a errori logici come la duplicazione di ordini, la sovrascrittura di dati o l\u2019attivazione ripetuta di operazioni.<\/p>\n\n\n\n<p>Per rendere un consumer idempotente, \u00e8 comune salvare un identificatore univoco per ogni messaggio elaborato e controllare la presenza dello stesso prima di applicare qualsiasi cambiamento. In alternativa, alcune architetture optano per operazioni \u201csafe by design\u201d, che non hanno effetti collaterali anche se ripetute.<\/p>\n\n\n\n<h3 class=\"wp-block-heading\">L\u2019approccio di Unipol<\/h3>\n\n\n\n<p>Unipol ha adottato un sistema di deduplica per gli eventi pi\u00f9 critici, salvando il <em>message ID<\/em> in tabelle di log e ignorando messaggi gi\u00e0 elaborati. Questa tecnica si \u00e8 dimostrata fondamentale per garantire l\u2019integrit\u00e0 nei flussi di notifica e nella propagazione di eventi interni tra sistemi legacy e moderni.<\/p>\n\n\n\n<figure class=\"wp-block-image\"><img decoding=\"async\" src=\"https:\/\/lh7-qw.googleusercontent.com\/docsz\/AD_4nXckDARJ3dOk3MAlKgUrE5BpxKhvGS5oKSQ8JcQ8AWAP8XtuXpXxV4vnQDuQQdeCzXVlflHmw-Lp7ryEHMWm3nzFWIVnHZdvpc6HirSnQQEWpVkE1QfmJJpo_kLkZmLC5qCd6znraA?key=xb98CHRLVS7dU3HGaYKy6mXj\" alt=\"\"\/><figcaption class=\"wp-element-caption\">Patterns in action (SAGA + Transactional Outbox + Idempotent Consumer)<\/figcaption><\/figure>\n\n\n\n<h2 class=\"wp-block-heading\">Osservabilit\u00e0 con OpenTelemetry e Dynatrace<\/h2>\n\n\n\n<p>Quando si progettano architetture distribuite complesse, implementare i pattern corretti non basta. Per garantire affidabilit\u00e0, bisogna <em>vedere<\/em> cosa succede nel sistema, anticipare i problemi, identificare colli di bottiglia e analizzare i flussi in modo trasparente. \u00c8 qui che l\u2019<strong>osservabilit\u00e0<\/strong> gioca un ruolo chiave, permettendo di correlare eventi, transazioni e performance attraverso l\u2019intera infrastruttura.<\/p>\n\n\n\n<h3 class=\"wp-block-heading\">L\u2019osservabilit\u00e0 come componente architetturale<\/h3>\n\n\n\n<p>In sistemi che adottano pattern come Outbox o Saga, il tracciamento di un singolo evento che attraversa servizi diversi pu\u00f2 diventare complesso. Per questo, Unipol ha integrato strumenti come <strong>OpenTelemetry<\/strong>, un framework open-source per la raccolta di metriche, log e tracce distribuite, e <strong>Dynatrace<\/strong>, una piattaforma di monitoraggio avanzata con funzionalit\u00e0 di AIOps e tracciamento automatico delle dipendenze.<\/p>\n\n\n\n<p>OpenTelemetry permette di standardizzare la raccolta dei dati da applicazioni e servizi, mentre Dynatrace si occupa della visualizzazione, della correlazione automatica e dell\u2019analisi predittiva. Insieme, questi strumenti offrono una visione in tempo reale delle performance del sistema, rilevando anomalie, ritardi nei flussi delle saghe o tentativi ripetuti di elaborare eventi duplicati.<\/p>\n\n\n\n<h3 class=\"wp-block-heading\">L\u2019applicazione in Unipol<\/h3>\n\n\n\n<p>Nei flussi core come quelli di generazione documentale o di notifica eventi verso i partner, Unipol ha utilizzato <strong>tracing distribuito<\/strong> per mappare ogni step dell\u2019elaborazione. Questo ha consentito di isolare rapidamente le cause di latenza, verificare se un outbox non veniva processato o se un servizio compensativo non si attivava correttamente. La sinergia tra metadati semantici raccolti da OpenTelemetry e l\u2019intelligenza artificiale di Dynatrace ha permesso di costruire un sistema non solo osservabile, ma anche capace di autodiagnosi e interventi proattivi.<\/p>\n\n\n\n<figure class=\"wp-block-image\"><img decoding=\"async\" src=\"https:\/\/lh7-qw.googleusercontent.com\/docsz\/AD_4nXe72SQBU9y-O9oUj8-N0wmvD5aykRL51_UpuZu-Q3pIXs3LhoAyjJbIr-zln-AOH-Mn7AJUYP-m6QYttDm3Z5HC3hhH7vfHIhHgeRxJLqhFSmkNHlomkAXYjUihJtqfwr32F0Lc?key=xb98CHRLVS7dU3HGaYKy6mXj\" alt=\"\"\/><figcaption class=\"wp-element-caption\">osservabilit\u00e0 su schema dell&#8217;applicazione<\/figcaption><\/figure>\n\n\n\n<h2 class=\"wp-block-heading\">Conclusioni: lezioni apprese e prospettive future<\/h2>\n\n\n\n<p>L\u2019esperienza di Unipol dimostra che affrontare il <em>dual write problem<\/em> \u00e8 una sfida concreta, ma anche una grande opportunit\u00e0 per migliorare l\u2019affidabilit\u00e0 dei sistemi distribuiti. Attraverso l\u2019adozione di pattern architetturali robusti e strumenti di osservabilit\u00e0, \u00e8 possibile costruire piattaforme resilienti, scalabili e trasparenti.<\/p>\n\n\n\n<p>L\u2019<strong>Outbox Table Pattern<\/strong> ha permesso di isolare la logica transazionale dalla comunicazione asincrona, riducendo il rischio di inconsistenze nei messaggi inviati. Il <strong>Saga Pattern<\/strong>, applicato in versione coreografata, ha favorito la gestione di processi distribuiti con un grado elevato di flessibilit\u00e0 e recuperabilit\u00e0. L\u2019approccio <strong>idempotente<\/strong> ha offerto un\u2019ulteriore barriera contro i problemi derivanti da retry o duplicazioni, rendendo i consumer pi\u00f9 sicuri e prevedibili.<\/p>\n\n\n\n<p>Ma \u00e8 grazie all\u2019introduzione di <strong>OpenTelemetry<\/strong> e <strong>Dynatrace<\/strong> che queste soluzioni hanno potuto esprimere tutto il loro potenziale. Solo con una visibilit\u00e0 profonda e continua dei sistemi \u00e8 possibile garantire un funzionamento fluido e tempestivamente correggere le anomalie.<\/p>\n\n\n\n<hr class=\"wp-block-separator has-alpha-channel-opacity\"\/>\n\n\n\n<div style=\"background-color:#f2f2f2;color:#32373c\" class=\"wp-block-genesis-blocks-gb-profile-box round gb-has-avatar gb-font-size-18 gb-block-profile gb-profile-columns\"><div class=\"gb-profile-column gb-profile-avatar-wrap\"><div class=\"gb-profile-image-wrap\"><figure class=\"gb-profile-image-square\"><img loading=\"lazy\" decoding=\"async\" width=\"800\" height=\"800\" class=\"gb-profile-avatar wp-image-33080\" src=\"https:\/\/www.codemotion.com\/magazine\/wp-content\/uploads\/2025\/05\/image-2.png\" alt=\"\" srcset=\"https:\/\/www.codemotion.com\/magazine\/wp-content\/uploads\/2025\/05\/image-2.png 800w, https:\/\/www.codemotion.com\/magazine\/wp-content\/uploads\/2025\/05\/image-2-300x300.png 300w, https:\/\/www.codemotion.com\/magazine\/wp-content\/uploads\/2025\/05\/image-2-150x150.png 150w, https:\/\/www.codemotion.com\/magazine\/wp-content\/uploads\/2025\/05\/image-2-768x768.png 768w, https:\/\/www.codemotion.com\/magazine\/wp-content\/uploads\/2025\/05\/image-2-100x100.png 100w, https:\/\/www.codemotion.com\/magazine\/wp-content\/uploads\/2025\/05\/image-2-600x600.png 600w\" sizes=\"auto, (max-width: 800px) 100vw, 800px\" \/><\/figure><\/div><\/div><div class=\"gb-profile-column gb-profile-content-wrap\"><h2 class=\"gb-profile-name\" style=\"color:#32373c\"><a href=\"https:\/\/www.linkedin.com\/in\/angelo-manzione-6b091315\/overlay\/about-this-profile\/\" target=\"_blank\" rel=\"noreferrer noopener\">Angelo Manzione<\/a><\/h2><p class=\"gb-profile-title\" style=\"color:#32373c\">Head of Enterprise &amp; Cloud Solution Architecture presso Gruppo Unipol<\/p><div class=\"gb-profile-text\">Angelo is a specialized software engineer, with a solid work experience. His objective way of facing problems and his ability to see innovative solutions from a new point of view are some of his best skills.<\/div><ul class=\"gb-social-links\"><\/ul><\/div><\/div>\n\n\n\n<div style=\"background-color:#f2f2f2;color:#32373c\" class=\"wp-block-genesis-blocks-gb-profile-box round gb-has-avatar gb-font-size-18 gb-block-profile gb-profile-columns\"><div class=\"gb-profile-column gb-profile-avatar-wrap\"><div class=\"gb-profile-image-wrap\"><figure class=\"gb-profile-image-square\"><img loading=\"lazy\" decoding=\"async\" width=\"414\" height=\"414\" class=\"gb-profile-avatar wp-image-33082\" src=\"https:\/\/www.codemotion.com\/magazine\/wp-content\/uploads\/2025\/05\/1563992812102.jpg\" alt=\"\" srcset=\"https:\/\/www.codemotion.com\/magazine\/wp-content\/uploads\/2025\/05\/1563992812102.jpg 414w, https:\/\/www.codemotion.com\/magazine\/wp-content\/uploads\/2025\/05\/1563992812102-300x300.jpg 300w, https:\/\/www.codemotion.com\/magazine\/wp-content\/uploads\/2025\/05\/1563992812102-150x150.jpg 150w, https:\/\/www.codemotion.com\/magazine\/wp-content\/uploads\/2025\/05\/1563992812102-100x100.jpg 100w\" sizes=\"auto, (max-width: 414px) 100vw, 414px\" \/><\/figure><\/div><\/div><div class=\"gb-profile-column gb-profile-content-wrap\"><h2 class=\"gb-profile-name\" style=\"color:#32373c\"><a href=\"https:\/\/www.linkedin.com\/in\/angelo-manzione-6b091315\/overlay\/about-this-profile\/\"><\/a><a href=\"https:\/\/www.linkedin.com\/in\/iacopo-talevi-10087618b\/overlay\/about-this-profile\/\" target=\"_blank\" rel=\"noreferrer noopener\">Iacopo Talevi<\/a><\/h2><p class=\"gb-profile-title\" style=\"color:#32373c\">Integration and Observability Architect presso Unipol Assicurazioni S.p.A.<\/p><div class=\"gb-profile-text\">I am an Integration and Observability Architect with a focus on platforms in the Ark team at Unipol.<br>As Integration Architect, I lead the introduction of an enterprise event streaming platform at Unipol, for which I am the Product Owner and I manage all aspects (vision, roadmap, architectural decision, development, support, etc). In addition, I design and support integration solutions that bridge modern architectures with legacy systems.<\/div><ul class=\"gb-social-links\"><\/ul><\/div><\/div>\n","protected":false},"excerpt":{"rendered":"<p>In questo articolo, scoprirete come Unipol ha affrontato l\u2019annoso tema del dual write problem nel contesto delle Architetture distribuite. Vengono presentate implementazioni di pattern come l&#8217;Outbox Table, il Saga e l&#8217;Idempotent Consumer,&nbsp; gi\u00e0 rilasciate in produzione e che, gi\u00e0 da diversi mesi, garantiscono la protezione da messaggi e dati duplicati. Vedrete, infine, come l\u2019implementazione dell\u2019sdk&#8230; <a class=\"more-link\" href=\"https:\/\/www.codemotion.com\/magazine\/it\/backend-it\/come-risolvere-il-dual-write-problem-nei-sistemi-distribuiti\/\">Read more<\/a><\/p>\n","protected":false},"author":64,"featured_media":33044,"comment_status":"closed","ping_status":"closed","sticky":false,"template":"","format":"standard","meta":{"_editorskit_title_hidden":false,"_editorskit_reading_time":0,"_editorskit_is_block_options_detached":false,"_editorskit_block_options_position":"{}","_uag_custom_page_level_css":"","_genesis_hide_title":false,"_genesis_hide_breadcrumbs":false,"_genesis_hide_singular_image":false,"_genesis_hide_footer_widgets":false,"_genesis_custom_body_class":"","_genesis_custom_post_class":"","_genesis_layout":"","footnotes":""},"categories":[10263],"tags":[10329,10438],"collections":[11549],"class_list":{"0":"post-33042","1":"post","2":"type-post","3":"status-publish","4":"format-standard","5":"has-post-thumbnail","7":"category-backend-it","8":"tag-framework","9":"tag-sviluppo-software-it","10":"collections-il-meglio-della-settimana","11":"entry"},"yoast_head":"<!-- This site is optimized with the Yoast SEO Premium plugin v26.9 (Yoast SEO v26.9) - https:\/\/yoast.com\/product\/yoast-seo-premium-wordpress\/ -->\n<title>Come risolvere il dual write problem nei sistemi distribuiti<\/title>\n<meta name=\"description\" content=\"Scopri come Unipol ha risolto il dual write problem nelle architetture distribuite usando pattern come Outbox Table e Idempotent Consumer.\" \/>\n<meta name=\"robots\" content=\"index, follow, max-snippet:-1, max-image-preview:large, max-video-preview:-1\" \/>\n<link rel=\"canonical\" href=\"https:\/\/www.codemotion.com\/magazine\/it\/backend-it\/come-risolvere-il-dual-write-problem-nei-sistemi-distribuiti\/\" \/>\n<meta property=\"og:locale\" content=\"en_US\" \/>\n<meta property=\"og:type\" content=\"article\" \/>\n<meta property=\"og:title\" content=\"Come risolvere il dual write problem nei sistemi distribuiti\" \/>\n<meta property=\"og:description\" content=\"Scopri come Unipol ha risolto il dual write problem nelle architetture distribuite usando pattern come Outbox Table e Idempotent Consumer.\" \/>\n<meta property=\"og:url\" content=\"https:\/\/www.codemotion.com\/magazine\/it\/backend-it\/come-risolvere-il-dual-write-problem-nei-sistemi-distribuiti\/\" \/>\n<meta property=\"og:site_name\" content=\"Codemotion Magazine\" \/>\n<meta property=\"article:publisher\" content=\"https:\/\/www.facebook.com\/Codemotion.Italy\/\" \/>\n<meta property=\"article:published_time\" content=\"2025-05-22T09:16:38+00:00\" \/>\n<meta property=\"article:modified_time\" content=\"2025-05-26T10:55:29+00:00\" \/>\n<meta property=\"og:image\" content=\"https:\/\/www.codemotion.com\/magazine\/wp-content\/uploads\/2025\/05\/DALL\u00b7E-2025-05-20-10.38.36-A-horizontal-photo-realistic-image-of-a-software-developer-working-intensely-on-complex-problems.-The-developer-is-seated-at-a-modern-desk-with-multip.webp\" \/>\n\t<meta property=\"og:image:width\" content=\"1792\" \/>\n\t<meta property=\"og:image:height\" content=\"1024\" \/>\n\t<meta property=\"og:image:type\" content=\"image\/webp\" \/>\n<meta name=\"author\" content=\"Codemotion\" \/>\n<meta name=\"twitter:card\" content=\"summary_large_image\" \/>\n<meta name=\"twitter:creator\" content=\"@CodemotionIT\" \/>\n<meta name=\"twitter:site\" content=\"@CodemotionIT\" \/>\n<meta name=\"twitter:label1\" content=\"Written by\" \/>\n\t<meta name=\"twitter:data1\" content=\"Codemotion\" \/>\n\t<meta name=\"twitter:label2\" content=\"Est. reading time\" \/>\n\t<meta name=\"twitter:data2\" content=\"11 minutes\" \/>\n<script type=\"application\/ld+json\" class=\"yoast-schema-graph\">{\"@context\":\"https:\/\/schema.org\",\"@graph\":[{\"@type\":\"Article\",\"@id\":\"https:\/\/www.codemotion.com\/magazine\/it\/backend-it\/come-risolvere-il-dual-write-problem-nei-sistemi-distribuiti\/#article\",\"isPartOf\":{\"@id\":\"https:\/\/www.codemotion.com\/magazine\/it\/backend-it\/come-risolvere-il-dual-write-problem-nei-sistemi-distribuiti\/\"},\"author\":{\"name\":\"Codemotion\",\"@id\":\"https:\/\/www.codemotion.com\/magazine\/#\/schema\/person\/201bb98b02412383686cced7521b861c\"},\"headline\":\"Come risolvere il dual write problem nei sistemi distribuiti\",\"datePublished\":\"2025-05-22T09:16:38+00:00\",\"dateModified\":\"2025-05-26T10:55:29+00:00\",\"mainEntityOfPage\":{\"@id\":\"https:\/\/www.codemotion.com\/magazine\/it\/backend-it\/come-risolvere-il-dual-write-problem-nei-sistemi-distribuiti\/\"},\"wordCount\":2155,\"publisher\":{\"@id\":\"https:\/\/www.codemotion.com\/magazine\/#organization\"},\"image\":{\"@id\":\"https:\/\/www.codemotion.com\/magazine\/it\/backend-it\/come-risolvere-il-dual-write-problem-nei-sistemi-distribuiti\/#primaryimage\"},\"thumbnailUrl\":\"https:\/\/www.codemotion.com\/magazine\/wp-content\/uploads\/2025\/05\/DALL\u00b7E-2025-05-20-10.38.36-A-horizontal-photo-realistic-image-of-a-software-developer-working-intensely-on-complex-problems.-The-developer-is-seated-at-a-modern-desk-with-multip.webp\",\"keywords\":[\"Framework\",\"sviluppo software\"],\"articleSection\":[\"Backend\"],\"inLanguage\":\"en-US\"},{\"@type\":\"WebPage\",\"@id\":\"https:\/\/www.codemotion.com\/magazine\/it\/backend-it\/come-risolvere-il-dual-write-problem-nei-sistemi-distribuiti\/\",\"url\":\"https:\/\/www.codemotion.com\/magazine\/it\/backend-it\/come-risolvere-il-dual-write-problem-nei-sistemi-distribuiti\/\",\"name\":\"Come risolvere il dual write problem nei sistemi distribuiti\",\"isPartOf\":{\"@id\":\"https:\/\/www.codemotion.com\/magazine\/#website\"},\"primaryImageOfPage\":{\"@id\":\"https:\/\/www.codemotion.com\/magazine\/it\/backend-it\/come-risolvere-il-dual-write-problem-nei-sistemi-distribuiti\/#primaryimage\"},\"image\":{\"@id\":\"https:\/\/www.codemotion.com\/magazine\/it\/backend-it\/come-risolvere-il-dual-write-problem-nei-sistemi-distribuiti\/#primaryimage\"},\"thumbnailUrl\":\"https:\/\/www.codemotion.com\/magazine\/wp-content\/uploads\/2025\/05\/DALL\u00b7E-2025-05-20-10.38.36-A-horizontal-photo-realistic-image-of-a-software-developer-working-intensely-on-complex-problems.-The-developer-is-seated-at-a-modern-desk-with-multip.webp\",\"datePublished\":\"2025-05-22T09:16:38+00:00\",\"dateModified\":\"2025-05-26T10:55:29+00:00\",\"description\":\"Scopri come Unipol ha risolto il dual write problem nelle architetture distribuite usando pattern come Outbox Table e Idempotent Consumer.\",\"breadcrumb\":{\"@id\":\"https:\/\/www.codemotion.com\/magazine\/it\/backend-it\/come-risolvere-il-dual-write-problem-nei-sistemi-distribuiti\/#breadcrumb\"},\"inLanguage\":\"en-US\",\"potentialAction\":[{\"@type\":\"ReadAction\",\"target\":[\"https:\/\/www.codemotion.com\/magazine\/it\/backend-it\/come-risolvere-il-dual-write-problem-nei-sistemi-distribuiti\/\"]}]},{\"@type\":\"ImageObject\",\"inLanguage\":\"en-US\",\"@id\":\"https:\/\/www.codemotion.com\/magazine\/it\/backend-it\/come-risolvere-il-dual-write-problem-nei-sistemi-distribuiti\/#primaryimage\",\"url\":\"https:\/\/www.codemotion.com\/magazine\/wp-content\/uploads\/2025\/05\/DALL\u00b7E-2025-05-20-10.38.36-A-horizontal-photo-realistic-image-of-a-software-developer-working-intensely-on-complex-problems.-The-developer-is-seated-at-a-modern-desk-with-multip.webp\",\"contentUrl\":\"https:\/\/www.codemotion.com\/magazine\/wp-content\/uploads\/2025\/05\/DALL\u00b7E-2025-05-20-10.38.36-A-horizontal-photo-realistic-image-of-a-software-developer-working-intensely-on-complex-problems.-The-developer-is-seated-at-a-modern-desk-with-multip.webp\",\"width\":1792,\"height\":1024},{\"@type\":\"BreadcrumbList\",\"@id\":\"https:\/\/www.codemotion.com\/magazine\/it\/backend-it\/come-risolvere-il-dual-write-problem-nei-sistemi-distribuiti\/#breadcrumb\",\"itemListElement\":[{\"@type\":\"ListItem\",\"position\":1,\"name\":\"Home\",\"item\":\"https:\/\/www.codemotion.com\/magazine\/\"},{\"@type\":\"ListItem\",\"position\":2,\"name\":\"Backend\",\"item\":\"https:\/\/www.codemotion.com\/magazine\/it\/backend-it\/\"},{\"@type\":\"ListItem\",\"position\":3,\"name\":\"Come risolvere il dual write problem nei sistemi distribuiti\"}]},{\"@type\":\"WebSite\",\"@id\":\"https:\/\/www.codemotion.com\/magazine\/#website\",\"url\":\"https:\/\/www.codemotion.com\/magazine\/\",\"name\":\"Codemotion Magazine\",\"description\":\"We code the future. Together\",\"publisher\":{\"@id\":\"https:\/\/www.codemotion.com\/magazine\/#organization\"},\"potentialAction\":[{\"@type\":\"SearchAction\",\"target\":{\"@type\":\"EntryPoint\",\"urlTemplate\":\"https:\/\/www.codemotion.com\/magazine\/?s={search_term_string}\"},\"query-input\":{\"@type\":\"PropertyValueSpecification\",\"valueRequired\":true,\"valueName\":\"search_term_string\"}}],\"inLanguage\":\"en-US\"},{\"@type\":\"Organization\",\"@id\":\"https:\/\/www.codemotion.com\/magazine\/#organization\",\"name\":\"Codemotion\",\"url\":\"https:\/\/www.codemotion.com\/magazine\/\",\"logo\":{\"@type\":\"ImageObject\",\"inLanguage\":\"en-US\",\"@id\":\"https:\/\/www.codemotion.com\/magazine\/#\/schema\/logo\/image\/\",\"url\":\"https:\/\/www.codemotion.com\/magazine\/wp-content\/uploads\/2019\/11\/codemotionlogo.png\",\"contentUrl\":\"https:\/\/www.codemotion.com\/magazine\/wp-content\/uploads\/2019\/11\/codemotionlogo.png\",\"width\":225,\"height\":225,\"caption\":\"Codemotion\"},\"image\":{\"@id\":\"https:\/\/www.codemotion.com\/magazine\/#\/schema\/logo\/image\/\"},\"sameAs\":[\"https:\/\/www.facebook.com\/Codemotion.Italy\/\",\"https:\/\/x.com\/CodemotionIT\"]},{\"@type\":\"Person\",\"@id\":\"https:\/\/www.codemotion.com\/magazine\/#\/schema\/person\/201bb98b02412383686cced7521b861c\",\"name\":\"Codemotion\",\"image\":{\"@type\":\"ImageObject\",\"inLanguage\":\"en-US\",\"@id\":\"https:\/\/www.codemotion.com\/magazine\/#\/schema\/person\/image\/\",\"url\":\"https:\/\/www.codemotion.com\/magazine\/wp-content\/uploads\/2019\/11\/cropped-codemotionlogo-150x150.png\",\"contentUrl\":\"https:\/\/www.codemotion.com\/magazine\/wp-content\/uploads\/2019\/11\/cropped-codemotionlogo-150x150.png\",\"caption\":\"Codemotion\"},\"description\":\"Articles wirtten by the Codemotion staff. Tech news, inspiration, latest treends in software development and more.\",\"sameAs\":[\"https:\/\/x.com\/CodemotionIT\"],\"url\":\"https:\/\/www.codemotion.com\/magazine\/author\/codemotion-2\/\"}]}<\/script>\n<!-- \/ Yoast SEO Premium plugin. -->","yoast_head_json":{"title":"Come risolvere il dual write problem nei sistemi distribuiti","description":"Scopri come Unipol ha risolto il dual write problem nelle architetture distribuite usando pattern come Outbox Table e Idempotent Consumer.","robots":{"index":"index","follow":"follow","max-snippet":"max-snippet:-1","max-image-preview":"max-image-preview:large","max-video-preview":"max-video-preview:-1"},"canonical":"https:\/\/www.codemotion.com\/magazine\/it\/backend-it\/come-risolvere-il-dual-write-problem-nei-sistemi-distribuiti\/","og_locale":"en_US","og_type":"article","og_title":"Come risolvere il dual write problem nei sistemi distribuiti","og_description":"Scopri come Unipol ha risolto il dual write problem nelle architetture distribuite usando pattern come Outbox Table e Idempotent Consumer.","og_url":"https:\/\/www.codemotion.com\/magazine\/it\/backend-it\/come-risolvere-il-dual-write-problem-nei-sistemi-distribuiti\/","og_site_name":"Codemotion Magazine","article_publisher":"https:\/\/www.facebook.com\/Codemotion.Italy\/","article_published_time":"2025-05-22T09:16:38+00:00","article_modified_time":"2025-05-26T10:55:29+00:00","og_image":[{"width":1792,"height":1024,"url":"https:\/\/www.codemotion.com\/magazine\/wp-content\/uploads\/2025\/05\/DALL\u00b7E-2025-05-20-10.38.36-A-horizontal-photo-realistic-image-of-a-software-developer-working-intensely-on-complex-problems.-The-developer-is-seated-at-a-modern-desk-with-multip.webp","type":"image\/webp"}],"author":"Codemotion","twitter_card":"summary_large_image","twitter_creator":"@CodemotionIT","twitter_site":"@CodemotionIT","twitter_misc":{"Written by":"Codemotion","Est. reading time":"11 minutes"},"schema":{"@context":"https:\/\/schema.org","@graph":[{"@type":"Article","@id":"https:\/\/www.codemotion.com\/magazine\/it\/backend-it\/come-risolvere-il-dual-write-problem-nei-sistemi-distribuiti\/#article","isPartOf":{"@id":"https:\/\/www.codemotion.com\/magazine\/it\/backend-it\/come-risolvere-il-dual-write-problem-nei-sistemi-distribuiti\/"},"author":{"name":"Codemotion","@id":"https:\/\/www.codemotion.com\/magazine\/#\/schema\/person\/201bb98b02412383686cced7521b861c"},"headline":"Come risolvere il dual write problem nei sistemi distribuiti","datePublished":"2025-05-22T09:16:38+00:00","dateModified":"2025-05-26T10:55:29+00:00","mainEntityOfPage":{"@id":"https:\/\/www.codemotion.com\/magazine\/it\/backend-it\/come-risolvere-il-dual-write-problem-nei-sistemi-distribuiti\/"},"wordCount":2155,"publisher":{"@id":"https:\/\/www.codemotion.com\/magazine\/#organization"},"image":{"@id":"https:\/\/www.codemotion.com\/magazine\/it\/backend-it\/come-risolvere-il-dual-write-problem-nei-sistemi-distribuiti\/#primaryimage"},"thumbnailUrl":"https:\/\/www.codemotion.com\/magazine\/wp-content\/uploads\/2025\/05\/DALL\u00b7E-2025-05-20-10.38.36-A-horizontal-photo-realistic-image-of-a-software-developer-working-intensely-on-complex-problems.-The-developer-is-seated-at-a-modern-desk-with-multip.webp","keywords":["Framework","sviluppo software"],"articleSection":["Backend"],"inLanguage":"en-US"},{"@type":"WebPage","@id":"https:\/\/www.codemotion.com\/magazine\/it\/backend-it\/come-risolvere-il-dual-write-problem-nei-sistemi-distribuiti\/","url":"https:\/\/www.codemotion.com\/magazine\/it\/backend-it\/come-risolvere-il-dual-write-problem-nei-sistemi-distribuiti\/","name":"Come risolvere il dual write problem nei sistemi distribuiti","isPartOf":{"@id":"https:\/\/www.codemotion.com\/magazine\/#website"},"primaryImageOfPage":{"@id":"https:\/\/www.codemotion.com\/magazine\/it\/backend-it\/come-risolvere-il-dual-write-problem-nei-sistemi-distribuiti\/#primaryimage"},"image":{"@id":"https:\/\/www.codemotion.com\/magazine\/it\/backend-it\/come-risolvere-il-dual-write-problem-nei-sistemi-distribuiti\/#primaryimage"},"thumbnailUrl":"https:\/\/www.codemotion.com\/magazine\/wp-content\/uploads\/2025\/05\/DALL\u00b7E-2025-05-20-10.38.36-A-horizontal-photo-realistic-image-of-a-software-developer-working-intensely-on-complex-problems.-The-developer-is-seated-at-a-modern-desk-with-multip.webp","datePublished":"2025-05-22T09:16:38+00:00","dateModified":"2025-05-26T10:55:29+00:00","description":"Scopri come Unipol ha risolto il dual write problem nelle architetture distribuite usando pattern come Outbox Table e Idempotent Consumer.","breadcrumb":{"@id":"https:\/\/www.codemotion.com\/magazine\/it\/backend-it\/come-risolvere-il-dual-write-problem-nei-sistemi-distribuiti\/#breadcrumb"},"inLanguage":"en-US","potentialAction":[{"@type":"ReadAction","target":["https:\/\/www.codemotion.com\/magazine\/it\/backend-it\/come-risolvere-il-dual-write-problem-nei-sistemi-distribuiti\/"]}]},{"@type":"ImageObject","inLanguage":"en-US","@id":"https:\/\/www.codemotion.com\/magazine\/it\/backend-it\/come-risolvere-il-dual-write-problem-nei-sistemi-distribuiti\/#primaryimage","url":"https:\/\/www.codemotion.com\/magazine\/wp-content\/uploads\/2025\/05\/DALL\u00b7E-2025-05-20-10.38.36-A-horizontal-photo-realistic-image-of-a-software-developer-working-intensely-on-complex-problems.-The-developer-is-seated-at-a-modern-desk-with-multip.webp","contentUrl":"https:\/\/www.codemotion.com\/magazine\/wp-content\/uploads\/2025\/05\/DALL\u00b7E-2025-05-20-10.38.36-A-horizontal-photo-realistic-image-of-a-software-developer-working-intensely-on-complex-problems.-The-developer-is-seated-at-a-modern-desk-with-multip.webp","width":1792,"height":1024},{"@type":"BreadcrumbList","@id":"https:\/\/www.codemotion.com\/magazine\/it\/backend-it\/come-risolvere-il-dual-write-problem-nei-sistemi-distribuiti\/#breadcrumb","itemListElement":[{"@type":"ListItem","position":1,"name":"Home","item":"https:\/\/www.codemotion.com\/magazine\/"},{"@type":"ListItem","position":2,"name":"Backend","item":"https:\/\/www.codemotion.com\/magazine\/it\/backend-it\/"},{"@type":"ListItem","position":3,"name":"Come risolvere il dual write problem nei sistemi distribuiti"}]},{"@type":"WebSite","@id":"https:\/\/www.codemotion.com\/magazine\/#website","url":"https:\/\/www.codemotion.com\/magazine\/","name":"Codemotion Magazine","description":"We code the future. Together","publisher":{"@id":"https:\/\/www.codemotion.com\/magazine\/#organization"},"potentialAction":[{"@type":"SearchAction","target":{"@type":"EntryPoint","urlTemplate":"https:\/\/www.codemotion.com\/magazine\/?s={search_term_string}"},"query-input":{"@type":"PropertyValueSpecification","valueRequired":true,"valueName":"search_term_string"}}],"inLanguage":"en-US"},{"@type":"Organization","@id":"https:\/\/www.codemotion.com\/magazine\/#organization","name":"Codemotion","url":"https:\/\/www.codemotion.com\/magazine\/","logo":{"@type":"ImageObject","inLanguage":"en-US","@id":"https:\/\/www.codemotion.com\/magazine\/#\/schema\/logo\/image\/","url":"https:\/\/www.codemotion.com\/magazine\/wp-content\/uploads\/2019\/11\/codemotionlogo.png","contentUrl":"https:\/\/www.codemotion.com\/magazine\/wp-content\/uploads\/2019\/11\/codemotionlogo.png","width":225,"height":225,"caption":"Codemotion"},"image":{"@id":"https:\/\/www.codemotion.com\/magazine\/#\/schema\/logo\/image\/"},"sameAs":["https:\/\/www.facebook.com\/Codemotion.Italy\/","https:\/\/x.com\/CodemotionIT"]},{"@type":"Person","@id":"https:\/\/www.codemotion.com\/magazine\/#\/schema\/person\/201bb98b02412383686cced7521b861c","name":"Codemotion","image":{"@type":"ImageObject","inLanguage":"en-US","@id":"https:\/\/www.codemotion.com\/magazine\/#\/schema\/person\/image\/","url":"https:\/\/www.codemotion.com\/magazine\/wp-content\/uploads\/2019\/11\/cropped-codemotionlogo-150x150.png","contentUrl":"https:\/\/www.codemotion.com\/magazine\/wp-content\/uploads\/2019\/11\/cropped-codemotionlogo-150x150.png","caption":"Codemotion"},"description":"Articles wirtten by the Codemotion staff. Tech news, inspiration, latest treends in software development and more.","sameAs":["https:\/\/x.com\/CodemotionIT"],"url":"https:\/\/www.codemotion.com\/magazine\/author\/codemotion-2\/"}]}},"featured_image_src":"https:\/\/www.codemotion.com\/magazine\/wp-content\/uploads\/2025\/05\/DALL\u00b7E-2025-05-20-10.38.36-A-horizontal-photo-realistic-image-of-a-software-developer-working-intensely-on-complex-problems.-The-developer-is-seated-at-a-modern-desk-with-multip-600x400.webp","featured_image_src_square":"https:\/\/www.codemotion.com\/magazine\/wp-content\/uploads\/2025\/05\/DALL\u00b7E-2025-05-20-10.38.36-A-horizontal-photo-realistic-image-of-a-software-developer-working-intensely-on-complex-problems.-The-developer-is-seated-at-a-modern-desk-with-multip-600x600.webp","author_info":{"display_name":"Codemotion","author_link":"https:\/\/www.codemotion.com\/magazine\/author\/codemotion-2\/"},"uagb_featured_image_src":{"full":["https:\/\/www.codemotion.com\/magazine\/wp-content\/uploads\/2025\/05\/DALL\u00b7E-2025-05-20-10.38.36-A-horizontal-photo-realistic-image-of-a-software-developer-working-intensely-on-complex-problems.-The-developer-is-seated-at-a-modern-desk-with-multip.webp",1792,1024,false],"thumbnail":["https:\/\/www.codemotion.com\/magazine\/wp-content\/uploads\/2025\/05\/DALL\u00b7E-2025-05-20-10.38.36-A-horizontal-photo-realistic-image-of-a-software-developer-working-intensely-on-complex-problems.-The-developer-is-seated-at-a-modern-desk-with-multip-150x150.webp",150,150,true],"medium":["https:\/\/www.codemotion.com\/magazine\/wp-content\/uploads\/2025\/05\/DALL\u00b7E-2025-05-20-10.38.36-A-horizontal-photo-realistic-image-of-a-software-developer-working-intensely-on-complex-problems.-The-developer-is-seated-at-a-modern-desk-with-multip-300x171.webp",300,171,true],"medium_large":["https:\/\/www.codemotion.com\/magazine\/wp-content\/uploads\/2025\/05\/DALL\u00b7E-2025-05-20-10.38.36-A-horizontal-photo-realistic-image-of-a-software-developer-working-intensely-on-complex-problems.-The-developer-is-seated-at-a-modern-desk-with-multip-768x439.webp",768,439,true],"large":["https:\/\/www.codemotion.com\/magazine\/wp-content\/uploads\/2025\/05\/DALL\u00b7E-2025-05-20-10.38.36-A-horizontal-photo-realistic-image-of-a-software-developer-working-intensely-on-complex-problems.-The-developer-is-seated-at-a-modern-desk-with-multip-1024x585.webp",1024,585,true],"1536x1536":["https:\/\/www.codemotion.com\/magazine\/wp-content\/uploads\/2025\/05\/DALL\u00b7E-2025-05-20-10.38.36-A-horizontal-photo-realistic-image-of-a-software-developer-working-intensely-on-complex-problems.-The-developer-is-seated-at-a-modern-desk-with-multip-1536x878.webp",1536,878,true],"2048x2048":["https:\/\/www.codemotion.com\/magazine\/wp-content\/uploads\/2025\/05\/DALL\u00b7E-2025-05-20-10.38.36-A-horizontal-photo-realistic-image-of-a-software-developer-working-intensely-on-complex-problems.-The-developer-is-seated-at-a-modern-desk-with-multip.webp",1792,1024,false],"small-home-featured":["https:\/\/www.codemotion.com\/magazine\/wp-content\/uploads\/2025\/05\/DALL\u00b7E-2025-05-20-10.38.36-A-horizontal-photo-realistic-image-of-a-software-developer-working-intensely-on-complex-problems.-The-developer-is-seated-at-a-modern-desk-with-multip-100x100.webp",100,100,true],"sidebar-featured":["https:\/\/www.codemotion.com\/magazine\/wp-content\/uploads\/2025\/05\/DALL\u00b7E-2025-05-20-10.38.36-A-horizontal-photo-realistic-image-of-a-software-developer-working-intensely-on-complex-problems.-The-developer-is-seated-at-a-modern-desk-with-multip-180x128.webp",180,128,true],"genesis-singular-images":["https:\/\/www.codemotion.com\/magazine\/wp-content\/uploads\/2025\/05\/DALL\u00b7E-2025-05-20-10.38.36-A-horizontal-photo-realistic-image-of-a-software-developer-working-intensely-on-complex-problems.-The-developer-is-seated-at-a-modern-desk-with-multip-896x504.webp",896,504,true],"archive-featured":["https:\/\/www.codemotion.com\/magazine\/wp-content\/uploads\/2025\/05\/DALL\u00b7E-2025-05-20-10.38.36-A-horizontal-photo-realistic-image-of-a-software-developer-working-intensely-on-complex-problems.-The-developer-is-seated-at-a-modern-desk-with-multip-400x225.webp",400,225,true],"gb-block-post-grid-landscape":["https:\/\/www.codemotion.com\/magazine\/wp-content\/uploads\/2025\/05\/DALL\u00b7E-2025-05-20-10.38.36-A-horizontal-photo-realistic-image-of-a-software-developer-working-intensely-on-complex-problems.-The-developer-is-seated-at-a-modern-desk-with-multip-600x400.webp",600,400,true],"gb-block-post-grid-square":["https:\/\/www.codemotion.com\/magazine\/wp-content\/uploads\/2025\/05\/DALL\u00b7E-2025-05-20-10.38.36-A-horizontal-photo-realistic-image-of-a-software-developer-working-intensely-on-complex-problems.-The-developer-is-seated-at-a-modern-desk-with-multip-600x600.webp",600,600,true]},"uagb_author_info":{"display_name":"Codemotion","author_link":"https:\/\/www.codemotion.com\/magazine\/author\/codemotion-2\/"},"uagb_comment_info":0,"uagb_excerpt":"In questo articolo, scoprirete come Unipol ha affrontato l\u2019annoso tema del dual write problem nel contesto delle Architetture distribuite. Vengono presentate implementazioni di pattern come l&#8217;Outbox Table, il Saga e l&#8217;Idempotent Consumer,&nbsp; gi\u00e0 rilasciate in produzione e che, gi\u00e0 da diversi mesi, garantiscono la protezione da messaggi e dati duplicati. Vedrete, infine, come l\u2019implementazione dell\u2019sdk&#8230;&hellip;","lang":"it","_links":{"self":[{"href":"https:\/\/www.codemotion.com\/magazine\/wp-json\/wp\/v2\/posts\/33042","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/www.codemotion.com\/magazine\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/www.codemotion.com\/magazine\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/www.codemotion.com\/magazine\/wp-json\/wp\/v2\/users\/64"}],"replies":[{"embeddable":true,"href":"https:\/\/www.codemotion.com\/magazine\/wp-json\/wp\/v2\/comments?post=33042"}],"version-history":[{"count":3,"href":"https:\/\/www.codemotion.com\/magazine\/wp-json\/wp\/v2\/posts\/33042\/revisions"}],"predecessor-version":[{"id":33087,"href":"https:\/\/www.codemotion.com\/magazine\/wp-json\/wp\/v2\/posts\/33042\/revisions\/33087"}],"wp:featuredmedia":[{"embeddable":true,"href":"https:\/\/www.codemotion.com\/magazine\/wp-json\/wp\/v2\/media\/33044"}],"wp:attachment":[{"href":"https:\/\/www.codemotion.com\/magazine\/wp-json\/wp\/v2\/media?parent=33042"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/www.codemotion.com\/magazine\/wp-json\/wp\/v2\/categories?post=33042"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/www.codemotion.com\/magazine\/wp-json\/wp\/v2\/tags?post=33042"},{"taxonomy":"collections","embeddable":true,"href":"https:\/\/www.codemotion.com\/magazine\/wp-json\/wp\/v2\/collections?post=33042"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}