<?xml version="1.0" encoding="UTF-8" standalone="no"?><rss xmlns:atom="http://www.w3.org/2005/Atom" xmlns:content="http://purl.org/rss/1.0/modules/content/" xmlns:dc="http://purl.org/dc/elements/1.1/" xmlns:itunes="http://www.itunes.com/dtds/podcast-1.0.dtd" xmlns:slash="http://purl.org/rss/1.0/modules/slash/" xmlns:sy="http://purl.org/rss/1.0/modules/syndication/" xmlns:wfw="http://wellformedweb.org/CommentAPI/" version="2.0">

<channel>
	<title>Jose Cuéllar .net</title>
	<atom:link href="https://josecuellar.net/feed/" rel="self" type="application/rss+xml"/>
	<link>https://josecuellar.net</link>
	<description>//Tech Lead, Senior Backend Developer &amp; Life-long learner</description>
	<lastBuildDate>Fri, 21 Nov 2025 21:49:18 +0000</lastBuildDate>
	<language>es</language>
	<sy:updatePeriod>
	hourly	</sy:updatePeriod>
	<sy:updateFrequency>
	1	</sy:updateFrequency>
	<generator>https://wordpress.org/?v=6.8.3</generator>
	<item>
		<title>Saga Pattern (3/3)</title>
		<link>https://josecuellar.net/saga-pattern-3-3/</link>
		
		<dc:creator><![CDATA[Jose]]></dc:creator>
		<pubDate>Sun, 26 Apr 2020 21:25:27 +0000</pubDate>
				<category><![CDATA[General]]></category>
		<category><![CDATA[Arquitectura]]></category>
		<guid isPermaLink="false">https://josecuellar.net/?p=1961</guid>

					<description><![CDATA[El patrón Saga fue propuesto por Hector Garcia-Molina y Kenneth Salem en 1987. Puedes descargarte el paper aquí: SAGAS. Basada en arquitecturas guiadas por eventos (Event Driven Architecture), las sagas nos garantizarán la consistencia de datos en las transacciones de negocio que involucren varias transacciones locales entre varios servicios o participantes en un determinado sistema [&#8230;]]]></description>
										<content:encoded><![CDATA[
<p><em>El patrón Saga fue propuesto por Hector Garcia-Molina y Kenneth Salem en 1987. Puedes descargarte el paper aquí: <a href="https://josecuellar.net/wp-content/uploads/2020/04/sagapaper1987.pdf">SAGAS</a>.</em></p>



<p>Basada en arquitecturas guiadas por eventos (<strong><a href="https://josecuellar.net/domain-driven-design-episodio-iii-arquitectura/">Event Driven Architecture</a>)</strong>, las sagas nos garantizarán la consistencia de datos en las <strong>transacciones de negocio que involucren varias transacciones locales entre varios servicios o participantes</strong> en un determinado sistema distribuido.</p>



<p>Principalmente <strong>gestiona una secuencia de transacciones locales</strong> que completarán dicha transacción de negocio: cada transacción local de cada servicio se ejecutará <strong>basándose en el resultado de otros participantes</strong> o servicios mediante la comunicación de eventos de dominio.</p>



<p>Cada servicio deberá ser responsable de realizar su <strong>posible transacción de compensación (rollback)</strong> de una transacción local ya realizada correctamente en el caso de algún error reaccionando a los llamados <strong>eventos de compensación</strong>.</p>



<p>Existen dos tipos de gestión de sagas: basada en <strong>orquestación </strong>o <strong>coreografía</strong>.</p>



<h2 class="wp-block-heading">Choreography</h2>



<p>Los participantes <strong>reaccionan de forma autónoma</strong>. Cada servicio participa en la transacción distribuida de forma <strong>individual</strong>. Siendo responsable de gestionar su propia transacción local según la operación resultante de otro participante: continuar la saga o ejecutar la <strong>transacción de compensación</strong> (<em>deshaciendo cambios ya realizados</em>) desencadenando los <strong>eventos de compensación</strong>. Notificando si la transacción ha sido realizada correctamente o no, publicando el evento correspondiente.</p>



<figure class="wp-block-image size-large is-resized is-style-default"><img fetchpriority="high" decoding="async" width="1024" height="387" src="https://josecuellar.net/wp-content/uploads/2020/04/image-29-1024x387.png" alt="" class="wp-image-1970" style="width:630px;height:238px" srcset="https://josecuellar.net/wp-content/uploads/2020/04/image-29-1024x387.png 1024w, https://josecuellar.net/wp-content/uploads/2020/04/image-29-300x113.png 300w, https://josecuellar.net/wp-content/uploads/2020/04/image-29-768x290.png 768w, https://josecuellar.net/wp-content/uploads/2020/04/image-29-1536x581.png 1536w, https://josecuellar.net/wp-content/uploads/2020/04/image-29-1320x499.png 1320w, https://josecuellar.net/wp-content/uploads/2020/04/image-29.png 1568w" sizes="(max-width: 1024px) 100vw, 1024px" /></figure>



<p>No existe un <em>single point of failure</em> y los servicios se encuentran totalmente desacoplados. Aunque (dependiendo del número de participantes o servicios que colaboren para garantizar la ejecución completa de la transacción distribuida) puede ocasionar un aumento en la <strong>complejidad dificultando las tareas de testing, debug y monitoring</strong>.</p>



<h2 class="wp-block-heading">Orchestration</h2>



<p>Los <strong>participantes son gestionados desde un único punto: el orquestador de la saga</strong>. Mediante una primera operación orquesta las llamadas secuenciales al conjunto de participantes para llevar a cabo la transacción de negocio distribuida.</p>



<figure class="wp-block-image size-large is-resized is-style-default"><img decoding="async" width="1024" height="721" src="https://josecuellar.net/wp-content/uploads/2020/04/image-30-1024x721.png" alt="" class="wp-image-1973" style="width:623px;height:438px" srcset="https://josecuellar.net/wp-content/uploads/2020/04/image-30-1024x721.png 1024w, https://josecuellar.net/wp-content/uploads/2020/04/image-30-300x211.png 300w, https://josecuellar.net/wp-content/uploads/2020/04/image-30-768x541.png 768w, https://josecuellar.net/wp-content/uploads/2020/04/image-30.png 1076w" sizes="(max-width: 1024px) 100vw, 1024px" /></figure>



<p>Si el orquestador detecta un error en alguna respuesta en la ejecución de algún participante ejecutará las <strong>acciones correspondientes de compensación en cada uno de los participantes ya ejecutados</strong> hasta el momento.</p>



<p>Las ejecuciones de los participantes se realizan asíncronamente siguiendo el orden necesario si se requiere. Pueden existir varias posibilidades de implementación dependiendo del stack tecnológico, aunque recomendable usar los patrones <strong>Remote Procedure Call</strong> (RPC) <strong><em>request/async response</em></strong> o <strong><em>request/replay</em></strong> en las comunicaciones con los participantes.</p>



<p>La ventaja principal es la <strong>visibilidad que aporta tener todo el <em>workflow</em> centralizado en el orquestador</strong> resultando <strong>más sencillas las operaciones de testing, debug y monitoring</strong>. Aunque disponemos de un único componente creando una dependencia entre los participantes<em>. </em></p>



<p>Entonces, si realmente y lo <strong>verdaderamente importante en nuestro sistema son los eventos de dominio para mantener la consistencia</strong> de los datos, disponiendo además de diferentes estrategias y prácticas que solventan diferentes problemas en el momento que guardamos dichos estados (escritura) y otras cuando necesitamos consultarlos (<strong>lectura</strong>). La pregunta sería: <em>¿Porque no trabajamos únicamente con eventos?</em>. Acercándonos así a <a href="https://josecuellar.net/domain-driven-design-episodio-iii-arquitectura/#eventsourcing">Event Sourcing y CQRS</a>.</p>



<p>Bajo mi punto de vista, la solución ante un problema dado en una situación y contexto concretos se encuentra en el <strong>equilibrio entre los costes y beneficios de cada decisión que tomemos </strong>en cada momento. Y las decisiones (si dispones de posibilidad de colaborar o influir en ellas, claro) mejor tomarlas en base a los datos que dispongas y conocimientos/experiencia del equipo. Y recuerda incluir como coste la complejidad que añadas.</p>



<p>Hasta aquí, de momento, los <strong>principales patrones que nos permitirán garantizar una consistencia </strong>de los datos. Lógicamente estas prácticas tendrán un coste de desarrollo, aunque ya hemos visto que este tipo de prácticas <strong>no son nuevas, no hará falta reinventar la rueda</strong>: tenemos disponible una gran cantidad de herramientas <em>open source</em> que nos facilitarán implementarlos (incluyendo servicios <em>cloud </em>como las <a href="https://docs.microsoft.com/en-us/azure/azure-functions/durable/durable-functions-orchestrations?tabs=csharp">Durable Orchestrations</a> de <em>Azure</em>) basándonos así en patrones y guías comunes siendo más sencillo explicarlos y manteniendo siempre un orden y coherencia en nuestras prácticas.</p>



<p><em>Feedback is always welcome <img src="https://s.w.org/images/core/emoji/16.0.1/72x72/1f642.png" alt="🙂" class="wp-smiley" style="height: 1em; max-height: 1em;" /></em></p>



<p><em>Lecturas y charlas recomendadas:</em></p>



<ul class="wp-block-list">
<li><a href="https://microservices.io/patterns/data/saga.html">https://microservices.io/patterns/data/saga.html</a></li>



<li><a href="https://medium.com/@ijayakantha/microservices-the-saga-pattern-for-distributed-transactions-c489d0ac0247">https://medium.com/@ijayakantha/microservices-the-saga-pattern-for-distributed-transactions-c489d0ac0247</a></li>



<li><a href="https://jimmybogard.com/life-beyond-distributed-transactions-sagas/">https://jimmybogard.com/life-beyond-distributed-transactions-sagas/</a></li>
</ul>



<p></p>



<figure class="wp-block-embed aligncenter is-type-video is-provider-youtube wp-block-embed-youtube wp-embed-aspect-16-9 wp-has-aspect-ratio"><div class="wp-block-embed__wrapper">
<iframe title="Not Just Events: Developing Asynchronous Microservices • Chris Richardson • GOTO 2019" width="500" height="281" src="https://www.youtube.com/embed/kyNL7yCvQQc?feature=oembed" frameborder="0" allow="accelerometer; autoplay; clipboard-write; encrypted-media; gyroscope; picture-in-picture; web-share" referrerpolicy="strict-origin-when-cross-origin" allowfullscreen></iframe>
</div></figure>



<p></p>



<figure class="wp-block-embed aligncenter is-type-video is-provider-youtube wp-block-embed-youtube wp-embed-aspect-16-9 wp-has-aspect-ratio"><div class="wp-block-embed__wrapper">
<iframe loading="lazy" title="Effective Microservice Communication and Conversation Patterns - Jimmy Bogard" width="500" height="281" src="https://www.youtube.com/embed/aHsVsbo_VOE?feature=oembed" frameborder="0" allow="accelerometer; autoplay; clipboard-write; encrypted-media; gyroscope; picture-in-picture; web-share" referrerpolicy="strict-origin-when-cross-origin" allowfullscreen></iframe>
</div></figure>



<p></p>



<figure class="wp-block-embed-wordpress aligncenter wp-block-embed is-type-wp-embed is-provider-jose-cuellar-net"><div class="wp-block-embed__wrapper">
<blockquote class="wp-embedded-content" data-secret="Vd8RaoCgjs"><a href="https://josecuellar.net/data-consistency-the-problem-1-3/">Data consistency: the problem (1/3)</a></blockquote><iframe loading="lazy" class="wp-embedded-content" sandbox="allow-scripts" security="restricted"  title="«Data consistency: the problem (1/3)» — Jose Cuéllar .net" src="https://josecuellar.net/data-consistency-the-problem-1-3/embed/#?secret=usnAz6OG0e#?secret=Vd8RaoCgjs" data-secret="Vd8RaoCgjs" width="500" height="282" frameborder="0" marginwidth="0" marginheight="0" scrolling="no"></iframe>
</div></figure>



<figure class="wp-block-embed-wordpress aligncenter wp-block-embed is-type-wp-embed is-provider-jose-cuellar-net"><div class="wp-block-embed__wrapper">
<blockquote class="wp-embedded-content" data-secret="J4TwODON3j"><a href="https://josecuellar.net/transactional-outbox-pattern-polling-publisher-pattern-2-3/">Transactional Outbox &#038; Polling Publisher Patterns (2/3)</a></blockquote><iframe loading="lazy" class="wp-embedded-content" sandbox="allow-scripts" security="restricted"  title="«Transactional Outbox &#038; Polling Publisher Patterns (2/3)» — Jose Cuéllar .net" src="https://josecuellar.net/transactional-outbox-pattern-polling-publisher-pattern-2-3/embed/#?secret=JcOQhfsHl6#?secret=J4TwODON3j" data-secret="J4TwODON3j" width="500" height="282" frameborder="0" marginwidth="0" marginheight="0" scrolling="no"></iframe>
</div></figure>



<p></p>
]]></content:encoded>
					
		
		
			<enclosure length="7995440" type="application/pdf" url="https://josecuellar.net/wp-content/uploads/2020/04/sagapaper1987.pdf"/></item>
		<item>
		<title>Transactional Outbox &amp; Polling Publisher Patterns (2/3)</title>
		<link>https://josecuellar.net/transactional-outbox-pattern-polling-publisher-pattern-2-3/</link>
		
		<dc:creator><![CDATA[Jose]]></dc:creator>
		<pubDate>Fri, 24 Apr 2020 00:02:05 +0000</pubDate>
				<category><![CDATA[General]]></category>
		<category><![CDATA[Arquitectura]]></category>
		<guid isPermaLink="false">https://josecuellar.net/?p=1914</guid>

					<description><![CDATA[A lo largo del tiempo las bases de datos NoSQL han ido mejorado sus características para ofrecernos ACID según el tipo (Single Row, Single Shard o Distrituded): El problema principal, no radica en que una determinada base de datos garantice o no ACID en sus transacciones (lógicamente, debería serlo para minimizar el riesgo de inconsistencias), [&#8230;]]]></description>
										<content:encoded><![CDATA[
<p>A lo largo del tiempo las bases de datos <em>NoSQL </em>han ido mejorado sus características para ofrecernos <em>ACID </em>según el tipo (<strong>Single Row, Single Shard o Distrituded</strong>):</p>



<figure class="wp-block-image size-large is-resized"><img loading="lazy" decoding="async" width="1024" height="312" src="https://josecuellar.net/wp-content/uploads/2020/04/image-21-1024x312.png" alt="" class="wp-image-1936" style="width:595px;height:181px" srcset="https://josecuellar.net/wp-content/uploads/2020/04/image-21-1024x312.png 1024w, https://josecuellar.net/wp-content/uploads/2020/04/image-21-300x92.png 300w, https://josecuellar.net/wp-content/uploads/2020/04/image-21-768x234.png 768w, https://josecuellar.net/wp-content/uploads/2020/04/image-21.png 1036w" sizes="auto, (max-width: 1024px) 100vw, 1024px" /><figcaption class="wp-element-caption"><em>Modern databases offer distributed ACID, Sid Choudhury</em></figcaption></figure>



<p>El problema principal, no radica en que<strong> una determinada base de datos garantice o no ACID</strong> en sus transacciones (lógicamente, debería serlo para minimizar el riesgo de inconsistencias), sino <strong>dividir las operaciones de un mismo </strong><em><strong>workflow</strong> </em>(creación completa del pedido con todas sus operaciones) <strong>en varias transacciones locales independientes </strong>entre los diferentes contextos y bases de datos, sean las que sean. &nbsp;</p>



<p>De modo que garantizar las comunicaciones entre los contextos es vital para permitir las ejecuciones distribuidas entre ellos manteniendo la consistencia de los datos. </p>



<p>Normalmente debemos <strong>notificar el evento una vez realizada la transacción local</strong>. Para ello, ejecutamos la transacción y a continuación publicamos el evento a nuestro <em>message-broker</em>:</p>


<div class="wp-block-image is-style-default">
<figure class="aligncenter size-large is-resized"><img loading="lazy" decoding="async" width="750" height="368" src="https://josecuellar.net/wp-content/uploads/2020/04/image-25.png" alt="" class="wp-image-1954" style="width:474px;height:232px" srcset="https://josecuellar.net/wp-content/uploads/2020/04/image-25.png 750w, https://josecuellar.net/wp-content/uploads/2020/04/image-25-300x147.png 300w" sizes="auto, (max-width: 750px) 100vw, 750px" /></figure></div>


<p>El problema es que <strong>la transacción y el envío del evento, no son atómicos: se ejecutan independientemente</strong> pudiendo provocar posibles inconsistencias de datos si alguno de ambos falla:</p>


<div class="wp-block-image is-style-default">
<figure class="aligncenter size-large is-resized"><img loading="lazy" decoding="async" width="911" height="392" src="https://josecuellar.net/wp-content/uploads/2020/04/image-23.png" alt="" class="wp-image-1951" style="width:488px;height:210px" srcset="https://josecuellar.net/wp-content/uploads/2020/04/image-23.png 911w, https://josecuellar.net/wp-content/uploads/2020/04/image-23-300x129.png 300w, https://josecuellar.net/wp-content/uploads/2020/04/image-23-768x330.png 768w" sizes="auto, (max-width: 911px) 100vw, 911px" /></figure></div>

<div class="wp-block-image is-style-default">
<figure class="aligncenter size-large is-resized"><img loading="lazy" decoding="async" width="901" height="368" src="https://josecuellar.net/wp-content/uploads/2020/04/image-24.png" alt="" class="wp-image-1952" style="width:483px;height:197px" srcset="https://josecuellar.net/wp-content/uploads/2020/04/image-24.png 901w, https://josecuellar.net/wp-content/uploads/2020/04/image-24-300x123.png 300w, https://josecuellar.net/wp-content/uploads/2020/04/image-24-768x314.png 768w" sizes="auto, (max-width: 901px) 100vw, 901px" /></figure></div>


<p>El patrón <strong>Transactional Outbox</strong> nos permitirá una <strong>única transacción atómica garantizando una entrega <a href="https://www.cloudcomputingpatterns.org/at_least_once_delivery/">At-Least-Once</a></strong> y dándonos la posibilidad de <strong>reprocesarlos </strong>en cualquier momento.</p>



<p>Lo aplicaremos <strong>guardando en la misma transacción tanto la operación que deseemos realizar (que garantice <em>ACID</em>), como los eventos</strong> que pueda generar. Los eventos quedarán persistidos en la base de datos: </p>


<div class="wp-block-image is-style-default">
<figure class="aligncenter size-large"><img loading="lazy" decoding="async" width="1024" height="445" src="https://josecuellar.net/wp-content/uploads/2020/04/image-26-1024x445.png" alt="" class="wp-image-1955" srcset="https://josecuellar.net/wp-content/uploads/2020/04/image-26-1024x445.png 1024w, https://josecuellar.net/wp-content/uploads/2020/04/image-26-300x130.png 300w, https://josecuellar.net/wp-content/uploads/2020/04/image-26-768x334.png 768w, https://josecuellar.net/wp-content/uploads/2020/04/image-26.png 1095w" sizes="auto, (max-width: 1024px) 100vw, 1024px" /></figure></div>


<p>Mediante <strong><a href="https://microservices.io/patterns/data/polling-publisher.html">Polling Publisher</a> </strong>publicaríamos los eventos a nuestro <em>message-broker</em>. Manteniendo el estado de los eventos en el <em>outbox </em>comprobando el <em><a href="https://en.wikipedia.org/wiki/Acknowledgement_(data_networks)">ACK </a></em>en el momento de la publicación (asegurando así la recepción del evento). O incluso, el consumidor podría actualizar el evento a procesado correctamente mediante un <a href="https://medium.com/@scokmen/debugging-microservices-part-ii-the-correlation-identifier-552f9016afcd"><em>CorrelationId</em> </a>o <em>MessageId</em>.</p>



<p>Aseguraremos <strong>At-least-once</strong>/Once-or-more (los mensajes no se perderán, aunque podrían duplicarse). Por ese motivo, nuestros consumidores deberían ser <strong><a href="http://shuttle.github.io/shuttle-esb/concepts-idempotence">idempotentes </a></strong>(la ejecución de una o varias veces tendrá el mismo resultado).</p>



<p><em>Existen herramientas interesantes ya desarrolladas que nos permitirán adaptar outbox pattern de forma sencilla:</em></p>



<ul class="wp-block-list">
<li><a href="https://docs.particular.net/nservicebus/outbox/">https://docs.particular.net/nservicebus/outbox/</a></li>



<li><a href="https://github.com/dotnetcore/CAP">https://github.com/dotnetcore/CAP</a></li>
</ul>



<p></p>



<p><em>Como he comentado, existen motores de bases de datos distribuidas que nos permiten consistencia de datos en sus transacciones (con ciertas penalizaciones de rendimiento): </em></p>



<blockquote class="wp-block-quote is-layout-flow wp-block-quote-is-layout-flow">
<p><a href="https://azure.microsoft.com/es-es/services/cosmos-db/">Azure Cosmos Db</a> nos da la opción de <em><a href="https://docs.microsoft.com/es-es/azure/cosmos-db/consistency-levels">strong consistency</a></em> (<em>single region/single operation</em>) y garantizando <em>ACID </em>mediante <a href="https://devblogs.microsoft.com/cosmosdb/introducing-transactionalbatch-in-the-net-sdk/">TransactionalBatch</a>. Ofreciéndonos las <a href="https://docs.microsoft.com/es-es/azure/cosmos-db/change-feed-functions">Change Feed Functions</a> en el que nos notificará de cualquier inserción o actualización de un contenedor específico. Para ello, necesitaremos una colección donde guardaremos el estado de procesado de las notificaciones (<a href="https://docs.microsoft.com/bs-latn-ba/azure/cosmos-db/how-to-create-multiple-cosmos-db-triggers">lease containers</a>). </p>
</blockquote>



<p>De este modo (con algunos matices) podemos acercarnos al patrón <em>outbox</em> de forma sencilla (aunque, idealmente deberíamos crear una colección específica de <em>eventos </em>generados y disponer de un <em>polling publisher</em>):</p>



<figure class="wp-block-image size-large is-resized is-style-default"><img loading="lazy" decoding="async" width="711" height="342" src="https://josecuellar.net/wp-content/uploads/2020/05/image-7.png" alt="" class="wp-image-2015" style="width:587px;height:281px" srcset="https://josecuellar.net/wp-content/uploads/2020/05/image-7.png 711w, https://josecuellar.net/wp-content/uploads/2020/05/image-7-300x144.png 300w" sizes="auto, (max-width: 711px) 100vw, 711px" /></figure>



<p>Para <strong>evitar dicha penalización de rendimiento y garantizar la consistencia</strong>: podríamos <em>escuchar </em>los eventos generados creando los datos específicos de consulta en alguna otra base de datos o tecnología. <strong>Notificando así además a otros servicios</strong> (dada la importancia en la consistencia de datos en transacciones de negocio distribuidas como veremos en el <a href="https://josecuellar.net/saga-pattern-3-3/">siguiente post</a>):</p>



<figure class="wp-block-image size-large is-style-default"><img loading="lazy" decoding="async" width="735" height="427" src="https://josecuellar.net/wp-content/uploads/2020/05/image-6.png" alt="" class="wp-image-2014" srcset="https://josecuellar.net/wp-content/uploads/2020/05/image-6.png 735w, https://josecuellar.net/wp-content/uploads/2020/05/image-6-300x174.png 300w" sizes="auto, (max-width: 735px) 100vw, 735px" /></figure>



<p>Hasta aquí uno de los patrones <strong>más recomendados habitualmente</strong> para garantizar el envío de eventos correspondientes a transacciones locales de cada servicio.</p>



<p></p>



<p><em>Lecturas recomendadas:</em></p>



<div class="wp-block-group"><div class="wp-block-group__inner-container is-layout-flow wp-block-group-is-layout-flow">
<div class="wp-block-group"><div class="wp-block-group__inner-container is-layout-flow wp-block-group-is-layout-flow">
<ul class="wp-block-list">
<li><a href="https://docs.microsoft.com/en-us/dotnet/architecture/microservices/multi-container-microservice-net-applications/subscribe-events">https://docs.microsoft.com/en-us/dotnet/architecture/microservices/multi-container-microservice-net-applications/subscribe-events</a></li>



<li><a href="https://docs.microsoft.com/bs-latn-ba/azure/cosmos-db/how-to-create-multiple-cosmos-db-triggers">https://docs.microsoft.com/bs-latn-ba/azure/cosmos-db/how-to-create-multiple-cosmos-db-triggers</a></li>



<li><a href="https://docs.microsoft.com/es-es/azure/cosmos-db/consistency-levels">https://docs.microsoft.com/es-es/azure/cosmos-db/consistency-levels</a></li>



<li><a href="https://microservices.io/patterns/data/transactional-outbox.html">https://microservices.io/patterns/data/transactional-outbox.html</a></li>



<li><a href="https://jimmybogard.com/life-beyond-distributed-transactions-an-apostates-implementation-relational-resources/">https://jimmybogard.com/life-beyond-distributed-transactions-an-apostates-implementation-relational-resources/</a></li>



<li><a href="https://www.kamilgrzybek.com/design/the-outbox-pattern/">https://www.kamilgrzybek.com/design/the-outbox-pattern/</a></li>
</ul>



<p></p>
</div></div>
</div></div>



<figure class="wp-block-embed-wordpress aligncenter wp-block-embed is-type-wp-embed is-provider-jose-cuellar-net"><div class="wp-block-embed__wrapper">
<blockquote class="wp-embedded-content" data-secret="npX7Ttv86r"><a href="https://josecuellar.net/saga-pattern-3-3/">Saga Pattern (3/3)</a></blockquote><iframe loading="lazy" class="wp-embedded-content" sandbox="allow-scripts" security="restricted"  title="«Saga Pattern (3/3)» — Jose Cuéllar .net" src="https://josecuellar.net/saga-pattern-3-3/embed/#?secret=pAZ8r2VjpY#?secret=npX7Ttv86r" data-secret="npX7Ttv86r" width="500" height="282" frameborder="0" marginwidth="0" marginheight="0" scrolling="no"></iframe>
</div></figure>



<p></p>
]]></content:encoded>
					
		
		
			</item>
	</channel>
</rss>