Files
nexus/sreweekly/articles/379/01-the-saga-is-antipattern.html
2026-09-12 17:23:01 +08:00

5396 lines
313 KiB
HTML
Raw Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="utf-8">
<title>The Saga is Antipattern - DEV Community</title>
<link rel="preload" href="/reactions?article_id=1510071" as="fetch" crossorigin="same-origin">
<link rel="canonical" href="https://dev.to/siy/the-saga-is-antipattern-1354" />
<meta name="description" content="The Saga pattern is often positioned as a better way to handle distributed transactions. I see no... Tagged with microservices, saga.">
<meta name="keywords" content="microservices, saga, software, coding, development, engineering, inclusive, community">
<meta property="og:type" content="article" />
<meta property="og:url" content="https://dev.to/siy/the-saga-is-antipattern-1354" />
<meta property="og:title" content="The Saga is Antipattern" />
<meta property="og:description" content="The Saga pattern is often positioned as a better way to handle distributed transactions. I see no..." />
<meta property="og:site_name" content="DEV Community" />
<meta name="twitter:site" content="@thepracticaldev">
<meta name="twitter:creator" content="@">
<meta name="author-trust" content="0">
<meta name="twitter:title" content="The Saga is Antipattern">
<meta name="twitter:description" content="The Saga pattern is often positioned as a better way to handle distributed transactions. I see no...">
<meta name="twitter:card" content="summary_large_image">
<meta name="twitter:widgets:new-embed-design" content="on">
<meta name="robots" content="max-snippet:-1, max-image-preview:large, max-video-preview:-1">
<meta property="og:image" content="https://media2.dev.to/dynamic/image/width=1000,height=500,fit=cover,gravity=auto,format=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F1p5sw2yv33a7wc10m57t.png" />
<meta name="twitter:image:src" content="https://media2.dev.to/dynamic/image/width=1000,height=500,fit=cover,gravity=auto,format=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F1p5sw2yv33a7wc10m57t.png">
<meta name="last-updated" content="2026-09-12 05:48:53 UTC">
<meta name="user-signed-in" content="false">
<meta name="head-cached-at" content="1789192133">
<meta name="environment" content="production">
<link rel="stylesheet" href="https://assets.dev.to/assets/minimal-3a438d8d138f95f478f01cbe53363cacf36bc6c47172aeb2e6c9172eebe29aa6.css" media="all" id="main-minimal-stylesheet" />
<link rel="stylesheet" href="https://assets.dev.to/assets/views-ca4b6f6e9ec63c7deefbdd4067e585d752cd4b06c12da1a49c7b9644defa2758.css" media="all" id="main-views-stylesheet" />
<link rel="stylesheet" href="https://assets.dev.to/assets/crayons-537acd1cbd95b8d8d524dab489c8923b7316dd045ead39e7a2dbaa42cdc208b2.css" media="all" id="main-crayons-stylesheet" />
<script src="https://assets.dev.to/assets/base-2e294c52c5fe6b771fda1a5f38d2f10756d0b4d8359c6f9825fe47df0f54e6ae.js" defer="defer"></script>
<script src="https://assets.dev.to/assets/application-9ee88e198a0d2b64238c8557b5225d20e2c18ff5b877f1159ee5a31f6e3174f9.js" defer="defer"></script>
<script src="https://assets.dev.to/assets/baseInitializers-624554190e72cf52de9498fd225c2e71ab334dfc4919535dcc5a26a3a0ae2359.js" defer="defer"></script>
<script src="https://assets.dev.to/assets/baseTracking-cb478131fb1b41bc25e80ebcee996318777e081c9aa87367fabc1c118461a2d3.js" defer="defer"></script>
<script src="https://assets.dev.to/assets/followButtons-e3595664847e9f43945a9b8a0445b32cda9a149f1f169f78b8fcc7714ccab45a.js" defer="defer"></script>
<script src="https://assets.dev.to/assets/eventSignupButtons-a2b5da712a1b8eeb0eda4d63fafc54973138a70b88503a2163806c27fc1e4c39.js" defer="defer"></script>
<meta name="search-script" content="https://assets.dev.to/assets/Search-a570c3428c9b6cb070d3f18817c957f80d0dbdf36a0f4a1d6e23a990305fbc12.js">
<meta name="mermaid-script" content="https://assets.dev.to/assets/mermaidRenderer-b9ba305a9767f9203ac04b8043493fb0542090e9a7981428cecf8c7d2ccaf177.js">
<meta name="viewport" content="width=device-width, initial-scale=1.0, viewport-fit=cover">
<link rel="icon" type="image/x-icon" href="https://media2.dev.to/dynamic/image/width=32,height=,fit=scale-down,gravity=auto,format=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F8j7kvp660rqzt99zui8e.png" />
<link rel="apple-touch-icon" href="https://media2.dev.to/dynamic/image/width=180,height=,fit=scale-down,gravity=auto,format=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F8j7kvp660rqzt99zui8e.png">
<link rel="apple-touch-icon" sizes="152x152" href="https://media2.dev.to/dynamic/image/width=152,height=,fit=scale-down,gravity=auto,format=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F8j7kvp660rqzt99zui8e.png">
<link rel="apple-touch-icon" sizes="180x180" href="https://media2.dev.to/dynamic/image/width=180,height=,fit=scale-down,gravity=auto,format=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F8j7kvp660rqzt99zui8e.png">
<link rel="apple-touch-icon" sizes="167x167" href="https://media2.dev.to/dynamic/image/width=167,height=,fit=scale-down,gravity=auto,format=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F8j7kvp660rqzt99zui8e.png">
<link href="https://media2.dev.to/dynamic/image/width=192,height=,fit=scale-down,gravity=auto,format=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F8j7kvp660rqzt99zui8e.png" rel="icon" sizes="192x192" />
<link href="https://media2.dev.to/dynamic/image/width=128,height=,fit=scale-down,gravity=auto,format=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F8j7kvp660rqzt99zui8e.png" rel="icon" sizes="128x128" />
<meta name="apple-mobile-web-app-title" content="dev.to">
<meta name="application-name" content="dev.to">
<meta name="theme-color" content="#ffffff" media="(prefers-color-scheme: light)">
<meta name="theme-color" content="#000000" media="(prefers-color-scheme: dark)">
<link rel="search" href="https://dev.to/open-search.xml" type="application/opensearchdescription+xml" title="DEV Community" />
<link rel="describedby" href="https://dev.to/llms.txt" type="text/plain" title="Guidance for AI agents" />
<meta property="forem:name" content="DEV Community" />
<meta property="forem:logo" content="https://media2.dev.to/dynamic/image/width=512,height=,fit=scale-down,gravity=auto,format=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F8j7kvp660rqzt99zui8e.png" />
<meta property="forem:domain" content="dev.to" />
<style>
body:has(.pageslug-aie) #topbar {
display: none !important;
}
@media screen and (max-width: 768px) and (pointer: coarse) {
/* Target WebKit/Blink specific behaviors */
@supports (-webkit-app-region: none) {
body:has(.pageslug-aie) .dc-page {
padding-top: 56px !important;
}
}
}
body:not(.hidden-shell) .pageslug-aie {
margin-top: -56px !important;
}
/* ==========================================================================
THE 418 CHALLENGE: THEME-AWARE RETRO EDITION
========================================================================== */
.articletag-418challenge {
font-family: "Comic Sans MS", "Chalkboard SE", "Marker Felt", sans-serif !important;
cursor: crosshair !important;
}
/* Destroy modern rounded corners and add brutal borders */
.articletag-418challenge .crayons-card,
.articletag-418challenge .crayons-article__main,
.articletag-418challenge .crayons-article__header {
border-radius: 0 !important;
margin-bottom: 2rem !important;
}
/* Typography specifics */
.articletag-418challenge h1,
.articletag-418challenge h2,
.articletag-418challenge h3 {
text-transform: uppercase !important;
}
/* Fake <marquee> effect for the main article title */
.articletag-418challenge h1.fs-3xl {
animation: retro-slide 5s linear infinite alternate;
overflow: visible;
}
/* Spin those avatars */
.articletag-418challenge .crayons-article__header__meta img {
border-radius: 0 !important;
animation: retro-spin 5s linear infinite;
}
/* Obnoxious tags */
.articletag-418challenge .crayons-tag {
border-radius: 0 !important;
font-weight: 900 !important;
transform: rotate(-3deg);
display: inline-block;
}
.articletag-418challenge .crayons-tag:nth-child(even) {
transform: rotate(3deg);
}
/* --------------------------------------------------------------------------
2. LIGHT THEME (Windows 95 / Office 97 Vibes)
-------------------------------------------------------------------------- */
body:not(.dark-theme) .articletag-418challenge {
background-color: #008080 !important; /* Win95 Teal Desktop */
}
body:not(.dark-theme) .articletag-418challenge .crayons-card,
body:not(.dark-theme) .articletag-418challenge .crayons-article__main,
body:not(.dark-theme) .articletag-418challenge .crayons-article__header {
background-color: #c0c0c0 !important; /* Classic dialog gray */
color: #000000 !important;
border: 4px outset #ffffff !important;
box-shadow: 8px 8px 0px #000000 !important;
}
body:not(.dark-theme) .articletag-418challenge h1,
body:not(.dark-theme) .articletag-418challenge h2,
body:not(.dark-theme) .articletag-418challenge h3 {
color: #ff0000 !important;
text-shadow: 2px 2px 0px #ffff00 !important;
border-bottom: 3px dashed #0000ff !important;
}
body:not(.dark-theme) .articletag-418challenge a,
body:not(.dark-theme) .articletag-418challenge .crayons-link {
color: #0000ff !important; /* Standard unvisited blue */
text-decoration: underline !important;
font-weight: bold !important;
}
body:not(.dark-theme) .articletag-418challenge a:hover,
body:not(.dark-theme) .articletag-418challenge .crayons-link:hover {
background-color: #ffff00 !important;
color: #ff0000 !important;
}
body:not(.dark-theme) .articletag-418challenge .crayons-tag {
background: #ffff00 !important;
color: #ff0000 !important;
border: 2px dotted #0000ff !important;
}
/* --------------------------------------------------------------------------
3. DARK THEME (1999 Hacker / Deep GeoCities Vibes)
-------------------------------------------------------------------------- */
body.dark-theme .articletag-418challenge {
background-color: #000000 !important;
/* Dumb CSS: A scrolling, eye-bleeding neon green hacker grid with CRT scanlines */
background-image:
linear-gradient(transparent 50%, rgba(0, 255, 0, 0.25) 50%),
linear-gradient(90deg, rgba(0, 255, 0, 0.5) 1px, transparent 1px),
linear-gradient(rgba(0, 255, 0, 0.5) 1px, transparent 1px) !important;
background-size: 100% 4px, 20px 20px, 20px 20px !important;
animation: retro-pan 60s linear infinite !important;
}
body.dark-theme .articletag-418challenge .crayons-card,
body.dark-theme .articletag-418challenge .crayons-article__main,
body.dark-theme .articletag-418challenge .crayons-article__header {
background-color: #111111 !important;
color: #00ff00 !important; /* Terminal Green */
border: 4px outset #555555 !important;
box-shadow: 8px 8px 0px #ff00ff !important; /* Hot pink shadow */
}
body.dark-theme .articletag-418challenge h1,
body.dark-theme .articletag-418challenge h2,
body.dark-theme .articletag-418challenge h3 {
color: #ff00ff !important; /* Magenta headers */
text-shadow: 2px 2px 0px #00ffff !important; /* Cyan shadow */
border-bottom: 3px dashed #00ff00 !important;
}
body.dark-theme .articletag-418challenge a,
body.dark-theme .articletag-418challenge .crayons-link {
color: #00ffff !important; /* Cyan links */
text-decoration: underline !important;
font-weight: bold !important;
}
body.dark-theme .articletag-418challenge a:hover,
body.dark-theme .articletag-418challenge .crayons-link:hover {
background-color: #ff00ff !important;
color: #ffffff !important;
}
body.dark-theme .articletag-418challenge .crayons-tag {
background: #000000 !important;
color: #00ff00 !important;
border: 2px dotted #ff00ff !important;
}
/* --------------------------------------------------------------------------
4. ANIMATIONS
-------------------------------------------------------------------------- */
@keyframes retro-spin {
100% { transform: rotate(360deg); }
}
@keyframes retro-slide {
0% { transform: translateX(-2%); }
100% { transform: translateX(2%); }
}
@keyframes retro-pan {
0% { background-position: 0 0, 0 0, 0 0; }
/* Numbers must be multiples of the background-size (4px and 20px) to loop perfectly */
100% { background-position: 0 100px, 40px 40px, 40px 40px; }
}
/* --------------------------------------------------------------------------
5. BONUS: CAUTION TAPE REACTION BAR
-------------------------------------------------------------------------- */
.articletag-418challenge .crayons-article-actions {
background: repeating-linear-gradient(
45deg,
#ffff00,
#ffff00 10px,
#000000 10px,
#000000 20px
) !important;
border: 4px solid #ff0000 !important;
border-radius: 0 !important;
}
.articletag-418challenge .crayons-article-actions button {
background:black;
color: #ff00ff !important;
}
.articletag-418challenge .crayons-article-actions .crayons-reaction__count {
color: #ff00ff !important;
font-weight: bold !important;
}
.articletag-418challenge .crayons-icon:not(.crayons-icon--default) * {
fill: #ffff00 !important;
}
.articletag-418challenge .c-embed .crayons-btn--primary {
color: #00ff00 !important;
}
.articletag-418challenge .popover-billboard {
margin-bottom: 0 !important;
}
.crayons-story__contentpreview .ltag__link--embedded {
margin-top: 0 !important;
}
.subscription-icon {
max-height: 16px !important;
display: inline-block !important;
}
@media screen and (min-width: 950px) {
.event-show-layout {
margin-top: 24px !important;
}
}
@media screen and (max-width: 949px) {
.event-show-layout {
padding: 11px !important;
}
}
</style>
</head>
<body
class="sans-serif-article-body default-header"
data-user-status="logged-out"
data-is-root-subforem="false"
data-subforem-id="1"
data-side-nav-visible="true"
data-community-name="DEV Community"
data-subscription-icon="https://assets.dev.to/assets/subscription-icon-805dfa7ac7dd660f07ed8d654877270825b07a92a03841aa99a1093bd00431b2.png"
data-community-leader-icon="https://assets.dev.to/assets/community-leader-icon-b72c9e74eff54916e5c46c962f47ba40c9f611a71f8b157511f9613f69c0001b.svg"
data-locale="en"
data-honeybadger-key="hbp_nqu4Y66HuEKlD6YRGssZuRQnPOjDm50J8Zkr"
data-deployed-at="2026-09-11T18:06:01Z"
data-latest-commit-id="ac54b3b29af145ea947eb7f5d6acba8a86c9d109"
data-ga-tracking="UA-71991109-1"
data-cookie-banner-user-context="logged_out_only"
data-cookie-banner-platform-context="off"
data-algolia-id="PRSOBFP46H"
data-algolia-search-key="9aa7d31610cba78851c9b1f63776a9dd"
data-algolia-display="true"
data-dynamic-url-component="bmar11"
data-ga4-tracking-id="G-TYEM8Y3JN3"
data-global-feature-flags-enabled="data_update_scripts onboarding_newsletter_content schedule_articles moderator_role display_ad_tags replace_unicorn_with_jump_to_comments article_id_adjusted_weight cloudflare_preferred_for_hosted_images multiple_reactions subscriber_icon ab_experiment_feed_strategy use_stories_endpoint digest_subject_testing digest_results_count_testing consistent_rendering discover_and_following_tabs hero_billboard onboarding_drip_emails algolia_frontend gemini_onboarding optimize_article_tag_query dev_core_user_sync personalized_email_digests community_favorites"
data-style-fingerprint="c75bfc6a82">
<script>
if (navigator.userAgent === 'ForemWebView/1' || window.frameElement) {
document.body.classList.add("hidden-shell");
}
if (new Date() > new Date("2026-02-04T09:00:00-05:00")) {
document.body.dataset.sideNavVisible = "false";
}
</script>
<link rel="stylesheet" href="https://assets.dev.to/assets/minimal-3a438d8d138f95f478f01cbe53363cacf36bc6c47172aeb2e6c9172eebe29aa6.css" media="all" id="secondary-minimal-stylesheet" />
<link rel="stylesheet" href="https://assets.dev.to/assets/views-ca4b6f6e9ec63c7deefbdd4067e585d752cd4b06c12da1a49c7b9644defa2758.css" media="all" id="secondary-views-stylesheet" />
<link rel="stylesheet" href="https://assets.dev.to/assets/crayons-537acd1cbd95b8d8d524dab489c8923b7316dd045ead39e7a2dbaa42cdc208b2.css" media="all" id="secondary-crayons-stylesheet" />
<div id="body-styles">
<style>
:root {
--accent-brand-lighter-rgb: 86, 105, 285;
--accent-brand-rgb: 64, 78, 211;
--accent-brand-darker-rgb: 51, 62, 169;
}
</style>
</div>
<div id="audiocontent" data-podcast="">
</div>
<div class="navigation-progress" id="navigation-progress"></div>
<header id="topbar" class="crayons-header topbar print-hidden">
<span id="route-change-target" tabindex="-1"></span>
<a href="#main-content" class="skip-content-link">Skip to content</a>
<div class="crayons-header__container">
<span class="inline-block m:hidden ">
<button class="c-btn c-btn--icon-alone js-hamburger-trigger mx-2">
<svg xmlns="http://www.w3.org/2000/svg" width="24" height="24" viewBox="0 0 24 24" role="img" aria-labelledby="aa4sl66ri2zjnc3ggwknz5zfpvzc1qvp" class="crayons-icon"><title id="aa4sl66ri2zjnc3ggwknz5zfpvzc1qvp">Navigation menu</title>
<path d="M3 4h18v2H3V4zm0 7h18v2H3v-2zm0 7h18v2H3v-2z"></path>
</svg>
</button>
</span>
<a href="/" class="site-logo" aria-label="DEV Community Home" >
<img class="site-logo__img"
src="https://media2.dev.to/dynamic/image/quality=100/https://dev-to-uploads.s3.amazonaws.com/uploads/logos/resized_logo_UQww2soKuUsjaOGNB38o.png"
style="aspect-ratio: 10 / 8"
alt="DEV Community">
</a>
<div class="crayons-header--search js-search-form" id="header-search">
<form accept-charset="UTF-8" method="get" action="/search" role="search">
<div class="crayons-fields crayons-fields--horizontal">
<div class="crayons-field flex-1 relative">
<input id="search-input" class="crayons-header--search-input crayons-textfield js-search-input" type="text" id="nav-search" name="q" placeholder="Find related posts..." autocomplete="off" />
<button type="submit" aria-label="Search" class="c-btn c-btn--icon-alone absolute inset-px right-auto mt-0 py-0">
<svg xmlns="http://www.w3.org/2000/svg" width="24" height="24" viewBox="0 0 24 24" role="img" aria-labelledby="asqv8mw9kiziv8tf2l9ltartxln5ppai" aria-hidden="true" class="crayons-icon"><title id="asqv8mw9kiziv8tf2l9ltartxln5ppai">Search</title>
<path d="M18.031 16.617l4.283 4.282-1.415 1.415-4.282-4.283A8.96 8.96 0 0111 20c-4.968 0-9-4.032-9-9s4.032-9 9-9 9 4.032 9 9a8.96 8.96 0 01-1.969 5.617zm-2.006-.742A6.977 6.977 0 0018 11c0-3.868-3.133-7-7-7-3.868 0-7 3.132-7 7 0 3.867 3.132 7 7 7a6.977 6.977 0 004.875-1.975l.15-.15z"></path>
</svg>
</button>
<a class="crayons-header--search-brand-indicator" href="https://www.algolia.com/developers/?utm_source=devto&utm_medium=referral" target="_blank" rel="noopener noreferrer">
Powered by Algolia
<svg xmlns="http://www.w3.org/2000/svg" id="Layer_1" width="24" height="24" viewBox="0 0 500 500.34" role="img" aria-labelledby="asip5wmxt4g10rfyo3guubjzs9a5rvsl" aria-hidden="true" class="crayons-icon"><title id="asip5wmxt4g10rfyo3guubjzs9a5rvsl">Search</title>
<defs></defs><path class="cls-1" d="M250,0C113.38,0,2,110.16,.03,246.32c-2,138.29,110.19,252.87,248.49,253.67,42.71,.25,83.85-10.2,120.38-30.05,3.56-1.93,4.11-6.83,1.08-9.52l-23.39-20.74c-4.75-4.22-11.52-5.41-17.37-2.92-25.5,10.85-53.21,16.39-81.76,16.04-111.75-1.37-202.04-94.35-200.26-206.1,1.76-110.33,92.06-199.55,202.8-199.55h202.83V407.68l-115.08-102.25c-3.72-3.31-9.43-2.66-12.43,1.31-18.47,24.46-48.56,39.67-81.98,37.36-46.36-3.2-83.92-40.52-87.4-86.86-4.15-55.28,39.65-101.58,94.07-101.58,49.21,0,89.74,37.88,93.97,86.01,.38,4.28,2.31,8.28,5.53,11.13l29.97,26.57c3.4,3.01,8.8,1.17,9.63-3.3,2.16-11.55,2.92-23.6,2.07-35.95-4.83-70.39-61.84-127.01-132.26-131.35-80.73-4.98-148.23,58.18-150.37,137.35-2.09,77.15,61.12,143.66,138.28,145.36,32.21,.71,62.07-9.42,86.2-26.97l150.36,133.29c6.45,5.71,16.62,1.14,16.62-7.48V9.49C500,4.25,495.75,0,490.51,0H250Z"></path>
</svg>
</a>
</div>
</div>
</form>
</div>
<div class="flex items-center h-100 ml-auto">
<div class="flex" id="authentication-top-nav-actions">
<span class="hidden m:block">
<a href="https://dev.to/enter?signup_subforem=1" class="c-link c-link--block mr-2 whitespace-nowrap ml-auto" data-no-instant>
Log in
</a>
</span>
<a href="https://dev.to/enter?signup_subforem=1&amp;state=new-user" data-tracking-id="ca_top_nav" data-tracking-source="top_navbar" class="c-cta c-cta--branded whitespace-nowrap mr-2" data-no-instant>
Create account
</a>
</div>
</div>
</div>
</header>
<div class="hamburger">
<div class="hamburger__content">
<header class="hamburger__content__header">
<h2 class="fs-l fw-bold flex-1 break-word lh-tight">DEV Community</h2>
<button class="c-btn c-btn--icon-alone js-hamburger-trigger shrink-0" aria-label="Close">
<svg xmlns="http://www.w3.org/2000/svg" width="24" height="24" viewBox="0 0 24 24" role="img" aria-labelledby="ak8wz59hr1n3uxss7za7gtprrdj05x68" aria-hidden="true" class="crayons-icon c-btn__icon"><title id="ak8wz59hr1n3uxss7za7gtprrdj05x68">Close</title><path d="M12 10.586l4.95-4.95 1.414 1.414-4.95 4.95 4.95 4.95-1.414 1.414-4.95-4.95-4.95 4.95-1.414-1.414 4.95-4.95-4.95-4.95L7.05 5.636l4.95 4.95z"></path></svg>
</button>
</header>
<div class="p-2 js-navigation-links-container" id="authentication-hamburger-actions">
</div>
</div>
<div class="hamburger__overlay js-hamburger-trigger"></div>
</div>
<div id="active-broadcast" class="broadcast-wrapper"></div>
<div id="page-content" class="wrapper stories stories-show articletag-microservices articletag-saga articleuser-145374" data-current-page="stories-show">
<div id="page-content-inner" data-internal-nav="false" data-viewable-id="1510071" data-viewable-type="Article">
<div id="page-route-change" class="screen-reader-only" aria-live="polite" aria-atomic="true"></div>
<style>
.html-variant-wrapper { display: none}
</style>
<script src="https://unpkg.com/@webcomponents/webcomponentsjs@2.2.10/webcomponents-loader.js"
integrity="sha384-3HK5hxQbkFqOIxMbpROlRmRtYl2LBZ52t+tqcjzsmr9NJuOWQxl8RgQSyFvq2lhy"
crossorigin="anonymous" defer></script>
<script src="https://assets.dev.to/assets/webShare-0686f0b9ac40589694ef6ae6a6202c44119bc781c254f6cf6d52d8a008461156.js" defer="defer"></script>
<script src="https://assets.dev.to/assets/articlePage-7386c745667022e7147503d288454cfce459f2019ee90ce454e641a116844837.js" defer="defer"></script>
<script src="https://assets.dev.to/assets/commentDropdowns-7a28d130e5b78d38b30a9495a964003a66bd64fa455fc70b766d69cf06b9ba24.js" defer="defer"></script>
<script type="application/ld+json">
{"@context":"http://schema.org","@type":"Article","mainEntityOfPage":{"@type":"WebPage","@id":"https://dev.to/siy/the-saga-is-antipattern-1354"},"url":"https://dev.to/siy/the-saga-is-antipattern-1354","image":["https://media2.dev.to/dynamic/image/width=1080,height=1080,fit=cover,gravity=auto,format=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F1p5sw2yv33a7wc10m57t.png","https://media2.dev.to/dynamic/image/width=1280,height=720,fit=cover,gravity=auto,format=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F1p5sw2yv33a7wc10m57t.png","https://media2.dev.to/dynamic/image/width=1600,height=900,fit=cover,gravity=auto,format=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F1p5sw2yv33a7wc10m57t.png"],"publisher":{"@context":"http://schema.org","@type":"Organization","name":"DEV Community","logo":{"@context":"http://schema.org","@type":"ImageObject","url":"https://media2.dev.to/dynamic/image/width=192,height=,fit=scale-down,gravity=auto,format=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F8j7kvp660rqzt99zui8e.png","width":"192","height":"192"}},"headline":"The Saga is Antipattern","author":{"@context":"http://schema.org","@type":"Person","url":"https://dev.to/siy","name":"Sergiy Yevtushenko"},"datePublished":"2023-06-20T00:28:16Z","dateModified":"2023-06-20T00:29:30Z","mainEntity":{"@type":"DiscussionForumPosting","@id":"#article-discussion-1510071","headline":"The Saga is Antipattern","text":"\u003cp\u003eThe Saga pattern is often positioned as a better way to handle distributed transactions. I see no point in discussing Saga's disadvantages because the problem is that Saga should not be used in the microservices at all:\u003c/p\u003e\n\n\u003cblockquote\u003e\n\u003cp\u003eIf you need distributed transactions across a few microservices, most likely you incorrectly defined and separated domains.\u003c/p\u003e\n\u003c/blockquote\u003e\n\n\u003cp\u003eBelow is a long explanation why.\u003c/p\u003e\n\n\u003ch2\u003e\n \u003ca name=\"microservices-as-distributed-system\" href=\"#microservices-as-distributed-system\"\u003e\n \u003c/a\u003e\n Microservices As Distributed System\n\u003c/h2\u003e\n\n\u003cp\u003eAny microservices-based system is a distributed system. To be precise — the simplest possible, basic version of it. Such a distributed system does not maintain any form of consensus. In other words, such a system:\u003c/p\u003e\n\n\u003cul\u003e\n\u003cli\u003eLacks any built-in means to coordinate nodes\u003c/li\u003e\n\u003cli\u003eLacks any built-in means to get information about nodes\u003c/li\u003e\n\u003cli\u003eIf nodes need to communicate, such a communication must be a part of business logic\u003c/li\u003e\n\u003c/ul\u003e\n\n\u003cp\u003eThese properties result in an inability of a microservices-based system to perform certain tasks. For example, perform transactions. Or maintain consistency (even eventual). Or get information if all necessary nodes are up and running (i.e. if the system is available). As a result, if one node needs a piece of information from the other node, it should explicitly include a request to remote service as one of the business steps. It looks surprisingly similar to interactions between, for example, browsers and web servers. Note, that such interaction means that each request is completely independent of each other. All transactions, if they are necessary, never cross request boundaries. Only with such a deep separation of domains, it makes sense to require a microservice to maintain its own data, independently and separately. Or claim independent deployability or testability. Or accept a possibly failed request to another node as an explicit step in business logic.\u003c/p\u003e\n\n\u003cblockquote\u003e\n\u003cp\u003eSince no transaction can cross the request boundary, the service must govern all data included in the transaction. This could be considered a validation criteria for the separation of domains. If any cross-service transaction is necessary, then split-up was done incorrectly.\u003c/p\u003e\n\u003c/blockquote\u003e\n\n\u003ch2\u003e\n \u003ca name=\"domain-size-issue\" href=\"#domain-size-issue\"\u003e\n \u003c/a\u003e\n Domain Size Issue\n\u003c/h2\u003e\n\n\u003cp\u003eAs soon as we start doing separation of domains according to data governance, we may quickly realize that in the vast majority of cases, microservices look a lot like traditional monoliths and the domain they should handle is big. Or realize that traditional monoliths are, in fact, microservices. This happens because most organizations have only a very limited number of truly independent domains. Most often — one.\u003c/p\u003e\n\n\u003cp\u003eUnfortunately, the whole microservices hype ignores this fact, and we get \"best practices\", \"design patterns\", books, articles, etc. which are stretching the initial idea of loosely coupled independent services to areas where it does not fit. This results in a mind-blowing, devastating consequences:\u003c/p\u003e\n\n\u003cul\u003e\n\u003cli\u003eWe build unreliable systems (see above about what kind of distributed systems microservices are) on top of reliable ones (cloud infrastructure)\u003c/li\u003e\n\u003cli\u003eWe get ugly, inherently broken design, where layers are mixed up, communication error handling/retrying/etc. and transaction handling happens at the business logic level\u003c/li\u003e\n\u003cli\u003eWe split data into parts and then try to collect them to process the request, introducing unpredictable and barely controllable tail latency\u003c/li\u003e\n\u003cli\u003eWe get the systems, which are unable to ensure data integrity and consistency\u003c/li\u003e\n\u003cli\u003eWe ought to perform end-to-end testing before deployment because there are no guarantees that a new version of service does not break the whole system. This completely obviates any independent testability and deployability of the services\u003c/li\u003e\n\u003c/ul\u003e\n\n\u003cp\u003eThe list above is definitely incomplete. Incorrectly applied microservices can cause all kinds of harm. Especially when combined with \"cloud native\" \"microservices\" frameworks like Spring, which turn the whole system into a bunch of slowly moving monoliths.\u003c/p\u003e\n\n\u003cp\u003eAll advantages and requirements, which are inherent properties and natural fit for the microservices, either disappear or get transformed into quite painful and expensive obstacles.\u003c/p\u003e\n\n\u003cp\u003eUnfortunately, all these considerations might result in much bigger domains than could be considered acceptable for traditional microservices design. That’s fine and just means that we should not use microservices. What can we use then? Let’s take a look.\u003c/p\u003e\n\n\u003ch2\u003e\n \u003ca name=\"handling-big-domain\" href=\"#handling-big-domain\"\u003e\n \u003c/a\u003e\n Handling Big Domain\n\u003c/h2\u003e\n\n\u003cp\u003eSince we’re going to handle a big, but single domain, we need to use something capable to maintain consensus. There are at least three options:\u003c/p\u003e\n\n\u003cul\u003e\n\u003cli\u003eModular monolith (also known as modulith)\u003c/li\u003e\n\u003cli\u003eEvent-driven architecture\u003c/li\u003e\n\u003cli\u003eCluster-based architecture\u003c/li\u003e\n\u003c/ul\u003e\n\n\u003ch3\u003e\n \u003ca name=\"modular-monolith\" href=\"#modular-monolith\"\u003e\n \u003c/a\u003e\n Modular Monolith\n\u003c/h3\u003e\n\n\u003cp\u003eThis option addresses most monolith pain points, in particular maintainability and concurrent development. Mostly, this is achieved by improving design via application of DDD and other techniques. The ability to access all data, perform regular transactions and lack of communication errors makes this approach an appealing choice for many use cases. In addition, this approach is much easier to fix/rework/refactor/update in atomic fashion during system evolution. Note that inner sub-services are not required to maintain their own data (but they can, if necessary). Shared data is often inherent and natural in this approach, as we’re talking about a single domain. Since this is just a monolith, after all, there are no issues with maintaining the consensus nor deployment/monitoring/maintenance.\u003c/p\u003e\n\n\u003cp\u003eThe main disadvantage of moduliths is the limited scalability. At some point, there might be a need to switch to another design. Fortunately, modularity significantly simplifies the transition.\u003c/p\u003e\n\n\u003ch3\u003e\n \u003ca name=\"eventdriven-architecture-eda\" href=\"#eventdriven-architecture-eda\"\u003e\n \u003c/a\u003e\n Event-Driven Architecture (EDA)\n\u003c/h3\u003e\n\n\u003cp\u003eEDA is quite a popular choice and while often it is mentioned in the context of microservices, this is incorrect. By design, EDA leverages reliable data sharing infrastructure in the form of message brokers or pub-sub service, which explicitly conflicts with how microservices maintain their data. Overall, this architecture is described in detail in many sources, so I see no point to repeating them here.\u003cbr\u003e\nIts main disadvantage is the similarity to microservices regarding reliance on infrastructure, complex deployment, monitoring, etc.\u003c/p\u003e\n\n\u003ch3\u003e\n \u003ca name=\"clusterbased-architecture\" href=\"#clusterbased-architecture\"\u003e\n \u003c/a\u003e\n Cluster-based Architecture\n\u003c/h3\u003e\n\n\u003cp\u003e\u003ca href=\"https://dev.to/siy/nanoservices-or-alternative-to-monoliths-and-microservices-12bb\"\u003eThis design\u003c/a\u003e is quite a rare animal. It has several advantages, but a few worth being noted separately:\u003c/p\u003e\n\n\u003cul\u003e\n\u003cli\u003eSimplicity of transition to this architecture from modulith\u003c/li\u003e\n\u003cli\u003eNo reliance on infrastructure. Often, the whole system is self-contained, could be deployed on premises, in the cloud or across several clouds\u003c/li\u003e\n\u003cli\u003eSimplicity of deployment — there is only one deployable artifact\u003c/li\u003e\n\u003cli\u003eNearly linear scalability\u003c/li\u003e\n\u003cli\u003eReal fault tolerance — failed node does not bring down the whole system nor results in error being returned from request. Requests are just somewhat slower processed\u003c/li\u003e\n\u003cli\u003eGreat resource utilization, fine-grained two level scaling\u003c/li\u003e\n\u003c/ul\u003e\n\n\u003ch2\u003e\n \u003ca name=\"conclusion\" href=\"#conclusion\"\u003e\n \u003c/a\u003e\n Conclusion\n\u003c/h2\u003e\n\n\u003cp\u003eMicroservices were thought of as a way to solve problems, but their blind application causes more harm than good. The main issue is that there are no clear criteria, where they are applicable. I have no illusions, my article will not solve this problem, but at least it provides some meaningful criteria to assess where microservices should not be used.\u003c/p\u003e\n\n","author":{"@type":"Person","name":"Sergiy Yevtushenko","url":"https://dev.to/siy"},"datePublished":"2023-06-20T00:28:16Z","dateModified":"2023-06-20T00:29:30Z","url":"https://dev.to/siy/the-saga-is-antipattern-1354","interactionStatistic":[{"@type":"InteractionCounter","interactionType":"https://schema.org/CommentAction","userInteractionCount":19},{"@type":"InteractionCounter","interactionType":"https://schema.org/LikeAction","userInteractionCount":25}],"comment":[{"@type":"Comment","@id":"#comment-1050553","text":"\u003cp\u003eI do not feel as though you've made your point. You made a claim, then backed it up by making more claims, and then went on to talk about different design patterns.\u003c/p\u003e\n\n\u003cp\u003eSagas are not only for microservices. You can have the need to perform distributed transactions even in a monolith. Also, not all transactions terminate within your organization's code.\u003c/p\u003e\n\n\u003cp\u003eImagine a ticketing system where my application collects payment by sending HTTP to one third party, and then books a ticket by sending to another third party.\u003c/p\u003e\n\n\u003cp\u003eIf the second request fails, then I should unwind and roll back. Sure, it's trivial in this case, but I think that is the argument for a saga pattern.\u003c/p\u003e\n\n","author":{"@type":"Person","name":"Kirill Birger","url":"https://dev.to/kbirgerdev"},"datePublished":"2023-07-03T19:42:23Z","dateModified":"2023-07-03T19:42:23Z","url":"https://dev.to/kbirgerdev/comment/27k1n","interactionStatistic":[{"@type":"InteractionCounter","interactionType":"https://schema.org/LikeAction","userInteractionCount":6}],"comment":[{"@type":"Comment","@id":"#comment-1050702","text":"\u003cp\u003eThanks for your comment. Let's analyze it step by step:\u003c/p\u003e\n\n\u003cblockquote\u003e\n\u003cp\u003eYou made a claim, then backed it up by making more claims, and then went on to talk about different design patterns.\u003c/p\u003e\n\u003c/blockquote\u003e\n\n\u003cp\u003eI guess you're mixing up my article with regular microservices' propaganda, which is based on making claims without bothering with evidence or reasoning. What you call \"claims\" are basic facts about distributed systems in general and microservices in particular. Since my goal is not click-baiting, but educating, besides \"claims\" I'm also providing information about approaches suitable for cases, where microservices are not applicable. \u003c/p\u003e\n\n\u003cblockquote\u003e\n\u003cp\u003eSagas are not only for microservices. You can have the need to perform distributed transactions even in a monolith. Also, not all transactions terminate within your organization's code.\u003c/p\u003e\n\u003c/blockquote\u003e\n\n\u003cp\u003eThe problem is not with Saga, which definitely has its own areas of application (for example, state management in UI apps). The problem is attempting to perform distributed transactions in systems which are inherently incapable of performing them. Like microservices. And yes, you may have such a need, but the presence of need does not mean the presence of ability. \u003c/p\u003e\n\n\u003cblockquote\u003e\n\u003cp\u003eImagine a ticketing system where my application collects payment by sending HTTP to one third party, and then books a ticket by sending to another third party. If the second request fails, then I should unwind and roll back. Sure, it's trivial in this case, but I think that is the argument for a saga pattern.\u003c/p\u003e\n\u003c/blockquote\u003e\n\n\u003cp\u003eThanks for this example. I don't know why you consider it trivial, but even in this case you can easily observe the consequences of a lack of consensus:\u003c/p\u003e\n\n\u003cul\u003e\n\u003cli\u003eImagine that your call for payment collection terminates with the timeout, and the same happens with the compensation operation. Your system and external payment processing system now may have different opinion about the status of the payment\u003c/li\u003e\n\u003cli\u003eEven more funny case happens if payment is processed successfully, but then the booking of ticket timeouts and exactly the same happens with the compensation operation for payment. Now every system may have its own understanding of what happened and what is the state of each part of the user request (payment and tickets)\u003c/li\u003e\n\u003c/ul\u003e\n\n\u003cp\u003eOf course, in both cases mentioned above, you may try to recover and restore a consistent view of the data across all systems. This will require additional steps outside the Saga pattern, and recovery still may fail, causing even more mess. Adding each additional step exponentially increases the number of possible inconsistencies.\u003c/p\u003e\n\n","author":{"@type":"Person","name":"Sergiy Yevtushenko","url":"https://dev.to/siy"},"datePublished":"2023-07-04T08:50:49Z","dateModified":"2023-07-04T08:55:51Z","url":"https://dev.to/siy/comment/27k7g","interactionStatistic":[{"@type":"InteractionCounter","interactionType":"https://schema.org/LikeAction","userInteractionCount":2}],"parentItem":{"@type":"Comment","@id":"#comment-1050553"}}]},{"@type":"Comment","@id":"#comment-1050145","text":"\u003cp\u003eGreat article. \u003c/p\u003e\n\n","author":{"@type":"Person","name":"Khaled Hosseini","url":"https://dev.to/khaledhosseini"},"datePublished":"2023-07-02T19:42:43Z","dateModified":"2023-07-02T19:42:43Z","url":"https://dev.to/khaledhosseini/comment/27jc5","interactionStatistic":[{"@type":"InteractionCounter","interactionType":"https://schema.org/LikeAction","userInteractionCount":2}]},{"@type":"Comment","@id":"#comment-1055399","text":"\u003cp\u003eI'm not sure you understand what the saga pattern is and what it solves. It has nothing to do with consensus among nodes. Hence the invalidity of your arguments. It has to do with coordinating the states of long-running business process, where the transition between states can be milliseconds or days. \"Transactions\" in the sense your describe in your argument area irrelevant in this context.\u003c/p\u003e\n\n","author":{"@type":"Person","name":"David Alexis","url":"https://dev.to/davealexis"},"datePublished":"2023-07-16T17:28:27Z","dateModified":"2023-07-16T17:28:27Z","url":"https://dev.to/davealexis/comment/28167","interactionStatistic":[{"@type":"InteractionCounter","interactionType":"https://schema.org/LikeAction","userInteractionCount":1}],"comment":[{"@type":"Comment","@id":"#comment-1055447","text":"\u003cp\u003eThat's correct, strictly speaking the Saga pattern has nothing to do with consensus. But it performs coordination of involved nodes and coordination in distributed system requires consensus. You also may find interesting to take a look into other thread, where you can find example.\u003c/p\u003e\n\n","author":{"@type":"Person","name":"Sergiy Yevtushenko","url":"https://dev.to/siy"},"datePublished":"2023-07-16T22:01:39Z","dateModified":"2023-07-16T22:01:39Z","url":"https://dev.to/siy/comment/28183","interactionStatistic":[{"@type":"InteractionCounter","interactionType":"https://schema.org/LikeAction","userInteractionCount":1}],"parentItem":{"@type":"Comment","@id":"#comment-1055399"}}]},{"@type":"Comment","@id":"#comment-1380809","text":"\u003cp\u003eWhere did you take this from \"EDA leverages reliable data sharing\" - What does it mean ? This sounds as a sophism to permit you conclude with \"which explicitly conflicts with how microservices maintain their data\". \u003c/p\u003e\n\n\u003cp\u003eHow \"Event-Driven Architecture (EDA) \" is going to \"maintain consensus\". Even cluster-based will have it's own problems with it. And \"This design\" is the link to one of your own articles on \"Nanoservices\". And how does it solve the problem that Saga patterns solves ?\u003c/p\u003e\n\n\u003cp\u003eHow Cluster-based Architecture solves the consistency across clusters ?\u003c/p\u003e\n\n\u003cp\u003eWhat are you references ? Where did you inspire from ? \u003c/p\u003e\n\n\u003cp\u003eWhat are you talking about ? Can you take just one, lets say Cluster-based Architecture and show how it solves data consistency problem better than SAGA pattern ?\u003c/p\u003e\n\n","author":{"@type":"Person","name":"Mircea Sirghi","url":"https://dev.to/hackus"},"datePublished":"2025-08-12T10:39:05Z","dateModified":"2025-08-12T10:39:05Z","url":"https://dev.to/hackus/comment/30eg1","interactionStatistic":[{"@type":"InteractionCounter","interactionType":"https://schema.org/LikeAction","userInteractionCount":0}],"comment":[{"@type":"Comment","@id":"#comment-1384840","text":"\u003cp\u003eThe queue/stream or pub-sub service is shared between publisher and consumer. And usually implemented using some clustered solution, which could be considered reliable.\u003c/p\u003e\n\n\u003cp\u003eEDA maintains eventual consistency by leveraging ACID transactions in DB (which don't have to be split as with microservices) + method-specific message delivery guarantees (for example, \"at least once\") + idempotency (to turn \"at least once\" into \"exactly once\"). Together this combination forms an eventually consistent system, which does not suffer from data loss or corruption. \u003c/p\u003e\n\n\u003cp\u003eClustered architecture can implement 2PC by itself or just use ACID transactions provided by modern grids like Apache Ignite.\u003c/p\u003e\n\n\u003cp\u003eAll these solutions are generic, i.e. don't need to implement every single transaction in the system from scratch, like it's necessary for Saga. And they don't suffer from data versioning issues, like Saga. DB-based ACID transactions also provide additional guarantees by leveraging DB schema constraints.\u003c/p\u003e\n\n","author":{"@type":"Person","name":"Sergiy Yevtushenko","url":"https://dev.to/siy"},"datePublished":"2025-08-23T11:18:57Z","dateModified":"2025-08-23T11:18:57Z","url":"https://dev.to/siy/comment/30kf2","interactionStatistic":[{"@type":"InteractionCounter","interactionType":"https://schema.org/LikeAction","userInteractionCount":1}],"parentItem":{"@type":"Comment","@id":"#comment-1380809"}}]},{"@type":"Comment","@id":"#comment-1050914","text":"\u003cp\u003eI read the whole article, but I didn't get your point. Now, what is the alternative to using Saga? Maybe, it was much nicer if you made your point progressively by making some examples. At least, you should have mentioned some references for extra reading.\u003c/p\u003e\n\n","author":{"@type":"Person","name":"Khosro Pakmanesh","url":"https://dev.to/khosropakmanesh"},"datePublished":"2023-07-04T18:54:07Z","dateModified":"2023-07-04T18:54:07Z","url":"https://dev.to/khosropakmanesh/comment/27kfk","interactionStatistic":[{"@type":"InteractionCounter","interactionType":"https://schema.org/LikeAction","userInteractionCount":0}],"comment":[{"@type":"Comment","@id":"#comment-1050997","text":"\u003cp\u003eThe point is explicitly stated at the beginning:\u003c/p\u003e\n\n\u003cblockquote\u003e\n\u003cp\u003eIf you need distributed transactions across a few microservices, most likely you incorrectly defined and separated domains.\u003c/p\u003e\n\u003c/blockquote\u003e\n\n\u003cp\u003eSo, there can't be any alternatives. Instead, application should be designed using other approaches, which have no problems with handling transactions. Possible approaches are listed and discussed in article.\u003c/p\u003e\n\n","author":{"@type":"Person","name":"Sergiy Yevtushenko","url":"https://dev.to/siy"},"datePublished":"2023-07-05T02:58:07Z","dateModified":"2023-07-05T02:58:07Z","url":"https://dev.to/siy/comment/27kip","interactionStatistic":[{"@type":"InteractionCounter","interactionType":"https://schema.org/LikeAction","userInteractionCount":2}],"parentItem":{"@type":"Comment","@id":"#comment-1050914"}}]},{"@type":"Comment","@id":"#comment-1442167","text":"\u003cp\u003eAmen. Its 2026 and the microservices hype wave is still going on\u003c/p\u003e\n\n","author":{"@type":"Person","name":"Alfonso García-Patiño Barbolani","url":"https://dev.to/barbolani"},"datePublished":"2026-01-28T06:09:20Z","dateModified":"2026-01-28T06:09:20Z","url":"https://dev.to/barbolani/comment/3419p","interactionStatistic":[{"@type":"InteractionCounter","interactionType":"https://schema.org/LikeAction","userInteractionCount":1}],"comment":[{"@type":"Comment","@id":"#comment-1443346","text":"\u003cp\u003eThings may change soon: \u003ca href=\"https://dev.to/siy/fail-safe-your-legacy-java-in-one-sprint-d2b\" rel=\"nofollow\"\u003edev.to/siy/fail-safe-your-legacy-j...\u003c/a\u003e\u003c/p\u003e\n\n","author":{"@type":"Person","name":"Sergiy Yevtushenko","url":"https://dev.to/siy"},"datePublished":"2026-01-30T08:00:17Z","dateModified":"2026-01-30T08:00:17Z","url":"https://dev.to/siy/comment/34338","interactionStatistic":[{"@type":"InteractionCounter","interactionType":"https://schema.org/LikeAction","userInteractionCount":1}],"parentItem":{"@type":"Comment","@id":"#comment-1442167"}}]}]}}
</script>
<div class="crayons-layout crayons-layout--3-cols crayons-layout--article">
<aside class="crayons-layout__sidebar-left" aria-label="Article actions">
<script>
if (/Twitter for (iPhone|iPad|Android)/i.test(navigator.userAgent)) {
document.documentElement.classList.add('is-twitter-in-app');
}
</script>
<style>
.community-leader-visible-block {
display: none !important;
}
.trusted-visible-block {
display: none !important;
}
.only-sidebar-menu-item {
display: none !important;
}
@media (min-width: 640px) {
body.community-leader-status-true .only-sidebar-menu-item.community-leader-visible-block {
display: block !important;
}
body.trusted-status-true .only-sidebar-menu-item.trusted-visible-block {
display: block !important;
}
}
.only-mobile-menu-item {
display: none !important;
}
body.community-leader-status-true .only-mobile-menu-item.community-leader-visible-block {
display: block !important;
}
body.trusted-status-true .only-mobile-menu-item.trusted-visible-block {
display: block !important;
}
@media (min-width: 640px) {
body.community-leader-status-true .only-mobile-menu-item.community-leader-visible-block {
display: none !important;
}
body.trusted-status-true .only-mobile-menu-item.trusted-visible-block {
display: none !important;
}
}
.crayons-reaction__count {
line-height: 18px !important;
height: 18px !important;
min-height: 18px !important;
display: inline-flex !important;
align-items: center !important;
justify-content: center !important;
}
@media (min-width: 768px) {
.crayons-reaction__count {
display: flex !important;
}
}
.crayons-reaction__count > span {
height: 16px !important;
width: 16px !important;
padding: 0 !important;
display: inline-block !important;
}
</style>
<div class="crayons-article-actions print-hidden">
<div class="crayons-article-actions__inner">
<div class="reaction-drawer__outer hoverdown" style="">
<button
id="reaction-drawer-trigger"
aria-label="reaction-drawer-trigger"
aria-pressed="false"
class="hoverdown-trigger crayons-reaction pseudo-reaction crayons-tooltip__activator relative">
<span class="crayons-reaction__icon crayons-reaction__icon--borderless crayons-reaction--like crayons-reaction__icon--inactive" style="width: 40px; height: 40px">
<svg xmlns="http://www.w3.org/2000/svg" width="24" height="24" viewBox="0 0 24 24" fill="none" role="img" aria-hidden="true" class="crayons-icon">
<g clip-path="url(#clip0_988_3276)">
<path d="M19 14V17H22V19H18.999L19 22H17L16.999 19H14V17H17V14H19ZM20.243 4.75698C22.505 7.02498 22.583 10.637 20.479 12.992L19.059 11.574C20.39 10.05 20.32 7.65998 18.827 6.16998C17.324 4.67098 14.907 4.60698 13.337 6.01698L12.002 7.21498L10.666 6.01798C9.09103 4.60598 6.67503 4.66798 5.17203 6.17198C3.68203 7.66198 3.60703 10.047 4.98003 11.623L13.412 20.069L12 21.485L3.52003 12.993C1.41603 10.637 1.49503 7.01898 3.75603 4.75698C6.02103 2.49298 9.64403 2.41698 12 4.52898C14.349 2.41998 17.979 2.48998 20.242 4.75698H20.243Z" fill="#525252"></path>
</g>
<defs>
<clipPath id="clip0_988_3276">
<rect width="24" height="24" fill="white"></rect>
</clipPath>
</defs>
</svg>
</span>
<span class="crayons-reaction__icon crayons-reaction__icon--borderless crayons-reaction__icon--active" style="width: 40px; height: 40px">
<img aria_hidden="true" height="24" width="24" src="https://assets.dev.to/assets/heart-plus-active-9ea3b22f2bc311281db911d416166c5f430636e76b15cd5df6b3b841d830eefa.svg" />
</span>
<span class="crayons-reaction__count" id="reaction_total_count">
<span class="bg-base-40 opacity-25 inline-block radius-default" style="height: 16px; width: 16px;"></span>
</span>
<span class="crayons-tooltip__content">
Add reaction
</span>
</button>
<div class="reaction-drawer" aria-expanded="false">
<div class="reaction-drawer__container">
<button
id="reaction-butt-like"
name="Like"
aria-label="Like"
aria-pressed="false"
class="crayons-reaction crayons-tooltip__activator relative pt-2 pr-2 pb-1 pl-2"
data-category="like">
<span class="crayons-reaction__icon crayons-reaction__icon--inactive p-0">
<img aria_hidden="true" height="32" width="32" src="https://assets.dev.to/assets/sparkle-heart-5f9bee3767e18deb1bb725290cb151c25234768a0e9a2bd39370c382d02920cf.svg" />
</span>
<span class="crayons-reaction__count" id="reaction-number-like"><span class="bg-base-40 opacity-25 p-2 inline-block radius-default"></span></span>
<span data-testid="tooltip" class="crayons-tooltip__content">
Like
</span>
</button>
<button
id="reaction-butt-unicorn"
name="Unicorn"
aria-label="Unicorn"
aria-pressed="false"
class="crayons-reaction crayons-tooltip__activator relative pt-2 pr-2 pb-1 pl-2"
data-category="unicorn">
<span class="crayons-reaction__icon crayons-reaction__icon--inactive p-0">
<img aria_hidden="true" height="32" width="32" src="https://assets.dev.to/assets/multi-unicorn-b44d6f8c23cdd00964192bedc38af3e82463978aa611b4365bd33a0f1f4f3e97.svg" />
</span>
<span class="crayons-reaction__count" id="reaction-number-unicorn"><span class="bg-base-40 opacity-25 p-2 inline-block radius-default"></span></span>
<span data-testid="tooltip" class="crayons-tooltip__content">
Unicorn
</span>
</button>
<button
id="reaction-butt-exploding_head"
name="Exploding Head"
aria-label="Exploding Head"
aria-pressed="false"
class="crayons-reaction crayons-tooltip__activator relative pt-2 pr-2 pb-1 pl-2"
data-category="exploding_head">
<span class="crayons-reaction__icon crayons-reaction__icon--inactive p-0">
<img aria_hidden="true" height="32" width="32" src="https://assets.dev.to/assets/exploding-head-daceb38d627e6ae9b730f36a1e390fca556a4289d5a41abb2c35068ad3e2c4b5.svg" />
</span>
<span class="crayons-reaction__count" id="reaction-number-exploding_head"><span class="bg-base-40 opacity-25 p-2 inline-block radius-default"></span></span>
<span data-testid="tooltip" class="crayons-tooltip__content">
Exploding Head
</span>
</button>
<button
id="reaction-butt-raised_hands"
name="Raised Hands"
aria-label="Raised Hands"
aria-pressed="false"
class="crayons-reaction crayons-tooltip__activator relative pt-2 pr-2 pb-1 pl-2"
data-category="raised_hands">
<span class="crayons-reaction__icon crayons-reaction__icon--inactive p-0">
<img aria_hidden="true" height="32" width="32" src="https://assets.dev.to/assets/raised-hands-74b2099fd66a39f2d7eed9305ee0f4553df0eb7b4f11b01b6b1b499973048fe5.svg" />
</span>
<span class="crayons-reaction__count" id="reaction-number-raised_hands"><span class="bg-base-40 opacity-25 p-2 inline-block radius-default"></span></span>
<span data-testid="tooltip" class="crayons-tooltip__content">
Raised Hands
</span>
</button>
<button
id="reaction-butt-fire"
name="Fire"
aria-label="Fire"
aria-pressed="false"
class="crayons-reaction crayons-tooltip__activator relative pt-2 pr-2 pb-1 pl-2"
data-category="fire">
<span class="crayons-reaction__icon crayons-reaction__icon--inactive p-0">
<img aria_hidden="true" height="32" width="32" src="https://assets.dev.to/assets/fire-f60e7a582391810302117f987b22a8ef04a2fe0df7e3258a5f49332df1cec71e.svg" />
</span>
<span class="crayons-reaction__count" id="reaction-number-fire"><span class="bg-base-40 opacity-25 p-2 inline-block radius-default"></span></span>
<span data-testid="tooltip" class="crayons-tooltip__content">
Fire
</span>
</button>
</div>
</div>
</div>
<button
id="reaction-butt-comment"
aria-label="Jump to Comments"
aria-pressed="false"
class="crayons-reaction crayons-reaction--comment crayons-tooltip__activator relative"
data-category="comment">
<span class="crayons-reaction__icon crayons-reaction__icon--borderless crayons-reaction__icon--inactive">
<svg xmlns="http://www.w3.org/2000/svg" width="24" height="24" viewBox="0 0 24 24" role="img" aria-hidden="true" class="crayons-icon">
<path d="M10 3h4a8 8 0 010 16v3.5c-5-2-12-5-12-11.5a8 8 0 018-8zm2 14h2a6 6 0 000-12h-4a6 6 0 00-6 6c0 3.61 2.462 5.966 8 8.48V17z"></path>
</svg>
</span>
<span class="crayons-reaction__count" id="reaction-number-comment" data-count="19">
<span class="bg-base-40 opacity-25 inline-block radius-default" style="height: 16px; width: 16px;"></span>
</span>
<span data-testid="tooltip" class="crayons-tooltip__content">
Jump to Comments
</span>
</button>
<button
id="reaction-butt-readinglist"
aria-label="Add to reading list"
aria-pressed="false"
class="crayons-reaction crayons-reaction--readinglist crayons-tooltip__activator relative"
data-category="readinglist">
<span class="crayons-reaction__icon crayons-reaction__icon--borderless crayons-reaction__icon--inactive">
<svg xmlns="http://www.w3.org/2000/svg" width="24" height="24" viewBox="0 0 24 24" role="img" aria-hidden="true" class="crayons-icon">
<path d="M5 2h14a1 1 0 011 1v19.143a.5.5 0 01-.766.424L12 18.03l-7.234 4.536A.5.5 0 014 22.143V3a1 1 0 011-1zm13 2H6v15.432l6-3.761 6 3.761V4z"></path>
</svg>
</span>
<span class="crayons-reaction__count" id="reaction-number-readinglist"><span class="bg-base-40 opacity-25 inline-block radius-default" style="height: 16px; width: 16px;"></span></span>
<span data-testid="tooltip" class="crayons-tooltip__content">
Save
</span>
</button>
<button
id="reaction-butt-boost"
aria-label="Boost"
aria-pressed="false"
class="crayons-reaction crayons-reaction--boost crayons-tooltip__activator relative">
<span class="crayons-reaction__icon crayons-reaction__icon--borderless crayons-reaction__icon--inactive">
<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24" fill="currentColor" role="img" aria-hidden="true" class="crayons-icon" width="24" height="24">
<path transform="translate(24,0) scale(-1,1)" d="M6 4H21C21.5523 4 22 4.44772 22 5V12H20V6H6V9L1 5L6 1V4ZM18 20H3C2.44772 20 2 19.5523 2 19V12H4V18H18V15L23 19L18 23V20Z"></path>
</svg>
</span>
<span data-testid="tooltip" class="crayons-tooltip__content">
Boost
</span>
</button>
<div class="only-sidebar-menu-item community-leader-visible-block align-center">
<span class="favorite-control-root" data-favorite-control="true" data-variant="article" data-favoritable-type="Article" data-favoritable-id="1510071" data-favoritable-user-id="145374" data-favorited="false" data-label-favorite="Pick as gem" data-label-favorited="Picked as gem" data-label-favorited-by-you="Picked as gem by you" data-modal-title="Gem Picked!" data-modal-body="You&#39;ve picked this as a community gem!" data-modal-remaining-zero="You have no more gems left to give out today." data-modal-remaining-one="You have 1 more gem left to give out today." data-modal-remaining-other="You have %{count} more gems left to give out today." data-modal-remaining-unlimited="You have unlimited gems to give out." data-modal-close="Got it" data-modal-exhausted-title="Out of Gems" data-modal-exhausted-body="You have no more gems left to give out today. Your allowance will refresh soon!" data-modal-exhausted-close="Got it"><button type="button" class="favorite-reaction favorite-control crayons-tooltip__activator relative" aria-label="Pick as gem"><span class="crayons-reaction__icon crayons-reaction__icon--borderless"><svg xmlns="http://www.w3.org/2000/svg" width="24" height="24" viewBox="0 0 24 24" role="img" class="crayons-icon crayons-icon--default"><path d="M5.95 3.5h12.1L23.5 9 12 20.5.5 9 5.95 3.5z" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round"></path></svg>
</span><span data-testid="tooltip" class="crayons-tooltip__content">Pick as gem</span></button></span>
</div>
<div id="mod-actions-menu-btn-area" class="only-sidebar-menu-item trusted-visible-block align-center">
</div>
<div class="align-center m:relative">
<button id="article-show-more-button" aria-controls="article-show-more-dropdown" aria-expanded="false" aria-haspopup="true" class="dropbtn crayons-btn crayons-btn--ghost-dimmed crayons-btn--icon-rounded" aria-label="Share post options">
<svg xmlns="http://www.w3.org/2000/svg" width="24" height="24" role="img" aria-labelledby="a97kpzary2kxhxu5u2kwf8qgkq1h6oun" aria-hidden="true" class="crayons-icon dropdown-icon"><title id="a97kpzary2kxhxu5u2kwf8qgkq1h6oun">More...</title><path fill-rule="evenodd" clip-rule="evenodd" d="M7 12a2 2 0 11-4 0 2 2 0 014 0zm7 0a2 2 0 11-4 0 2 2 0 014 0zm5 2a2 2 0 100-4 2 2 0 000 4z"></path></svg>
</button>
<div id="article-show-more-dropdown" class="crayons-dropdown side-bar left-2 right-2 m:right-auto m:left-100 s:left-auto mb-1 m:mb-0 top-unset bottom-100 m:top-0 m:bottom-unset">
<div>
<button
id="copy-post-url-button"
class="flex justify-between crayons-link crayons-link--block w-100 bg-transparent border-0"
data-postUrl="https://dev.to/siy/the-saga-is-antipattern-1354">
<span class="fw-bold">Copy link</span>
<svg xmlns="http://www.w3.org/2000/svg" width="24" height="24" viewBox="0 0 24 24" id="article-copy-icon" role="img" aria-labelledby="atjx7gbtbx81id992mipr7d5adfmcxq6" aria-hidden="true" class="crayons-icon mx-2 shrink-0"><title id="atjx7gbtbx81id992mipr7d5adfmcxq6">Copy link</title>
<path d="M7 6V3a1 1 0 011-1h12a1 1 0 011 1v14a1 1 0 01-1 1h-3v3c0 .552-.45 1-1.007 1H4.007A1 1 0 013 21l.003-14c0-.552.45-1 1.007-1H7zm2 0h8v10h2V4H9v2zm-2 5v2h6v-2H7zm0 4v2h6v-2H7z"></path>
</svg>
</button>
<div id="article-copy-link-announcer" aria-live="polite" class="crayons-notice crayons-notice--success my-2 p-1" aria-live="polite" hidden>Copied to Clipboard</div>
</div>
<div class="Desktop-only">
<a
target="_blank"
class="crayons-link crayons-link--block"
rel="noopener"
href='https://twitter.com/intent/tweet?text=%22The%20Saga%20is%20Antipattern%22%20by%20Sergiy%20Yevtushenko%20%23DEVCommunity%20https%3A%2F%2Fdev.to%2Fsiy%2Fthe-saga-is-antipattern-1354'>
Share to X
</a>
<a
target="_blank"
class="crayons-link crayons-link--block"
rel="noopener"
href="https://www.linkedin.com/shareArticle?mini=true&url=https%3A%2F%2Fdev.to%2Fsiy%2Fthe-saga-is-antipattern-1354&title=The%20Saga%20is%20Antipattern&summary=The%20Saga%20pattern%20is%20often%20positioned%20as%20a%20better%20way%20to%20handle%20distributed%20transactions.%20I%20see%20no...&source=DEV%20Community">
Share to LinkedIn
</a>
<a
target="_blank"
class="crayons-link crayons-link--block"
rel="noopener"
href="https://www.facebook.com/sharer.php?u=https%3A%2F%2Fdev.to%2Fsiy%2Fthe-saga-is-antipattern-1354">
Share to Facebook
</a>
<a
target="_blank"
class="crayons-link crayons-link--block"
rel="noopener"
href="https://s2f.kytta.dev/?text=https%3A%2F%2Fdev.to%2Fsiy%2Fthe-saga-is-antipattern-1354">
Share to Mastodon
</a>
</div>
<web-share-wrapper shareurl="https://dev.to/siy/the-saga-is-antipattern-1354" sharetitle="The Saga is Antipattern" sharetext="The Saga pattern is often positioned as a better way to handle distributed transactions. I see no..." template="web-share-button">
</web-share-wrapper>
<template id="web-share-button">
<a href="#" class="dropdown-link-row crayons-link crayons-link--block">Share Post via...</a>
</template>
<a href="/report-abuse" class="crayons-link crayons-link--block" id="ReportButtonAuthor">Report Abuse</a>
</div>
</div>
</div>
</div>
</aside>
<main id="main-content" class="crayons-layout__content grid gap-4">
<div class="article-wrapper">
<article class="crayons-card crayons-article mb-4"
id="article-show-container"
data-article-id="1510071"
data-article-slug="the-saga-is-antipattern-1354"
data-author-id="145374"
data-author-name="Sergiy Yevtushenko"
data-author-username="siy"
data-co-author-ids=""
data-path="/siy/the-saga-is-antipattern-1354"
data-pin-path="/stories/feed/pinned_article"
data-pinned-article-id=""
data-published="true"
data-scheduled="false"
>
<script>
try {
if(localStorage) {
let currentUser = localStorage.getItem('current_user');
if (currentUser) {
currentUser = JSON.parse(currentUser);
if (currentUser.id === 145374) {
document.getElementById('article-show-container').classList.add('current-user-is-article-author');
}
}
}
} catch (e) {
console.error(e);
}
</script>
<header class="crayons-article__header" id="main-title">
<div class="crayons-article__header__meta">
<div class="flex s:items-start flex-col s:flex-row">
<div id="action-space" class="crayons-article__actions mb-4 s:mb-0 s:order-last"></div>
<div class="flex flex-1 mb-5 items-start">
<div class="relative">
<a href="/siy"><img class="radius-full align-middle" src="https://media2.dev.to/dynamic/image/width=50,height=50,fit=cover,gravity=auto,format=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Fuser%2Fprofile_image%2F145374%2F6e93547b-45cc-430e-9659-3adea03266b5.jpeg" width="40" height="40" alt="Sergiy Yevtushenko" /></a>
</div>
<div class="pl-3 flex-1">
<a href="/siy" class="crayons-link fw-bold">Sergiy Yevtushenko</a>
<p class="fs-xs color-base-60 flex flex-wrap items-center gap-1">
<span>Posted on <time datetime="2023-06-20T00:28:16Z" class="date">Jun 20, 2023</time></span>
</p>
</div>
</div>
</div>
<div class="multiple_reactions_engagement">
<button
class="reaction_engagement_like hidden crayons-reaction crayons-reaction--like"
data-category="like"
aria-label="Like"
type="button"
><span class="crayons-reaction__icon crayons-reaction__icon--inactive p-1"><img src="https://assets.dev.to/assets/sparkle-heart-5f9bee3767e18deb1bb725290cb151c25234768a0e9a2bd39370c382d02920cf.svg" width="24" height="24" /></span>
<span class="crayons-reaction__count" id="reaction_engagement_like_count">&nbsp;</span>
</button> <button
class="reaction_engagement_unicorn hidden crayons-reaction crayons-reaction--unicorn"
data-category="unicorn"
aria-label="Unicorn"
type="button"
><span class="crayons-reaction__icon crayons-reaction__icon--inactive p-1"><img src="https://assets.dev.to/assets/multi-unicorn-b44d6f8c23cdd00964192bedc38af3e82463978aa611b4365bd33a0f1f4f3e97.svg" width="24" height="24" /></span>
<span class="crayons-reaction__count" id="reaction_engagement_unicorn_count">&nbsp;</span>
</button> <button
class="reaction_engagement_exploding_head hidden crayons-reaction crayons-reaction--exploding_head"
data-category="exploding_head"
aria-label="Exploding Head"
type="button"
><span class="crayons-reaction__icon crayons-reaction__icon--inactive p-1"><img src="https://assets.dev.to/assets/exploding-head-daceb38d627e6ae9b730f36a1e390fca556a4289d5a41abb2c35068ad3e2c4b5.svg" width="24" height="24" /></span>
<span class="crayons-reaction__count" id="reaction_engagement_exploding_head_count">&nbsp;</span>
</button> <button
class="reaction_engagement_raised_hands hidden crayons-reaction crayons-reaction--raised_hands"
data-category="raised_hands"
aria-label="Raised Hands"
type="button"
><span class="crayons-reaction__icon crayons-reaction__icon--inactive p-1"><img src="https://assets.dev.to/assets/raised-hands-74b2099fd66a39f2d7eed9305ee0f4553df0eb7b4f11b01b6b1b499973048fe5.svg" width="24" height="24" /></span>
<span class="crayons-reaction__count" id="reaction_engagement_raised_hands_count">&nbsp;</span>
</button> <button
class="reaction_engagement_fire hidden crayons-reaction crayons-reaction--fire"
data-category="fire"
aria-label="Fire"
type="button"
><span class="crayons-reaction__icon crayons-reaction__icon--inactive p-1"><img src="https://assets.dev.to/assets/fire-f60e7a582391810302117f987b22a8ef04a2fe0df7e3258a5f49332df1cec71e.svg" width="24" height="24" /></span>
<span class="crayons-reaction__count" id="reaction_engagement_fire_count">&nbsp;</span>
</button>
</div>
<h1 class=" fs-3xl m:fs-4xl l:fs-5xl fw-bold s:fw-heavy lh-tight mb-2 medium">
The Saga is Antipattern
</h1>
<div class="spec__tags flex flex-wrap">
<a class="crayons-tag " style="
--tag-bg: rgba(0, 0, 0, 0.10);
--tag-prefix: #000000;
--tag-bg-hover: rgba(0, 0, 0, 0.10);
--tag-prefix-hover: #000000;
" href="/t/microservices"><span class="crayons-tag__prefix">#</span>microservices</a>
<a class="crayons-tag " style="
--tag-bg: rgba(64, 78, 211, 0.10);
--tag-prefix: #404ED3;
--tag-bg-hover: rgba(64, 78, 211, 0.10);
--tag-prefix-hover: #404ED3;
" href="/t/saga"><span class="crayons-tag__prefix">#</span>saga</a>
</div>
</div>
</header>
<div class="crayons-article__main ">
<div class="crayons-article__body text-styles spec__body" data-article-id="1510071"
id="article-body">
<p>The Saga pattern is often positioned as a better way to handle distributed transactions. I see no point in discussing Saga's disadvantages because the problem is that Saga should not be used in the microservices at all:</p>
<blockquote>
<p>If you need distributed transactions across a few microservices, most likely you incorrectly defined and separated domains.</p>
</blockquote>
<p>Below is a long explanation why.</p>
<h2>
<a name="microservices-as-distributed-system" href="#microservices-as-distributed-system">
</a>
Microservices As Distributed System
</h2>
<p>Any microservices-based system is a distributed system. To be precise — the simplest possible, basic version of it. Such a distributed system does not maintain any form of consensus. In other words, such a system:</p>
<ul>
<li>Lacks any built-in means to coordinate nodes</li>
<li>Lacks any built-in means to get information about nodes</li>
<li>If nodes need to communicate, such a communication must be a part of business logic</li>
</ul>
<p>These properties result in an inability of a microservices-based system to perform certain tasks. For example, perform transactions. Or maintain consistency (even eventual). Or get information if all necessary nodes are up and running (i.e. if the system is available). As a result, if one node needs a piece of information from the other node, it should explicitly include a request to remote service as one of the business steps. It looks surprisingly similar to interactions between, for example, browsers and web servers. Note, that such interaction means that each request is completely independent of each other. All transactions, if they are necessary, never cross request boundaries. Only with such a deep separation of domains, it makes sense to require a microservice to maintain its own data, independently and separately. Or claim independent deployability or testability. Or accept a possibly failed request to another node as an explicit step in business logic.</p>
<blockquote>
<p>Since no transaction can cross the request boundary, the service must govern all data included in the transaction. This could be considered a validation criteria for the separation of domains. If any cross-service transaction is necessary, then split-up was done incorrectly.</p>
</blockquote>
<h2>
<a name="domain-size-issue" href="#domain-size-issue">
</a>
Domain Size Issue
</h2>
<p>As soon as we start doing separation of domains according to data governance, we may quickly realize that in the vast majority of cases, microservices look a lot like traditional monoliths and the domain they should handle is big. Or realize that traditional monoliths are, in fact, microservices. This happens because most organizations have only a very limited number of truly independent domains. Most often — one.</p>
<p>Unfortunately, the whole microservices hype ignores this fact, and we get "best practices", "design patterns", books, articles, etc. which are stretching the initial idea of loosely coupled independent services to areas where it does not fit. This results in a mind-blowing, devastating consequences:</p>
<ul>
<li>We build unreliable systems (see above about what kind of distributed systems microservices are) on top of reliable ones (cloud infrastructure)</li>
<li>We get ugly, inherently broken design, where layers are mixed up, communication error handling/retrying/etc. and transaction handling happens at the business logic level</li>
<li>We split data into parts and then try to collect them to process the request, introducing unpredictable and barely controllable tail latency</li>
<li>We get the systems, which are unable to ensure data integrity and consistency</li>
<li>We ought to perform end-to-end testing before deployment because there are no guarantees that a new version of service does not break the whole system. This completely obviates any independent testability and deployability of the services</li>
</ul>
<p>The list above is definitely incomplete. Incorrectly applied microservices can cause all kinds of harm. Especially when combined with "cloud native" "microservices" frameworks like Spring, which turn the whole system into a bunch of slowly moving monoliths.</p>
<p>All advantages and requirements, which are inherent properties and natural fit for the microservices, either disappear or get transformed into quite painful and expensive obstacles.</p>
<p>Unfortunately, all these considerations might result in much bigger domains than could be considered acceptable for traditional microservices design. That’s fine and just means that we should not use microservices. What can we use then? Let’s take a look.</p>
<h2>
<a name="handling-big-domain" href="#handling-big-domain">
</a>
Handling Big Domain
</h2>
<p>Since we’re going to handle a big, but single domain, we need to use something capable to maintain consensus. There are at least three options:</p>
<ul>
<li>Modular monolith (also known as modulith)</li>
<li>Event-driven architecture</li>
<li>Cluster-based architecture</li>
</ul>
<h3>
<a name="modular-monolith" href="#modular-monolith">
</a>
Modular Monolith
</h3>
<p>This option addresses most monolith pain points, in particular maintainability and concurrent development. Mostly, this is achieved by improving design via application of DDD and other techniques. The ability to access all data, perform regular transactions and lack of communication errors makes this approach an appealing choice for many use cases. In addition, this approach is much easier to fix/rework/refactor/update in atomic fashion during system evolution. Note that inner sub-services are not required to maintain their own data (but they can, if necessary). Shared data is often inherent and natural in this approach, as we’re talking about a single domain. Since this is just a monolith, after all, there are no issues with maintaining the consensus nor deployment/monitoring/maintenance.</p>
<p>The main disadvantage of moduliths is the limited scalability. At some point, there might be a need to switch to another design. Fortunately, modularity significantly simplifies the transition.</p>
<h3>
<a name="eventdriven-architecture-eda" href="#eventdriven-architecture-eda">
</a>
Event-Driven Architecture (EDA)
</h3>
<p>EDA is quite a popular choice and while often it is mentioned in the context of microservices, this is incorrect. By design, EDA leverages reliable data sharing infrastructure in the form of message brokers or pub-sub service, which explicitly conflicts with how microservices maintain their data. Overall, this architecture is described in detail in many sources, so I see no point to repeating them here.<br>
Its main disadvantage is the similarity to microservices regarding reliance on infrastructure, complex deployment, monitoring, etc.</p>
<h3>
<a name="clusterbased-architecture" href="#clusterbased-architecture">
</a>
Cluster-based Architecture
</h3>
<p><a href="https://dev.to/siy/nanoservices-or-alternative-to-monoliths-and-microservices-12bb">This design</a> is quite a rare animal. It has several advantages, but a few worth being noted separately:</p>
<ul>
<li>Simplicity of transition to this architecture from modulith</li>
<li>No reliance on infrastructure. Often, the whole system is self-contained, could be deployed on premises, in the cloud or across several clouds</li>
<li>Simplicity of deployment — there is only one deployable artifact</li>
<li>Nearly linear scalability</li>
<li>Real fault tolerance — failed node does not bring down the whole system nor results in error being returned from request. Requests are just somewhat slower processed</li>
<li>Great resource utilization, fine-grained two level scaling</li>
</ul>
<h2>
<a name="conclusion" href="#conclusion">
</a>
Conclusion
</h2>
<p>Microservices were thought of as a way to solve problems, but their blind application causes more harm than good. The main issue is that there are no clear criteria, where they are applicable. I have no illusions, my article will not solve this problem, but at least it provides some meaningful criteria to assess where microservices should not be used.</p>
</div>
<div class="below-post-bb body-billboard-container" data-async-url="/siy/the-saga-is-antipattern-1354/bmar11/post_body_bottom"></div>
</div>
<section id="comments" data-follow-button-container="true" data-updated-at="2026-09-12 05:48:52 UTC" class="text-padding mb-4 border-t-1 border-0 border-solid border-base-10">
<header class="relative flex justify-between items-center mb-6">
<div class="flex items-center">
<h2 class="crayons-subtitle-1">
Top comments <span class="js-comments-count" data-comments-count="19">(19)</span>
</h2>
</div>
<div id="comment-subscription" class="print-hidden">
<div class="crayons-btn-group">
<span class="crayons-btn crayons-btn--outlined">Subscribe</span>
</div>
</div>
</header>
<div id="billboard_delay_trigger"></div>
<div
id="comments-container"
data-testid="comments-container"
data-commentable-id="1510071"
data-commentable-type="Article"
data-has-recent-comment-activity="false">
<div id="response-templates-data" class="hidden"></div>
<form class="comment-form print-hidden" id="new_comment" action="/comments" accept-charset="UTF-8" method="post">
<input type="hidden" name="authenticity_token" value="NOTHING" id="new_comment_authenticity_token">
<input value="1510071" autocomplete="off" type="hidden" name="comment[commentable_id]" id="comment_commentable_id" />
<input value="Article" autocomplete="off" type="hidden" name="comment[commentable_type]" id="comment_commentable_type" />
<span class="crayons-avatar m:crayons-avatar--l mr-2 shrink-0">
<img src="https://media2.dev.to/dynamic/image/width=256,height=,fit=scale-down,gravity=auto,format=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F8j7kvp660rqzt99zui8e.png" width="32" height="32" alt="pic" class="crayons-avatar__image overflow-hidden" id="comment-primary-user-profile--avatar" loading="lazy" />
</span>
<div class="comment-form__inner">
<div class="comment-form__field" data-tracking-name="comment_form_textfield">
<textarea placeholder="Add to the discussion" onfocus="handleFocus(event)" onkeyup="handleKeyUp(event)" onkeydown="handleKeyDown(event)" oninput="handleChange(event)" id="text-area" required="required" class="crayons-textfield comment-textarea crayons-textfield--ghost" aria-label="Add a comment to the discussion" name="comment[body_markdown]">
</textarea>
</div>
<div class="response-templates-container crayons-card crayons-card--secondary p-4 mb-4 comment-form__templates fs-base hidden">
<header class="mb-3">
<button type="button" class="crayons-btn personal-template-button active" data-target-type="personal" data-form-id="new_comment">Personal</button>
<button type="button" class="crayons-btn moderator-template-button hidden" data-target-type="moderator" data-form-id="new_comment">Trusted User</button>
</header>
<div class="personal-responses-container">
</div>
<div class="moderator-responses-container hidden">
</div>
<a target="_blank" rel="noopener nofollow" href="/settings/response-templates">
Create template
</a>
<p>Templates let you quickly answer FAQs or store snippets for re-use.</p>
</div>
<div class="comment-form__preview text-styles text-styles--secondary" id="preview-div"></div>
<div class="comment-form__buttons mb-4 flex items-center flex-wrap gap-2">
<button type="submit" class="crayons-btn mr-2 js-btn-enable" onclick="validateField(event)" data-tracking-name="comment_submit_button" disabled>Submit</button>
<button type="button" class="preview-toggle crayons-btn crayons-btn--secondary comment-action-preview js-btn-enable mr-2" data-tracking-name="comment_preview_button" disabled>Preview</button>
<a href="/404.html" class="dismiss-edit-comment crayons-btn crayons-btn--ghost js-btn-dismiss hidden">Dismiss</a>
</div>
</div>
<div class="code-of-conduct" id="toggle-code-of-conduct-checkbox"></div>
</form>
<div class="comments" id="comment-trees-container">
<div class="js-billboard-container mid-comments-billboard-container pb-6" data-async-url="/siy/the-saga-is-antipattern-1354/bmar11/post_comments_mid"></div>
<details class="comment-wrapper js-comment-wrapper comment-wrapper--deep-0
root
" open>
<summary aria-label="Toggle this comment (and replies)" data-tracking-name="expand_comment_toggle">
<span class="m:mx-1 inline-block align-middle">
<svg xmlns="http://www.w3.org/2000/svg" width="24" height="24" viewBox="0 0 24 24" role="img" aria-labelledby="ah4ee2ae8qnwiv32t1wlj1jlkr48eu0z" class="crayons-icon expanded"><title id="ah4ee2ae8qnwiv32t1wlj1jlkr48eu0z">Collapse</title>
<path d="M12 10.677L8 6.935 9 6l3 2.807L15 6l1 .935-4 3.742zm0 4.517L9 18l-1-.935 4-3.742 4 3.742-1 .934-3-2.805z"></path>
</svg>
<svg xmlns="http://www.w3.org/2000/svg" width="24" height="24" viewBox="0 0 24 24" role="img" aria-labelledby="a7wi10blsdqo15pq02y8ffbszaorpfpg" class="crayons-icon collapsed"><title id="a7wi10blsdqo15pq02y8ffbszaorpfpg">Expand</title>
<path d="M12 18l-4-3.771 1-.943 3 2.829 3-2.829 1 .943L12 18zm0-10.115l-3 2.829-1-.943L12 6l4 3.771-1 .942-3-2.828z"></path>
</svg>
</span>
<span class="js-collapse-comment-content inline-block align-middle"></span>
</summary>
<div
id="comment-node-1050553"
class="
comment single-comment-node
root
comment--deep-0
"
data-comment-id="1050553"
data-path="/siy/the-saga-is-antipattern-1354/comments/27k1n"
data-comment-author-id="1027393"
data-content-user-id="1027393">
<a name="comment-27k1n" style="position: absolute; top: -8px;">&nbsp;</a>
<div class="comment__inner">
<a href="https://dev.to/kbirgerdev" class="shrink-0 crayons-avatar m:crayons-avatar--l mt-4 m:mt-3">
<img class="crayons-avatar__image" width="32" height="32" src="https://media2.dev.to/dynamic/image/width=50,height=50,fit=cover,gravity=auto,format=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Fuser%2Fprofile_image%2F1027393%2F9afe62aa-69b4-428a-9baf-b8275fc872a6.jpeg" alt="kbirgerdev profile image" loading="lazy" />
</a>
<div class="inner-comment comment__details">
<div class="comment__content crayons-card">
<div class="comment__header">
<a href="https://dev.to/kbirgerdev" class="crayons-link crayons-link--secondary flex items-center fw-medium m:hidden">
<span class="js-comment-username">
Kirill Birger
</span>
</a>
<div class="profile-preview-card relative mb-4 s:mb-0 fw-medium hidden m:block">
<button id="comment-profile-preview-trigger-1050553" aria-controls="comment-profile-preview-content-1050553" class="profile-preview-card__trigger p-1 -my-1 -ml-1 crayons-btn crayons-btn--ghost" aria-label="Kirill Birger profile details">
Kirill Birger
</button>
<div id="comment-profile-preview-content-1050553" class="profile-preview-card__content p-4 pt-0 branded-7 crayons-dropdown" style="--card-color: #000000; border-top-color: var(--card-color);" data-testid="profile-preview-card" data-repositioning-dropdown="true">
<div class="gap-4 grid">
<div class="-mt-4">
<a href="/kbirgerdev" class="flex">
<span class="crayons-avatar crayons-avatar--xl mr-2 shrink-0">
<img src="https://media2.dev.to/dynamic/image/width=90,height=90,fit=cover,gravity=auto,format=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Fuser%2Fprofile_image%2F1027393%2F9afe62aa-69b4-428a-9baf-b8275fc872a6.jpeg" class="crayons-avatar__image" alt="" loading="lazy" />
</span>
<span class="crayons-link crayons-subtitle-2 mt-5">
Kirill Birger
</span>
</a>
</div>
<div class="print-hidden">
<button name="button" type="button" data-info="{&quot;className&quot;:&quot;User&quot;,&quot;style&quot;:&quot;&quot;,&quot;id&quot;:1027393,&quot;name&quot;:&quot;Kirill Birger&quot;}" class="crayons-btn follow-action-button whitespace-nowrap w-100 follow-user" aria-label="Follow user: Kirill Birger" aria-pressed="false">Follow</button>
</div>
<div class="color-base-70">
Software Architect, Engineer, lover of beautiful code
</div>
<div class="user-metadata-details">
<ul class="user-metadata-details-inner">
<li>
<div class="key">
Education
</div>
<div class="value">
BSCS, MSCS Northeastern
</div>
</li>
<li>
<div class="key">
Work
</div>
<div class="value">
Software Architect
</div>
</li>
<li>
<div class="key">
Joined
</div>
<div class="value">
<time datetime="2023-02-15T12:31:24Z" class="date">Feb 15, 2023</time>
</div>
</li>
</ul>
</div>
</div>
</div>
</div>
<span class="color-base-30 px-2 m:pl-0" role="presentation">&bull;</span>
<a href="https://dev.to/siy/the-saga-is-antipattern-1354#comment-27k1n" class="comment-date crayons-link crayons-link--secondary fs-s">
<time datetime="2023-07-03T19:42:23Z" class=date-short-year>
Jul 3 &#39;23
</time>
</a>
<div class="comment__dropdown" data-tracking-name="comment_dropdown">
<button id="comment-dropdown-trigger-1050553" aria-controls="comment-dropdown-1050553" aria-expanded="false"
class="dropbtn comment__dropdown-trigger crayons-btn crayons-btn--s crayons-btn--ghost crayons-btn--icon "
aria-label="Toggle dropdown menu" aria-haspopup="true">
<svg xmlns="http://www.w3.org/2000/svg" width="24" height="24" viewBox="0 0 24 24" role="img" aria-labelledby="a75gmp5cnxks1wpim1hdwr7b9drz57jx" class="crayons-icon pointer-events-none"><title id="a75gmp5cnxks1wpim1hdwr7b9drz57jx">Dropdown menu</title>
<path fill-rule="evenodd" clip-rule="evenodd" d="M8.25 12a1.5 1.5 0 11-3 0 1.5 1.5 0 013 0zm5.25 0a1.5 1.5 0 11-3 0 1.5 1.5 0 013 0zm3.75 1.5a1.5 1.5 0 100-3 1.5 1.5 0 000 3z"></path>
</svg>
</button>
<div id="comment-dropdown-1050553" class="crayons-dropdown right-1 s:right-0 s:left-auto fs-base dropdown">
<ul class="m-0">
<li><a href="https://dev.to/siy/the-saga-is-antipattern-1354#comment-27k1n" class="crayons-link crayons-link--block permalink-copybtn" aria-label="Copy link to Kirill Birger&#39;s comment" data-no-instant>Copy link</a></li>
<li class="comment-actions hidden" data-user-id="1027393" data-action="settings-button" data-path="https://dev.to/kbirgerdev/comment/27k1n/settings" aria-label="Go to Kirill Birger&#39;s comment settings"></li>
<li class="comment-actions hidden" data-action="hide-button" data-commentable-user-id="145374" data-user-id="1027393">
<button
class="flex justify-between crayons-link crayons-link--block w-100 bg-transparent border-0 hide-comment"
data-hide-type="hide"
data-comment-id="1050553"
data-comment-url="https://dev.to/kbirgerdev/comment/27k1n"
aria-label="Hide Kirill Birger&#39;s comment">
Hide
</button>
</li>
<li class="mod-actions hidden mod-actions-comment-button" data-path="https://dev.to/kbirgerdev/comment/27k1n/mod" aria-label="Moderate Kirill Birger&#39;s comment"></li>
<li class="report-abuse-link-wrapper" data-path="/report-abuse?url=https://dev.to/kbirgerdev/comment/27k1n" aria-label="Report Kirill Birger&#39;s comment as abusive or violating our code of conduct and/or terms and conditions"></li>
<li class="current-user-actions"></li>
</ul>
</div>
</div>
</div>
<div
class="
comment__body
text-styles
text-styles--secondary
body
">
<p>I do not feel as though you've made your point. You made a claim, then backed it up by making more claims, and then went on to talk about different design patterns.</p>
<p>Sagas are not only for microservices. You can have the need to perform distributed transactions even in a monolith. Also, not all transactions terminate within your organization's code.</p>
<p>Imagine a ticketing system where my application collects payment by sending HTTP to one third party, and then books a ticket by sending to another third party.</p>
<p>If the second request fails, then I should unwind and roll back. Sure, it's trivial in this case, but I think that is the argument for a saga pattern.</p>
</div>
</div>
<script>
</script>
<footer class="comment__footer print-hidden">
<button
class="crayons-tooltip__activator relative crayons-btn crayons-btn--ghost crayons-btn--icon-left crayons-btn--s mr-1 reaction-like inline-flex reaction-button"
id="button-for-comment-1050553"
data-comment-id="1050553"
aria-label="like"
data-tracking-name="comment_heart_button">
<svg xmlns="http://www.w3.org/2000/svg" width="24" height="24" role="img" aria-labelledby="apxc10hbcd9zy7xctrx8itukhn61fpng" class="crayons-icon reaction-icon not-reacted"><title id="apxc10hbcd9zy7xctrx8itukhn61fpng">Like comment: </title><path d="M18.884 12.595l.01.011L12 19.5l-6.894-6.894.01-.01A4.875 4.875 0 0112 5.73a4.875 4.875 0 016.884 6.865zM6.431 7.037a3.375 3.375 0 000 4.773L12 17.38l5.569-5.569a3.375 3.375 0 10-4.773-4.773L9.613 10.22l-1.06-1.062 2.371-2.372a3.375 3.375 0 00-4.492.25v.001z"></path></svg>
<svg xmlns="http://www.w3.org/2000/svg" width="24" height="24" viewBox="0 0 24 24" role="img" aria-labelledby="alxxjsr5vlipleft04y70d86m8il2608" class="crayons-icon crayons-icon reaction-icon--like reaction-icon reacted"><title id="alxxjsr5vlipleft04y70d86m8il2608">Like comment: </title>
<path d="M5.116 12.595a4.875 4.875 0 015.56-7.68h-.002L7.493 8.098l1.06 1.061 3.181-3.182a4.875 4.875 0 016.895 6.894L12 19.5l-6.894-6.894.01-.01z"></path>
</svg>
<span class="reactions-count">6</span><span class="reactions-label hidden m:inline-block">&nbsp;likes</span>
<span data-testid="tooltip" class="crayons-tooltip__content">
Like
</span>
</button>
<span class="favorite-control-root" data-favorite-control="true" data-variant="comment" data-favoritable-type="Comment" data-favoritable-id="1050553" data-favoritable-user-id="1027393" data-favorited="false" data-label-favorite="Pick as gem" data-label-favorited="Picked as gem" data-label-favorited-by-you="Picked as gem by you" data-modal-title="Gem Picked!" data-modal-body="You&#39;ve picked this as a community gem!" data-modal-remaining-zero="You have no more gems left to give out today." data-modal-remaining-one="You have 1 more gem left to give out today." data-modal-remaining-other="You have %{count} more gems left to give out today." data-modal-remaining-unlimited="You have unlimited gems to give out." data-modal-close="Got it" data-modal-exhausted-title="Out of Gems" data-modal-exhausted-body="You have no more gems left to give out today. Your allowance will refresh soon!" data-modal-exhausted-close="Got it"></span>
<button
class="actions crayons-btn crayons-btn--ghost crayons-btn--s crayons-btn--icon-left toggle-reply-form mr-1 inline-flex"
data-comment-id="1050553"
data-path="/siy/the-saga-is-antipattern-1354/comments/27k1n"
data-tracking-name="comment_reply_button"
data-testid="reply-button-1050553"
rel="nofollow">
<svg xmlns="http://www.w3.org/2000/svg" width="24" height="24" role="img" aria-labelledby="aihbff563od146tcgmwwb0d2zamfag01" class="crayons-icon reaction-icon not-reacted"><title id="aihbff563od146tcgmwwb0d2zamfag01">Comment button</title><path d="M10.5 5h3a6 6 0 110 12v2.625c-3.75-1.5-9-3.75-9-8.625a6 6 0 016-6zM12 15.5h1.5a4.501 4.501 0 001.722-8.657A4.5 4.5 0 0013.5 6.5h-3A4.5 4.5 0 006 11c0 2.707 1.846 4.475 6 6.36V15.5z"></path></svg>
<span class="hidden m:inline-block">Reply</span>
</button>
</footer>
</div>
</div>
<details class="comment-wrapper js-comment-wrapper comment-wrapper--deep-1
child
" open>
<summary aria-label="Toggle this comment (and replies)" data-tracking-name="expand_comment_toggle">
<span class="mx-0 inline-block align-middle">
<svg xmlns="http://www.w3.org/2000/svg" width="24" height="24" viewBox="0 0 24 24" role="img" aria-labelledby="apmoegz4chi73epklf04awydmh5zqrta" class="crayons-icon expanded"><title id="apmoegz4chi73epklf04awydmh5zqrta">Collapse</title>
<path d="M12 10.677L8 6.935 9 6l3 2.807L15 6l1 .935-4 3.742zm0 4.517L9 18l-1-.935 4-3.742 4 3.742-1 .934-3-2.805z"></path>
</svg>
<svg xmlns="http://www.w3.org/2000/svg" width="24" height="24" viewBox="0 0 24 24" role="img" aria-labelledby="a4rxqq7h6nxkxu5kqatd8n975ufnqugu" class="crayons-icon collapsed"><title id="a4rxqq7h6nxkxu5kqatd8n975ufnqugu">Expand</title>
<path d="M12 18l-4-3.771 1-.943 3 2.829 3-2.829 1 .943L12 18zm0-10.115l-3 2.829-1-.943L12 6l4 3.771-1 .942-3-2.828z"></path>
</svg>
</span>
<span class="js-collapse-comment-content inline-block align-middle"></span>
</summary>
<div
id="comment-node-1050702"
class="
comment single-comment-node
child
comment--deep-1
"
data-comment-id="1050702"
data-path="/siy/the-saga-is-antipattern-1354/comments/27k7g"
data-comment-author-id="145374"
data-content-user-id="145374">
<a name="comment-27k7g" style="position: absolute; top: -8px;">&nbsp;</a>
<div class="comment__inner">
<a href="https://dev.to/siy" class="shrink-0 crayons-avatar mt-4">
<img class="crayons-avatar__image" width="32" height="32" src="https://media2.dev.to/dynamic/image/width=50,height=50,fit=cover,gravity=auto,format=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Fuser%2Fprofile_image%2F145374%2F6e93547b-45cc-430e-9659-3adea03266b5.jpeg" alt="siy profile image" loading="lazy" />
</a>
<div class="inner-comment comment__details">
<div class="comment__content crayons-card">
<div class="comment__header">
<a href="https://dev.to/siy" class="crayons-link crayons-link--secondary flex items-center fw-medium m:hidden">
<span class="js-comment-username">
Sergiy Yevtushenko
</span>
<span class="crayons-hover-tooltip inline-block spec-op-author -mr-2" data-tooltip="Author">
<svg xmlns="http://www.w3.org/2000/svg" width="24" height="24" viewBox="0 0 24 24" role="img" class="crayons-icon">
<path d="M12 8.25a6 6 0 110 12 6 6 0 010-12zm0 2.625l-.992 2.01-2.218.322 1.605 1.564-.379 2.21L12 15.937l1.984 1.043-.379-2.209 1.605-1.564-2.218-.323L12 10.875zm.75-6.376l3.75.001v2.25l-1.022.854a7.45 7.45 0 00-2.728-.817V4.5zm-1.5 0v2.288a7.451 7.451 0 00-2.727.816L7.5 6.75V4.5h3.75z"></path>
</svg>
</span>
</a>
<div class="profile-preview-card relative mb-4 s:mb-0 fw-medium hidden m:block">
<button id="comment-profile-preview-trigger-1050702" aria-controls="comment-profile-preview-content-1050702" class="profile-preview-card__trigger p-1 -my-1 -ml-1 crayons-btn crayons-btn--ghost" aria-label="Sergiy Yevtushenko profile details">
Sergiy Yevtushenko
</button>
<div id="comment-profile-preview-content-1050702" class="profile-preview-card__content p-4 pt-0 branded-7 crayons-dropdown" style="--card-color: #a198bb; border-top-color: var(--card-color);" data-testid="profile-preview-card" data-repositioning-dropdown="true">
<div class="gap-4 grid">
<div class="-mt-4">
<a href="/siy" class="flex">
<span class="crayons-avatar crayons-avatar--xl mr-2 shrink-0">
<img src="https://media2.dev.to/dynamic/image/width=90,height=90,fit=cover,gravity=auto,format=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Fuser%2Fprofile_image%2F145374%2F6e93547b-45cc-430e-9659-3adea03266b5.jpeg" class="crayons-avatar__image" alt="" loading="lazy" />
</span>
<span class="crayons-link crayons-subtitle-2 mt-5">
Sergiy Yevtushenko
</span>
</a>
</div>
<div class="print-hidden">
<button name="button" type="button" data-info="{&quot;className&quot;:&quot;User&quot;,&quot;style&quot;:&quot;&quot;,&quot;id&quot;:145374,&quot;name&quot;:&quot;Sergiy Yevtushenko&quot;}" class="crayons-btn follow-action-button whitespace-nowrap w-100 follow-user" aria-label="Follow user: Sergiy Yevtushenko" aria-pressed="false">Follow</button>
</div>
<div class="color-base-70">
Writing code for 35+ years and still enjoy it...
</div>
<div class="user-metadata-details">
<ul class="user-metadata-details-inner">
<li>
<div class="key">
Location
</div>
<div class="value">
Krakow, Poland
</div>
</li>
<li>
<div class="key">
Work
</div>
<div class="value">
Senior Software Engineer
</div>
</li>
<li>
<div class="key">
Joined
</div>
<div class="value">
<time datetime="2019-03-14T05:28:55Z" class="date">Mar 14, 2019</time>
</div>
</li>
</ul>
</div>
</div>
</div>
<span class="crayons-hover-tooltip inline-block spec-op-author -ml-2" data-tooltip="Author">
<svg xmlns="http://www.w3.org/2000/svg" width="24" height="24" viewBox="0 0 24 24" role="img" class="crayons-icon">
<path d="M12 8.25a6 6 0 110 12 6 6 0 010-12zm0 2.625l-.992 2.01-2.218.322 1.605 1.564-.379 2.21L12 15.937l1.984 1.043-.379-2.209 1.605-1.564-2.218-.323L12 10.875zm.75-6.376l3.75.001v2.25l-1.022.854a7.45 7.45 0 00-2.728-.817V4.5zm-1.5 0v2.288a7.451 7.451 0 00-2.727.816L7.5 6.75V4.5h3.75z"></path>
</svg>
</span>
</div>
<span class="color-base-30 px-2 m:pl-0" role="presentation">&bull;</span>
<a href="https://dev.to/siy/the-saga-is-antipattern-1354#comment-27k7g" class="comment-date crayons-link crayons-link--secondary fs-s">
<time datetime="2023-07-04T08:50:49Z" class=date-short-year>
Jul 4 &#39;23
</time>
<span class="hidden m:inline-block">&bull; Edited on <time datetime="2023-07-04T08:55:51Z" class="date-no-year">Jul 4</time></span>
<span class="m:hidden">&bull; Edited</span>
</a>
<div class="comment__dropdown" data-tracking-name="comment_dropdown">
<button id="comment-dropdown-trigger-1050702" aria-controls="comment-dropdown-1050702" aria-expanded="false"
class="dropbtn comment__dropdown-trigger crayons-btn crayons-btn--s crayons-btn--ghost crayons-btn--icon "
aria-label="Toggle dropdown menu" aria-haspopup="true">
<svg xmlns="http://www.w3.org/2000/svg" width="24" height="24" viewBox="0 0 24 24" role="img" aria-labelledby="a1z3v87ps5ptx2meow10ijzdger8wv26" class="crayons-icon pointer-events-none"><title id="a1z3v87ps5ptx2meow10ijzdger8wv26">Dropdown menu</title>
<path fill-rule="evenodd" clip-rule="evenodd" d="M8.25 12a1.5 1.5 0 11-3 0 1.5 1.5 0 013 0zm5.25 0a1.5 1.5 0 11-3 0 1.5 1.5 0 013 0zm3.75 1.5a1.5 1.5 0 100-3 1.5 1.5 0 000 3z"></path>
</svg>
</button>
<div id="comment-dropdown-1050702" class="crayons-dropdown right-1 s:right-0 s:left-auto fs-base dropdown">
<ul class="m-0">
<li><a href="https://dev.to/siy/the-saga-is-antipattern-1354#comment-27k7g" class="crayons-link crayons-link--block permalink-copybtn" aria-label="Copy link to Sergiy Yevtushenko&#39;s comment" data-no-instant>Copy link</a></li>
<li class="comment-actions hidden" data-user-id="145374" data-action="settings-button" data-path="https://dev.to/siy/comment/27k7g/settings" aria-label="Go to Sergiy Yevtushenko&#39;s comment settings"></li>
<li class="comment-actions hidden" data-action="hide-button" data-commentable-user-id="145374" data-user-id="145374">
<button
class="flex justify-between crayons-link crayons-link--block w-100 bg-transparent border-0 hide-comment"
data-hide-type="hide"
data-comment-id="1050702"
data-comment-url="https://dev.to/siy/comment/27k7g"
aria-label="Hide Sergiy Yevtushenko&#39;s comment">
Hide
</button>
</li>
<li class="mod-actions hidden mod-actions-comment-button" data-path="https://dev.to/siy/comment/27k7g/mod" aria-label="Moderate Sergiy Yevtushenko&#39;s comment"></li>
<li class="report-abuse-link-wrapper" data-path="/report-abuse?url=https://dev.to/siy/comment/27k7g" aria-label="Report Sergiy Yevtushenko&#39;s comment as abusive or violating our code of conduct and/or terms and conditions"></li>
<li class="current-user-actions"></li>
</ul>
</div>
</div>
</div>
<div
class="
comment__body
text-styles
text-styles--secondary
body
">
<p>Thanks for your comment. Let's analyze it step by step:</p>
<blockquote>
<p>You made a claim, then backed it up by making more claims, and then went on to talk about different design patterns.</p>
</blockquote>
<p>I guess you're mixing up my article with regular microservices' propaganda, which is based on making claims without bothering with evidence or reasoning. What you call "claims" are basic facts about distributed systems in general and microservices in particular. Since my goal is not click-baiting, but educating, besides "claims" I'm also providing information about approaches suitable for cases, where microservices are not applicable. </p>
<blockquote>
<p>Sagas are not only for microservices. You can have the need to perform distributed transactions even in a monolith. Also, not all transactions terminate within your organization's code.</p>
</blockquote>
<p>The problem is not with Saga, which definitely has its own areas of application (for example, state management in UI apps). The problem is attempting to perform distributed transactions in systems which are inherently incapable of performing them. Like microservices. And yes, you may have such a need, but the presence of need does not mean the presence of ability. </p>
<blockquote>
<p>Imagine a ticketing system where my application collects payment by sending HTTP to one third party, and then books a ticket by sending to another third party. If the second request fails, then I should unwind and roll back. Sure, it's trivial in this case, but I think that is the argument for a saga pattern.</p>
</blockquote>
<p>Thanks for this example. I don't know why you consider it trivial, but even in this case you can easily observe the consequences of a lack of consensus:</p>
<ul>
<li>Imagine that your call for payment collection terminates with the timeout, and the same happens with the compensation operation. Your system and external payment processing system now may have different opinion about the status of the payment</li>
<li>Even more funny case happens if payment is processed successfully, but then the booking of ticket timeouts and exactly the same happens with the compensation operation for payment. Now every system may have its own understanding of what happened and what is the state of each part of the user request (payment and tickets)</li>
</ul>
<p>Of course, in both cases mentioned above, you may try to recover and restore a consistent view of the data across all systems. This will require additional steps outside the Saga pattern, and recovery still may fail, causing even more mess. Adding each additional step exponentially increases the number of possible inconsistencies.</p>
</div>
</div>
<script>
</script>
<footer class="comment__footer print-hidden">
<button
class="crayons-tooltip__activator relative crayons-btn crayons-btn--ghost crayons-btn--icon-left crayons-btn--s mr-1 reaction-like inline-flex reaction-button"
id="button-for-comment-1050702"
data-comment-id="1050702"
aria-label="like"
data-tracking-name="comment_heart_button">
<svg xmlns="http://www.w3.org/2000/svg" width="24" height="24" role="img" aria-labelledby="asqwvrr3fs6m9dfksg7j11z47ogxymtk" class="crayons-icon reaction-icon not-reacted"><title id="asqwvrr3fs6m9dfksg7j11z47ogxymtk">Like comment: </title><path d="M18.884 12.595l.01.011L12 19.5l-6.894-6.894.01-.01A4.875 4.875 0 0112 5.73a4.875 4.875 0 016.884 6.865zM6.431 7.037a3.375 3.375 0 000 4.773L12 17.38l5.569-5.569a3.375 3.375 0 10-4.773-4.773L9.613 10.22l-1.06-1.062 2.371-2.372a3.375 3.375 0 00-4.492.25v.001z"></path></svg>
<svg xmlns="http://www.w3.org/2000/svg" width="24" height="24" viewBox="0 0 24 24" role="img" aria-labelledby="adt1lcbk0djbcqxqmzmx90q378wohbln" class="crayons-icon crayons-icon reaction-icon--like reaction-icon reacted"><title id="adt1lcbk0djbcqxqmzmx90q378wohbln">Like comment: </title>
<path d="M5.116 12.595a4.875 4.875 0 015.56-7.68h-.002L7.493 8.098l1.06 1.061 3.181-3.182a4.875 4.875 0 016.895 6.894L12 19.5l-6.894-6.894.01-.01z"></path>
</svg>
<span class="reactions-count">2</span><span class="reactions-label hidden m:inline-block">&nbsp;likes</span>
<span data-testid="tooltip" class="crayons-tooltip__content">
Like
</span>
</button>
<span class="favorite-control-root" data-favorite-control="true" data-variant="comment" data-favoritable-type="Comment" data-favoritable-id="1050702" data-favoritable-user-id="145374" data-favorited="false" data-label-favorite="Pick as gem" data-label-favorited="Picked as gem" data-label-favorited-by-you="Picked as gem by you" data-modal-title="Gem Picked!" data-modal-body="You&#39;ve picked this as a community gem!" data-modal-remaining-zero="You have no more gems left to give out today." data-modal-remaining-one="You have 1 more gem left to give out today." data-modal-remaining-other="You have %{count} more gems left to give out today." data-modal-remaining-unlimited="You have unlimited gems to give out." data-modal-close="Got it" data-modal-exhausted-title="Out of Gems" data-modal-exhausted-body="You have no more gems left to give out today. Your allowance will refresh soon!" data-modal-exhausted-close="Got it"></span>
<button
class="actions crayons-btn crayons-btn--ghost crayons-btn--s crayons-btn--icon-left toggle-reply-form mr-1 inline-flex"
data-comment-id="1050702"
data-path="/siy/the-saga-is-antipattern-1354/comments/27k7g"
data-tracking-name="comment_reply_button"
data-testid="reply-button-1050702"
rel="nofollow">
<svg xmlns="http://www.w3.org/2000/svg" width="24" height="24" role="img" aria-labelledby="a9a4cr0vfym136bvekgvlndzrzcnew6x" class="crayons-icon reaction-icon not-reacted"><title id="a9a4cr0vfym136bvekgvlndzrzcnew6x">Comment button</title><path d="M10.5 5h3a6 6 0 110 12v2.625c-3.75-1.5-9-3.75-9-8.625a6 6 0 016-6zM12 15.5h1.5a4.501 4.501 0 001.722-8.657A4.5 4.5 0 0013.5 6.5h-3A4.5 4.5 0 006 11c0 2.707 1.846 4.475 6 6.36V15.5z"></path></svg>
<span class="hidden m:inline-block">Reply</span>
</button>
</footer>
</div>
</div>
<details class="comment-wrapper js-comment-wrapper comment-wrapper--deep-2
child
" open>
<summary aria-label="Toggle this comment (and replies)" data-tracking-name="expand_comment_toggle">
<span class="mx-0 inline-block align-middle">
<svg xmlns="http://www.w3.org/2000/svg" width="24" height="24" viewBox="0 0 24 24" role="img" aria-labelledby="aiycsi6v7snwfap1ggjv4hls9svn9z3f" class="crayons-icon expanded"><title id="aiycsi6v7snwfap1ggjv4hls9svn9z3f">Collapse</title>
<path d="M12 10.677L8 6.935 9 6l3 2.807L15 6l1 .935-4 3.742zm0 4.517L9 18l-1-.935 4-3.742 4 3.742-1 .934-3-2.805z"></path>
</svg>
<svg xmlns="http://www.w3.org/2000/svg" width="24" height="24" viewBox="0 0 24 24" role="img" aria-labelledby="aczu3w44pfhb6gd1ibokpd5p48yxp7tv" class="crayons-icon collapsed"><title id="aczu3w44pfhb6gd1ibokpd5p48yxp7tv">Expand</title>
<path d="M12 18l-4-3.771 1-.943 3 2.829 3-2.829 1 .943L12 18zm0-10.115l-3 2.829-1-.943L12 6l4 3.771-1 .942-3-2.828z"></path>
</svg>
</span>
<span class="js-collapse-comment-content inline-block align-middle"></span>
</summary>
<div
id="comment-node-1051160"
class="
comment single-comment-node
child
comment--deep-2
"
data-comment-id="1051160"
data-path="/siy/the-saga-is-antipattern-1354/comments/27kp6"
data-comment-author-id="1027393"
data-content-user-id="1027393">
<a name="comment-27kp6" style="position: absolute; top: -8px;">&nbsp;</a>
<div class="comment__inner">
<a href="https://dev.to/kbirgerdev" class="shrink-0 crayons-avatar mt-4">
<img class="crayons-avatar__image" width="32" height="32" src="https://media2.dev.to/dynamic/image/width=50,height=50,fit=cover,gravity=auto,format=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Fuser%2Fprofile_image%2F1027393%2F9afe62aa-69b4-428a-9baf-b8275fc872a6.jpeg" alt="kbirgerdev profile image" loading="lazy" />
</a>
<div class="inner-comment comment__details">
<div class="comment__content crayons-card">
<div class="comment__header">
<a href="https://dev.to/kbirgerdev" class="crayons-link crayons-link--secondary flex items-center fw-medium m:hidden">
<span class="js-comment-username">
Kirill Birger
</span>
</a>
<div class="profile-preview-card relative mb-4 s:mb-0 fw-medium hidden m:block">
<button id="comment-profile-preview-trigger-1051160" aria-controls="comment-profile-preview-content-1051160" class="profile-preview-card__trigger p-1 -my-1 -ml-1 crayons-btn crayons-btn--ghost" aria-label="Kirill Birger profile details">
Kirill Birger
</button>
<div id="comment-profile-preview-content-1051160" class="profile-preview-card__content p-4 pt-0 branded-7 crayons-dropdown" style="--card-color: #000000; border-top-color: var(--card-color);" data-testid="profile-preview-card" data-repositioning-dropdown="true">
<div class="gap-4 grid">
<div class="-mt-4">
<a href="/kbirgerdev" class="flex">
<span class="crayons-avatar crayons-avatar--xl mr-2 shrink-0">
<img src="https://media2.dev.to/dynamic/image/width=90,height=90,fit=cover,gravity=auto,format=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Fuser%2Fprofile_image%2F1027393%2F9afe62aa-69b4-428a-9baf-b8275fc872a6.jpeg" class="crayons-avatar__image" alt="" loading="lazy" />
</span>
<span class="crayons-link crayons-subtitle-2 mt-5">
Kirill Birger
</span>
</a>
</div>
<div class="print-hidden">
<button name="button" type="button" data-info="{&quot;className&quot;:&quot;User&quot;,&quot;style&quot;:&quot;&quot;,&quot;id&quot;:1027393,&quot;name&quot;:&quot;Kirill Birger&quot;}" class="crayons-btn follow-action-button whitespace-nowrap w-100 follow-user" aria-label="Follow user: Kirill Birger" aria-pressed="false">Follow</button>
</div>
<div class="color-base-70">
Software Architect, Engineer, lover of beautiful code
</div>
<div class="user-metadata-details">
<ul class="user-metadata-details-inner">
<li>
<div class="key">
Education
</div>
<div class="value">
BSCS, MSCS Northeastern
</div>
</li>
<li>
<div class="key">
Work
</div>
<div class="value">
Software Architect
</div>
</li>
<li>
<div class="key">
Joined
</div>
<div class="value">
<time datetime="2023-02-15T12:31:24Z" class="date">Feb 15, 2023</time>
</div>
</li>
</ul>
</div>
</div>
</div>
</div>
<span class="color-base-30 px-2 m:pl-0" role="presentation">&bull;</span>
<a href="https://dev.to/siy/the-saga-is-antipattern-1354#comment-27kp6" class="comment-date crayons-link crayons-link--secondary fs-s">
<time datetime="2023-07-05T11:35:35Z" class=date-short-year>
Jul 5 &#39;23
</time>
</a>
<div class="comment__dropdown" data-tracking-name="comment_dropdown">
<button id="comment-dropdown-trigger-1051160" aria-controls="comment-dropdown-1051160" aria-expanded="false"
class="dropbtn comment__dropdown-trigger crayons-btn crayons-btn--s crayons-btn--ghost crayons-btn--icon "
aria-label="Toggle dropdown menu" aria-haspopup="true">
<svg xmlns="http://www.w3.org/2000/svg" width="24" height="24" viewBox="0 0 24 24" role="img" aria-labelledby="acpjujkvpmn4kspyzof4rf2pzvs2xi3q" class="crayons-icon pointer-events-none"><title id="acpjujkvpmn4kspyzof4rf2pzvs2xi3q">Dropdown menu</title>
<path fill-rule="evenodd" clip-rule="evenodd" d="M8.25 12a1.5 1.5 0 11-3 0 1.5 1.5 0 013 0zm5.25 0a1.5 1.5 0 11-3 0 1.5 1.5 0 013 0zm3.75 1.5a1.5 1.5 0 100-3 1.5 1.5 0 000 3z"></path>
</svg>
</button>
<div id="comment-dropdown-1051160" class="crayons-dropdown right-1 s:right-0 s:left-auto fs-base dropdown">
<ul class="m-0">
<li><a href="https://dev.to/siy/the-saga-is-antipattern-1354#comment-27kp6" class="crayons-link crayons-link--block permalink-copybtn" aria-label="Copy link to Kirill Birger&#39;s comment" data-no-instant>Copy link</a></li>
<li class="comment-actions hidden" data-user-id="1027393" data-action="settings-button" data-path="https://dev.to/kbirgerdev/comment/27kp6/settings" aria-label="Go to Kirill Birger&#39;s comment settings"></li>
<li class="comment-actions hidden" data-action="hide-button" data-commentable-user-id="145374" data-user-id="1027393">
<button
class="flex justify-between crayons-link crayons-link--block w-100 bg-transparent border-0 hide-comment"
data-hide-type="hide"
data-comment-id="1051160"
data-comment-url="https://dev.to/kbirgerdev/comment/27kp6"
aria-label="Hide Kirill Birger&#39;s comment">
Hide
</button>
</li>
<li class="mod-actions hidden mod-actions-comment-button" data-path="https://dev.to/kbirgerdev/comment/27kp6/mod" aria-label="Moderate Kirill Birger&#39;s comment"></li>
<li class="report-abuse-link-wrapper" data-path="/report-abuse?url=https://dev.to/kbirgerdev/comment/27kp6" aria-label="Report Kirill Birger&#39;s comment as abusive or violating our code of conduct and/or terms and conditions"></li>
<li class="current-user-actions"></li>
</ul>
</div>
</div>
</div>
<div
class="
comment__body
text-styles
text-styles--secondary
body
">
<p>I think the points you make are valid, but I also think they apply equally to any system, micro services, or not. It seems like there is a single point of failure in most, if not all improvements of Saga. In principle, any IO can fail.</p>
<p>In practice, you just need your Saga IO to be more highly available than your other IO. </p>
<p>Since the Saga controller should generally be responsible for orchestration, I don't think you should be able to encounter a scenario where multiple parts of the system have different opinions on the state. Wouldn't you simply end up with a stalled or incomplete transaction?</p>
<p>I'm not sure if I know a better solution to issues like this for these scenarios </p>
</div>
</div>
<script>
</script>
<footer class="comment__footer print-hidden">
<button
class="crayons-tooltip__activator relative crayons-btn crayons-btn--ghost crayons-btn--icon-left crayons-btn--s mr-1 reaction-like inline-flex reaction-button"
id="button-for-comment-1051160"
data-comment-id="1051160"
aria-label="like"
data-tracking-name="comment_heart_button">
<svg xmlns="http://www.w3.org/2000/svg" width="24" height="24" role="img" aria-labelledby="ahash2yv998pom9fce0qm18hpp33fle6" class="crayons-icon reaction-icon not-reacted"><title id="ahash2yv998pom9fce0qm18hpp33fle6">Like comment: </title><path d="M18.884 12.595l.01.011L12 19.5l-6.894-6.894.01-.01A4.875 4.875 0 0112 5.73a4.875 4.875 0 016.884 6.865zM6.431 7.037a3.375 3.375 0 000 4.773L12 17.38l5.569-5.569a3.375 3.375 0 10-4.773-4.773L9.613 10.22l-1.06-1.062 2.371-2.372a3.375 3.375 0 00-4.492.25v.001z"></path></svg>
<svg xmlns="http://www.w3.org/2000/svg" width="24" height="24" viewBox="0 0 24 24" role="img" aria-labelledby="aq091ccgsa5tkdpgd5zigxavgmuivxjr" class="crayons-icon crayons-icon reaction-icon--like reaction-icon reacted"><title id="aq091ccgsa5tkdpgd5zigxavgmuivxjr">Like comment: </title>
<path d="M5.116 12.595a4.875 4.875 0 015.56-7.68h-.002L7.493 8.098l1.06 1.061 3.181-3.182a4.875 4.875 0 016.895 6.894L12 19.5l-6.894-6.894.01-.01z"></path>
</svg>
<span class="reactions-count">2</span><span class="reactions-label hidden m:inline-block">&nbsp;likes</span>
<span data-testid="tooltip" class="crayons-tooltip__content">
Like
</span>
</button>
<span class="favorite-control-root" data-favorite-control="true" data-variant="comment" data-favoritable-type="Comment" data-favoritable-id="1051160" data-favoritable-user-id="1027393" data-favorited="false" data-label-favorite="Pick as gem" data-label-favorited="Picked as gem" data-label-favorited-by-you="Picked as gem by you" data-modal-title="Gem Picked!" data-modal-body="You&#39;ve picked this as a community gem!" data-modal-remaining-zero="You have no more gems left to give out today." data-modal-remaining-one="You have 1 more gem left to give out today." data-modal-remaining-other="You have %{count} more gems left to give out today." data-modal-remaining-unlimited="You have unlimited gems to give out." data-modal-close="Got it" data-modal-exhausted-title="Out of Gems" data-modal-exhausted-body="You have no more gems left to give out today. Your allowance will refresh soon!" data-modal-exhausted-close="Got it"></span>
<span class="fs-s inline-flex items-center fs-italic color-base-50 pl-1">
<svg xmlns="http://www.w3.org/2000/svg" width="24" height="24" viewBox="0 0 24 24" role="img" aria-labelledby="a8282qv5j0nf6mp5va43qewvbdqivdtf" class="crayons-icon"><title id="a8282qv5j0nf6mp5va43qewvbdqivdtf">Thread</title>
<path d="M17 13l-5 6-5-6h3.125c0-3.314 2.798-6 6.25-6 .17 0 .34.006.506.02-1.787.904-3.006 2.705-3.006 4.78V13H17z"></path>
</svg>
Thread
</span>
</footer>
</div>
</div>
<div
id="comment-node-1051189"
class="
comment single-comment-node
child
comment--deep-3
"
data-comment-id="1051189"
data-path="/siy/the-saga-is-antipattern-1354/comments/27l09"
data-comment-author-id="145374"
data-content-user-id="145374">
<a name="comment-27l09" style="position: absolute; top: -8px;">&nbsp;</a>
<div class="comment__inner">
<a href="https://dev.to/siy" class="shrink-0 crayons-avatar mt-4">
<img class="crayons-avatar__image" width="32" height="32" src="https://media2.dev.to/dynamic/image/width=50,height=50,fit=cover,gravity=auto,format=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Fuser%2Fprofile_image%2F145374%2F6e93547b-45cc-430e-9659-3adea03266b5.jpeg" alt="siy profile image" loading="lazy" />
</a>
<div class="inner-comment comment__details">
<div class="comment__content crayons-card">
<div class="comment__header">
<a href="https://dev.to/siy" class="crayons-link crayons-link--secondary flex items-center fw-medium m:hidden">
<span class="js-comment-username">
Sergiy Yevtushenko
</span>
<span class="crayons-hover-tooltip inline-block spec-op-author -mr-2" data-tooltip="Author">
<svg xmlns="http://www.w3.org/2000/svg" width="24" height="24" viewBox="0 0 24 24" role="img" class="crayons-icon">
<path d="M12 8.25a6 6 0 110 12 6 6 0 010-12zm0 2.625l-.992 2.01-2.218.322 1.605 1.564-.379 2.21L12 15.937l1.984 1.043-.379-2.209 1.605-1.564-2.218-.323L12 10.875zm.75-6.376l3.75.001v2.25l-1.022.854a7.45 7.45 0 00-2.728-.817V4.5zm-1.5 0v2.288a7.451 7.451 0 00-2.727.816L7.5 6.75V4.5h3.75z"></path>
</svg>
</span>
</a>
<div class="profile-preview-card relative mb-4 s:mb-0 fw-medium hidden m:block">
<button id="comment-profile-preview-trigger-1051189" aria-controls="comment-profile-preview-content-1051189" class="profile-preview-card__trigger p-1 -my-1 -ml-1 crayons-btn crayons-btn--ghost" aria-label="Sergiy Yevtushenko profile details">
Sergiy Yevtushenko
</button>
<div id="comment-profile-preview-content-1051189" class="profile-preview-card__content p-4 pt-0 branded-7 crayons-dropdown" style="--card-color: #a198bb; border-top-color: var(--card-color);" data-testid="profile-preview-card" data-repositioning-dropdown="true">
<div class="gap-4 grid">
<div class="-mt-4">
<a href="/siy" class="flex">
<span class="crayons-avatar crayons-avatar--xl mr-2 shrink-0">
<img src="https://media2.dev.to/dynamic/image/width=90,height=90,fit=cover,gravity=auto,format=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Fuser%2Fprofile_image%2F145374%2F6e93547b-45cc-430e-9659-3adea03266b5.jpeg" class="crayons-avatar__image" alt="" loading="lazy" />
</span>
<span class="crayons-link crayons-subtitle-2 mt-5">
Sergiy Yevtushenko
</span>
</a>
</div>
<div class="print-hidden">
<button name="button" type="button" data-info="{&quot;className&quot;:&quot;User&quot;,&quot;style&quot;:&quot;&quot;,&quot;id&quot;:145374,&quot;name&quot;:&quot;Sergiy Yevtushenko&quot;}" class="crayons-btn follow-action-button whitespace-nowrap w-100 follow-user" aria-label="Follow user: Sergiy Yevtushenko" aria-pressed="false">Follow</button>
</div>
<div class="color-base-70">
Writing code for 35+ years and still enjoy it...
</div>
<div class="user-metadata-details">
<ul class="user-metadata-details-inner">
<li>
<div class="key">
Location
</div>
<div class="value">
Krakow, Poland
</div>
</li>
<li>
<div class="key">
Work
</div>
<div class="value">
Senior Software Engineer
</div>
</li>
<li>
<div class="key">
Joined
</div>
<div class="value">
<time datetime="2019-03-14T05:28:55Z" class="date">Mar 14, 2019</time>
</div>
</li>
</ul>
</div>
</div>
</div>
<span class="crayons-hover-tooltip inline-block spec-op-author -ml-2" data-tooltip="Author">
<svg xmlns="http://www.w3.org/2000/svg" width="24" height="24" viewBox="0 0 24 24" role="img" class="crayons-icon">
<path d="M12 8.25a6 6 0 110 12 6 6 0 010-12zm0 2.625l-.992 2.01-2.218.322 1.605 1.564-.379 2.21L12 15.937l1.984 1.043-.379-2.209 1.605-1.564-2.218-.323L12 10.875zm.75-6.376l3.75.001v2.25l-1.022.854a7.45 7.45 0 00-2.728-.817V4.5zm-1.5 0v2.288a7.451 7.451 0 00-2.727.816L7.5 6.75V4.5h3.75z"></path>
</svg>
</span>
</div>
<span class="color-base-30 px-2 m:pl-0" role="presentation">&bull;</span>
<a href="https://dev.to/siy/the-saga-is-antipattern-1354#comment-27l09" class="comment-date crayons-link crayons-link--secondary fs-s">
<time datetime="2023-07-05T12:39:56Z" class=date-short-year>
Jul 5 &#39;23
</time>
</a>
<div class="comment__dropdown" data-tracking-name="comment_dropdown">
<button id="comment-dropdown-trigger-1051189" aria-controls="comment-dropdown-1051189" aria-expanded="false"
class="dropbtn comment__dropdown-trigger crayons-btn crayons-btn--s crayons-btn--ghost crayons-btn--icon "
aria-label="Toggle dropdown menu" aria-haspopup="true">
<svg xmlns="http://www.w3.org/2000/svg" width="24" height="24" viewBox="0 0 24 24" role="img" aria-labelledby="ahy7w7aey7h5el0k8owrg6r8mqlnx4k7" class="crayons-icon pointer-events-none"><title id="ahy7w7aey7h5el0k8owrg6r8mqlnx4k7">Dropdown menu</title>
<path fill-rule="evenodd" clip-rule="evenodd" d="M8.25 12a1.5 1.5 0 11-3 0 1.5 1.5 0 013 0zm5.25 0a1.5 1.5 0 11-3 0 1.5 1.5 0 013 0zm3.75 1.5a1.5 1.5 0 100-3 1.5 1.5 0 000 3z"></path>
</svg>
</button>
<div id="comment-dropdown-1051189" class="crayons-dropdown right-1 s:right-0 s:left-auto fs-base dropdown">
<ul class="m-0">
<li><a href="https://dev.to/siy/the-saga-is-antipattern-1354#comment-27l09" class="crayons-link crayons-link--block permalink-copybtn" aria-label="Copy link to Sergiy Yevtushenko&#39;s comment" data-no-instant>Copy link</a></li>
<li class="comment-actions hidden" data-user-id="145374" data-action="settings-button" data-path="https://dev.to/siy/comment/27l09/settings" aria-label="Go to Sergiy Yevtushenko&#39;s comment settings"></li>
<li class="comment-actions hidden" data-action="hide-button" data-commentable-user-id="145374" data-user-id="145374">
<button
class="flex justify-between crayons-link crayons-link--block w-100 bg-transparent border-0 hide-comment"
data-hide-type="hide"
data-comment-id="1051189"
data-comment-url="https://dev.to/siy/comment/27l09"
aria-label="Hide Sergiy Yevtushenko&#39;s comment">
Hide
</button>
</li>
<li class="mod-actions hidden mod-actions-comment-button" data-path="https://dev.to/siy/comment/27l09/mod" aria-label="Moderate Sergiy Yevtushenko&#39;s comment"></li>
<li class="report-abuse-link-wrapper" data-path="/report-abuse?url=https://dev.to/siy/comment/27l09" aria-label="Report Sergiy Yevtushenko&#39;s comment as abusive or violating our code of conduct and/or terms and conditions"></li>
<li class="current-user-actions"></li>
</ul>
</div>
</div>
</div>
<div
class="
comment__body
text-styles
text-styles--secondary
body
">
<p>Those distributed systems, which have consensus, don't suffer from such issues by design. For example, clusters can perform transactions (including ACID) without any problems. </p>
<p>Yes, in practice it is possible to achieve, as I call it, "parametric consensus". It means that everything will work properly (even in the face of some number of failures) as long as every component of the system works according to expectations of other components. The main issue in this case is the lack of any confidence that all components are working properly unless you have end-to-end testing which covers all (or most) of possible failures. In practice, I didn't see such setups. I guess the main reason is expensive maintenance of such a test setup.</p>
<p>The better (I'd say "best") solution is to use proper design, which does not suffer from microservices issues. A large part of my article is dedicated to possible solutions. From my experience, most organizations can safely stick with modulith. Being implemented with a decent technology stack, it can handle loads way more than those organizations may ever need. But if there is a real need to scale up (especially dynamically), then EDA or clustered approach will be better. EDA is better described in available sources, but requires somewhat specific internal design and mindset. The clustered design might provide more familiar internals, and the app might be designed completely self-contained (zero infrastructure dependency). Unfortunately, there is very little information about it, although the first app designed this way I've implemented more than a decade ago.</p>
</div>
</div>
<script>
</script>
<footer class="comment__footer print-hidden">
<button
class="crayons-tooltip__activator relative crayons-btn crayons-btn--ghost crayons-btn--icon-left crayons-btn--s mr-1 reaction-like inline-flex reaction-button"
id="button-for-comment-1051189"
data-comment-id="1051189"
aria-label="like"
data-tracking-name="comment_heart_button">
<svg xmlns="http://www.w3.org/2000/svg" width="24" height="24" role="img" aria-labelledby="aal43bhvgm9oqrp3q7ib104eqmnammpz" class="crayons-icon reaction-icon not-reacted"><title id="aal43bhvgm9oqrp3q7ib104eqmnammpz">Like comment: </title><path d="M18.884 12.595l.01.011L12 19.5l-6.894-6.894.01-.01A4.875 4.875 0 0112 5.73a4.875 4.875 0 016.884 6.865zM6.431 7.037a3.375 3.375 0 000 4.773L12 17.38l5.569-5.569a3.375 3.375 0 10-4.773-4.773L9.613 10.22l-1.06-1.062 2.371-2.372a3.375 3.375 0 00-4.492.25v.001z"></path></svg>
<svg xmlns="http://www.w3.org/2000/svg" width="24" height="24" viewBox="0 0 24 24" role="img" aria-labelledby="agf7g21u20t6zljahwx1xnb5devi90y0" class="crayons-icon crayons-icon reaction-icon--like reaction-icon reacted"><title id="agf7g21u20t6zljahwx1xnb5devi90y0">Like comment: </title>
<path d="M5.116 12.595a4.875 4.875 0 015.56-7.68h-.002L7.493 8.098l1.06 1.061 3.181-3.182a4.875 4.875 0 016.895 6.894L12 19.5l-6.894-6.894.01-.01z"></path>
</svg>
<span class="reactions-count">1</span><span class="reactions-label hidden m:inline-block">&nbsp;like</span>
<span data-testid="tooltip" class="crayons-tooltip__content">
Like
</span>
</button>
<span class="favorite-control-root" data-favorite-control="true" data-variant="comment" data-favoritable-type="Comment" data-favoritable-id="1051189" data-favoritable-user-id="145374" data-favorited="false" data-label-favorite="Pick as gem" data-label-favorited="Picked as gem" data-label-favorited-by-you="Picked as gem by you" data-modal-title="Gem Picked!" data-modal-body="You&#39;ve picked this as a community gem!" data-modal-remaining-zero="You have no more gems left to give out today." data-modal-remaining-one="You have 1 more gem left to give out today." data-modal-remaining-other="You have %{count} more gems left to give out today." data-modal-remaining-unlimited="You have unlimited gems to give out." data-modal-close="Got it" data-modal-exhausted-title="Out of Gems" data-modal-exhausted-body="You have no more gems left to give out today. Your allowance will refresh soon!" data-modal-exhausted-close="Got it"></span>
<span class="fs-s inline-flex items-center fs-italic color-base-50 pl-1">
<svg xmlns="http://www.w3.org/2000/svg" width="24" height="24" viewBox="0 0 24 24" role="img" aria-labelledby="aodabj75tg4whambnr8i56agppgmhmb5" class="crayons-icon"><title id="aodabj75tg4whambnr8i56agppgmhmb5">Thread</title>
<path d="M17 13l-5 6-5-6h3.125c0-3.314 2.798-6 6.25-6 .17 0 .34.006.506.02-1.787.904-3.006 2.705-3.006 4.78V13H17z"></path>
</svg>
Thread
</span>
</footer>
</div>
</div>
<div
id="comment-node-1051412"
class="
comment single-comment-node
child
comment--deep-4
comment--too-deep
"
data-comment-id="1051412"
data-path="/siy/the-saga-is-antipattern-1354/comments/27l8o"
data-comment-author-id="1027393"
data-content-user-id="1027393">
<a name="comment-27l8o" style="position: absolute; top: -8px;">&nbsp;</a>
<div class="comment__inner">
<a href="https://dev.to/kbirgerdev" class="shrink-0 crayons-avatar mt-4">
<img class="crayons-avatar__image" width="32" height="32" src="https://media2.dev.to/dynamic/image/width=50,height=50,fit=cover,gravity=auto,format=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Fuser%2Fprofile_image%2F1027393%2F9afe62aa-69b4-428a-9baf-b8275fc872a6.jpeg" alt="kbirgerdev profile image" loading="lazy" />
</a>
<div class="inner-comment comment__details">
<div class="comment__content crayons-card">
<div class="comment__header">
<a href="https://dev.to/kbirgerdev" class="crayons-link crayons-link--secondary flex items-center fw-medium m:hidden">
<span class="js-comment-username">
Kirill Birger
</span>
</a>
<div class="profile-preview-card relative mb-4 s:mb-0 fw-medium hidden m:block">
<button id="comment-profile-preview-trigger-1051412" aria-controls="comment-profile-preview-content-1051412" class="profile-preview-card__trigger p-1 -my-1 -ml-1 crayons-btn crayons-btn--ghost" aria-label="Kirill Birger profile details">
Kirill Birger
</button>
<div id="comment-profile-preview-content-1051412" class="profile-preview-card__content p-4 pt-0 branded-7 crayons-dropdown" style="--card-color: #000000; border-top-color: var(--card-color);" data-testid="profile-preview-card" data-repositioning-dropdown="true">
<div class="gap-4 grid">
<div class="-mt-4">
<a href="/kbirgerdev" class="flex">
<span class="crayons-avatar crayons-avatar--xl mr-2 shrink-0">
<img src="https://media2.dev.to/dynamic/image/width=90,height=90,fit=cover,gravity=auto,format=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Fuser%2Fprofile_image%2F1027393%2F9afe62aa-69b4-428a-9baf-b8275fc872a6.jpeg" class="crayons-avatar__image" alt="" loading="lazy" />
</span>
<span class="crayons-link crayons-subtitle-2 mt-5">
Kirill Birger
</span>
</a>
</div>
<div class="print-hidden">
<button name="button" type="button" data-info="{&quot;className&quot;:&quot;User&quot;,&quot;style&quot;:&quot;&quot;,&quot;id&quot;:1027393,&quot;name&quot;:&quot;Kirill Birger&quot;}" class="crayons-btn follow-action-button whitespace-nowrap w-100 follow-user" aria-label="Follow user: Kirill Birger" aria-pressed="false">Follow</button>
</div>
<div class="color-base-70">
Software Architect, Engineer, lover of beautiful code
</div>
<div class="user-metadata-details">
<ul class="user-metadata-details-inner">
<li>
<div class="key">
Education
</div>
<div class="value">
BSCS, MSCS Northeastern
</div>
</li>
<li>
<div class="key">
Work
</div>
<div class="value">
Software Architect
</div>
</li>
<li>
<div class="key">
Joined
</div>
<div class="value">
<time datetime="2023-02-15T12:31:24Z" class="date">Feb 15, 2023</time>
</div>
</li>
</ul>
</div>
</div>
</div>
</div>
<span class="color-base-30 px-2 m:pl-0" role="presentation">&bull;</span>
<a href="https://dev.to/siy/the-saga-is-antipattern-1354#comment-27l8o" class="comment-date crayons-link crayons-link--secondary fs-s">
<time datetime="2023-07-06T04:24:51Z" class=date-short-year>
Jul 6 &#39;23
</time>
</a>
<div class="comment__dropdown" data-tracking-name="comment_dropdown">
<button id="comment-dropdown-trigger-1051412" aria-controls="comment-dropdown-1051412" aria-expanded="false"
class="dropbtn comment__dropdown-trigger crayons-btn crayons-btn--s crayons-btn--ghost crayons-btn--icon "
aria-label="Toggle dropdown menu" aria-haspopup="true">
<svg xmlns="http://www.w3.org/2000/svg" width="24" height="24" viewBox="0 0 24 24" role="img" aria-labelledby="atcaf0cje1uixjvlv93kf4ek7niwczp1" class="crayons-icon pointer-events-none"><title id="atcaf0cje1uixjvlv93kf4ek7niwczp1">Dropdown menu</title>
<path fill-rule="evenodd" clip-rule="evenodd" d="M8.25 12a1.5 1.5 0 11-3 0 1.5 1.5 0 013 0zm5.25 0a1.5 1.5 0 11-3 0 1.5 1.5 0 013 0zm3.75 1.5a1.5 1.5 0 100-3 1.5 1.5 0 000 3z"></path>
</svg>
</button>
<div id="comment-dropdown-1051412" class="crayons-dropdown right-1 s:right-0 s:left-auto fs-base dropdown">
<ul class="m-0">
<li><a href="https://dev.to/siy/the-saga-is-antipattern-1354#comment-27l8o" class="crayons-link crayons-link--block permalink-copybtn" aria-label="Copy link to Kirill Birger&#39;s comment" data-no-instant>Copy link</a></li>
<li class="comment-actions hidden" data-user-id="1027393" data-action="settings-button" data-path="https://dev.to/kbirgerdev/comment/27l8o/settings" aria-label="Go to Kirill Birger&#39;s comment settings"></li>
<li class="comment-actions hidden" data-action="hide-button" data-commentable-user-id="145374" data-user-id="1027393">
<button
class="flex justify-between crayons-link crayons-link--block w-100 bg-transparent border-0 hide-comment"
data-hide-type="hide"
data-comment-id="1051412"
data-comment-url="https://dev.to/kbirgerdev/comment/27l8o"
aria-label="Hide Kirill Birger&#39;s comment">
Hide
</button>
</li>
<li class="mod-actions hidden mod-actions-comment-button" data-path="https://dev.to/kbirgerdev/comment/27l8o/mod" aria-label="Moderate Kirill Birger&#39;s comment"></li>
<li class="report-abuse-link-wrapper" data-path="/report-abuse?url=https://dev.to/kbirgerdev/comment/27l8o" aria-label="Report Kirill Birger&#39;s comment as abusive or violating our code of conduct and/or terms and conditions"></li>
<li class="current-user-actions"></li>
</ul>
</div>
</div>
</div>
<div
class="
comment__body
text-styles
text-styles--secondary
body
">
<p>You're not describing failures of microservices, or sagas. You're discussing failures of straw man implementations of code.</p>
<blockquote>
<p>The better (I'd say "best") solution is to use proper design, which does not suffer from microservices issues.</p>
</blockquote>
<p>Your design has nothing to do with saga. Let me say it again: You are claiming that saga is an anti pattern, and then you wrote an incredibly verbose pitch to your other blog post. I'm not making any claims about click bait or not, but that is what is coming across here.</p>
<p>The proposals you make have merit. I am simply pointing out that none of this has any meaningful connection to sagas. Hence my comment about your point not being made. It's simply a non sequitur.</p>
<p>Moreover, what you are referring to as cluster based nanoservices is actually how kubernetes and istio work.</p>
<p>You can't just ignore the fact that you will never have full control over every system on the internet. Many transactions do not terminate in your code, but call to third parties. It does not MATTER if you have "nano" services, micro services, mega services, or anything else. You make arguments about microservices with poor boundaries. That's not a trait of microservices, that's a trait of bad software writing.</p>
<p>Yes, if none of the software behaves in reasonable ways, saga won't work. What's your point? If an asteroid hits your router, will you get double charged?</p>
<p>Microservices and saga have disadvantages, but not the ones you're claiming, except for the comments about dependency management, and running locally, which seem to also be an issue in your proposal</p>
</div>
</div>
<script>
</script>
<footer class="comment__footer print-hidden">
<button
class="crayons-tooltip__activator relative crayons-btn crayons-btn--ghost crayons-btn--icon-left crayons-btn--s mr-1 reaction-like inline-flex reaction-button"
id="button-for-comment-1051412"
data-comment-id="1051412"
aria-label="like"
data-tracking-name="comment_heart_button">
<svg xmlns="http://www.w3.org/2000/svg" width="24" height="24" role="img" aria-labelledby="a3dvz6adkrtfvpugo9w02wxy28ys08m4" class="crayons-icon reaction-icon not-reacted"><title id="a3dvz6adkrtfvpugo9w02wxy28ys08m4">Like comment: </title><path d="M18.884 12.595l.01.011L12 19.5l-6.894-6.894.01-.01A4.875 4.875 0 0112 5.73a4.875 4.875 0 016.884 6.865zM6.431 7.037a3.375 3.375 0 000 4.773L12 17.38l5.569-5.569a3.375 3.375 0 10-4.773-4.773L9.613 10.22l-1.06-1.062 2.371-2.372a3.375 3.375 0 00-4.492.25v.001z"></path></svg>
<svg xmlns="http://www.w3.org/2000/svg" width="24" height="24" viewBox="0 0 24 24" role="img" aria-labelledby="alz2vzqihgnp10425abh24g4lquy4wpx" class="crayons-icon crayons-icon reaction-icon--like reaction-icon reacted"><title id="alz2vzqihgnp10425abh24g4lquy4wpx">Like comment: </title>
<path d="M5.116 12.595a4.875 4.875 0 015.56-7.68h-.002L7.493 8.098l1.06 1.061 3.181-3.182a4.875 4.875 0 016.895 6.894L12 19.5l-6.894-6.894.01-.01z"></path>
</svg>
<span class="reactions-count">3</span><span class="reactions-label hidden m:inline-block">&nbsp;likes</span>
<span data-testid="tooltip" class="crayons-tooltip__content">
Like
</span>
</button>
<span class="favorite-control-root" data-favorite-control="true" data-variant="comment" data-favoritable-type="Comment" data-favoritable-id="1051412" data-favoritable-user-id="1027393" data-favorited="false" data-label-favorite="Pick as gem" data-label-favorited="Picked as gem" data-label-favorited-by-you="Picked as gem by you" data-modal-title="Gem Picked!" data-modal-body="You&#39;ve picked this as a community gem!" data-modal-remaining-zero="You have no more gems left to give out today." data-modal-remaining-one="You have 1 more gem left to give out today." data-modal-remaining-other="You have %{count} more gems left to give out today." data-modal-remaining-unlimited="You have unlimited gems to give out." data-modal-close="Got it" data-modal-exhausted-title="Out of Gems" data-modal-exhausted-body="You have no more gems left to give out today. Your allowance will refresh soon!" data-modal-exhausted-close="Got it"></span>
<span class="fs-s inline-flex items-center fs-italic color-base-50 pl-1">
<svg xmlns="http://www.w3.org/2000/svg" width="24" height="24" viewBox="0 0 24 24" role="img" aria-labelledby="a1whnr948a2uxnlsqerf8gca7clr1dxu" class="crayons-icon"><title id="a1whnr948a2uxnlsqerf8gca7clr1dxu">Thread</title>
<path d="M17 13l-5 6-5-6h3.125c0-3.314 2.798-6 6.25-6 .17 0 .34.006.506.02-1.787.904-3.006 2.705-3.006 4.78V13H17z"></path>
</svg>
Thread
</span>
</footer>
</div>
</div>
<div
id="comment-node-1051495"
class="
comment single-comment-node
child
comment--deep-5
comment--too-deep
"
data-comment-id="1051495"
data-path="/siy/the-saga-is-antipattern-1354/comments/27lc3"
data-comment-author-id="145374"
data-content-user-id="145374">
<a name="comment-27lc3" style="position: absolute; top: -8px;">&nbsp;</a>
<div class="comment__inner">
<a href="https://dev.to/siy" class="shrink-0 crayons-avatar mt-4">
<img class="crayons-avatar__image" width="32" height="32" src="https://media2.dev.to/dynamic/image/width=50,height=50,fit=cover,gravity=auto,format=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Fuser%2Fprofile_image%2F145374%2F6e93547b-45cc-430e-9659-3adea03266b5.jpeg" alt="siy profile image" loading="lazy" />
</a>
<div class="inner-comment comment__details">
<div class="comment__content crayons-card">
<div class="comment__header">
<a href="https://dev.to/siy" class="crayons-link crayons-link--secondary flex items-center fw-medium m:hidden">
<span class="js-comment-username">
Sergiy Yevtushenko
</span>
<span class="crayons-hover-tooltip inline-block spec-op-author -mr-2" data-tooltip="Author">
<svg xmlns="http://www.w3.org/2000/svg" width="24" height="24" viewBox="0 0 24 24" role="img" class="crayons-icon">
<path d="M12 8.25a6 6 0 110 12 6 6 0 010-12zm0 2.625l-.992 2.01-2.218.322 1.605 1.564-.379 2.21L12 15.937l1.984 1.043-.379-2.209 1.605-1.564-2.218-.323L12 10.875zm.75-6.376l3.75.001v2.25l-1.022.854a7.45 7.45 0 00-2.728-.817V4.5zm-1.5 0v2.288a7.451 7.451 0 00-2.727.816L7.5 6.75V4.5h3.75z"></path>
</svg>
</span>
</a>
<div class="profile-preview-card relative mb-4 s:mb-0 fw-medium hidden m:block">
<button id="comment-profile-preview-trigger-1051495" aria-controls="comment-profile-preview-content-1051495" class="profile-preview-card__trigger p-1 -my-1 -ml-1 crayons-btn crayons-btn--ghost" aria-label="Sergiy Yevtushenko profile details">
Sergiy Yevtushenko
</button>
<div id="comment-profile-preview-content-1051495" class="profile-preview-card__content p-4 pt-0 branded-7 crayons-dropdown" style="--card-color: #a198bb; border-top-color: var(--card-color);" data-testid="profile-preview-card" data-repositioning-dropdown="true">
<div class="gap-4 grid">
<div class="-mt-4">
<a href="/siy" class="flex">
<span class="crayons-avatar crayons-avatar--xl mr-2 shrink-0">
<img src="https://media2.dev.to/dynamic/image/width=90,height=90,fit=cover,gravity=auto,format=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Fuser%2Fprofile_image%2F145374%2F6e93547b-45cc-430e-9659-3adea03266b5.jpeg" class="crayons-avatar__image" alt="" loading="lazy" />
</span>
<span class="crayons-link crayons-subtitle-2 mt-5">
Sergiy Yevtushenko
</span>
</a>
</div>
<div class="print-hidden">
<button name="button" type="button" data-info="{&quot;className&quot;:&quot;User&quot;,&quot;style&quot;:&quot;&quot;,&quot;id&quot;:145374,&quot;name&quot;:&quot;Sergiy Yevtushenko&quot;}" class="crayons-btn follow-action-button whitespace-nowrap w-100 follow-user" aria-label="Follow user: Sergiy Yevtushenko" aria-pressed="false">Follow</button>
</div>
<div class="color-base-70">
Writing code for 35+ years and still enjoy it...
</div>
<div class="user-metadata-details">
<ul class="user-metadata-details-inner">
<li>
<div class="key">
Location
</div>
<div class="value">
Krakow, Poland
</div>
</li>
<li>
<div class="key">
Work
</div>
<div class="value">
Senior Software Engineer
</div>
</li>
<li>
<div class="key">
Joined
</div>
<div class="value">
<time datetime="2019-03-14T05:28:55Z" class="date">Mar 14, 2019</time>
</div>
</li>
</ul>
</div>
</div>
</div>
<span class="crayons-hover-tooltip inline-block spec-op-author -ml-2" data-tooltip="Author">
<svg xmlns="http://www.w3.org/2000/svg" width="24" height="24" viewBox="0 0 24 24" role="img" class="crayons-icon">
<path d="M12 8.25a6 6 0 110 12 6 6 0 010-12zm0 2.625l-.992 2.01-2.218.322 1.605 1.564-.379 2.21L12 15.937l1.984 1.043-.379-2.209 1.605-1.564-2.218-.323L12 10.875zm.75-6.376l3.75.001v2.25l-1.022.854a7.45 7.45 0 00-2.728-.817V4.5zm-1.5 0v2.288a7.451 7.451 0 00-2.727.816L7.5 6.75V4.5h3.75z"></path>
</svg>
</span>
</div>
<span class="color-base-30 px-2 m:pl-0" role="presentation">&bull;</span>
<a href="https://dev.to/siy/the-saga-is-antipattern-1354#comment-27lc3" class="comment-date crayons-link crayons-link--secondary fs-s">
<time datetime="2023-07-06T09:00:22Z" class=date-short-year>
Jul 6 &#39;23
</time>
</a>
<div class="comment__dropdown" data-tracking-name="comment_dropdown">
<button id="comment-dropdown-trigger-1051495" aria-controls="comment-dropdown-1051495" aria-expanded="false"
class="dropbtn comment__dropdown-trigger crayons-btn crayons-btn--s crayons-btn--ghost crayons-btn--icon "
aria-label="Toggle dropdown menu" aria-haspopup="true">
<svg xmlns="http://www.w3.org/2000/svg" width="24" height="24" viewBox="0 0 24 24" role="img" aria-labelledby="a41j62afg35f3uphnpf80h5nkmc854pq" class="crayons-icon pointer-events-none"><title id="a41j62afg35f3uphnpf80h5nkmc854pq">Dropdown menu</title>
<path fill-rule="evenodd" clip-rule="evenodd" d="M8.25 12a1.5 1.5 0 11-3 0 1.5 1.5 0 013 0zm5.25 0a1.5 1.5 0 11-3 0 1.5 1.5 0 013 0zm3.75 1.5a1.5 1.5 0 100-3 1.5 1.5 0 000 3z"></path>
</svg>
</button>
<div id="comment-dropdown-1051495" class="crayons-dropdown right-1 s:right-0 s:left-auto fs-base dropdown">
<ul class="m-0">
<li><a href="https://dev.to/siy/the-saga-is-antipattern-1354#comment-27lc3" class="crayons-link crayons-link--block permalink-copybtn" aria-label="Copy link to Sergiy Yevtushenko&#39;s comment" data-no-instant>Copy link</a></li>
<li class="comment-actions hidden" data-user-id="145374" data-action="settings-button" data-path="https://dev.to/siy/comment/27lc3/settings" aria-label="Go to Sergiy Yevtushenko&#39;s comment settings"></li>
<li class="comment-actions hidden" data-action="hide-button" data-commentable-user-id="145374" data-user-id="145374">
<button
class="flex justify-between crayons-link crayons-link--block w-100 bg-transparent border-0 hide-comment"
data-hide-type="hide"
data-comment-id="1051495"
data-comment-url="https://dev.to/siy/comment/27lc3"
aria-label="Hide Sergiy Yevtushenko&#39;s comment">
Hide
</button>
</li>
<li class="mod-actions hidden mod-actions-comment-button" data-path="https://dev.to/siy/comment/27lc3/mod" aria-label="Moderate Sergiy Yevtushenko&#39;s comment"></li>
<li class="report-abuse-link-wrapper" data-path="/report-abuse?url=https://dev.to/siy/comment/27lc3" aria-label="Report Sergiy Yevtushenko&#39;s comment as abusive or violating our code of conduct and/or terms and conditions"></li>
<li class="current-user-actions"></li>
</ul>
</div>
</div>
</div>
<div
class="
comment__body
text-styles
text-styles--secondary
body
">
<blockquote>
<p>You're not describing failures of microservices, or sagas.</p>
</blockquote>
<p>I do. Perhaps you just don't want to accept that.</p>
<blockquote>
<p>You're discussing failures of straw man implementations of code.</p>
</blockquote>
<p>Even worse: I'm discussing a fundamental flaw in the microservices which Saga can't solve. Moreover, "straw man implementations" is the Saga, any recovery logic on top of it is not Saga.</p>
<blockquote>
<p>Your design has nothing to do with saga. </p>
</blockquote>
<p>We were discussing an example provided by you. </p>
<blockquote>
<p>You are claiming that saga is an anti pattern, and then you wrote an incredibly verbose pitch to your other blog post. </p>
</blockquote>
<p>Yes, it is, when applied to distributed transactions in microservices. And that my article exists for so long (first version was published around 2015) that pitching it makes no sense. Actually, today I'd rewrite it from scratch, but I'm keeping it as is for historical reasons.</p>
<blockquote>
<p>The proposals you make have merit. I am simply pointing out that none of this has any meaningful connection to sagas.</p>
</blockquote>
<p>It has, as long as sagas are used for distributed transactions.</p>
<blockquote>
<p>Moreover, what you are referring to as cluster based nanoservices is actually how kubernetes and istio work.</p>
</blockquote>
<p>As well as any other cluster - Redis, Apache Ignite, Hazelcast, Infinispan, Cassandra, Zookeeper, etc. etc. But you missed the key point of the proposed architecture: the application is part of the cluster. So, by putting your microservices inside Kubernetes, you don't get a system with the same properties and abilities as clustered nanoservices. There is another missing part: the first time when I've actually implemented a (somewhat simplified) version of the architecture was in 2012, when Kubernetes and istio didn't even exist.</p>
<blockquote>
<p>Many transactions do not terminate in your code, but call to third parties.</p>
</blockquote>
<p>So what?</p>
<blockquote>
<p>Yes, if none of the software behaves in reasonable ways, saga won't work. What's your point? </p>
</blockquote>
<p>It's worth reading what I wrote once again. It's not about "reasonable ways", it's about expectations of other parties. Some software may continue working reasonably and according to specs and docs, but no longer support some assumptions. And the whole system built with these assumptions in mind will stop working or, what is worse, start silently damaging or losing data.</p>
<blockquote>
<p>Microservices and saga have disadvantages, but not the ones you're claiming, </p>
</blockquote>
<p>Are you referring to my other articles? Because in this article, I'm not claiming, but pointing out, that microservices have no consensus. This is not a claim, but the fact.</p>
<blockquote>
<p>except for the comments about dependency management, and running locally, which seem to also be an issue in your proposal</p>
</blockquote>
<p>It largely depends on the particular implementation. For example, with Apache Ignite, I had an implementation which works starting from one node - perfectly fine for local deployment and development purposes.</p>
</div>
</div>
<script>
</script>
<footer class="comment__footer print-hidden">
<button
class="crayons-tooltip__activator relative crayons-btn crayons-btn--ghost crayons-btn--icon-left crayons-btn--s mr-1 reaction-like inline-flex reaction-button"
id="button-for-comment-1051495"
data-comment-id="1051495"
aria-label="like"
data-tracking-name="comment_heart_button">
<svg xmlns="http://www.w3.org/2000/svg" width="24" height="24" role="img" aria-labelledby="a2qlunpeyjepeod5yxmn50cs9xcc2fze" class="crayons-icon reaction-icon not-reacted"><title id="a2qlunpeyjepeod5yxmn50cs9xcc2fze">Like comment: </title><path d="M18.884 12.595l.01.011L12 19.5l-6.894-6.894.01-.01A4.875 4.875 0 0112 5.73a4.875 4.875 0 016.884 6.865zM6.431 7.037a3.375 3.375 0 000 4.773L12 17.38l5.569-5.569a3.375 3.375 0 10-4.773-4.773L9.613 10.22l-1.06-1.062 2.371-2.372a3.375 3.375 0 00-4.492.25v.001z"></path></svg>
<svg xmlns="http://www.w3.org/2000/svg" width="24" height="24" viewBox="0 0 24 24" role="img" aria-labelledby="afbhhawli0r86y7mcw75q0t73c6uodad" class="crayons-icon crayons-icon reaction-icon--like reaction-icon reacted"><title id="afbhhawli0r86y7mcw75q0t73c6uodad">Like comment: </title>
<path d="M5.116 12.595a4.875 4.875 0 015.56-7.68h-.002L7.493 8.098l1.06 1.061 3.181-3.182a4.875 4.875 0 016.895 6.894L12 19.5l-6.894-6.894.01-.01z"></path>
</svg>
<span class="reactions-count">1</span><span class="reactions-label hidden m:inline-block">&nbsp;like</span>
<span data-testid="tooltip" class="crayons-tooltip__content">
Like
</span>
</button>
<span class="favorite-control-root" data-favorite-control="true" data-variant="comment" data-favoritable-type="Comment" data-favoritable-id="1051495" data-favoritable-user-id="145374" data-favorited="false" data-label-favorite="Pick as gem" data-label-favorited="Picked as gem" data-label-favorited-by-you="Picked as gem by you" data-modal-title="Gem Picked!" data-modal-body="You&#39;ve picked this as a community gem!" data-modal-remaining-zero="You have no more gems left to give out today." data-modal-remaining-one="You have 1 more gem left to give out today." data-modal-remaining-other="You have %{count} more gems left to give out today." data-modal-remaining-unlimited="You have unlimited gems to give out." data-modal-close="Got it" data-modal-exhausted-title="Out of Gems" data-modal-exhausted-body="You have no more gems left to give out today. Your allowance will refresh soon!" data-modal-exhausted-close="Got it"></span>
<span class="fs-s inline-flex items-center fs-italic color-base-50 pl-1">
<svg xmlns="http://www.w3.org/2000/svg" width="24" height="24" viewBox="0 0 24 24" role="img" aria-labelledby="ahd2x2so52m5qmfay1c43ba06r9uuo7s" class="crayons-icon"><title id="ahd2x2so52m5qmfay1c43ba06r9uuo7s">Thread</title>
<path d="M17 13l-5 6-5-6h3.125c0-3.314 2.798-6 6.25-6 .17 0 .34.006.506.02-1.787.904-3.006 2.705-3.006 4.78V13H17z"></path>
</svg>
Thread
</span>
</footer>
</div>
</div>
<div
id="comment-node-1052544"
class="
comment single-comment-node
child
comment--deep-6
comment--too-deep
"
data-comment-id="1052544"
data-path="/siy/the-saga-is-antipattern-1354/comments/27n0c"
data-comment-author-id="202411"
data-content-user-id="202411">
<a name="comment-27n0c" style="position: absolute; top: -8px;">&nbsp;</a>
<div class="comment__inner">
<a href="https://dev.to/drdamour" class="shrink-0 crayons-avatar mt-4">
<img class="crayons-avatar__image" width="32" height="32" src="https://media2.dev.to/dynamic/image/width=50,height=50,fit=cover,gravity=auto,format=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Fuser%2Fprofile_image%2F202411%2Fe7dd1da7-6bcf-4e82-a1d8-b7c6eb7ff537.jpg" alt="drdamour profile image" loading="lazy" />
</a>
<div class="inner-comment comment__details">
<div class="comment__content crayons-card">
<div class="comment__header">
<a href="https://dev.to/drdamour" class="crayons-link crayons-link--secondary flex items-center fw-medium m:hidden">
<span class="js-comment-username">
chris damour
</span>
</a>
<div class="profile-preview-card relative mb-4 s:mb-0 fw-medium hidden m:block">
<button id="comment-profile-preview-trigger-1052544" aria-controls="comment-profile-preview-content-1052544" class="profile-preview-card__trigger p-1 -my-1 -ml-1 crayons-btn crayons-btn--ghost" aria-label="chris damour profile details">
chris damour
</button>
<div id="comment-profile-preview-content-1052544" class="profile-preview-card__content p-4 pt-0 branded-7 crayons-dropdown" style="--card-color: #002a9e; border-top-color: var(--card-color);" data-testid="profile-preview-card" data-repositioning-dropdown="true">
<div class="gap-4 grid">
<div class="-mt-4">
<a href="/drdamour" class="flex">
<span class="crayons-avatar crayons-avatar--xl mr-2 shrink-0">
<img src="https://media2.dev.to/dynamic/image/width=90,height=90,fit=cover,gravity=auto,format=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Fuser%2Fprofile_image%2F202411%2Fe7dd1da7-6bcf-4e82-a1d8-b7c6eb7ff537.jpg" class="crayons-avatar__image" alt="" loading="lazy" />
</span>
<span class="crayons-link crayons-subtitle-2 mt-5">
chris damour
</span>
</a>
</div>
<div class="print-hidden">
<button name="button" type="button" data-info="{&quot;className&quot;:&quot;User&quot;,&quot;style&quot;:&quot;&quot;,&quot;id&quot;:202411,&quot;name&quot;:&quot;chris damour&quot;}" class="crayons-btn follow-action-button whitespace-nowrap w-100 follow-user" aria-label="Follow user: chris damour" aria-pressed="false">Follow</button>
</div>
<div class="user-metadata-details">
<ul class="user-metadata-details-inner">
<li>
<div class="key">
Joined
</div>
<div class="value">
<time datetime="2019-07-27T14:54:39Z" class="date">Jul 27, 2019</time>
</div>
</li>
</ul>
</div>
</div>
</div>
</div>
<span class="color-base-30 px-2 m:pl-0" role="presentation">&bull;</span>
<a href="https://dev.to/siy/the-saga-is-antipattern-1354#comment-27n0c" class="comment-date crayons-link crayons-link--secondary fs-s">
<time datetime="2023-07-09T15:40:08Z" class=date-short-year>
Jul 9 &#39;23
</time>
</a>
<div class="comment__dropdown" data-tracking-name="comment_dropdown">
<button id="comment-dropdown-trigger-1052544" aria-controls="comment-dropdown-1052544" aria-expanded="false"
class="dropbtn comment__dropdown-trigger crayons-btn crayons-btn--s crayons-btn--ghost crayons-btn--icon "
aria-label="Toggle dropdown menu" aria-haspopup="true">
<svg xmlns="http://www.w3.org/2000/svg" width="24" height="24" viewBox="0 0 24 24" role="img" aria-labelledby="a8ezi51ze67czw85yubr9bayz8g9i24c" class="crayons-icon pointer-events-none"><title id="a8ezi51ze67czw85yubr9bayz8g9i24c">Dropdown menu</title>
<path fill-rule="evenodd" clip-rule="evenodd" d="M8.25 12a1.5 1.5 0 11-3 0 1.5 1.5 0 013 0zm5.25 0a1.5 1.5 0 11-3 0 1.5 1.5 0 013 0zm3.75 1.5a1.5 1.5 0 100-3 1.5 1.5 0 000 3z"></path>
</svg>
</button>
<div id="comment-dropdown-1052544" class="crayons-dropdown right-1 s:right-0 s:left-auto fs-base dropdown">
<ul class="m-0">
<li><a href="https://dev.to/siy/the-saga-is-antipattern-1354#comment-27n0c" class="crayons-link crayons-link--block permalink-copybtn" aria-label="Copy link to chris damour&#39;s comment" data-no-instant>Copy link</a></li>
<li class="comment-actions hidden" data-user-id="202411" data-action="settings-button" data-path="https://dev.to/drdamour/comment/27n0c/settings" aria-label="Go to chris damour&#39;s comment settings"></li>
<li class="comment-actions hidden" data-action="hide-button" data-commentable-user-id="145374" data-user-id="202411">
<button
class="flex justify-between crayons-link crayons-link--block w-100 bg-transparent border-0 hide-comment"
data-hide-type="hide"
data-comment-id="1052544"
data-comment-url="https://dev.to/drdamour/comment/27n0c"
aria-label="Hide chris damour&#39;s comment">
Hide
</button>
</li>
<li class="mod-actions hidden mod-actions-comment-button" data-path="https://dev.to/drdamour/comment/27n0c/mod" aria-label="Moderate chris damour&#39;s comment"></li>
<li class="report-abuse-link-wrapper" data-path="/report-abuse?url=https://dev.to/drdamour/comment/27n0c" aria-label="Report chris damour&#39;s comment as abusive or violating our code of conduct and/or terms and conditions"></li>
<li class="current-user-actions"></li>
</ul>
</div>
</div>
</div>
<div
class="
comment__body
text-styles
text-styles--secondary
body
">
<blockquote>
<p>Many transactions do not terminate in your code, but call to third parties.</p>
<p>So what?</p>
</blockquote>
<p>so the cluster approach will not work given their service runs in their nodes and by definition cant run in your cluster.</p>
<p>fwiw your comments come off as arrogant. Start with asssuming you are wrong and reread the comments, theyll make more sense.</p>
</div>
</div>
<script>
</script>
<footer class="comment__footer print-hidden">
<button
class="crayons-tooltip__activator relative crayons-btn crayons-btn--ghost crayons-btn--icon-left crayons-btn--s mr-1 reaction-like inline-flex reaction-button"
id="button-for-comment-1052544"
data-comment-id="1052544"
aria-label="like"
data-tracking-name="comment_heart_button">
<svg xmlns="http://www.w3.org/2000/svg" width="24" height="24" role="img" aria-labelledby="at4vrghin8leivcugnygdz420pbdd0ud" class="crayons-icon reaction-icon not-reacted"><title id="at4vrghin8leivcugnygdz420pbdd0ud">Like comment: </title><path d="M18.884 12.595l.01.011L12 19.5l-6.894-6.894.01-.01A4.875 4.875 0 0112 5.73a4.875 4.875 0 016.884 6.865zM6.431 7.037a3.375 3.375 0 000 4.773L12 17.38l5.569-5.569a3.375 3.375 0 10-4.773-4.773L9.613 10.22l-1.06-1.062 2.371-2.372a3.375 3.375 0 00-4.492.25v.001z"></path></svg>
<svg xmlns="http://www.w3.org/2000/svg" width="24" height="24" viewBox="0 0 24 24" role="img" aria-labelledby="an7ei3wmoecjt9l3hvv33knqwolda3dh" class="crayons-icon crayons-icon reaction-icon--like reaction-icon reacted"><title id="an7ei3wmoecjt9l3hvv33knqwolda3dh">Like comment: </title>
<path d="M5.116 12.595a4.875 4.875 0 015.56-7.68h-.002L7.493 8.098l1.06 1.061 3.181-3.182a4.875 4.875 0 016.895 6.894L12 19.5l-6.894-6.894.01-.01z"></path>
</svg>
<span class="reactions-count">2</span><span class="reactions-label hidden m:inline-block">&nbsp;likes</span>
<span data-testid="tooltip" class="crayons-tooltip__content">
Like
</span>
</button>
<span class="favorite-control-root" data-favorite-control="true" data-variant="comment" data-favoritable-type="Comment" data-favoritable-id="1052544" data-favoritable-user-id="202411" data-favorited="false" data-label-favorite="Pick as gem" data-label-favorited="Picked as gem" data-label-favorited-by-you="Picked as gem by you" data-modal-title="Gem Picked!" data-modal-body="You&#39;ve picked this as a community gem!" data-modal-remaining-zero="You have no more gems left to give out today." data-modal-remaining-one="You have 1 more gem left to give out today." data-modal-remaining-other="You have %{count} more gems left to give out today." data-modal-remaining-unlimited="You have unlimited gems to give out." data-modal-close="Got it" data-modal-exhausted-title="Out of Gems" data-modal-exhausted-body="You have no more gems left to give out today. Your allowance will refresh soon!" data-modal-exhausted-close="Got it"></span>
<span class="fs-s inline-flex items-center fs-italic color-base-50 pl-1">
<svg xmlns="http://www.w3.org/2000/svg" width="24" height="24" viewBox="0 0 24 24" role="img" aria-labelledby="as5scyfgv5pnookta73jabvrw3gyhbmi" class="crayons-icon"><title id="as5scyfgv5pnookta73jabvrw3gyhbmi">Thread</title>
<path d="M17 13l-5 6-5-6h3.125c0-3.314 2.798-6 6.25-6 .17 0 .34.006.506.02-1.787.904-3.006 2.705-3.006 4.78V13H17z"></path>
</svg>
Thread
</span>
</footer>
</div>
</div>
<div
id="comment-node-1052604"
class="
comment single-comment-node
child
comment--deep-7
comment--too-deep
"
data-comment-id="1052604"
data-path="/siy/the-saga-is-antipattern-1354/comments/27n2k"
data-comment-author-id="145374"
data-content-user-id="145374">
<a name="comment-27n2k" style="position: absolute; top: -8px;">&nbsp;</a>
<div class="comment__inner">
<a href="https://dev.to/siy" class="shrink-0 crayons-avatar mt-4">
<img class="crayons-avatar__image" width="32" height="32" src="https://media2.dev.to/dynamic/image/width=50,height=50,fit=cover,gravity=auto,format=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Fuser%2Fprofile_image%2F145374%2F6e93547b-45cc-430e-9659-3adea03266b5.jpeg" alt="siy profile image" loading="lazy" />
</a>
<div class="inner-comment comment__details">
<div class="comment__content crayons-card">
<div class="comment__header">
<a href="https://dev.to/siy" class="crayons-link crayons-link--secondary flex items-center fw-medium m:hidden">
<span class="js-comment-username">
Sergiy Yevtushenko
</span>
<span class="crayons-hover-tooltip inline-block spec-op-author -mr-2" data-tooltip="Author">
<svg xmlns="http://www.w3.org/2000/svg" width="24" height="24" viewBox="0 0 24 24" role="img" class="crayons-icon">
<path d="M12 8.25a6 6 0 110 12 6 6 0 010-12zm0 2.625l-.992 2.01-2.218.322 1.605 1.564-.379 2.21L12 15.937l1.984 1.043-.379-2.209 1.605-1.564-2.218-.323L12 10.875zm.75-6.376l3.75.001v2.25l-1.022.854a7.45 7.45 0 00-2.728-.817V4.5zm-1.5 0v2.288a7.451 7.451 0 00-2.727.816L7.5 6.75V4.5h3.75z"></path>
</svg>
</span>
</a>
<div class="profile-preview-card relative mb-4 s:mb-0 fw-medium hidden m:block">
<button id="comment-profile-preview-trigger-1052604" aria-controls="comment-profile-preview-content-1052604" class="profile-preview-card__trigger p-1 -my-1 -ml-1 crayons-btn crayons-btn--ghost" aria-label="Sergiy Yevtushenko profile details">
Sergiy Yevtushenko
</button>
<div id="comment-profile-preview-content-1052604" class="profile-preview-card__content p-4 pt-0 branded-7 crayons-dropdown" style="--card-color: #a198bb; border-top-color: var(--card-color);" data-testid="profile-preview-card" data-repositioning-dropdown="true">
<div class="gap-4 grid">
<div class="-mt-4">
<a href="/siy" class="flex">
<span class="crayons-avatar crayons-avatar--xl mr-2 shrink-0">
<img src="https://media2.dev.to/dynamic/image/width=90,height=90,fit=cover,gravity=auto,format=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Fuser%2Fprofile_image%2F145374%2F6e93547b-45cc-430e-9659-3adea03266b5.jpeg" class="crayons-avatar__image" alt="" loading="lazy" />
</span>
<span class="crayons-link crayons-subtitle-2 mt-5">
Sergiy Yevtushenko
</span>
</a>
</div>
<div class="print-hidden">
<button name="button" type="button" data-info="{&quot;className&quot;:&quot;User&quot;,&quot;style&quot;:&quot;&quot;,&quot;id&quot;:145374,&quot;name&quot;:&quot;Sergiy Yevtushenko&quot;}" class="crayons-btn follow-action-button whitespace-nowrap w-100 follow-user" aria-label="Follow user: Sergiy Yevtushenko" aria-pressed="false">Follow</button>
</div>
<div class="color-base-70">
Writing code for 35+ years and still enjoy it...
</div>
<div class="user-metadata-details">
<ul class="user-metadata-details-inner">
<li>
<div class="key">
Location
</div>
<div class="value">
Krakow, Poland
</div>
</li>
<li>
<div class="key">
Work
</div>
<div class="value">
Senior Software Engineer
</div>
</li>
<li>
<div class="key">
Joined
</div>
<div class="value">
<time datetime="2019-03-14T05:28:55Z" class="date">Mar 14, 2019</time>
</div>
</li>
</ul>
</div>
</div>
</div>
<span class="crayons-hover-tooltip inline-block spec-op-author -ml-2" data-tooltip="Author">
<svg xmlns="http://www.w3.org/2000/svg" width="24" height="24" viewBox="0 0 24 24" role="img" class="crayons-icon">
<path d="M12 8.25a6 6 0 110 12 6 6 0 010-12zm0 2.625l-.992 2.01-2.218.322 1.605 1.564-.379 2.21L12 15.937l1.984 1.043-.379-2.209 1.605-1.564-2.218-.323L12 10.875zm.75-6.376l3.75.001v2.25l-1.022.854a7.45 7.45 0 00-2.728-.817V4.5zm-1.5 0v2.288a7.451 7.451 0 00-2.727.816L7.5 6.75V4.5h3.75z"></path>
</svg>
</span>
</div>
<span class="color-base-30 px-2 m:pl-0" role="presentation">&bull;</span>
<a href="https://dev.to/siy/the-saga-is-antipattern-1354#comment-27n2k" class="comment-date crayons-link crayons-link--secondary fs-s">
<time datetime="2023-07-09T21:35:17Z" class=date-short-year>
Jul 9 &#39;23
</time>
</a>
<div class="comment__dropdown" data-tracking-name="comment_dropdown">
<button id="comment-dropdown-trigger-1052604" aria-controls="comment-dropdown-1052604" aria-expanded="false"
class="dropbtn comment__dropdown-trigger crayons-btn crayons-btn--s crayons-btn--ghost crayons-btn--icon "
aria-label="Toggle dropdown menu" aria-haspopup="true">
<svg xmlns="http://www.w3.org/2000/svg" width="24" height="24" viewBox="0 0 24 24" role="img" aria-labelledby="a2q35ziqb4ohvroctu6iqder5a0u7a8w" class="crayons-icon pointer-events-none"><title id="a2q35ziqb4ohvroctu6iqder5a0u7a8w">Dropdown menu</title>
<path fill-rule="evenodd" clip-rule="evenodd" d="M8.25 12a1.5 1.5 0 11-3 0 1.5 1.5 0 013 0zm5.25 0a1.5 1.5 0 11-3 0 1.5 1.5 0 013 0zm3.75 1.5a1.5 1.5 0 100-3 1.5 1.5 0 000 3z"></path>
</svg>
</button>
<div id="comment-dropdown-1052604" class="crayons-dropdown right-1 s:right-0 s:left-auto fs-base dropdown">
<ul class="m-0">
<li><a href="https://dev.to/siy/the-saga-is-antipattern-1354#comment-27n2k" class="crayons-link crayons-link--block permalink-copybtn" aria-label="Copy link to Sergiy Yevtushenko&#39;s comment" data-no-instant>Copy link</a></li>
<li class="comment-actions hidden" data-user-id="145374" data-action="settings-button" data-path="https://dev.to/siy/comment/27n2k/settings" aria-label="Go to Sergiy Yevtushenko&#39;s comment settings"></li>
<li class="comment-actions hidden" data-action="hide-button" data-commentable-user-id="145374" data-user-id="145374">
<button
class="flex justify-between crayons-link crayons-link--block w-100 bg-transparent border-0 hide-comment"
data-hide-type="hide"
data-comment-id="1052604"
data-comment-url="https://dev.to/siy/comment/27n2k"
aria-label="Hide Sergiy Yevtushenko&#39;s comment">
Hide
</button>
</li>
<li class="mod-actions hidden mod-actions-comment-button" data-path="https://dev.to/siy/comment/27n2k/mod" aria-label="Moderate Sergiy Yevtushenko&#39;s comment"></li>
<li class="report-abuse-link-wrapper" data-path="/report-abuse?url=https://dev.to/siy/comment/27n2k" aria-label="Report Sergiy Yevtushenko&#39;s comment as abusive or violating our code of conduct and/or terms and conditions"></li>
<li class="current-user-actions"></li>
</ul>
</div>
</div>
</div>
<div
class="
comment__body
text-styles
text-styles--secondary
body
">
<blockquote>
<p>so the cluster approach will not work given their service runs in their nodes and by definition cant run in your cluster<br>
It's not about cluster or EDA, given that we discuss microservices model. I just tried to get (second time) from my opponent explanation why/how this use case makes Saga not antipattern. Necessity can't make bad thing good. Using this use case as an argument sounds like declaring burning of fossil fuels not harmful to environment just because we live too far from the nearest supermarket and use gasoline car to go there. <br>
Real solution for this use case is to provide API suitable for 2PC by such external services, but this requires changes at the far end which we don't control. From the other hand, wide understanding the problem may create demand and vendors start adjusting their APIs.</p>
<p>fwiw your comments come off as arrogant. </p>
</blockquote>
<p>Sorry, that's my usual reaction to rude and ignorant comments from some wearers of architect hats. </p>
<blockquote>
<p>Start with asssuming you are wrong and reread the comments, theyll make more sense</p>
</blockquote>
<p>Thanks for suggestion. That's what I actually do every time.</p>
</div>
</div>
<script>
</script>
<footer class="comment__footer print-hidden">
<button
class="crayons-tooltip__activator relative crayons-btn crayons-btn--ghost crayons-btn--icon-left crayons-btn--s mr-1 reaction-like inline-flex reaction-button"
id="button-for-comment-1052604"
data-comment-id="1052604"
aria-label="like"
data-tracking-name="comment_heart_button">
<svg xmlns="http://www.w3.org/2000/svg" width="24" height="24" role="img" aria-labelledby="aj6zioqzsip7v54hlp6pxz7otskagb9n" class="crayons-icon reaction-icon not-reacted"><title id="aj6zioqzsip7v54hlp6pxz7otskagb9n">Like comment: </title><path d="M18.884 12.595l.01.011L12 19.5l-6.894-6.894.01-.01A4.875 4.875 0 0112 5.73a4.875 4.875 0 016.884 6.865zM6.431 7.037a3.375 3.375 0 000 4.773L12 17.38l5.569-5.569a3.375 3.375 0 10-4.773-4.773L9.613 10.22l-1.06-1.062 2.371-2.372a3.375 3.375 0 00-4.492.25v.001z"></path></svg>
<svg xmlns="http://www.w3.org/2000/svg" width="24" height="24" viewBox="0 0 24 24" role="img" aria-labelledby="asv5so7p7739p03nhq6es2nz03cy5zip" class="crayons-icon crayons-icon reaction-icon--like reaction-icon reacted"><title id="asv5so7p7739p03nhq6es2nz03cy5zip">Like comment: </title>
<path d="M5.116 12.595a4.875 4.875 0 015.56-7.68h-.002L7.493 8.098l1.06 1.061 3.181-3.182a4.875 4.875 0 016.895 6.894L12 19.5l-6.894-6.894.01-.01z"></path>
</svg>
<span class="reactions-count">2</span><span class="reactions-label hidden m:inline-block">&nbsp;likes</span>
<span data-testid="tooltip" class="crayons-tooltip__content">
Like
</span>
</button>
<span class="favorite-control-root" data-favorite-control="true" data-variant="comment" data-favoritable-type="Comment" data-favoritable-id="1052604" data-favoritable-user-id="145374" data-favorited="false" data-label-favorite="Pick as gem" data-label-favorited="Picked as gem" data-label-favorited-by-you="Picked as gem by you" data-modal-title="Gem Picked!" data-modal-body="You&#39;ve picked this as a community gem!" data-modal-remaining-zero="You have no more gems left to give out today." data-modal-remaining-one="You have 1 more gem left to give out today." data-modal-remaining-other="You have %{count} more gems left to give out today." data-modal-remaining-unlimited="You have unlimited gems to give out." data-modal-close="Got it" data-modal-exhausted-title="Out of Gems" data-modal-exhausted-body="You have no more gems left to give out today. Your allowance will refresh soon!" data-modal-exhausted-close="Got it"></span>
<span class="fs-s inline-flex items-center fs-italic color-base-50 pl-1">
<svg xmlns="http://www.w3.org/2000/svg" width="24" height="24" viewBox="0 0 24 24" role="img" aria-labelledby="a34jhomkla8qpt6o95e8murjf4hks7bk" class="crayons-icon"><title id="a34jhomkla8qpt6o95e8murjf4hks7bk">Thread</title>
<path d="M17 13l-5 6-5-6h3.125c0-3.314 2.798-6 6.25-6 .17 0 .34.006.506.02-1.787.904-3.006 2.705-3.006 4.78V13H17z"></path>
</svg>
Thread
</span>
</footer>
</div>
</div>
<div
id="comment-node-1052676"
class="
comment single-comment-node
child
comment--deep-8
comment--too-deep
"
data-comment-id="1052676"
data-path="/siy/the-saga-is-antipattern-1354/comments/27n5e"
data-comment-author-id="202411"
data-content-user-id="202411">
<a name="comment-27n5e" style="position: absolute; top: -8px;">&nbsp;</a>
<div class="comment__inner">
<a href="https://dev.to/drdamour" class="shrink-0 crayons-avatar mt-4">
<img class="crayons-avatar__image" width="32" height="32" src="https://media2.dev.to/dynamic/image/width=50,height=50,fit=cover,gravity=auto,format=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Fuser%2Fprofile_image%2F202411%2Fe7dd1da7-6bcf-4e82-a1d8-b7c6eb7ff537.jpg" alt="drdamour profile image" loading="lazy" />
</a>
<div class="inner-comment comment__details">
<div class="comment__content crayons-card">
<div class="comment__header">
<a href="https://dev.to/drdamour" class="crayons-link crayons-link--secondary flex items-center fw-medium m:hidden">
<span class="js-comment-username">
chris damour
</span>
</a>
<div class="profile-preview-card relative mb-4 s:mb-0 fw-medium hidden m:block">
<button id="comment-profile-preview-trigger-1052676" aria-controls="comment-profile-preview-content-1052676" class="profile-preview-card__trigger p-1 -my-1 -ml-1 crayons-btn crayons-btn--ghost" aria-label="chris damour profile details">
chris damour
</button>
<div id="comment-profile-preview-content-1052676" class="profile-preview-card__content p-4 pt-0 branded-7 crayons-dropdown" style="--card-color: #002a9e; border-top-color: var(--card-color);" data-testid="profile-preview-card" data-repositioning-dropdown="true">
<div class="gap-4 grid">
<div class="-mt-4">
<a href="/drdamour" class="flex">
<span class="crayons-avatar crayons-avatar--xl mr-2 shrink-0">
<img src="https://media2.dev.to/dynamic/image/width=90,height=90,fit=cover,gravity=auto,format=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Fuser%2Fprofile_image%2F202411%2Fe7dd1da7-6bcf-4e82-a1d8-b7c6eb7ff537.jpg" class="crayons-avatar__image" alt="" loading="lazy" />
</span>
<span class="crayons-link crayons-subtitle-2 mt-5">
chris damour
</span>
</a>
</div>
<div class="print-hidden">
<button name="button" type="button" data-info="{&quot;className&quot;:&quot;User&quot;,&quot;style&quot;:&quot;&quot;,&quot;id&quot;:202411,&quot;name&quot;:&quot;chris damour&quot;}" class="crayons-btn follow-action-button whitespace-nowrap w-100 follow-user" aria-label="Follow user: chris damour" aria-pressed="false">Follow</button>
</div>
<div class="user-metadata-details">
<ul class="user-metadata-details-inner">
<li>
<div class="key">
Joined
</div>
<div class="value">
<time datetime="2019-07-27T14:54:39Z" class="date">Jul 27, 2019</time>
</div>
</li>
</ul>
</div>
</div>
</div>
</div>
<span class="color-base-30 px-2 m:pl-0" role="presentation">&bull;</span>
<a href="https://dev.to/siy/the-saga-is-antipattern-1354#comment-27n5e" class="comment-date crayons-link crayons-link--secondary fs-s">
<time datetime="2023-07-10T04:28:38Z" class=date-short-year>
Jul 10 &#39;23
</time>
<span class="hidden m:inline-block">&bull; Edited on <time datetime="2023-07-10T04:29:38Z" class="date-no-year">Jul 10</time></span>
<span class="m:hidden">&bull; Edited</span>
</a>
<div class="comment__dropdown" data-tracking-name="comment_dropdown">
<button id="comment-dropdown-trigger-1052676" aria-controls="comment-dropdown-1052676" aria-expanded="false"
class="dropbtn comment__dropdown-trigger crayons-btn crayons-btn--s crayons-btn--ghost crayons-btn--icon "
aria-label="Toggle dropdown menu" aria-haspopup="true">
<svg xmlns="http://www.w3.org/2000/svg" width="24" height="24" viewBox="0 0 24 24" role="img" aria-labelledby="ai2uk7ii3jm013xw1yfb6lz8btrvbzqe" class="crayons-icon pointer-events-none"><title id="ai2uk7ii3jm013xw1yfb6lz8btrvbzqe">Dropdown menu</title>
<path fill-rule="evenodd" clip-rule="evenodd" d="M8.25 12a1.5 1.5 0 11-3 0 1.5 1.5 0 013 0zm5.25 0a1.5 1.5 0 11-3 0 1.5 1.5 0 013 0zm3.75 1.5a1.5 1.5 0 100-3 1.5 1.5 0 000 3z"></path>
</svg>
</button>
<div id="comment-dropdown-1052676" class="crayons-dropdown right-1 s:right-0 s:left-auto fs-base dropdown">
<ul class="m-0">
<li><a href="https://dev.to/siy/the-saga-is-antipattern-1354#comment-27n5e" class="crayons-link crayons-link--block permalink-copybtn" aria-label="Copy link to chris damour&#39;s comment" data-no-instant>Copy link</a></li>
<li class="comment-actions hidden" data-user-id="202411" data-action="settings-button" data-path="https://dev.to/drdamour/comment/27n5e/settings" aria-label="Go to chris damour&#39;s comment settings"></li>
<li class="comment-actions hidden" data-action="hide-button" data-commentable-user-id="145374" data-user-id="202411">
<button
class="flex justify-between crayons-link crayons-link--block w-100 bg-transparent border-0 hide-comment"
data-hide-type="hide"
data-comment-id="1052676"
data-comment-url="https://dev.to/drdamour/comment/27n5e"
aria-label="Hide chris damour&#39;s comment">
Hide
</button>
</li>
<li class="mod-actions hidden mod-actions-comment-button" data-path="https://dev.to/drdamour/comment/27n5e/mod" aria-label="Moderate chris damour&#39;s comment"></li>
<li class="report-abuse-link-wrapper" data-path="/report-abuse?url=https://dev.to/drdamour/comment/27n5e" aria-label="Report chris damour&#39;s comment as abusive or violating our code of conduct and/or terms and conditions"></li>
<li class="current-user-actions"></li>
</ul>
</div>
</div>
</div>
<div
class="
comment__body
text-styles
text-styles--secondary
body
">
<blockquote>
<p>from my opponent </p>
</blockquote>
<p>its not a battle man, chill out. your article isnt that strong, these comments critiques are offering u a chance to make it stronger.</p>
<blockquote>
<p>Real solution for this use case is to provide API suitable for 2PC by such external services, but this requires changes at the far end which we don't control.</p>
</blockquote>
<p>we have different definitions of "real", perhaps you mean ideal solution. real to me means real world and in the real world i have to play by "their" rules/implementation. and saga works well enough.</p>
<blockquote>
<p>wide understanding the problem may create demand and vendors start adjusting their APIs</p>
</blockquote>
<p>i can agree with this. i principal engineer for fairly large (15k employee) biz and have felt it my duty to change our RFPs to ask for EDA and 2PC capabilities, hoping that it moves the needle ever so slightly. if customers dont ask and bandaid every time with existing "rest" (99% of time its just json rpc and not restful at all) service offerings from 3rd parties then we'll never get out of this downward spiral.</p>
<p>overall based on your comments i think the problem with this article is poor title/intro. "X is antipattern" means don't do it. more it seems what you're trying to say is "stop allowing your circumstances to force you into X, think of it as n anti pattern and demand better solutions"</p>
</div>
</div>
<script>
</script>
<footer class="comment__footer print-hidden">
<button
class="crayons-tooltip__activator relative crayons-btn crayons-btn--ghost crayons-btn--icon-left crayons-btn--s mr-1 reaction-like inline-flex reaction-button"
id="button-for-comment-1052676"
data-comment-id="1052676"
aria-label="like"
data-tracking-name="comment_heart_button">
<svg xmlns="http://www.w3.org/2000/svg" width="24" height="24" role="img" aria-labelledby="asbz47dvtzqee50129d372354sdnxqda" class="crayons-icon reaction-icon not-reacted"><title id="asbz47dvtzqee50129d372354sdnxqda">Like comment: </title><path d="M18.884 12.595l.01.011L12 19.5l-6.894-6.894.01-.01A4.875 4.875 0 0112 5.73a4.875 4.875 0 016.884 6.865zM6.431 7.037a3.375 3.375 0 000 4.773L12 17.38l5.569-5.569a3.375 3.375 0 10-4.773-4.773L9.613 10.22l-1.06-1.062 2.371-2.372a3.375 3.375 0 00-4.492.25v.001z"></path></svg>
<svg xmlns="http://www.w3.org/2000/svg" width="24" height="24" viewBox="0 0 24 24" role="img" aria-labelledby="ad16d0qw2h8rn4uebkipq44d6r4a5xx3" class="crayons-icon crayons-icon reaction-icon--like reaction-icon reacted"><title id="ad16d0qw2h8rn4uebkipq44d6r4a5xx3">Like comment: </title>
<path d="M5.116 12.595a4.875 4.875 0 015.56-7.68h-.002L7.493 8.098l1.06 1.061 3.181-3.182a4.875 4.875 0 016.895 6.894L12 19.5l-6.894-6.894.01-.01z"></path>
</svg>
<span class="reactions-count">1</span><span class="reactions-label hidden m:inline-block">&nbsp;like</span>
<span data-testid="tooltip" class="crayons-tooltip__content">
Like
</span>
</button>
<span class="favorite-control-root" data-favorite-control="true" data-variant="comment" data-favoritable-type="Comment" data-favoritable-id="1052676" data-favoritable-user-id="202411" data-favorited="false" data-label-favorite="Pick as gem" data-label-favorited="Picked as gem" data-label-favorited-by-you="Picked as gem by you" data-modal-title="Gem Picked!" data-modal-body="You&#39;ve picked this as a community gem!" data-modal-remaining-zero="You have no more gems left to give out today." data-modal-remaining-one="You have 1 more gem left to give out today." data-modal-remaining-other="You have %{count} more gems left to give out today." data-modal-remaining-unlimited="You have unlimited gems to give out." data-modal-close="Got it" data-modal-exhausted-title="Out of Gems" data-modal-exhausted-body="You have no more gems left to give out today. Your allowance will refresh soon!" data-modal-exhausted-close="Got it"></span>
<button
class="actions crayons-btn crayons-btn--ghost crayons-btn--s crayons-btn--icon-left toggle-reply-form mr-1 inline-flex"
data-comment-id="1052676"
data-path="/siy/the-saga-is-antipattern-1354/comments/27n5e"
data-tracking-name="comment_reply_button"
data-testid="reply-button-1052676"
rel="nofollow">
<svg xmlns="http://www.w3.org/2000/svg" width="24" height="24" role="img" aria-labelledby="ao197v0zccnhuq3y8cc9b4hj6b06e78g" class="crayons-icon reaction-icon not-reacted"><title id="ao197v0zccnhuq3y8cc9b4hj6b06e78g">Comment button</title><path d="M10.5 5h3a6 6 0 110 12v2.625c-3.75-1.5-9-3.75-9-8.625a6 6 0 016-6zM12 15.5h1.5a4.501 4.501 0 001.722-8.657A4.5 4.5 0 0013.5 6.5h-3A4.5 4.5 0 006 11c0 2.707 1.846 4.475 6 6.36V15.5z"></path></svg>
<span class="hidden m:inline-block">Reply</span>
</button>
</footer>
</div>
</div>
</div>
</div>
</div>
</div>
</div>
</div>
</div>
</details>
</div>
</details>
</div>
</details>
<details class="comment-wrapper js-comment-wrapper comment-wrapper--deep-0
root
" open>
<summary aria-label="Toggle this comment (and replies)" data-tracking-name="expand_comment_toggle">
<span class="m:mx-1 inline-block align-middle">
<svg xmlns="http://www.w3.org/2000/svg" width="24" height="24" viewBox="0 0 24 24" role="img" aria-labelledby="aelabszrgupu79qhgo253jnshgxmapjp" class="crayons-icon expanded"><title id="aelabszrgupu79qhgo253jnshgxmapjp">Collapse</title>
<path d="M12 10.677L8 6.935 9 6l3 2.807L15 6l1 .935-4 3.742zm0 4.517L9 18l-1-.935 4-3.742 4 3.742-1 .934-3-2.805z"></path>
</svg>
<svg xmlns="http://www.w3.org/2000/svg" width="24" height="24" viewBox="0 0 24 24" role="img" aria-labelledby="ao3drkewrittpve906rkczuolt69v5fn" class="crayons-icon collapsed"><title id="ao3drkewrittpve906rkczuolt69v5fn">Expand</title>
<path d="M12 18l-4-3.771 1-.943 3 2.829 3-2.829 1 .943L12 18zm0-10.115l-3 2.829-1-.943L12 6l4 3.771-1 .942-3-2.828z"></path>
</svg>
</span>
<span class="js-collapse-comment-content inline-block align-middle"></span>
</summary>
<div
id="comment-node-1050145"
class="
comment single-comment-node
root
comment--deep-0
"
data-comment-id="1050145"
data-path="/siy/the-saga-is-antipattern-1354/comments/27jc5"
data-comment-author-id="1094439"
data-content-user-id="1094439">
<a name="comment-27jc5" style="position: absolute; top: -8px;">&nbsp;</a>
<div class="comment__inner">
<a href="https://dev.to/khaledhosseini" class="shrink-0 crayons-avatar m:crayons-avatar--l mt-4 m:mt-3">
<img class="crayons-avatar__image" width="32" height="32" src="https://media2.dev.to/dynamic/image/width=50,height=50,fit=cover,gravity=auto,format=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Fuser%2Fprofile_image%2F1094439%2F84a43237-4936-459e-ae27-cb5c4e237b18.jpg" alt="khaledhosseini profile image" loading="lazy" />
</a>
<div class="inner-comment comment__details">
<div class="comment__content crayons-card">
<div class="comment__header">
<a href="https://dev.to/khaledhosseini" class="crayons-link crayons-link--secondary flex items-center fw-medium m:hidden">
<span class="js-comment-username">
Khaled Hosseini
</span>
</a>
<div class="profile-preview-card relative mb-4 s:mb-0 fw-medium hidden m:block">
<button id="comment-profile-preview-trigger-1050145" aria-controls="comment-profile-preview-content-1050145" class="profile-preview-card__trigger p-1 -my-1 -ml-1 crayons-btn crayons-btn--ghost" aria-label="Khaled Hosseini profile details">
Khaled Hosseini
</button>
<div id="comment-profile-preview-content-1050145" class="profile-preview-card__content p-4 pt-0 branded-7 crayons-dropdown" style="--card-color: #000000; border-top-color: var(--card-color);" data-testid="profile-preview-card" data-repositioning-dropdown="true">
<div class="gap-4 grid">
<div class="-mt-4">
<a href="/khaledhosseini" class="flex">
<span class="crayons-avatar crayons-avatar--xl mr-2 shrink-0">
<img src="https://media2.dev.to/dynamic/image/width=90,height=90,fit=cover,gravity=auto,format=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Fuser%2Fprofile_image%2F1094439%2F84a43237-4936-459e-ae27-cb5c4e237b18.jpg" class="crayons-avatar__image" alt="" loading="lazy" />
</span>
<span class="crayons-link crayons-subtitle-2 mt-5">
Khaled Hosseini
</span>
</a>
</div>
<div class="print-hidden">
<button name="button" type="button" data-info="{&quot;className&quot;:&quot;User&quot;,&quot;style&quot;:&quot;&quot;,&quot;id&quot;:1094439,&quot;name&quot;:&quot;Khaled Hosseini&quot;}" class="crayons-btn follow-action-button whitespace-nowrap w-100 follow-user" aria-label="Follow user: Khaled Hosseini" aria-pressed="false">Follow</button>
</div>
<div class="color-base-70">
From `Molecular Quantum Mechanics` To `Code`.
</div>
<div class="user-metadata-details">
<ul class="user-metadata-details-inner">
<li>
<div class="key">
Joined
</div>
<div class="value">
<time datetime="2023-06-02T17:18:02Z" class="date">Jun 2, 2023</time>
</div>
</li>
</ul>
</div>
</div>
</div>
</div>
<span class="color-base-30 px-2 m:pl-0" role="presentation">&bull;</span>
<a href="https://dev.to/siy/the-saga-is-antipattern-1354#comment-27jc5" class="comment-date crayons-link crayons-link--secondary fs-s">
<time datetime="2023-07-02T19:42:43Z" class=date-short-year>
Jul 2 &#39;23
</time>
</a>
<div class="comment__dropdown" data-tracking-name="comment_dropdown">
<button id="comment-dropdown-trigger-1050145" aria-controls="comment-dropdown-1050145" aria-expanded="false"
class="dropbtn comment__dropdown-trigger crayons-btn crayons-btn--s crayons-btn--ghost crayons-btn--icon "
aria-label="Toggle dropdown menu" aria-haspopup="true">
<svg xmlns="http://www.w3.org/2000/svg" width="24" height="24" viewBox="0 0 24 24" role="img" aria-labelledby="ajvu21v5nw5snb1e2rakvzkb33v3e0yo" class="crayons-icon pointer-events-none"><title id="ajvu21v5nw5snb1e2rakvzkb33v3e0yo">Dropdown menu</title>
<path fill-rule="evenodd" clip-rule="evenodd" d="M8.25 12a1.5 1.5 0 11-3 0 1.5 1.5 0 013 0zm5.25 0a1.5 1.5 0 11-3 0 1.5 1.5 0 013 0zm3.75 1.5a1.5 1.5 0 100-3 1.5 1.5 0 000 3z"></path>
</svg>
</button>
<div id="comment-dropdown-1050145" class="crayons-dropdown right-1 s:right-0 s:left-auto fs-base dropdown">
<ul class="m-0">
<li><a href="https://dev.to/siy/the-saga-is-antipattern-1354#comment-27jc5" class="crayons-link crayons-link--block permalink-copybtn" aria-label="Copy link to Khaled Hosseini&#39;s comment" data-no-instant>Copy link</a></li>
<li class="comment-actions hidden" data-user-id="1094439" data-action="settings-button" data-path="https://dev.to/khaledhosseini/comment/27jc5/settings" aria-label="Go to Khaled Hosseini&#39;s comment settings"></li>
<li class="comment-actions hidden" data-action="hide-button" data-commentable-user-id="145374" data-user-id="1094439">
<button
class="flex justify-between crayons-link crayons-link--block w-100 bg-transparent border-0 hide-comment"
data-hide-type="hide"
data-comment-id="1050145"
data-comment-url="https://dev.to/khaledhosseini/comment/27jc5"
aria-label="Hide Khaled Hosseini&#39;s comment">
Hide
</button>
</li>
<li class="mod-actions hidden mod-actions-comment-button" data-path="https://dev.to/khaledhosseini/comment/27jc5/mod" aria-label="Moderate Khaled Hosseini&#39;s comment"></li>
<li class="report-abuse-link-wrapper" data-path="/report-abuse?url=https://dev.to/khaledhosseini/comment/27jc5" aria-label="Report Khaled Hosseini&#39;s comment as abusive or violating our code of conduct and/or terms and conditions"></li>
<li class="current-user-actions"></li>
</ul>
</div>
</div>
</div>
<div
class="
comment__body
text-styles
text-styles--secondary
body
">
<p>Great article. </p>
</div>
</div>
<script>
</script>
<footer class="comment__footer print-hidden">
<button
class="crayons-tooltip__activator relative crayons-btn crayons-btn--ghost crayons-btn--icon-left crayons-btn--s mr-1 reaction-like inline-flex reaction-button"
id="button-for-comment-1050145"
data-comment-id="1050145"
aria-label="like"
data-tracking-name="comment_heart_button">
<svg xmlns="http://www.w3.org/2000/svg" width="24" height="24" role="img" aria-labelledby="aop9vnln5kvgl5cfg77td40v9958d72" class="crayons-icon reaction-icon not-reacted"><title id="aop9vnln5kvgl5cfg77td40v9958d72">Like comment: </title><path d="M18.884 12.595l.01.011L12 19.5l-6.894-6.894.01-.01A4.875 4.875 0 0112 5.73a4.875 4.875 0 016.884 6.865zM6.431 7.037a3.375 3.375 0 000 4.773L12 17.38l5.569-5.569a3.375 3.375 0 10-4.773-4.773L9.613 10.22l-1.06-1.062 2.371-2.372a3.375 3.375 0 00-4.492.25v.001z"></path></svg>
<svg xmlns="http://www.w3.org/2000/svg" width="24" height="24" viewBox="0 0 24 24" role="img" aria-labelledby="asv0araw5w3al72y0e452gjriedj1rwh" class="crayons-icon crayons-icon reaction-icon--like reaction-icon reacted"><title id="asv0araw5w3al72y0e452gjriedj1rwh">Like comment: </title>
<path d="M5.116 12.595a4.875 4.875 0 015.56-7.68h-.002L7.493 8.098l1.06 1.061 3.181-3.182a4.875 4.875 0 016.895 6.894L12 19.5l-6.894-6.894.01-.01z"></path>
</svg>
<span class="reactions-count">2</span><span class="reactions-label hidden m:inline-block">&nbsp;likes</span>
<span data-testid="tooltip" class="crayons-tooltip__content">
Like
</span>
</button>
<span class="favorite-control-root" data-favorite-control="true" data-variant="comment" data-favoritable-type="Comment" data-favoritable-id="1050145" data-favoritable-user-id="1094439" data-favorited="false" data-label-favorite="Pick as gem" data-label-favorited="Picked as gem" data-label-favorited-by-you="Picked as gem by you" data-modal-title="Gem Picked!" data-modal-body="You&#39;ve picked this as a community gem!" data-modal-remaining-zero="You have no more gems left to give out today." data-modal-remaining-one="You have 1 more gem left to give out today." data-modal-remaining-other="You have %{count} more gems left to give out today." data-modal-remaining-unlimited="You have unlimited gems to give out." data-modal-close="Got it" data-modal-exhausted-title="Out of Gems" data-modal-exhausted-body="You have no more gems left to give out today. Your allowance will refresh soon!" data-modal-exhausted-close="Got it"></span>
<button
class="actions crayons-btn crayons-btn--ghost crayons-btn--s crayons-btn--icon-left toggle-reply-form mr-1 inline-flex"
data-comment-id="1050145"
data-path="/siy/the-saga-is-antipattern-1354/comments/27jc5"
data-tracking-name="comment_reply_button"
data-testid="reply-button-1050145"
rel="nofollow">
<svg xmlns="http://www.w3.org/2000/svg" width="24" height="24" role="img" aria-labelledby="ab2l21vnk26uu5comhvkpg0x3xf396nm" class="crayons-icon reaction-icon not-reacted"><title id="ab2l21vnk26uu5comhvkpg0x3xf396nm">Comment button</title><path d="M10.5 5h3a6 6 0 110 12v2.625c-3.75-1.5-9-3.75-9-8.625a6 6 0 016-6zM12 15.5h1.5a4.501 4.501 0 001.722-8.657A4.5 4.5 0 0013.5 6.5h-3A4.5 4.5 0 006 11c0 2.707 1.846 4.475 6 6.36V15.5z"></path></svg>
<span class="hidden m:inline-block">Reply</span>
</button>
</footer>
</div>
</div>
</div>
</details>
<details class="comment-wrapper js-comment-wrapper comment-wrapper--deep-0
root
" open>
<summary aria-label="Toggle this comment (and replies)" data-tracking-name="expand_comment_toggle">
<span class="m:mx-1 inline-block align-middle">
<svg xmlns="http://www.w3.org/2000/svg" width="24" height="24" viewBox="0 0 24 24" role="img" aria-labelledby="ad7fii9owf8wemy43033bk7u2sjx7cyk" class="crayons-icon expanded"><title id="ad7fii9owf8wemy43033bk7u2sjx7cyk">Collapse</title>
<path d="M12 10.677L8 6.935 9 6l3 2.807L15 6l1 .935-4 3.742zm0 4.517L9 18l-1-.935 4-3.742 4 3.742-1 .934-3-2.805z"></path>
</svg>
<svg xmlns="http://www.w3.org/2000/svg" width="24" height="24" viewBox="0 0 24 24" role="img" aria-labelledby="aphe1xn5otq30xuphrzx5foeeymem812" class="crayons-icon collapsed"><title id="aphe1xn5otq30xuphrzx5foeeymem812">Expand</title>
<path d="M12 18l-4-3.771 1-.943 3 2.829 3-2.829 1 .943L12 18zm0-10.115l-3 2.829-1-.943L12 6l4 3.771-1 .942-3-2.828z"></path>
</svg>
</span>
<span class="js-collapse-comment-content inline-block align-middle"></span>
</summary>
<div
id="comment-node-1055399"
class="
comment single-comment-node
root
comment--deep-0
"
data-comment-id="1055399"
data-path="/siy/the-saga-is-antipattern-1354/comments/28167"
data-comment-author-id="273830"
data-content-user-id="273830">
<a name="comment-28167" style="position: absolute; top: -8px;">&nbsp;</a>
<div class="comment__inner">
<a href="https://dev.to/davealexis" class="shrink-0 crayons-avatar m:crayons-avatar--l mt-4 m:mt-3">
<img class="crayons-avatar__image" width="32" height="32" src="https://media2.dev.to/dynamic/image/width=50,height=50,fit=cover,gravity=auto,format=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Fuser%2Fprofile_image%2F273830%2Fe53bf641-d3ec-4685-9aea-381fa97f50c4.jpeg" alt="davealexis profile image" loading="lazy" />
</a>
<div class="inner-comment comment__details">
<div class="comment__content crayons-card">
<div class="comment__header">
<a href="https://dev.to/davealexis" class="crayons-link crayons-link--secondary flex items-center fw-medium m:hidden">
<span class="js-comment-username">
David Alexis
</span>
</a>
<div class="profile-preview-card relative mb-4 s:mb-0 fw-medium hidden m:block">
<button id="comment-profile-preview-trigger-1055399" aria-controls="comment-profile-preview-content-1055399" class="profile-preview-card__trigger p-1 -my-1 -ml-1 crayons-btn crayons-btn--ghost" aria-label="David Alexis profile details">
David Alexis
</button>
<div id="comment-profile-preview-content-1055399" class="profile-preview-card__content p-4 pt-0 branded-7 crayons-dropdown" style="--card-color: #160533; border-top-color: var(--card-color);" data-testid="profile-preview-card" data-repositioning-dropdown="true">
<div class="gap-4 grid">
<div class="-mt-4">
<a href="/davealexis" class="flex">
<span class="crayons-avatar crayons-avatar--xl mr-2 shrink-0">
<img src="https://media2.dev.to/dynamic/image/width=90,height=90,fit=cover,gravity=auto,format=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Fuser%2Fprofile_image%2F273830%2Fe53bf641-d3ec-4685-9aea-381fa97f50c4.jpeg" class="crayons-avatar__image" alt="" loading="lazy" />
</span>
<span class="crayons-link crayons-subtitle-2 mt-5">
David Alexis
</span>
</a>
</div>
<div class="print-hidden">
<button name="button" type="button" data-info="{&quot;className&quot;:&quot;User&quot;,&quot;style&quot;:&quot;&quot;,&quot;id&quot;:273830,&quot;name&quot;:&quot;David Alexis&quot;}" class="crayons-btn follow-action-button whitespace-nowrap w-100 follow-user" aria-label="Follow user: David Alexis" aria-pressed="false">Follow</button>
</div>
<div class="user-metadata-details">
<ul class="user-metadata-details-inner">
<li>
<div class="key">
Joined
</div>
<div class="value">
<time datetime="2019-11-17T21:44:16Z" class="date">Nov 17, 2019</time>
</div>
</li>
</ul>
</div>
</div>
</div>
</div>
<span class="color-base-30 px-2 m:pl-0" role="presentation">&bull;</span>
<a href="https://dev.to/siy/the-saga-is-antipattern-1354#comment-28167" class="comment-date crayons-link crayons-link--secondary fs-s">
<time datetime="2023-07-16T17:28:27Z" class=date-short-year>
Jul 16 &#39;23
</time>
</a>
<div class="comment__dropdown" data-tracking-name="comment_dropdown">
<button id="comment-dropdown-trigger-1055399" aria-controls="comment-dropdown-1055399" aria-expanded="false"
class="dropbtn comment__dropdown-trigger crayons-btn crayons-btn--s crayons-btn--ghost crayons-btn--icon "
aria-label="Toggle dropdown menu" aria-haspopup="true">
<svg xmlns="http://www.w3.org/2000/svg" width="24" height="24" viewBox="0 0 24 24" role="img" aria-labelledby="aodsasp5i3dx5ooyfzkn9nhw2ayzvf5i" class="crayons-icon pointer-events-none"><title id="aodsasp5i3dx5ooyfzkn9nhw2ayzvf5i">Dropdown menu</title>
<path fill-rule="evenodd" clip-rule="evenodd" d="M8.25 12a1.5 1.5 0 11-3 0 1.5 1.5 0 013 0zm5.25 0a1.5 1.5 0 11-3 0 1.5 1.5 0 013 0zm3.75 1.5a1.5 1.5 0 100-3 1.5 1.5 0 000 3z"></path>
</svg>
</button>
<div id="comment-dropdown-1055399" class="crayons-dropdown right-1 s:right-0 s:left-auto fs-base dropdown">
<ul class="m-0">
<li><a href="https://dev.to/siy/the-saga-is-antipattern-1354#comment-28167" class="crayons-link crayons-link--block permalink-copybtn" aria-label="Copy link to David Alexis&#39;s comment" data-no-instant>Copy link</a></li>
<li class="comment-actions hidden" data-user-id="273830" data-action="settings-button" data-path="https://dev.to/davealexis/comment/28167/settings" aria-label="Go to David Alexis&#39;s comment settings"></li>
<li class="comment-actions hidden" data-action="hide-button" data-commentable-user-id="145374" data-user-id="273830">
<button
class="flex justify-between crayons-link crayons-link--block w-100 bg-transparent border-0 hide-comment"
data-hide-type="hide"
data-comment-id="1055399"
data-comment-url="https://dev.to/davealexis/comment/28167"
aria-label="Hide David Alexis&#39;s comment">
Hide
</button>
</li>
<li class="mod-actions hidden mod-actions-comment-button" data-path="https://dev.to/davealexis/comment/28167/mod" aria-label="Moderate David Alexis&#39;s comment"></li>
<li class="report-abuse-link-wrapper" data-path="/report-abuse?url=https://dev.to/davealexis/comment/28167" aria-label="Report David Alexis&#39;s comment as abusive or violating our code of conduct and/or terms and conditions"></li>
<li class="current-user-actions"></li>
</ul>
</div>
</div>
</div>
<div
class="
comment__body
text-styles
text-styles--secondary
body
">
<p>I'm not sure you understand what the saga pattern is and what it solves. It has nothing to do with consensus among nodes. Hence the invalidity of your arguments. It has to do with coordinating the states of long-running business process, where the transition between states can be milliseconds or days. "Transactions" in the sense your describe in your argument area irrelevant in this context.</p>
</div>
</div>
<script>
</script>
<footer class="comment__footer print-hidden">
<button
class="crayons-tooltip__activator relative crayons-btn crayons-btn--ghost crayons-btn--icon-left crayons-btn--s mr-1 reaction-like inline-flex reaction-button"
id="button-for-comment-1055399"
data-comment-id="1055399"
aria-label="like"
data-tracking-name="comment_heart_button">
<svg xmlns="http://www.w3.org/2000/svg" width="24" height="24" role="img" aria-labelledby="aiqtewmqp56obj7ai9le3rt66durtzx3" class="crayons-icon reaction-icon not-reacted"><title id="aiqtewmqp56obj7ai9le3rt66durtzx3">Like comment: </title><path d="M18.884 12.595l.01.011L12 19.5l-6.894-6.894.01-.01A4.875 4.875 0 0112 5.73a4.875 4.875 0 016.884 6.865zM6.431 7.037a3.375 3.375 0 000 4.773L12 17.38l5.569-5.569a3.375 3.375 0 10-4.773-4.773L9.613 10.22l-1.06-1.062 2.371-2.372a3.375 3.375 0 00-4.492.25v.001z"></path></svg>
<svg xmlns="http://www.w3.org/2000/svg" width="24" height="24" viewBox="0 0 24 24" role="img" aria-labelledby="at4za78b8x14rp6aukw5vveg757z4hx0" class="crayons-icon crayons-icon reaction-icon--like reaction-icon reacted"><title id="at4za78b8x14rp6aukw5vveg757z4hx0">Like comment: </title>
<path d="M5.116 12.595a4.875 4.875 0 015.56-7.68h-.002L7.493 8.098l1.06 1.061 3.181-3.182a4.875 4.875 0 016.895 6.894L12 19.5l-6.894-6.894.01-.01z"></path>
</svg>
<span class="reactions-count">1</span><span class="reactions-label hidden m:inline-block">&nbsp;like</span>
<span data-testid="tooltip" class="crayons-tooltip__content">
Like
</span>
</button>
<span class="favorite-control-root" data-favorite-control="true" data-variant="comment" data-favoritable-type="Comment" data-favoritable-id="1055399" data-favoritable-user-id="273830" data-favorited="false" data-label-favorite="Pick as gem" data-label-favorited="Picked as gem" data-label-favorited-by-you="Picked as gem by you" data-modal-title="Gem Picked!" data-modal-body="You&#39;ve picked this as a community gem!" data-modal-remaining-zero="You have no more gems left to give out today." data-modal-remaining-one="You have 1 more gem left to give out today." data-modal-remaining-other="You have %{count} more gems left to give out today." data-modal-remaining-unlimited="You have unlimited gems to give out." data-modal-close="Got it" data-modal-exhausted-title="Out of Gems" data-modal-exhausted-body="You have no more gems left to give out today. Your allowance will refresh soon!" data-modal-exhausted-close="Got it"></span>
<button
class="actions crayons-btn crayons-btn--ghost crayons-btn--s crayons-btn--icon-left toggle-reply-form mr-1 inline-flex"
data-comment-id="1055399"
data-path="/siy/the-saga-is-antipattern-1354/comments/28167"
data-tracking-name="comment_reply_button"
data-testid="reply-button-1055399"
rel="nofollow">
<svg xmlns="http://www.w3.org/2000/svg" width="24" height="24" role="img" aria-labelledby="aottjicu8d5ymuuoikft3anlxitt8474" class="crayons-icon reaction-icon not-reacted"><title id="aottjicu8d5ymuuoikft3anlxitt8474">Comment button</title><path d="M10.5 5h3a6 6 0 110 12v2.625c-3.75-1.5-9-3.75-9-8.625a6 6 0 016-6zM12 15.5h1.5a4.501 4.501 0 001.722-8.657A4.5 4.5 0 0013.5 6.5h-3A4.5 4.5 0 006 11c0 2.707 1.846 4.475 6 6.36V15.5z"></path></svg>
<span class="hidden m:inline-block">Reply</span>
</button>
</footer>
</div>
</div>
<details class="comment-wrapper js-comment-wrapper comment-wrapper--deep-1
child
" open>
<summary aria-label="Toggle this comment (and replies)" data-tracking-name="expand_comment_toggle">
<span class="mx-0 inline-block align-middle">
<svg xmlns="http://www.w3.org/2000/svg" width="24" height="24" viewBox="0 0 24 24" role="img" aria-labelledby="a7jkqly50yhoysr5ibgydpsa9u324guv" class="crayons-icon expanded"><title id="a7jkqly50yhoysr5ibgydpsa9u324guv">Collapse</title>
<path d="M12 10.677L8 6.935 9 6l3 2.807L15 6l1 .935-4 3.742zm0 4.517L9 18l-1-.935 4-3.742 4 3.742-1 .934-3-2.805z"></path>
</svg>
<svg xmlns="http://www.w3.org/2000/svg" width="24" height="24" viewBox="0 0 24 24" role="img" aria-labelledby="afaoo82bijwes7b3fukeyhqo4df3aokj" class="crayons-icon collapsed"><title id="afaoo82bijwes7b3fukeyhqo4df3aokj">Expand</title>
<path d="M12 18l-4-3.771 1-.943 3 2.829 3-2.829 1 .943L12 18zm0-10.115l-3 2.829-1-.943L12 6l4 3.771-1 .942-3-2.828z"></path>
</svg>
</span>
<span class="js-collapse-comment-content inline-block align-middle"></span>
</summary>
<div
id="comment-node-1055447"
class="
comment single-comment-node
child
comment--deep-1
"
data-comment-id="1055447"
data-path="/siy/the-saga-is-antipattern-1354/comments/28183"
data-comment-author-id="145374"
data-content-user-id="145374">
<a name="comment-28183" style="position: absolute; top: -8px;">&nbsp;</a>
<div class="comment__inner">
<a href="https://dev.to/siy" class="shrink-0 crayons-avatar mt-4">
<img class="crayons-avatar__image" width="32" height="32" src="https://media2.dev.to/dynamic/image/width=50,height=50,fit=cover,gravity=auto,format=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Fuser%2Fprofile_image%2F145374%2F6e93547b-45cc-430e-9659-3adea03266b5.jpeg" alt="siy profile image" loading="lazy" />
</a>
<div class="inner-comment comment__details">
<div class="comment__content crayons-card">
<div class="comment__header">
<a href="https://dev.to/siy" class="crayons-link crayons-link--secondary flex items-center fw-medium m:hidden">
<span class="js-comment-username">
Sergiy Yevtushenko
</span>
<span class="crayons-hover-tooltip inline-block spec-op-author -mr-2" data-tooltip="Author">
<svg xmlns="http://www.w3.org/2000/svg" width="24" height="24" viewBox="0 0 24 24" role="img" class="crayons-icon">
<path d="M12 8.25a6 6 0 110 12 6 6 0 010-12zm0 2.625l-.992 2.01-2.218.322 1.605 1.564-.379 2.21L12 15.937l1.984 1.043-.379-2.209 1.605-1.564-2.218-.323L12 10.875zm.75-6.376l3.75.001v2.25l-1.022.854a7.45 7.45 0 00-2.728-.817V4.5zm-1.5 0v2.288a7.451 7.451 0 00-2.727.816L7.5 6.75V4.5h3.75z"></path>
</svg>
</span>
</a>
<div class="profile-preview-card relative mb-4 s:mb-0 fw-medium hidden m:block">
<button id="comment-profile-preview-trigger-1055447" aria-controls="comment-profile-preview-content-1055447" class="profile-preview-card__trigger p-1 -my-1 -ml-1 crayons-btn crayons-btn--ghost" aria-label="Sergiy Yevtushenko profile details">
Sergiy Yevtushenko
</button>
<div id="comment-profile-preview-content-1055447" class="profile-preview-card__content p-4 pt-0 branded-7 crayons-dropdown" style="--card-color: #a198bb; border-top-color: var(--card-color);" data-testid="profile-preview-card" data-repositioning-dropdown="true">
<div class="gap-4 grid">
<div class="-mt-4">
<a href="/siy" class="flex">
<span class="crayons-avatar crayons-avatar--xl mr-2 shrink-0">
<img src="https://media2.dev.to/dynamic/image/width=90,height=90,fit=cover,gravity=auto,format=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Fuser%2Fprofile_image%2F145374%2F6e93547b-45cc-430e-9659-3adea03266b5.jpeg" class="crayons-avatar__image" alt="" loading="lazy" />
</span>
<span class="crayons-link crayons-subtitle-2 mt-5">
Sergiy Yevtushenko
</span>
</a>
</div>
<div class="print-hidden">
<button name="button" type="button" data-info="{&quot;className&quot;:&quot;User&quot;,&quot;style&quot;:&quot;&quot;,&quot;id&quot;:145374,&quot;name&quot;:&quot;Sergiy Yevtushenko&quot;}" class="crayons-btn follow-action-button whitespace-nowrap w-100 follow-user" aria-label="Follow user: Sergiy Yevtushenko" aria-pressed="false">Follow</button>
</div>
<div class="color-base-70">
Writing code for 35+ years and still enjoy it...
</div>
<div class="user-metadata-details">
<ul class="user-metadata-details-inner">
<li>
<div class="key">
Location
</div>
<div class="value">
Krakow, Poland
</div>
</li>
<li>
<div class="key">
Work
</div>
<div class="value">
Senior Software Engineer
</div>
</li>
<li>
<div class="key">
Joined
</div>
<div class="value">
<time datetime="2019-03-14T05:28:55Z" class="date">Mar 14, 2019</time>
</div>
</li>
</ul>
</div>
</div>
</div>
<span class="crayons-hover-tooltip inline-block spec-op-author -ml-2" data-tooltip="Author">
<svg xmlns="http://www.w3.org/2000/svg" width="24" height="24" viewBox="0 0 24 24" role="img" class="crayons-icon">
<path d="M12 8.25a6 6 0 110 12 6 6 0 010-12zm0 2.625l-.992 2.01-2.218.322 1.605 1.564-.379 2.21L12 15.937l1.984 1.043-.379-2.209 1.605-1.564-2.218-.323L12 10.875zm.75-6.376l3.75.001v2.25l-1.022.854a7.45 7.45 0 00-2.728-.817V4.5zm-1.5 0v2.288a7.451 7.451 0 00-2.727.816L7.5 6.75V4.5h3.75z"></path>
</svg>
</span>
</div>
<span class="color-base-30 px-2 m:pl-0" role="presentation">&bull;</span>
<a href="https://dev.to/siy/the-saga-is-antipattern-1354#comment-28183" class="comment-date crayons-link crayons-link--secondary fs-s">
<time datetime="2023-07-16T22:01:39Z" class=date-short-year>
Jul 16 &#39;23
</time>
</a>
<div class="comment__dropdown" data-tracking-name="comment_dropdown">
<button id="comment-dropdown-trigger-1055447" aria-controls="comment-dropdown-1055447" aria-expanded="false"
class="dropbtn comment__dropdown-trigger crayons-btn crayons-btn--s crayons-btn--ghost crayons-btn--icon "
aria-label="Toggle dropdown menu" aria-haspopup="true">
<svg xmlns="http://www.w3.org/2000/svg" width="24" height="24" viewBox="0 0 24 24" role="img" aria-labelledby="a3slb45k0zq0y5gudhwry6ak9v2qcnpj" class="crayons-icon pointer-events-none"><title id="a3slb45k0zq0y5gudhwry6ak9v2qcnpj">Dropdown menu</title>
<path fill-rule="evenodd" clip-rule="evenodd" d="M8.25 12a1.5 1.5 0 11-3 0 1.5 1.5 0 013 0zm5.25 0a1.5 1.5 0 11-3 0 1.5 1.5 0 013 0zm3.75 1.5a1.5 1.5 0 100-3 1.5 1.5 0 000 3z"></path>
</svg>
</button>
<div id="comment-dropdown-1055447" class="crayons-dropdown right-1 s:right-0 s:left-auto fs-base dropdown">
<ul class="m-0">
<li><a href="https://dev.to/siy/the-saga-is-antipattern-1354#comment-28183" class="crayons-link crayons-link--block permalink-copybtn" aria-label="Copy link to Sergiy Yevtushenko&#39;s comment" data-no-instant>Copy link</a></li>
<li class="comment-actions hidden" data-user-id="145374" data-action="settings-button" data-path="https://dev.to/siy/comment/28183/settings" aria-label="Go to Sergiy Yevtushenko&#39;s comment settings"></li>
<li class="comment-actions hidden" data-action="hide-button" data-commentable-user-id="145374" data-user-id="145374">
<button
class="flex justify-between crayons-link crayons-link--block w-100 bg-transparent border-0 hide-comment"
data-hide-type="hide"
data-comment-id="1055447"
data-comment-url="https://dev.to/siy/comment/28183"
aria-label="Hide Sergiy Yevtushenko&#39;s comment">
Hide
</button>
</li>
<li class="mod-actions hidden mod-actions-comment-button" data-path="https://dev.to/siy/comment/28183/mod" aria-label="Moderate Sergiy Yevtushenko&#39;s comment"></li>
<li class="report-abuse-link-wrapper" data-path="/report-abuse?url=https://dev.to/siy/comment/28183" aria-label="Report Sergiy Yevtushenko&#39;s comment as abusive or violating our code of conduct and/or terms and conditions"></li>
<li class="current-user-actions"></li>
</ul>
</div>
</div>
</div>
<div
class="
comment__body
text-styles
text-styles--secondary
body
">
<p>That's correct, strictly speaking the Saga pattern has nothing to do with consensus. But it performs coordination of involved nodes and coordination in distributed system requires consensus. You also may find interesting to take a look into other thread, where you can find example.</p>
</div>
</div>
<script>
</script>
<footer class="comment__footer print-hidden">
<button
class="crayons-tooltip__activator relative crayons-btn crayons-btn--ghost crayons-btn--icon-left crayons-btn--s mr-1 reaction-like inline-flex reaction-button"
id="button-for-comment-1055447"
data-comment-id="1055447"
aria-label="like"
data-tracking-name="comment_heart_button">
<svg xmlns="http://www.w3.org/2000/svg" width="24" height="24" role="img" aria-labelledby="a9wtkb0lnlkc10x8e78h942ib57ux5qt" class="crayons-icon reaction-icon not-reacted"><title id="a9wtkb0lnlkc10x8e78h942ib57ux5qt">Like comment: </title><path d="M18.884 12.595l.01.011L12 19.5l-6.894-6.894.01-.01A4.875 4.875 0 0112 5.73a4.875 4.875 0 016.884 6.865zM6.431 7.037a3.375 3.375 0 000 4.773L12 17.38l5.569-5.569a3.375 3.375 0 10-4.773-4.773L9.613 10.22l-1.06-1.062 2.371-2.372a3.375 3.375 0 00-4.492.25v.001z"></path></svg>
<svg xmlns="http://www.w3.org/2000/svg" width="24" height="24" viewBox="0 0 24 24" role="img" aria-labelledby="ahp44u07vcx73eoyut3xogujq24v0uqg" class="crayons-icon crayons-icon reaction-icon--like reaction-icon reacted"><title id="ahp44u07vcx73eoyut3xogujq24v0uqg">Like comment: </title>
<path d="M5.116 12.595a4.875 4.875 0 015.56-7.68h-.002L7.493 8.098l1.06 1.061 3.181-3.182a4.875 4.875 0 016.895 6.894L12 19.5l-6.894-6.894.01-.01z"></path>
</svg>
<span class="reactions-count">1</span><span class="reactions-label hidden m:inline-block">&nbsp;like</span>
<span data-testid="tooltip" class="crayons-tooltip__content">
Like
</span>
</button>
<span class="favorite-control-root" data-favorite-control="true" data-variant="comment" data-favoritable-type="Comment" data-favoritable-id="1055447" data-favoritable-user-id="145374" data-favorited="false" data-label-favorite="Pick as gem" data-label-favorited="Picked as gem" data-label-favorited-by-you="Picked as gem by you" data-modal-title="Gem Picked!" data-modal-body="You&#39;ve picked this as a community gem!" data-modal-remaining-zero="You have no more gems left to give out today." data-modal-remaining-one="You have 1 more gem left to give out today." data-modal-remaining-other="You have %{count} more gems left to give out today." data-modal-remaining-unlimited="You have unlimited gems to give out." data-modal-close="Got it" data-modal-exhausted-title="Out of Gems" data-modal-exhausted-body="You have no more gems left to give out today. Your allowance will refresh soon!" data-modal-exhausted-close="Got it"></span>
<button
class="actions crayons-btn crayons-btn--ghost crayons-btn--s crayons-btn--icon-left toggle-reply-form mr-1 inline-flex"
data-comment-id="1055447"
data-path="/siy/the-saga-is-antipattern-1354/comments/28183"
data-tracking-name="comment_reply_button"
data-testid="reply-button-1055447"
rel="nofollow">
<svg xmlns="http://www.w3.org/2000/svg" width="24" height="24" role="img" aria-labelledby="acqtv72cgyupen4dvbkn4blubpjuzosm" class="crayons-icon reaction-icon not-reacted"><title id="acqtv72cgyupen4dvbkn4blubpjuzosm">Comment button</title><path d="M10.5 5h3a6 6 0 110 12v2.625c-3.75-1.5-9-3.75-9-8.625a6 6 0 016-6zM12 15.5h1.5a4.501 4.501 0 001.722-8.657A4.5 4.5 0 0013.5 6.5h-3A4.5 4.5 0 006 11c0 2.707 1.846 4.475 6 6.36V15.5z"></path></svg>
<span class="hidden m:inline-block">Reply</span>
</button>
</footer>
</div>
</div>
</div>
</details>
</div>
</details>
<details class="comment-wrapper js-comment-wrapper comment-wrapper--deep-0
root
" open>
<summary aria-label="Toggle this comment (and replies)" data-tracking-name="expand_comment_toggle">
<span class="m:mx-1 inline-block align-middle">
<svg xmlns="http://www.w3.org/2000/svg" width="24" height="24" viewBox="0 0 24 24" role="img" aria-labelledby="a7azcx8oy55518k49x0chixxad0bu0ku" class="crayons-icon expanded"><title id="a7azcx8oy55518k49x0chixxad0bu0ku">Collapse</title>
<path d="M12 10.677L8 6.935 9 6l3 2.807L15 6l1 .935-4 3.742zm0 4.517L9 18l-1-.935 4-3.742 4 3.742-1 .934-3-2.805z"></path>
</svg>
<svg xmlns="http://www.w3.org/2000/svg" width="24" height="24" viewBox="0 0 24 24" role="img" aria-labelledby="agei7y8o40v7cznf6xd217010vl4cgf4" class="crayons-icon collapsed"><title id="agei7y8o40v7cznf6xd217010vl4cgf4">Expand</title>
<path d="M12 18l-4-3.771 1-.943 3 2.829 3-2.829 1 .943L12 18zm0-10.115l-3 2.829-1-.943L12 6l4 3.771-1 .942-3-2.828z"></path>
</svg>
</span>
<span class="js-collapse-comment-content inline-block align-middle"></span>
</summary>
<div
id="comment-node-1380809"
class="
comment single-comment-node
root
comment--deep-0
"
data-comment-id="1380809"
data-path="/siy/the-saga-is-antipattern-1354/comments/30eg1"
data-comment-author-id="1128771"
data-content-user-id="1128771">
<a name="comment-30eg1" style="position: absolute; top: -8px;">&nbsp;</a>
<div class="comment__inner">
<a href="https://dev.to/hackus" class="shrink-0 crayons-avatar m:crayons-avatar--l mt-4 m:mt-3">
<img class="crayons-avatar__image" width="32" height="32" src="https://media2.dev.to/dynamic/image/width=50,height=50,fit=cover,gravity=auto,format=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Fuser%2Fprofile_image%2F1128771%2Fa0ac6ce7-9db5-4e7b-a49d-15c3d1b00691.jpg" alt="hackus profile image" loading="lazy" />
</a>
<div class="inner-comment comment__details">
<div class="comment__content crayons-card">
<div class="comment__header">
<a href="https://dev.to/hackus" class="crayons-link crayons-link--secondary flex items-center fw-medium m:hidden">
<span class="js-comment-username">
Mircea Sirghi
</span>
</a>
<div class="profile-preview-card relative mb-4 s:mb-0 fw-medium hidden m:block">
<button id="comment-profile-preview-trigger-1380809" aria-controls="comment-profile-preview-content-1380809" class="profile-preview-card__trigger p-1 -my-1 -ml-1 crayons-btn crayons-btn--ghost" aria-label="Mircea Sirghi profile details">
Mircea Sirghi
</button>
<div id="comment-profile-preview-content-1380809" class="profile-preview-card__content p-4 pt-0 branded-7 crayons-dropdown" style="--card-color: #000000; border-top-color: var(--card-color);" data-testid="profile-preview-card" data-repositioning-dropdown="true">
<div class="gap-4 grid">
<div class="-mt-4">
<a href="/hackus" class="flex">
<span class="crayons-avatar crayons-avatar--xl mr-2 shrink-0">
<img src="https://media2.dev.to/dynamic/image/width=90,height=90,fit=cover,gravity=auto,format=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Fuser%2Fprofile_image%2F1128771%2Fa0ac6ce7-9db5-4e7b-a49d-15c3d1b00691.jpg" class="crayons-avatar__image" alt="" loading="lazy" />
</span>
<span class="crayons-link crayons-subtitle-2 mt-5">
Mircea Sirghi
</span>
</a>
</div>
<div class="print-hidden">
<button name="button" type="button" data-info="{&quot;className&quot;:&quot;User&quot;,&quot;style&quot;:&quot;&quot;,&quot;id&quot;:1128771,&quot;name&quot;:&quot;Mircea Sirghi&quot;}" class="crayons-btn follow-action-button whitespace-nowrap w-100 follow-user" aria-label="Follow user: Mircea Sirghi" aria-pressed="false">Follow</button>
</div>
<div class="color-base-70">
Software Engineer 11 years of experience.
</div>
<div class="user-metadata-details">
<ul class="user-metadata-details-inner">
<li>
<div class="key">
Joined
</div>
<div class="value">
<time datetime="2023-07-29T06:36:01Z" class="date">Jul 29, 2023</time>
</div>
</li>
</ul>
</div>
</div>
</div>
</div>
<span class="color-base-30 px-2 m:pl-0" role="presentation">&bull;</span>
<a href="https://dev.to/siy/the-saga-is-antipattern-1354#comment-30eg1" class="comment-date crayons-link crayons-link--secondary fs-s">
<time datetime="2025-08-12T10:39:05Z" class=date-short-year>
Aug 12 &#39;25
</time>
</a>
<div class="comment__dropdown" data-tracking-name="comment_dropdown">
<button id="comment-dropdown-trigger-1380809" aria-controls="comment-dropdown-1380809" aria-expanded="false"
class="dropbtn comment__dropdown-trigger crayons-btn crayons-btn--s crayons-btn--ghost crayons-btn--icon "
aria-label="Toggle dropdown menu" aria-haspopup="true">
<svg xmlns="http://www.w3.org/2000/svg" width="24" height="24" viewBox="0 0 24 24" role="img" aria-labelledby="ahtwkdcpzoh95x904hr7d2oipg1xs5ix" class="crayons-icon pointer-events-none"><title id="ahtwkdcpzoh95x904hr7d2oipg1xs5ix">Dropdown menu</title>
<path fill-rule="evenodd" clip-rule="evenodd" d="M8.25 12a1.5 1.5 0 11-3 0 1.5 1.5 0 013 0zm5.25 0a1.5 1.5 0 11-3 0 1.5 1.5 0 013 0zm3.75 1.5a1.5 1.5 0 100-3 1.5 1.5 0 000 3z"></path>
</svg>
</button>
<div id="comment-dropdown-1380809" class="crayons-dropdown right-1 s:right-0 s:left-auto fs-base dropdown">
<ul class="m-0">
<li><a href="https://dev.to/siy/the-saga-is-antipattern-1354#comment-30eg1" class="crayons-link crayons-link--block permalink-copybtn" aria-label="Copy link to Mircea Sirghi&#39;s comment" data-no-instant>Copy link</a></li>
<li class="comment-actions hidden" data-user-id="1128771" data-action="settings-button" data-path="https://dev.to/hackus/comment/30eg1/settings" aria-label="Go to Mircea Sirghi&#39;s comment settings"></li>
<li class="comment-actions hidden" data-action="hide-button" data-commentable-user-id="145374" data-user-id="1128771">
<button
class="flex justify-between crayons-link crayons-link--block w-100 bg-transparent border-0 hide-comment"
data-hide-type="hide"
data-comment-id="1380809"
data-comment-url="https://dev.to/hackus/comment/30eg1"
aria-label="Hide Mircea Sirghi&#39;s comment">
Hide
</button>
</li>
<li class="mod-actions hidden mod-actions-comment-button" data-path="https://dev.to/hackus/comment/30eg1/mod" aria-label="Moderate Mircea Sirghi&#39;s comment"></li>
<li class="report-abuse-link-wrapper" data-path="/report-abuse?url=https://dev.to/hackus/comment/30eg1" aria-label="Report Mircea Sirghi&#39;s comment as abusive or violating our code of conduct and/or terms and conditions"></li>
<li class="current-user-actions"></li>
</ul>
</div>
</div>
</div>
<div
class="
comment__body
text-styles
text-styles--secondary
body
">
<p>Where did you take this from "EDA leverages reliable data sharing" - What does it mean ? This sounds as a sophism to permit you conclude with "which explicitly conflicts with how microservices maintain their data". </p>
<p>How "Event-Driven Architecture (EDA) " is going to "maintain consensus". Even cluster-based will have it's own problems with it. And "This design" is the link to one of your own articles on "Nanoservices". And how does it solve the problem that Saga patterns solves ?</p>
<p>How Cluster-based Architecture solves the consistency across clusters ?</p>
<p>What are you references ? Where did you inspire from ? </p>
<p>What are you talking about ? Can you take just one, lets say Cluster-based Architecture and show how it solves data consistency problem better than SAGA pattern ?</p>
</div>
</div>
<script>
</script>
<footer class="comment__footer print-hidden">
<button
class="crayons-tooltip__activator relative crayons-btn crayons-btn--ghost crayons-btn--icon crayons-btn--s mr-1 reaction-like inline-flex reaction-button"
id="button-for-comment-1380809"
data-comment-id="1380809"
aria-label="like"
data-tracking-name="comment_heart_button">
<svg xmlns="http://www.w3.org/2000/svg" width="24" height="24" role="img" aria-labelledby="aqcpc2emnrq6p5wsosfiqred611x57wi" class="crayons-icon reaction-icon not-reacted"><title id="aqcpc2emnrq6p5wsosfiqred611x57wi">Like comment: </title><path d="M18.884 12.595l.01.011L12 19.5l-6.894-6.894.01-.01A4.875 4.875 0 0112 5.73a4.875 4.875 0 016.884 6.865zM6.431 7.037a3.375 3.375 0 000 4.773L12 17.38l5.569-5.569a3.375 3.375 0 10-4.773-4.773L9.613 10.22l-1.06-1.062 2.371-2.372a3.375 3.375 0 00-4.492.25v.001z"></path></svg>
<svg xmlns="http://www.w3.org/2000/svg" width="24" height="24" viewBox="0 0 24 24" role="img" aria-labelledby="aab4ocbmk1qmkg9d8yf769moinixwqq6" class="crayons-icon crayons-icon reaction-icon--like reaction-icon reacted"><title id="aab4ocbmk1qmkg9d8yf769moinixwqq6">Like comment: </title>
<path d="M5.116 12.595a4.875 4.875 0 015.56-7.68h-.002L7.493 8.098l1.06 1.061 3.181-3.182a4.875 4.875 0 016.895 6.894L12 19.5l-6.894-6.894.01-.01z"></path>
</svg>
<span class="reactions-count"></span><span class="reactions-label hidden m:inline-block"></span>
<span data-testid="tooltip" class="crayons-tooltip__content">
Like
</span>
</button>
<span class="favorite-control-root" data-favorite-control="true" data-variant="comment" data-favoritable-type="Comment" data-favoritable-id="1380809" data-favoritable-user-id="1128771" data-favorited="false" data-label-favorite="Pick as gem" data-label-favorited="Picked as gem" data-label-favorited-by-you="Picked as gem by you" data-modal-title="Gem Picked!" data-modal-body="You&#39;ve picked this as a community gem!" data-modal-remaining-zero="You have no more gems left to give out today." data-modal-remaining-one="You have 1 more gem left to give out today." data-modal-remaining-other="You have %{count} more gems left to give out today." data-modal-remaining-unlimited="You have unlimited gems to give out." data-modal-close="Got it" data-modal-exhausted-title="Out of Gems" data-modal-exhausted-body="You have no more gems left to give out today. Your allowance will refresh soon!" data-modal-exhausted-close="Got it"></span>
<button
class="actions crayons-btn crayons-btn--ghost crayons-btn--s crayons-btn--icon-left toggle-reply-form mr-1 inline-flex"
data-comment-id="1380809"
data-path="/siy/the-saga-is-antipattern-1354/comments/30eg1"
data-tracking-name="comment_reply_button"
data-testid="reply-button-1380809"
rel="nofollow">
<svg xmlns="http://www.w3.org/2000/svg" width="24" height="24" role="img" aria-labelledby="aijq7g1l2lesmyozfx7ynazudhml0owt" class="crayons-icon reaction-icon not-reacted"><title id="aijq7g1l2lesmyozfx7ynazudhml0owt">Comment button</title><path d="M10.5 5h3a6 6 0 110 12v2.625c-3.75-1.5-9-3.75-9-8.625a6 6 0 016-6zM12 15.5h1.5a4.501 4.501 0 001.722-8.657A4.5 4.5 0 0013.5 6.5h-3A4.5 4.5 0 006 11c0 2.707 1.846 4.475 6 6.36V15.5z"></path></svg>
<span class="hidden m:inline-block">Reply</span>
</button>
</footer>
</div>
</div>
<details class="comment-wrapper js-comment-wrapper comment-wrapper--deep-1
child
" open>
<summary aria-label="Toggle this comment (and replies)" data-tracking-name="expand_comment_toggle">
<span class="mx-0 inline-block align-middle">
<svg xmlns="http://www.w3.org/2000/svg" width="24" height="24" viewBox="0 0 24 24" role="img" aria-labelledby="aiahse6ehcp30fawknxkjzewhfyqgs7c" class="crayons-icon expanded"><title id="aiahse6ehcp30fawknxkjzewhfyqgs7c">Collapse</title>
<path d="M12 10.677L8 6.935 9 6l3 2.807L15 6l1 .935-4 3.742zm0 4.517L9 18l-1-.935 4-3.742 4 3.742-1 .934-3-2.805z"></path>
</svg>
<svg xmlns="http://www.w3.org/2000/svg" width="24" height="24" viewBox="0 0 24 24" role="img" aria-labelledby="aetjc9ip8bs9o42mbxmmnih23mr0r91x" class="crayons-icon collapsed"><title id="aetjc9ip8bs9o42mbxmmnih23mr0r91x">Expand</title>
<path d="M12 18l-4-3.771 1-.943 3 2.829 3-2.829 1 .943L12 18zm0-10.115l-3 2.829-1-.943L12 6l4 3.771-1 .942-3-2.828z"></path>
</svg>
</span>
<span class="js-collapse-comment-content inline-block align-middle"></span>
</summary>
<div
id="comment-node-1384840"
class="
comment single-comment-node
child
comment--deep-1
"
data-comment-id="1384840"
data-path="/siy/the-saga-is-antipattern-1354/comments/30kf2"
data-comment-author-id="145374"
data-content-user-id="145374">
<a name="comment-30kf2" style="position: absolute; top: -8px;">&nbsp;</a>
<div class="comment__inner">
<a href="https://dev.to/siy" class="shrink-0 crayons-avatar mt-4">
<img class="crayons-avatar__image" width="32" height="32" src="https://media2.dev.to/dynamic/image/width=50,height=50,fit=cover,gravity=auto,format=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Fuser%2Fprofile_image%2F145374%2F6e93547b-45cc-430e-9659-3adea03266b5.jpeg" alt="siy profile image" loading="lazy" />
</a>
<div class="inner-comment comment__details">
<div class="comment__content crayons-card">
<div class="comment__header">
<a href="https://dev.to/siy" class="crayons-link crayons-link--secondary flex items-center fw-medium m:hidden">
<span class="js-comment-username">
Sergiy Yevtushenko
</span>
<span class="crayons-hover-tooltip inline-block spec-op-author -mr-2" data-tooltip="Author">
<svg xmlns="http://www.w3.org/2000/svg" width="24" height="24" viewBox="0 0 24 24" role="img" class="crayons-icon">
<path d="M12 8.25a6 6 0 110 12 6 6 0 010-12zm0 2.625l-.992 2.01-2.218.322 1.605 1.564-.379 2.21L12 15.937l1.984 1.043-.379-2.209 1.605-1.564-2.218-.323L12 10.875zm.75-6.376l3.75.001v2.25l-1.022.854a7.45 7.45 0 00-2.728-.817V4.5zm-1.5 0v2.288a7.451 7.451 0 00-2.727.816L7.5 6.75V4.5h3.75z"></path>
</svg>
</span>
</a>
<div class="profile-preview-card relative mb-4 s:mb-0 fw-medium hidden m:block">
<button id="comment-profile-preview-trigger-1384840" aria-controls="comment-profile-preview-content-1384840" class="profile-preview-card__trigger p-1 -my-1 -ml-1 crayons-btn crayons-btn--ghost" aria-label="Sergiy Yevtushenko profile details">
Sergiy Yevtushenko
</button>
<div id="comment-profile-preview-content-1384840" class="profile-preview-card__content p-4 pt-0 branded-7 crayons-dropdown" style="--card-color: #a198bb; border-top-color: var(--card-color);" data-testid="profile-preview-card" data-repositioning-dropdown="true">
<div class="gap-4 grid">
<div class="-mt-4">
<a href="/siy" class="flex">
<span class="crayons-avatar crayons-avatar--xl mr-2 shrink-0">
<img src="https://media2.dev.to/dynamic/image/width=90,height=90,fit=cover,gravity=auto,format=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Fuser%2Fprofile_image%2F145374%2F6e93547b-45cc-430e-9659-3adea03266b5.jpeg" class="crayons-avatar__image" alt="" loading="lazy" />
</span>
<span class="crayons-link crayons-subtitle-2 mt-5">
Sergiy Yevtushenko
</span>
</a>
</div>
<div class="print-hidden">
<button name="button" type="button" data-info="{&quot;className&quot;:&quot;User&quot;,&quot;style&quot;:&quot;&quot;,&quot;id&quot;:145374,&quot;name&quot;:&quot;Sergiy Yevtushenko&quot;}" class="crayons-btn follow-action-button whitespace-nowrap w-100 follow-user" aria-label="Follow user: Sergiy Yevtushenko" aria-pressed="false">Follow</button>
</div>
<div class="color-base-70">
Writing code for 35+ years and still enjoy it...
</div>
<div class="user-metadata-details">
<ul class="user-metadata-details-inner">
<li>
<div class="key">
Location
</div>
<div class="value">
Krakow, Poland
</div>
</li>
<li>
<div class="key">
Work
</div>
<div class="value">
Senior Software Engineer
</div>
</li>
<li>
<div class="key">
Joined
</div>
<div class="value">
<time datetime="2019-03-14T05:28:55Z" class="date">Mar 14, 2019</time>
</div>
</li>
</ul>
</div>
</div>
</div>
<span class="crayons-hover-tooltip inline-block spec-op-author -ml-2" data-tooltip="Author">
<svg xmlns="http://www.w3.org/2000/svg" width="24" height="24" viewBox="0 0 24 24" role="img" class="crayons-icon">
<path d="M12 8.25a6 6 0 110 12 6 6 0 010-12zm0 2.625l-.992 2.01-2.218.322 1.605 1.564-.379 2.21L12 15.937l1.984 1.043-.379-2.209 1.605-1.564-2.218-.323L12 10.875zm.75-6.376l3.75.001v2.25l-1.022.854a7.45 7.45 0 00-2.728-.817V4.5zm-1.5 0v2.288a7.451 7.451 0 00-2.727.816L7.5 6.75V4.5h3.75z"></path>
</svg>
</span>
</div>
<span class="color-base-30 px-2 m:pl-0" role="presentation">&bull;</span>
<a href="https://dev.to/siy/the-saga-is-antipattern-1354#comment-30kf2" class="comment-date crayons-link crayons-link--secondary fs-s">
<time datetime="2025-08-23T11:18:57Z" class=date-short-year>
Aug 23 &#39;25
</time>
</a>
<div class="comment__dropdown" data-tracking-name="comment_dropdown">
<button id="comment-dropdown-trigger-1384840" aria-controls="comment-dropdown-1384840" aria-expanded="false"
class="dropbtn comment__dropdown-trigger crayons-btn crayons-btn--s crayons-btn--ghost crayons-btn--icon "
aria-label="Toggle dropdown menu" aria-haspopup="true">
<svg xmlns="http://www.w3.org/2000/svg" width="24" height="24" viewBox="0 0 24 24" role="img" aria-labelledby="aowtm43vrsqrqcsxra597zrbkusavd2r" class="crayons-icon pointer-events-none"><title id="aowtm43vrsqrqcsxra597zrbkusavd2r">Dropdown menu</title>
<path fill-rule="evenodd" clip-rule="evenodd" d="M8.25 12a1.5 1.5 0 11-3 0 1.5 1.5 0 013 0zm5.25 0a1.5 1.5 0 11-3 0 1.5 1.5 0 013 0zm3.75 1.5a1.5 1.5 0 100-3 1.5 1.5 0 000 3z"></path>
</svg>
</button>
<div id="comment-dropdown-1384840" class="crayons-dropdown right-1 s:right-0 s:left-auto fs-base dropdown">
<ul class="m-0">
<li><a href="https://dev.to/siy/the-saga-is-antipattern-1354#comment-30kf2" class="crayons-link crayons-link--block permalink-copybtn" aria-label="Copy link to Sergiy Yevtushenko&#39;s comment" data-no-instant>Copy link</a></li>
<li class="comment-actions hidden" data-user-id="145374" data-action="settings-button" data-path="https://dev.to/siy/comment/30kf2/settings" aria-label="Go to Sergiy Yevtushenko&#39;s comment settings"></li>
<li class="comment-actions hidden" data-action="hide-button" data-commentable-user-id="145374" data-user-id="145374">
<button
class="flex justify-between crayons-link crayons-link--block w-100 bg-transparent border-0 hide-comment"
data-hide-type="hide"
data-comment-id="1384840"
data-comment-url="https://dev.to/siy/comment/30kf2"
aria-label="Hide Sergiy Yevtushenko&#39;s comment">
Hide
</button>
</li>
<li class="mod-actions hidden mod-actions-comment-button" data-path="https://dev.to/siy/comment/30kf2/mod" aria-label="Moderate Sergiy Yevtushenko&#39;s comment"></li>
<li class="report-abuse-link-wrapper" data-path="/report-abuse?url=https://dev.to/siy/comment/30kf2" aria-label="Report Sergiy Yevtushenko&#39;s comment as abusive or violating our code of conduct and/or terms and conditions"></li>
<li class="current-user-actions"></li>
</ul>
</div>
</div>
</div>
<div
class="
comment__body
text-styles
text-styles--secondary
body
">
<p>The queue/stream or pub-sub service is shared between publisher and consumer. And usually implemented using some clustered solution, which could be considered reliable.</p>
<p>EDA maintains eventual consistency by leveraging ACID transactions in DB (which don't have to be split as with microservices) + method-specific message delivery guarantees (for example, "at least once") + idempotency (to turn "at least once" into "exactly once"). Together this combination forms an eventually consistent system, which does not suffer from data loss or corruption. </p>
<p>Clustered architecture can implement 2PC by itself or just use ACID transactions provided by modern grids like Apache Ignite.</p>
<p>All these solutions are generic, i.e. don't need to implement every single transaction in the system from scratch, like it's necessary for Saga. And they don't suffer from data versioning issues, like Saga. DB-based ACID transactions also provide additional guarantees by leveraging DB schema constraints.</p>
</div>
</div>
<script>
</script>
<footer class="comment__footer print-hidden">
<button
class="crayons-tooltip__activator relative crayons-btn crayons-btn--ghost crayons-btn--icon-left crayons-btn--s mr-1 reaction-like inline-flex reaction-button"
id="button-for-comment-1384840"
data-comment-id="1384840"
aria-label="like"
data-tracking-name="comment_heart_button">
<svg xmlns="http://www.w3.org/2000/svg" width="24" height="24" role="img" aria-labelledby="a3cmx4stfxdnevy7tfxrf21y1jgg26ws" class="crayons-icon reaction-icon not-reacted"><title id="a3cmx4stfxdnevy7tfxrf21y1jgg26ws">Like comment: </title><path d="M18.884 12.595l.01.011L12 19.5l-6.894-6.894.01-.01A4.875 4.875 0 0112 5.73a4.875 4.875 0 016.884 6.865zM6.431 7.037a3.375 3.375 0 000 4.773L12 17.38l5.569-5.569a3.375 3.375 0 10-4.773-4.773L9.613 10.22l-1.06-1.062 2.371-2.372a3.375 3.375 0 00-4.492.25v.001z"></path></svg>
<svg xmlns="http://www.w3.org/2000/svg" width="24" height="24" viewBox="0 0 24 24" role="img" aria-labelledby="asxwr8fgsqwmxp2dqxiif0xq5634qbxu" class="crayons-icon crayons-icon reaction-icon--like reaction-icon reacted"><title id="asxwr8fgsqwmxp2dqxiif0xq5634qbxu">Like comment: </title>
<path d="M5.116 12.595a4.875 4.875 0 015.56-7.68h-.002L7.493 8.098l1.06 1.061 3.181-3.182a4.875 4.875 0 016.895 6.894L12 19.5l-6.894-6.894.01-.01z"></path>
</svg>
<span class="reactions-count">1</span><span class="reactions-label hidden m:inline-block">&nbsp;like</span>
<span data-testid="tooltip" class="crayons-tooltip__content">
Like
</span>
</button>
<span class="favorite-control-root" data-favorite-control="true" data-variant="comment" data-favoritable-type="Comment" data-favoritable-id="1384840" data-favoritable-user-id="145374" data-favorited="false" data-label-favorite="Pick as gem" data-label-favorited="Picked as gem" data-label-favorited-by-you="Picked as gem by you" data-modal-title="Gem Picked!" data-modal-body="You&#39;ve picked this as a community gem!" data-modal-remaining-zero="You have no more gems left to give out today." data-modal-remaining-one="You have 1 more gem left to give out today." data-modal-remaining-other="You have %{count} more gems left to give out today." data-modal-remaining-unlimited="You have unlimited gems to give out." data-modal-close="Got it" data-modal-exhausted-title="Out of Gems" data-modal-exhausted-body="You have no more gems left to give out today. Your allowance will refresh soon!" data-modal-exhausted-close="Got it"></span>
<button
class="actions crayons-btn crayons-btn--ghost crayons-btn--s crayons-btn--icon-left toggle-reply-form mr-1 inline-flex"
data-comment-id="1384840"
data-path="/siy/the-saga-is-antipattern-1354/comments/30kf2"
data-tracking-name="comment_reply_button"
data-testid="reply-button-1384840"
rel="nofollow">
<svg xmlns="http://www.w3.org/2000/svg" width="24" height="24" role="img" aria-labelledby="a2gtrn9y0kqlrooocmyldf4gvp7ougq0" class="crayons-icon reaction-icon not-reacted"><title id="a2gtrn9y0kqlrooocmyldf4gvp7ougq0">Comment button</title><path d="M10.5 5h3a6 6 0 110 12v2.625c-3.75-1.5-9-3.75-9-8.625a6 6 0 016-6zM12 15.5h1.5a4.501 4.501 0 001.722-8.657A4.5 4.5 0 0013.5 6.5h-3A4.5 4.5 0 006 11c0 2.707 1.846 4.475 6 6.36V15.5z"></path></svg>
<span class="hidden m:inline-block">Reply</span>
</button>
</footer>
</div>
</div>
</div>
</details>
</div>
</details>
<details class="comment-wrapper js-comment-wrapper comment-wrapper--deep-0
root
" open>
<summary aria-label="Toggle this comment (and replies)" data-tracking-name="expand_comment_toggle">
<span class="m:mx-1 inline-block align-middle">
<svg xmlns="http://www.w3.org/2000/svg" width="24" height="24" viewBox="0 0 24 24" role="img" aria-labelledby="a2xu3tw23yxcs6ner0mft7x1sy2tnw2d" class="crayons-icon expanded"><title id="a2xu3tw23yxcs6ner0mft7x1sy2tnw2d">Collapse</title>
<path d="M12 10.677L8 6.935 9 6l3 2.807L15 6l1 .935-4 3.742zm0 4.517L9 18l-1-.935 4-3.742 4 3.742-1 .934-3-2.805z"></path>
</svg>
<svg xmlns="http://www.w3.org/2000/svg" width="24" height="24" viewBox="0 0 24 24" role="img" aria-labelledby="a4m48zncj7yxq9l3c95lkksm9m7qo4dl" class="crayons-icon collapsed"><title id="a4m48zncj7yxq9l3c95lkksm9m7qo4dl">Expand</title>
<path d="M12 18l-4-3.771 1-.943 3 2.829 3-2.829 1 .943L12 18zm0-10.115l-3 2.829-1-.943L12 6l4 3.771-1 .942-3-2.828z"></path>
</svg>
</span>
<span class="js-collapse-comment-content inline-block align-middle"></span>
</summary>
<div
id="comment-node-1050914"
class="
comment single-comment-node
root
comment--deep-0
"
data-comment-id="1050914"
data-path="/siy/the-saga-is-antipattern-1354/comments/27kfk"
data-comment-author-id="1113470"
data-content-user-id="1113470">
<a name="comment-27kfk" style="position: absolute; top: -8px;">&nbsp;</a>
<div class="comment__inner">
<a href="https://dev.to/khosropakmanesh" class="shrink-0 crayons-avatar m:crayons-avatar--l mt-4 m:mt-3">
<img class="crayons-avatar__image" width="32" height="32" src="https://media2.dev.to/dynamic/image/width=50,height=50,fit=cover,gravity=auto,format=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Fuser%2Fprofile_image%2F1113470%2F66d653eb-4c9d-474f-9701-2a095132d1a0.jpeg" alt="khosropakmanesh profile image" loading="lazy" />
</a>
<div class="inner-comment comment__details">
<div class="comment__content crayons-card">
<div class="comment__header">
<a href="https://dev.to/khosropakmanesh" class="crayons-link crayons-link--secondary flex items-center fw-medium m:hidden">
<span class="js-comment-username">
Khosro Pakmanesh
</span>
</a>
<div class="profile-preview-card relative mb-4 s:mb-0 fw-medium hidden m:block">
<button id="comment-profile-preview-trigger-1050914" aria-controls="comment-profile-preview-content-1050914" class="profile-preview-card__trigger p-1 -my-1 -ml-1 crayons-btn crayons-btn--ghost" aria-label="Khosro Pakmanesh profile details">
Khosro Pakmanesh
</button>
<div id="comment-profile-preview-content-1050914" class="profile-preview-card__content p-4 pt-0 branded-7 crayons-dropdown" style="--card-color: #000000; border-top-color: var(--card-color);" data-testid="profile-preview-card" data-repositioning-dropdown="true">
<div class="gap-4 grid">
<div class="-mt-4">
<a href="/khosropakmanesh" class="flex">
<span class="crayons-avatar crayons-avatar--xl mr-2 shrink-0">
<img src="https://media2.dev.to/dynamic/image/width=90,height=90,fit=cover,gravity=auto,format=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Fuser%2Fprofile_image%2F1113470%2F66d653eb-4c9d-474f-9701-2a095132d1a0.jpeg" class="crayons-avatar__image" alt="" loading="lazy" />
</span>
<span class="crayons-link crayons-subtitle-2 mt-5">
Khosro Pakmanesh
</span>
</a>
</div>
<div class="print-hidden">
<button name="button" type="button" data-info="{&quot;className&quot;:&quot;User&quot;,&quot;style&quot;:&quot;&quot;,&quot;id&quot;:1113470,&quot;name&quot;:&quot;Khosro Pakmanesh&quot;}" class="crayons-btn follow-action-button whitespace-nowrap w-100 follow-user" aria-label="Follow user: Khosro Pakmanesh" aria-pressed="false">Follow</button>
</div>
<div class="user-metadata-details">
<ul class="user-metadata-details-inner">
<li>
<div class="key">
Joined
</div>
<div class="value">
<time datetime="2023-07-04T18:48:18Z" class="date">Jul 4, 2023</time>
</div>
</li>
</ul>
</div>
</div>
</div>
</div>
<span class="color-base-30 px-2 m:pl-0" role="presentation">&bull;</span>
<a href="https://dev.to/siy/the-saga-is-antipattern-1354#comment-27kfk" class="comment-date crayons-link crayons-link--secondary fs-s">
<time datetime="2023-07-04T18:54:07Z" class=date-short-year>
Jul 4 &#39;23
</time>
</a>
<div class="comment__dropdown" data-tracking-name="comment_dropdown">
<button id="comment-dropdown-trigger-1050914" aria-controls="comment-dropdown-1050914" aria-expanded="false"
class="dropbtn comment__dropdown-trigger crayons-btn crayons-btn--s crayons-btn--ghost crayons-btn--icon "
aria-label="Toggle dropdown menu" aria-haspopup="true">
<svg xmlns="http://www.w3.org/2000/svg" width="24" height="24" viewBox="0 0 24 24" role="img" aria-labelledby="a6fll1p91nt0zs07nk0nbit6h5wvn2zk" class="crayons-icon pointer-events-none"><title id="a6fll1p91nt0zs07nk0nbit6h5wvn2zk">Dropdown menu</title>
<path fill-rule="evenodd" clip-rule="evenodd" d="M8.25 12a1.5 1.5 0 11-3 0 1.5 1.5 0 013 0zm5.25 0a1.5 1.5 0 11-3 0 1.5 1.5 0 013 0zm3.75 1.5a1.5 1.5 0 100-3 1.5 1.5 0 000 3z"></path>
</svg>
</button>
<div id="comment-dropdown-1050914" class="crayons-dropdown right-1 s:right-0 s:left-auto fs-base dropdown">
<ul class="m-0">
<li><a href="https://dev.to/siy/the-saga-is-antipattern-1354#comment-27kfk" class="crayons-link crayons-link--block permalink-copybtn" aria-label="Copy link to Khosro Pakmanesh&#39;s comment" data-no-instant>Copy link</a></li>
<li class="comment-actions hidden" data-user-id="1113470" data-action="settings-button" data-path="https://dev.to/khosropakmanesh/comment/27kfk/settings" aria-label="Go to Khosro Pakmanesh&#39;s comment settings"></li>
<li class="comment-actions hidden" data-action="hide-button" data-commentable-user-id="145374" data-user-id="1113470">
<button
class="flex justify-between crayons-link crayons-link--block w-100 bg-transparent border-0 hide-comment"
data-hide-type="hide"
data-comment-id="1050914"
data-comment-url="https://dev.to/khosropakmanesh/comment/27kfk"
aria-label="Hide Khosro Pakmanesh&#39;s comment">
Hide
</button>
</li>
<li class="mod-actions hidden mod-actions-comment-button" data-path="https://dev.to/khosropakmanesh/comment/27kfk/mod" aria-label="Moderate Khosro Pakmanesh&#39;s comment"></li>
<li class="report-abuse-link-wrapper" data-path="/report-abuse?url=https://dev.to/khosropakmanesh/comment/27kfk" aria-label="Report Khosro Pakmanesh&#39;s comment as abusive or violating our code of conduct and/or terms and conditions"></li>
<li class="current-user-actions"></li>
</ul>
</div>
</div>
</div>
<div
class="
comment__body
text-styles
text-styles--secondary
body
">
<p>I read the whole article, but I didn't get your point. Now, what is the alternative to using Saga? Maybe, it was much nicer if you made your point progressively by making some examples. At least, you should have mentioned some references for extra reading.</p>
</div>
</div>
<script>
</script>
<footer class="comment__footer print-hidden">
<button
class="crayons-tooltip__activator relative crayons-btn crayons-btn--ghost crayons-btn--icon crayons-btn--s mr-1 reaction-like inline-flex reaction-button"
id="button-for-comment-1050914"
data-comment-id="1050914"
aria-label="like"
data-tracking-name="comment_heart_button">
<svg xmlns="http://www.w3.org/2000/svg" width="24" height="24" role="img" aria-labelledby="a2f0tmlxkgd9xxpf07i699krk019tj42" class="crayons-icon reaction-icon not-reacted"><title id="a2f0tmlxkgd9xxpf07i699krk019tj42">Like comment: </title><path d="M18.884 12.595l.01.011L12 19.5l-6.894-6.894.01-.01A4.875 4.875 0 0112 5.73a4.875 4.875 0 016.884 6.865zM6.431 7.037a3.375 3.375 0 000 4.773L12 17.38l5.569-5.569a3.375 3.375 0 10-4.773-4.773L9.613 10.22l-1.06-1.062 2.371-2.372a3.375 3.375 0 00-4.492.25v.001z"></path></svg>
<svg xmlns="http://www.w3.org/2000/svg" width="24" height="24" viewBox="0 0 24 24" role="img" aria-labelledby="ai4j58ygqoduzkv763uz3gd11xzc8i2k" class="crayons-icon crayons-icon reaction-icon--like reaction-icon reacted"><title id="ai4j58ygqoduzkv763uz3gd11xzc8i2k">Like comment: </title>
<path d="M5.116 12.595a4.875 4.875 0 015.56-7.68h-.002L7.493 8.098l1.06 1.061 3.181-3.182a4.875 4.875 0 016.895 6.894L12 19.5l-6.894-6.894.01-.01z"></path>
</svg>
<span class="reactions-count"></span><span class="reactions-label hidden m:inline-block"></span>
<span data-testid="tooltip" class="crayons-tooltip__content">
Like
</span>
</button>
<span class="favorite-control-root" data-favorite-control="true" data-variant="comment" data-favoritable-type="Comment" data-favoritable-id="1050914" data-favoritable-user-id="1113470" data-favorited="false" data-label-favorite="Pick as gem" data-label-favorited="Picked as gem" data-label-favorited-by-you="Picked as gem by you" data-modal-title="Gem Picked!" data-modal-body="You&#39;ve picked this as a community gem!" data-modal-remaining-zero="You have no more gems left to give out today." data-modal-remaining-one="You have 1 more gem left to give out today." data-modal-remaining-other="You have %{count} more gems left to give out today." data-modal-remaining-unlimited="You have unlimited gems to give out." data-modal-close="Got it" data-modal-exhausted-title="Out of Gems" data-modal-exhausted-body="You have no more gems left to give out today. Your allowance will refresh soon!" data-modal-exhausted-close="Got it"></span>
<button
class="actions crayons-btn crayons-btn--ghost crayons-btn--s crayons-btn--icon-left toggle-reply-form mr-1 inline-flex"
data-comment-id="1050914"
data-path="/siy/the-saga-is-antipattern-1354/comments/27kfk"
data-tracking-name="comment_reply_button"
data-testid="reply-button-1050914"
rel="nofollow">
<svg xmlns="http://www.w3.org/2000/svg" width="24" height="24" role="img" aria-labelledby="a3its3b9kergywu44xyumkd79r0puoga" class="crayons-icon reaction-icon not-reacted"><title id="a3its3b9kergywu44xyumkd79r0puoga">Comment button</title><path d="M10.5 5h3a6 6 0 110 12v2.625c-3.75-1.5-9-3.75-9-8.625a6 6 0 016-6zM12 15.5h1.5a4.501 4.501 0 001.722-8.657A4.5 4.5 0 0013.5 6.5h-3A4.5 4.5 0 006 11c0 2.707 1.846 4.475 6 6.36V15.5z"></path></svg>
<span class="hidden m:inline-block">Reply</span>
</button>
</footer>
</div>
</div>
<details class="comment-wrapper js-comment-wrapper comment-wrapper--deep-1
child
" open>
<summary aria-label="Toggle this comment (and replies)" data-tracking-name="expand_comment_toggle">
<span class="mx-0 inline-block align-middle">
<svg xmlns="http://www.w3.org/2000/svg" width="24" height="24" viewBox="0 0 24 24" role="img" aria-labelledby="arh5ekgj8tvrp5hmoz8ooct28l7nep28" class="crayons-icon expanded"><title id="arh5ekgj8tvrp5hmoz8ooct28l7nep28">Collapse</title>
<path d="M12 10.677L8 6.935 9 6l3 2.807L15 6l1 .935-4 3.742zm0 4.517L9 18l-1-.935 4-3.742 4 3.742-1 .934-3-2.805z"></path>
</svg>
<svg xmlns="http://www.w3.org/2000/svg" width="24" height="24" viewBox="0 0 24 24" role="img" aria-labelledby="a1fhxsfhc9o4r39535172zb7zzisyka2" class="crayons-icon collapsed"><title id="a1fhxsfhc9o4r39535172zb7zzisyka2">Expand</title>
<path d="M12 18l-4-3.771 1-.943 3 2.829 3-2.829 1 .943L12 18zm0-10.115l-3 2.829-1-.943L12 6l4 3.771-1 .942-3-2.828z"></path>
</svg>
</span>
<span class="js-collapse-comment-content inline-block align-middle"></span>
</summary>
<div
id="comment-node-1050997"
class="
comment single-comment-node
child
comment--deep-1
"
data-comment-id="1050997"
data-path="/siy/the-saga-is-antipattern-1354/comments/27kip"
data-comment-author-id="145374"
data-content-user-id="145374">
<a name="comment-27kip" style="position: absolute; top: -8px;">&nbsp;</a>
<div class="comment__inner">
<a href="https://dev.to/siy" class="shrink-0 crayons-avatar mt-4">
<img class="crayons-avatar__image" width="32" height="32" src="https://media2.dev.to/dynamic/image/width=50,height=50,fit=cover,gravity=auto,format=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Fuser%2Fprofile_image%2F145374%2F6e93547b-45cc-430e-9659-3adea03266b5.jpeg" alt="siy profile image" loading="lazy" />
</a>
<div class="inner-comment comment__details">
<div class="comment__content crayons-card">
<div class="comment__header">
<a href="https://dev.to/siy" class="crayons-link crayons-link--secondary flex items-center fw-medium m:hidden">
<span class="js-comment-username">
Sergiy Yevtushenko
</span>
<span class="crayons-hover-tooltip inline-block spec-op-author -mr-2" data-tooltip="Author">
<svg xmlns="http://www.w3.org/2000/svg" width="24" height="24" viewBox="0 0 24 24" role="img" class="crayons-icon">
<path d="M12 8.25a6 6 0 110 12 6 6 0 010-12zm0 2.625l-.992 2.01-2.218.322 1.605 1.564-.379 2.21L12 15.937l1.984 1.043-.379-2.209 1.605-1.564-2.218-.323L12 10.875zm.75-6.376l3.75.001v2.25l-1.022.854a7.45 7.45 0 00-2.728-.817V4.5zm-1.5 0v2.288a7.451 7.451 0 00-2.727.816L7.5 6.75V4.5h3.75z"></path>
</svg>
</span>
</a>
<div class="profile-preview-card relative mb-4 s:mb-0 fw-medium hidden m:block">
<button id="comment-profile-preview-trigger-1050997" aria-controls="comment-profile-preview-content-1050997" class="profile-preview-card__trigger p-1 -my-1 -ml-1 crayons-btn crayons-btn--ghost" aria-label="Sergiy Yevtushenko profile details">
Sergiy Yevtushenko
</button>
<div id="comment-profile-preview-content-1050997" class="profile-preview-card__content p-4 pt-0 branded-7 crayons-dropdown" style="--card-color: #a198bb; border-top-color: var(--card-color);" data-testid="profile-preview-card" data-repositioning-dropdown="true">
<div class="gap-4 grid">
<div class="-mt-4">
<a href="/siy" class="flex">
<span class="crayons-avatar crayons-avatar--xl mr-2 shrink-0">
<img src="https://media2.dev.to/dynamic/image/width=90,height=90,fit=cover,gravity=auto,format=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Fuser%2Fprofile_image%2F145374%2F6e93547b-45cc-430e-9659-3adea03266b5.jpeg" class="crayons-avatar__image" alt="" loading="lazy" />
</span>
<span class="crayons-link crayons-subtitle-2 mt-5">
Sergiy Yevtushenko
</span>
</a>
</div>
<div class="print-hidden">
<button name="button" type="button" data-info="{&quot;className&quot;:&quot;User&quot;,&quot;style&quot;:&quot;&quot;,&quot;id&quot;:145374,&quot;name&quot;:&quot;Sergiy Yevtushenko&quot;}" class="crayons-btn follow-action-button whitespace-nowrap w-100 follow-user" aria-label="Follow user: Sergiy Yevtushenko" aria-pressed="false">Follow</button>
</div>
<div class="color-base-70">
Writing code for 35+ years and still enjoy it...
</div>
<div class="user-metadata-details">
<ul class="user-metadata-details-inner">
<li>
<div class="key">
Location
</div>
<div class="value">
Krakow, Poland
</div>
</li>
<li>
<div class="key">
Work
</div>
<div class="value">
Senior Software Engineer
</div>
</li>
<li>
<div class="key">
Joined
</div>
<div class="value">
<time datetime="2019-03-14T05:28:55Z" class="date">Mar 14, 2019</time>
</div>
</li>
</ul>
</div>
</div>
</div>
<span class="crayons-hover-tooltip inline-block spec-op-author -ml-2" data-tooltip="Author">
<svg xmlns="http://www.w3.org/2000/svg" width="24" height="24" viewBox="0 0 24 24" role="img" class="crayons-icon">
<path d="M12 8.25a6 6 0 110 12 6 6 0 010-12zm0 2.625l-.992 2.01-2.218.322 1.605 1.564-.379 2.21L12 15.937l1.984 1.043-.379-2.209 1.605-1.564-2.218-.323L12 10.875zm.75-6.376l3.75.001v2.25l-1.022.854a7.45 7.45 0 00-2.728-.817V4.5zm-1.5 0v2.288a7.451 7.451 0 00-2.727.816L7.5 6.75V4.5h3.75z"></path>
</svg>
</span>
</div>
<span class="color-base-30 px-2 m:pl-0" role="presentation">&bull;</span>
<a href="https://dev.to/siy/the-saga-is-antipattern-1354#comment-27kip" class="comment-date crayons-link crayons-link--secondary fs-s">
<time datetime="2023-07-05T02:58:07Z" class=date-short-year>
Jul 5 &#39;23
</time>
</a>
<div class="comment__dropdown" data-tracking-name="comment_dropdown">
<button id="comment-dropdown-trigger-1050997" aria-controls="comment-dropdown-1050997" aria-expanded="false"
class="dropbtn comment__dropdown-trigger crayons-btn crayons-btn--s crayons-btn--ghost crayons-btn--icon "
aria-label="Toggle dropdown menu" aria-haspopup="true">
<svg xmlns="http://www.w3.org/2000/svg" width="24" height="24" viewBox="0 0 24 24" role="img" aria-labelledby="aivzau7f8zfkhk0210hlscuishknnygk" class="crayons-icon pointer-events-none"><title id="aivzau7f8zfkhk0210hlscuishknnygk">Dropdown menu</title>
<path fill-rule="evenodd" clip-rule="evenodd" d="M8.25 12a1.5 1.5 0 11-3 0 1.5 1.5 0 013 0zm5.25 0a1.5 1.5 0 11-3 0 1.5 1.5 0 013 0zm3.75 1.5a1.5 1.5 0 100-3 1.5 1.5 0 000 3z"></path>
</svg>
</button>
<div id="comment-dropdown-1050997" class="crayons-dropdown right-1 s:right-0 s:left-auto fs-base dropdown">
<ul class="m-0">
<li><a href="https://dev.to/siy/the-saga-is-antipattern-1354#comment-27kip" class="crayons-link crayons-link--block permalink-copybtn" aria-label="Copy link to Sergiy Yevtushenko&#39;s comment" data-no-instant>Copy link</a></li>
<li class="comment-actions hidden" data-user-id="145374" data-action="settings-button" data-path="https://dev.to/siy/comment/27kip/settings" aria-label="Go to Sergiy Yevtushenko&#39;s comment settings"></li>
<li class="comment-actions hidden" data-action="hide-button" data-commentable-user-id="145374" data-user-id="145374">
<button
class="flex justify-between crayons-link crayons-link--block w-100 bg-transparent border-0 hide-comment"
data-hide-type="hide"
data-comment-id="1050997"
data-comment-url="https://dev.to/siy/comment/27kip"
aria-label="Hide Sergiy Yevtushenko&#39;s comment">
Hide
</button>
</li>
<li class="mod-actions hidden mod-actions-comment-button" data-path="https://dev.to/siy/comment/27kip/mod" aria-label="Moderate Sergiy Yevtushenko&#39;s comment"></li>
<li class="report-abuse-link-wrapper" data-path="/report-abuse?url=https://dev.to/siy/comment/27kip" aria-label="Report Sergiy Yevtushenko&#39;s comment as abusive or violating our code of conduct and/or terms and conditions"></li>
<li class="current-user-actions"></li>
</ul>
</div>
</div>
</div>
<div
class="
comment__body
text-styles
text-styles--secondary
body
">
<p>The point is explicitly stated at the beginning:</p>
<blockquote>
<p>If you need distributed transactions across a few microservices, most likely you incorrectly defined and separated domains.</p>
</blockquote>
<p>So, there can't be any alternatives. Instead, application should be designed using other approaches, which have no problems with handling transactions. Possible approaches are listed and discussed in article.</p>
</div>
</div>
<script>
</script>
<footer class="comment__footer print-hidden">
<button
class="crayons-tooltip__activator relative crayons-btn crayons-btn--ghost crayons-btn--icon-left crayons-btn--s mr-1 reaction-like inline-flex reaction-button"
id="button-for-comment-1050997"
data-comment-id="1050997"
aria-label="like"
data-tracking-name="comment_heart_button">
<svg xmlns="http://www.w3.org/2000/svg" width="24" height="24" role="img" aria-labelledby="atw60bcbbzm4a5sl4nlcpzwvn88hkoe3" class="crayons-icon reaction-icon not-reacted"><title id="atw60bcbbzm4a5sl4nlcpzwvn88hkoe3">Like comment: </title><path d="M18.884 12.595l.01.011L12 19.5l-6.894-6.894.01-.01A4.875 4.875 0 0112 5.73a4.875 4.875 0 016.884 6.865zM6.431 7.037a3.375 3.375 0 000 4.773L12 17.38l5.569-5.569a3.375 3.375 0 10-4.773-4.773L9.613 10.22l-1.06-1.062 2.371-2.372a3.375 3.375 0 00-4.492.25v.001z"></path></svg>
<svg xmlns="http://www.w3.org/2000/svg" width="24" height="24" viewBox="0 0 24 24" role="img" aria-labelledby="a746ck7aqt00umtahia8l80nr290kvsr" class="crayons-icon crayons-icon reaction-icon--like reaction-icon reacted"><title id="a746ck7aqt00umtahia8l80nr290kvsr">Like comment: </title>
<path d="M5.116 12.595a4.875 4.875 0 015.56-7.68h-.002L7.493 8.098l1.06 1.061 3.181-3.182a4.875 4.875 0 016.895 6.894L12 19.5l-6.894-6.894.01-.01z"></path>
</svg>
<span class="reactions-count">2</span><span class="reactions-label hidden m:inline-block">&nbsp;likes</span>
<span data-testid="tooltip" class="crayons-tooltip__content">
Like
</span>
</button>
<span class="favorite-control-root" data-favorite-control="true" data-variant="comment" data-favoritable-type="Comment" data-favoritable-id="1050997" data-favoritable-user-id="145374" data-favorited="false" data-label-favorite="Pick as gem" data-label-favorited="Picked as gem" data-label-favorited-by-you="Picked as gem by you" data-modal-title="Gem Picked!" data-modal-body="You&#39;ve picked this as a community gem!" data-modal-remaining-zero="You have no more gems left to give out today." data-modal-remaining-one="You have 1 more gem left to give out today." data-modal-remaining-other="You have %{count} more gems left to give out today." data-modal-remaining-unlimited="You have unlimited gems to give out." data-modal-close="Got it" data-modal-exhausted-title="Out of Gems" data-modal-exhausted-body="You have no more gems left to give out today. Your allowance will refresh soon!" data-modal-exhausted-close="Got it"></span>
<button
class="actions crayons-btn crayons-btn--ghost crayons-btn--s crayons-btn--icon-left toggle-reply-form mr-1 inline-flex"
data-comment-id="1050997"
data-path="/siy/the-saga-is-antipattern-1354/comments/27kip"
data-tracking-name="comment_reply_button"
data-testid="reply-button-1050997"
rel="nofollow">
<svg xmlns="http://www.w3.org/2000/svg" width="24" height="24" role="img" aria-labelledby="a3fasnmcb3dnxeoq0175n7e6op6kytzc" class="crayons-icon reaction-icon not-reacted"><title id="a3fasnmcb3dnxeoq0175n7e6op6kytzc">Comment button</title><path d="M10.5 5h3a6 6 0 110 12v2.625c-3.75-1.5-9-3.75-9-8.625a6 6 0 016-6zM12 15.5h1.5a4.501 4.501 0 001.722-8.657A4.5 4.5 0 0013.5 6.5h-3A4.5 4.5 0 006 11c0 2.707 1.846 4.475 6 6.36V15.5z"></path></svg>
<span class="hidden m:inline-block">Reply</span>
</button>
</footer>
</div>
</div>
</div>
</details>
</div>
</details>
<details class="comment-wrapper js-comment-wrapper comment-wrapper--deep-0
root
" open>
<summary aria-label="Toggle this comment (and replies)" data-tracking-name="expand_comment_toggle">
<span class="m:mx-1 inline-block align-middle">
<svg xmlns="http://www.w3.org/2000/svg" width="24" height="24" viewBox="0 0 24 24" role="img" aria-labelledby="agaeqqeks1eo1uzkrqpglwfqor7r4q9h" class="crayons-icon expanded"><title id="agaeqqeks1eo1uzkrqpglwfqor7r4q9h">Collapse</title>
<path d="M12 10.677L8 6.935 9 6l3 2.807L15 6l1 .935-4 3.742zm0 4.517L9 18l-1-.935 4-3.742 4 3.742-1 .934-3-2.805z"></path>
</svg>
<svg xmlns="http://www.w3.org/2000/svg" width="24" height="24" viewBox="0 0 24 24" role="img" aria-labelledby="ac8b2kzw0emrkivhtk4za2fwyk8pb7l" class="crayons-icon collapsed"><title id="ac8b2kzw0emrkivhtk4za2fwyk8pb7l">Expand</title>
<path d="M12 18l-4-3.771 1-.943 3 2.829 3-2.829 1 .943L12 18zm0-10.115l-3 2.829-1-.943L12 6l4 3.771-1 .942-3-2.828z"></path>
</svg>
</span>
<span class="js-collapse-comment-content inline-block align-middle"></span>
</summary>
<div
id="comment-node-1442167"
class="
comment single-comment-node
root
comment--deep-0
"
data-comment-id="1442167"
data-path="/siy/the-saga-is-antipattern-1354/comments/3419p"
data-comment-author-id="483415"
data-content-user-id="483415">
<a name="comment-3419p" style="position: absolute; top: -8px;">&nbsp;</a>
<div class="comment__inner">
<a href="https://dev.to/barbolani" class="shrink-0 crayons-avatar m:crayons-avatar--l mt-4 m:mt-3">
<img class="crayons-avatar__image" width="32" height="32" src="https://media2.dev.to/dynamic/image/width=50,height=50,fit=cover,gravity=auto,format=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Fuser%2Fprofile_image%2F483415%2F8bec39e2-eb5e-4798-9ff5-ccebdc5e32f2.png" alt="barbolani profile image" loading="lazy" />
</a>
<div class="inner-comment comment__details">
<div class="comment__content crayons-card">
<div class="comment__header">
<a href="https://dev.to/barbolani" class="crayons-link crayons-link--secondary flex items-center fw-medium m:hidden">
<span class="js-comment-username">
Alfonso García-Patiño Barbolani
</span>
</a>
<div class="profile-preview-card relative mb-4 s:mb-0 fw-medium hidden m:block">
<button id="comment-profile-preview-trigger-1442167" aria-controls="comment-profile-preview-content-1442167" class="profile-preview-card__trigger p-1 -my-1 -ml-1 crayons-btn crayons-btn--ghost" aria-label="Alfonso García-Patiño Barbolani profile details">
Alfonso García-Patiño Barbolani
</button>
<div id="comment-profile-preview-content-1442167" class="profile-preview-card__content p-4 pt-0 branded-7 crayons-dropdown" style="--card-color: #190aa4; border-top-color: var(--card-color);" data-testid="profile-preview-card" data-repositioning-dropdown="true">
<div class="gap-4 grid">
<div class="-mt-4">
<a href="/barbolani" class="flex">
<span class="crayons-avatar crayons-avatar--xl mr-2 shrink-0">
<img src="https://media2.dev.to/dynamic/image/width=90,height=90,fit=cover,gravity=auto,format=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Fuser%2Fprofile_image%2F483415%2F8bec39e2-eb5e-4798-9ff5-ccebdc5e32f2.png" class="crayons-avatar__image" alt="" loading="lazy" />
</span>
<span class="crayons-link crayons-subtitle-2 mt-5">
Alfonso García-Patiño Barbolani
</span>
</a>
</div>
<div class="print-hidden">
<button name="button" type="button" data-info="{&quot;className&quot;:&quot;User&quot;,&quot;style&quot;:&quot;&quot;,&quot;id&quot;:483415,&quot;name&quot;:&quot;Alfonso García-Patiño Barbolani&quot;}" class="crayons-btn follow-action-button whitespace-nowrap w-100 follow-user" aria-label="Follow user: Alfonso García-Patiño Barbolani" aria-pressed="false">Follow</button>
</div>
<div class="color-base-70">
Want to understand things that I use
</div>
<div class="user-metadata-details">
<ul class="user-metadata-details-inner">
<li>
<div class="key">
Location
</div>
<div class="value">
Madrid, Spain
</div>
</li>
<li>
<div class="key">
Work
</div>
<div class="value">
Senior Developer at CIMD
</div>
</li>
<li>
<div class="key">
Joined
</div>
<div class="value">
<time datetime="2020-10-06T08:05:17Z" class="date">Oct 6, 2020</time>
</div>
</li>
</ul>
</div>
</div>
</div>
</div>
<span class="color-base-30 px-2 m:pl-0" role="presentation">&bull;</span>
<a href="https://dev.to/siy/the-saga-is-antipattern-1354#comment-3419p" class="comment-date crayons-link crayons-link--secondary fs-s">
<time datetime="2026-01-28T06:09:20Z" class=date-no-year>
Jan 28
</time>
</a>
<div class="comment__dropdown" data-tracking-name="comment_dropdown">
<button id="comment-dropdown-trigger-1442167" aria-controls="comment-dropdown-1442167" aria-expanded="false"
class="dropbtn comment__dropdown-trigger crayons-btn crayons-btn--s crayons-btn--ghost crayons-btn--icon "
aria-label="Toggle dropdown menu" aria-haspopup="true">
<svg xmlns="http://www.w3.org/2000/svg" width="24" height="24" viewBox="0 0 24 24" role="img" aria-labelledby="atvnccedv5x9asyqvofglvblze6e8ywa" class="crayons-icon pointer-events-none"><title id="atvnccedv5x9asyqvofglvblze6e8ywa">Dropdown menu</title>
<path fill-rule="evenodd" clip-rule="evenodd" d="M8.25 12a1.5 1.5 0 11-3 0 1.5 1.5 0 013 0zm5.25 0a1.5 1.5 0 11-3 0 1.5 1.5 0 013 0zm3.75 1.5a1.5 1.5 0 100-3 1.5 1.5 0 000 3z"></path>
</svg>
</button>
<div id="comment-dropdown-1442167" class="crayons-dropdown right-1 s:right-0 s:left-auto fs-base dropdown">
<ul class="m-0">
<li><a href="https://dev.to/siy/the-saga-is-antipattern-1354#comment-3419p" class="crayons-link crayons-link--block permalink-copybtn" aria-label="Copy link to Alfonso García-Patiño Barbolani&#39;s comment" data-no-instant>Copy link</a></li>
<li class="comment-actions hidden" data-user-id="483415" data-action="settings-button" data-path="https://dev.to/barbolani/comment/3419p/settings" aria-label="Go to Alfonso García-Patiño Barbolani&#39;s comment settings"></li>
<li class="comment-actions hidden" data-action="hide-button" data-commentable-user-id="145374" data-user-id="483415">
<button
class="flex justify-between crayons-link crayons-link--block w-100 bg-transparent border-0 hide-comment"
data-hide-type="hide"
data-comment-id="1442167"
data-comment-url="https://dev.to/barbolani/comment/3419p"
aria-label="Hide Alfonso García-Patiño Barbolani&#39;s comment">
Hide
</button>
</li>
<li class="mod-actions hidden mod-actions-comment-button" data-path="https://dev.to/barbolani/comment/3419p/mod" aria-label="Moderate Alfonso García-Patiño Barbolani&#39;s comment"></li>
<li class="report-abuse-link-wrapper" data-path="/report-abuse?url=https://dev.to/barbolani/comment/3419p" aria-label="Report Alfonso García-Patiño Barbolani&#39;s comment as abusive or violating our code of conduct and/or terms and conditions"></li>
<li class="current-user-actions"></li>
</ul>
</div>
</div>
</div>
<div
class="
comment__body
text-styles
text-styles--secondary
body
">
<p>Amen. Its 2026 and the microservices hype wave is still going on</p>
</div>
</div>
<script>
</script>
<footer class="comment__footer print-hidden">
<button
class="crayons-tooltip__activator relative crayons-btn crayons-btn--ghost crayons-btn--icon-left crayons-btn--s mr-1 reaction-like inline-flex reaction-button"
id="button-for-comment-1442167"
data-comment-id="1442167"
aria-label="like"
data-tracking-name="comment_heart_button">
<svg xmlns="http://www.w3.org/2000/svg" width="24" height="24" role="img" aria-labelledby="a2zbr4fr66ahabooqz4v341gvlxqu2gb" class="crayons-icon reaction-icon not-reacted"><title id="a2zbr4fr66ahabooqz4v341gvlxqu2gb">Like comment: </title><path d="M18.884 12.595l.01.011L12 19.5l-6.894-6.894.01-.01A4.875 4.875 0 0112 5.73a4.875 4.875 0 016.884 6.865zM6.431 7.037a3.375 3.375 0 000 4.773L12 17.38l5.569-5.569a3.375 3.375 0 10-4.773-4.773L9.613 10.22l-1.06-1.062 2.371-2.372a3.375 3.375 0 00-4.492.25v.001z"></path></svg>
<svg xmlns="http://www.w3.org/2000/svg" width="24" height="24" viewBox="0 0 24 24" role="img" aria-labelledby="a9iehhebpwlouve1zjj3cu9qiqqy6hss" class="crayons-icon crayons-icon reaction-icon--like reaction-icon reacted"><title id="a9iehhebpwlouve1zjj3cu9qiqqy6hss">Like comment: </title>
<path d="M5.116 12.595a4.875 4.875 0 015.56-7.68h-.002L7.493 8.098l1.06 1.061 3.181-3.182a4.875 4.875 0 016.895 6.894L12 19.5l-6.894-6.894.01-.01z"></path>
</svg>
<span class="reactions-count">1</span><span class="reactions-label hidden m:inline-block">&nbsp;like</span>
<span data-testid="tooltip" class="crayons-tooltip__content">
Like
</span>
</button>
<span class="favorite-control-root" data-favorite-control="true" data-variant="comment" data-favoritable-type="Comment" data-favoritable-id="1442167" data-favoritable-user-id="483415" data-favorited="false" data-label-favorite="Pick as gem" data-label-favorited="Picked as gem" data-label-favorited-by-you="Picked as gem by you" data-modal-title="Gem Picked!" data-modal-body="You&#39;ve picked this as a community gem!" data-modal-remaining-zero="You have no more gems left to give out today." data-modal-remaining-one="You have 1 more gem left to give out today." data-modal-remaining-other="You have %{count} more gems left to give out today." data-modal-remaining-unlimited="You have unlimited gems to give out." data-modal-close="Got it" data-modal-exhausted-title="Out of Gems" data-modal-exhausted-body="You have no more gems left to give out today. Your allowance will refresh soon!" data-modal-exhausted-close="Got it"></span>
<button
class="actions crayons-btn crayons-btn--ghost crayons-btn--s crayons-btn--icon-left toggle-reply-form mr-1 inline-flex"
data-comment-id="1442167"
data-path="/siy/the-saga-is-antipattern-1354/comments/3419p"
data-tracking-name="comment_reply_button"
data-testid="reply-button-1442167"
rel="nofollow">
<svg xmlns="http://www.w3.org/2000/svg" width="24" height="24" role="img" aria-labelledby="ad2ha7030nygnptj6yjlwnb4oz0mj2xq" class="crayons-icon reaction-icon not-reacted"><title id="ad2ha7030nygnptj6yjlwnb4oz0mj2xq">Comment button</title><path d="M10.5 5h3a6 6 0 110 12v2.625c-3.75-1.5-9-3.75-9-8.625a6 6 0 016-6zM12 15.5h1.5a4.501 4.501 0 001.722-8.657A4.5 4.5 0 0013.5 6.5h-3A4.5 4.5 0 006 11c0 2.707 1.846 4.475 6 6.36V15.5z"></path></svg>
<span class="hidden m:inline-block">Reply</span>
</button>
</footer>
</div>
</div>
<details class="comment-wrapper js-comment-wrapper comment-wrapper--deep-1
child
" open>
<summary aria-label="Toggle this comment (and replies)" data-tracking-name="expand_comment_toggle">
<span class="mx-0 inline-block align-middle">
<svg xmlns="http://www.w3.org/2000/svg" width="24" height="24" viewBox="0 0 24 24" role="img" aria-labelledby="aqmpa887sgir020q84cf3bsc7bxf6ydy" class="crayons-icon expanded"><title id="aqmpa887sgir020q84cf3bsc7bxf6ydy">Collapse</title>
<path d="M12 10.677L8 6.935 9 6l3 2.807L15 6l1 .935-4 3.742zm0 4.517L9 18l-1-.935 4-3.742 4 3.742-1 .934-3-2.805z"></path>
</svg>
<svg xmlns="http://www.w3.org/2000/svg" width="24" height="24" viewBox="0 0 24 24" role="img" aria-labelledby="a2uun8hgxh2p61r4b8uv16zzy0qxsaky" class="crayons-icon collapsed"><title id="a2uun8hgxh2p61r4b8uv16zzy0qxsaky">Expand</title>
<path d="M12 18l-4-3.771 1-.943 3 2.829 3-2.829 1 .943L12 18zm0-10.115l-3 2.829-1-.943L12 6l4 3.771-1 .942-3-2.828z"></path>
</svg>
</span>
<span class="js-collapse-comment-content inline-block align-middle"></span>
</summary>
<div
id="comment-node-1443346"
class="
comment single-comment-node
child
comment--deep-1
"
data-comment-id="1443346"
data-path="/siy/the-saga-is-antipattern-1354/comments/34338"
data-comment-author-id="145374"
data-content-user-id="145374">
<a name="comment-34338" style="position: absolute; top: -8px;">&nbsp;</a>
<div class="comment__inner">
<a href="https://dev.to/siy" class="shrink-0 crayons-avatar mt-4">
<img class="crayons-avatar__image" width="32" height="32" src="https://media2.dev.to/dynamic/image/width=50,height=50,fit=cover,gravity=auto,format=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Fuser%2Fprofile_image%2F145374%2F6e93547b-45cc-430e-9659-3adea03266b5.jpeg" alt="siy profile image" loading="lazy" />
</a>
<div class="inner-comment comment__details">
<div class="comment__content crayons-card">
<div class="comment__header">
<a href="https://dev.to/siy" class="crayons-link crayons-link--secondary flex items-center fw-medium m:hidden">
<span class="js-comment-username">
Sergiy Yevtushenko
</span>
<span class="crayons-hover-tooltip inline-block spec-op-author -mr-2" data-tooltip="Author">
<svg xmlns="http://www.w3.org/2000/svg" width="24" height="24" viewBox="0 0 24 24" role="img" class="crayons-icon">
<path d="M12 8.25a6 6 0 110 12 6 6 0 010-12zm0 2.625l-.992 2.01-2.218.322 1.605 1.564-.379 2.21L12 15.937l1.984 1.043-.379-2.209 1.605-1.564-2.218-.323L12 10.875zm.75-6.376l3.75.001v2.25l-1.022.854a7.45 7.45 0 00-2.728-.817V4.5zm-1.5 0v2.288a7.451 7.451 0 00-2.727.816L7.5 6.75V4.5h3.75z"></path>
</svg>
</span>
</a>
<div class="profile-preview-card relative mb-4 s:mb-0 fw-medium hidden m:block">
<button id="comment-profile-preview-trigger-1443346" aria-controls="comment-profile-preview-content-1443346" class="profile-preview-card__trigger p-1 -my-1 -ml-1 crayons-btn crayons-btn--ghost" aria-label="Sergiy Yevtushenko profile details">
Sergiy Yevtushenko
</button>
<div id="comment-profile-preview-content-1443346" class="profile-preview-card__content p-4 pt-0 branded-7 crayons-dropdown" style="--card-color: #a198bb; border-top-color: var(--card-color);" data-testid="profile-preview-card" data-repositioning-dropdown="true">
<div class="gap-4 grid">
<div class="-mt-4">
<a href="/siy" class="flex">
<span class="crayons-avatar crayons-avatar--xl mr-2 shrink-0">
<img src="https://media2.dev.to/dynamic/image/width=90,height=90,fit=cover,gravity=auto,format=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Fuser%2Fprofile_image%2F145374%2F6e93547b-45cc-430e-9659-3adea03266b5.jpeg" class="crayons-avatar__image" alt="" loading="lazy" />
</span>
<span class="crayons-link crayons-subtitle-2 mt-5">
Sergiy Yevtushenko
</span>
</a>
</div>
<div class="print-hidden">
<button name="button" type="button" data-info="{&quot;className&quot;:&quot;User&quot;,&quot;style&quot;:&quot;&quot;,&quot;id&quot;:145374,&quot;name&quot;:&quot;Sergiy Yevtushenko&quot;}" class="crayons-btn follow-action-button whitespace-nowrap w-100 follow-user" aria-label="Follow user: Sergiy Yevtushenko" aria-pressed="false">Follow</button>
</div>
<div class="color-base-70">
Writing code for 35+ years and still enjoy it...
</div>
<div class="user-metadata-details">
<ul class="user-metadata-details-inner">
<li>
<div class="key">
Location
</div>
<div class="value">
Krakow, Poland
</div>
</li>
<li>
<div class="key">
Work
</div>
<div class="value">
Senior Software Engineer
</div>
</li>
<li>
<div class="key">
Joined
</div>
<div class="value">
<time datetime="2019-03-14T05:28:55Z" class="date">Mar 14, 2019</time>
</div>
</li>
</ul>
</div>
</div>
</div>
<span class="crayons-hover-tooltip inline-block spec-op-author -ml-2" data-tooltip="Author">
<svg xmlns="http://www.w3.org/2000/svg" width="24" height="24" viewBox="0 0 24 24" role="img" class="crayons-icon">
<path d="M12 8.25a6 6 0 110 12 6 6 0 010-12zm0 2.625l-.992 2.01-2.218.322 1.605 1.564-.379 2.21L12 15.937l1.984 1.043-.379-2.209 1.605-1.564-2.218-.323L12 10.875zm.75-6.376l3.75.001v2.25l-1.022.854a7.45 7.45 0 00-2.728-.817V4.5zm-1.5 0v2.288a7.451 7.451 0 00-2.727.816L7.5 6.75V4.5h3.75z"></path>
</svg>
</span>
</div>
<span class="color-base-30 px-2 m:pl-0" role="presentation">&bull;</span>
<a href="https://dev.to/siy/the-saga-is-antipattern-1354#comment-34338" class="comment-date crayons-link crayons-link--secondary fs-s">
<time datetime="2026-01-30T08:00:17Z" class=date-no-year>
Jan 30
</time>
</a>
<div class="comment__dropdown" data-tracking-name="comment_dropdown">
<button id="comment-dropdown-trigger-1443346" aria-controls="comment-dropdown-1443346" aria-expanded="false"
class="dropbtn comment__dropdown-trigger crayons-btn crayons-btn--s crayons-btn--ghost crayons-btn--icon "
aria-label="Toggle dropdown menu" aria-haspopup="true">
<svg xmlns="http://www.w3.org/2000/svg" width="24" height="24" viewBox="0 0 24 24" role="img" aria-labelledby="ajhmli4c2639pqoamuhhckt6jj8k5q28" class="crayons-icon pointer-events-none"><title id="ajhmli4c2639pqoamuhhckt6jj8k5q28">Dropdown menu</title>
<path fill-rule="evenodd" clip-rule="evenodd" d="M8.25 12a1.5 1.5 0 11-3 0 1.5 1.5 0 013 0zm5.25 0a1.5 1.5 0 11-3 0 1.5 1.5 0 013 0zm3.75 1.5a1.5 1.5 0 100-3 1.5 1.5 0 000 3z"></path>
</svg>
</button>
<div id="comment-dropdown-1443346" class="crayons-dropdown right-1 s:right-0 s:left-auto fs-base dropdown">
<ul class="m-0">
<li><a href="https://dev.to/siy/the-saga-is-antipattern-1354#comment-34338" class="crayons-link crayons-link--block permalink-copybtn" aria-label="Copy link to Sergiy Yevtushenko&#39;s comment" data-no-instant>Copy link</a></li>
<li class="comment-actions hidden" data-user-id="145374" data-action="settings-button" data-path="https://dev.to/siy/comment/34338/settings" aria-label="Go to Sergiy Yevtushenko&#39;s comment settings"></li>
<li class="comment-actions hidden" data-action="hide-button" data-commentable-user-id="145374" data-user-id="145374">
<button
class="flex justify-between crayons-link crayons-link--block w-100 bg-transparent border-0 hide-comment"
data-hide-type="hide"
data-comment-id="1443346"
data-comment-url="https://dev.to/siy/comment/34338"
aria-label="Hide Sergiy Yevtushenko&#39;s comment">
Hide
</button>
</li>
<li class="mod-actions hidden mod-actions-comment-button" data-path="https://dev.to/siy/comment/34338/mod" aria-label="Moderate Sergiy Yevtushenko&#39;s comment"></li>
<li class="report-abuse-link-wrapper" data-path="/report-abuse?url=https://dev.to/siy/comment/34338" aria-label="Report Sergiy Yevtushenko&#39;s comment as abusive or violating our code of conduct and/or terms and conditions"></li>
<li class="current-user-actions"></li>
</ul>
</div>
</div>
</div>
<div
class="
comment__body
text-styles
text-styles--secondary
body
">
<p>Things may change soon: <a href="https://dev.to/siy/fail-safe-your-legacy-java-in-one-sprint-d2b" rel="nofollow">dev.to/siy/fail-safe-your-legacy-j...</a></p>
</div>
</div>
<script>
</script>
<footer class="comment__footer print-hidden">
<button
class="crayons-tooltip__activator relative crayons-btn crayons-btn--ghost crayons-btn--icon-left crayons-btn--s mr-1 reaction-like inline-flex reaction-button"
id="button-for-comment-1443346"
data-comment-id="1443346"
aria-label="like"
data-tracking-name="comment_heart_button">
<svg xmlns="http://www.w3.org/2000/svg" width="24" height="24" role="img" aria-labelledby="a3d0jkvqrttf1tme5l0tb85xc3rg5o83" class="crayons-icon reaction-icon not-reacted"><title id="a3d0jkvqrttf1tme5l0tb85xc3rg5o83">Like comment: </title><path d="M18.884 12.595l.01.011L12 19.5l-6.894-6.894.01-.01A4.875 4.875 0 0112 5.73a4.875 4.875 0 016.884 6.865zM6.431 7.037a3.375 3.375 0 000 4.773L12 17.38l5.569-5.569a3.375 3.375 0 10-4.773-4.773L9.613 10.22l-1.06-1.062 2.371-2.372a3.375 3.375 0 00-4.492.25v.001z"></path></svg>
<svg xmlns="http://www.w3.org/2000/svg" width="24" height="24" viewBox="0 0 24 24" role="img" aria-labelledby="aqmo6af8r2u6oy34qlza3fsy0fdy5aoq" class="crayons-icon crayons-icon reaction-icon--like reaction-icon reacted"><title id="aqmo6af8r2u6oy34qlza3fsy0fdy5aoq">Like comment: </title>
<path d="M5.116 12.595a4.875 4.875 0 015.56-7.68h-.002L7.493 8.098l1.06 1.061 3.181-3.182a4.875 4.875 0 016.895 6.894L12 19.5l-6.894-6.894.01-.01z"></path>
</svg>
<span class="reactions-count">1</span><span class="reactions-label hidden m:inline-block">&nbsp;like</span>
<span data-testid="tooltip" class="crayons-tooltip__content">
Like
</span>
</button>
<span class="favorite-control-root" data-favorite-control="true" data-variant="comment" data-favoritable-type="Comment" data-favoritable-id="1443346" data-favoritable-user-id="145374" data-favorited="false" data-label-favorite="Pick as gem" data-label-favorited="Picked as gem" data-label-favorited-by-you="Picked as gem by you" data-modal-title="Gem Picked!" data-modal-body="You&#39;ve picked this as a community gem!" data-modal-remaining-zero="You have no more gems left to give out today." data-modal-remaining-one="You have 1 more gem left to give out today." data-modal-remaining-other="You have %{count} more gems left to give out today." data-modal-remaining-unlimited="You have unlimited gems to give out." data-modal-close="Got it" data-modal-exhausted-title="Out of Gems" data-modal-exhausted-body="You have no more gems left to give out today. Your allowance will refresh soon!" data-modal-exhausted-close="Got it"></span>
<button
class="actions crayons-btn crayons-btn--ghost crayons-btn--s crayons-btn--icon-left toggle-reply-form mr-1 inline-flex"
data-comment-id="1443346"
data-path="/siy/the-saga-is-antipattern-1354/comments/34338"
data-tracking-name="comment_reply_button"
data-testid="reply-button-1443346"
rel="nofollow">
<svg xmlns="http://www.w3.org/2000/svg" width="24" height="24" role="img" aria-labelledby="ae5f763uiww8lzbohm66bfrgoi41tl06" class="crayons-icon reaction-icon not-reacted"><title id="ae5f763uiww8lzbohm66bfrgoi41tl06">Comment button</title><path d="M10.5 5h3a6 6 0 110 12v2.625c-3.75-1.5-9-3.75-9-8.625a6 6 0 016-6zM12 15.5h1.5a4.501 4.501 0 001.722-8.657A4.5 4.5 0 0013.5 6.5h-3A4.5 4.5 0 006 11c0 2.707 1.846 4.475 6 6.36V15.5z"></path></svg>
<span class="hidden m:inline-block">Reply</span>
</button>
</footer>
</div>
</div>
</div>
</details>
</div>
</details>
</div>
</div>
<div class="align-center">
<div class="mb-4">
<a class="crayons-btn crayons-btn--secondary w-100" href="/siy/the-saga-is-antipattern-1354/comments">
View full discussion (19 comments)
</a>
</div>
<p class="fs-s color-base-60 mb-4">
Some comments may only be visible to logged-in visitors. <a href="/enter">Sign in</a> to view all comments.
</p>
<nav class="fs-s align-center block" aria-label="Conduct controls">
<a href="/code-of-conduct" class="crayons-link crayons-link--secondary">Code of Conduct</a>
<span class="opacity-25 px-2" role="presentation">&bull;</span>
<a href="/report-abuse" class="crayons-link crayons-link--secondary">Report abuse</a>
</nav>
</div>
</section>
<div id="hide-comments-modal" class="hidden">
<form id="hide-comments-modal__form" class="hide-comments-modal__form" data-type="json" action="/comments/hide" accept-charset="UTF-8" data-remote="true" method="post"><input type="hidden" name="_method" value="patch" autocomplete="off" /><input type="hidden" name="authenticity_token" value="Uq4lhFjRhuXBs6cQs_dXCXaXl925drnVJHagawTeX1EBygHpnK17KDwk7yKC1c20gRFvv94GeKDDQ1UVccerEQ" autocomplete="off" />
<div class="hide-comments-modal__content">
<p class="pb-2">
Are you sure you want to hide this comment? It will become hidden in your post, but will still be visible via the comment's <a id="hide-comments-modal__comment-permalink" href="#">permalink</a>.
</p>
<label class="crayons-field crayons-field--checkbox my-2">
<input name="hide_children" type="hidden" value="0" autocomplete="off" /><input class="hide_children crayons-checkbox" type="checkbox" value="1" name="hide_children" id="hide_children" />
<p class="crayons-field__label">Hide child comments as well</p>
</label>
<p class="pb-4 pt-2">
<button type="submit" class="crayons-btn">
Confirm
</button>
</p>
</div>
</form> <p class="fs-s color-base-60">For further actions, you may consider blocking this person and/or <a id="hide-comments-modal__report-link" href="/report-abuse">reporting abuse</a></p>
</div>
</article>
<div class="pb-4 crayons-layout__comments-billboard">
<div class="new-bb-container pb-4 crayons-layout__comments-billboard" data-async-url="/siy/the-saga-is-antipattern-1354/bmar11/post_comments"></div>
</div>
<!-- Bottom content skipped via SKIP_BOTTOM_CONTENT config -->
</div>
</main>
<aside class="crayons-layout__sidebar-right" aria-label="Author details">
<div class="crayons-article-sticky grid gap-4 pb-4 break-word" id="article-show-primary-sticky-nav">
<div class="crayons-card crayons-card--secondary branded-7 p-4 pt-0 gap-4 grid" style="border-top-color: #a198bb;">
<div class="-mt-4">
<a href="/siy" class="flex">
<span class="crayons-avatar crayons-avatar--xl mr-2 shrink-0">
<img src="https://media2.dev.to/dynamic/image/width=90,height=90,fit=cover,gravity=auto,format=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Fuser%2Fprofile_image%2F145374%2F6e93547b-45cc-430e-9659-3adea03266b5.jpeg" class="crayons-avatar__image" alt="" loading="lazy" />
</span>
<span class="crayons-link crayons-subtitle-2 mt-5">
Sergiy Yevtushenko
</span>
</a>
</div>
<div class="print-hidden">
<button name="button" type="button" data-info="{&quot;className&quot;:&quot;User&quot;,&quot;style&quot;:&quot;&quot;,&quot;id&quot;:145374,&quot;name&quot;:&quot;Sergiy Yevtushenko&quot;}" class="crayons-btn follow-action-button whitespace-nowrap w-100 follow-user" aria-label="Follow user: Sergiy Yevtushenko" aria-pressed="false">Follow</button>
</div>
<div class="color-base-70">
Writing code for 35+ years and still enjoy it...
</div>
<div class="user-metadata-details">
<ul class="user-metadata-details-inner">
<li>
<div class="key">
Location
</div>
<div class="value">
Krakow, Poland
</div>
</li>
<li>
<div class="key">
Work
</div>
<div class="value">
Senior Software Engineer
</div>
</li>
<li>
<div class="key">
Joined
</div>
<div class="value">
<time datetime="2019-03-14T05:28:55Z" class="date">Mar 14, 2019</time>
</div>
</li>
</ul>
</div>
</div>
<div class="crayons-card crayons-card--secondary">
<header class="crayons-card__header">
<h3 class="crayons-subtitle-2">
More from <a href="/siy">Sergiy Yevtushenko</a>
</h3>
</header>
<div>
<a class="crayons-link crayons-link--contentful" href="/siy/no-framework-no-pain-writing-aether-slices-4mi6">
No Framework, No Pain: Writing Aether Slices
<div class="crayons-link__secondary -ml-1">
<span class="mr-1"><span class="opacity-50">#</span>java</span>
<span class="mr-1"><span class="opacity-50">#</span>microservices</span>
<span class="mr-1"><span class="opacity-50">#</span>architecture</span>
<span class="mr-1"><span class="opacity-50">#</span>backend</span>
</div>
</a>
<a class="crayons-link crayons-link--contentful" href="/siy/slices-the-right-size-for-microservices-c4">
Slices: The Right Size for Microservices
<div class="crayons-link__secondary -ml-1">
<span class="mr-1"><span class="opacity-50">#</span>java</span>
<span class="mr-1"><span class="opacity-50">#</span>microservices</span>
<span class="mr-1"><span class="opacity-50">#</span>architecture</span>
<span class="mr-1"><span class="opacity-50">#</span>backend</span>
</div>
</a>
<a class="crayons-link crayons-link--contentful" href="/siy/sober-look-at-microservices-574h">
Sober Look at Microservices
<div class="crayons-link__secondary -ml-1">
<span class="mr-1"><span class="opacity-50">#</span>beginners</span>
<span class="mr-1"><span class="opacity-50">#</span>architecture</span>
<span class="mr-1"><span class="opacity-50">#</span>microservices</span>
</div>
</a>
</div>
</div>
</div>
<div class="crayons-article-sticky grid gap-4 break-word sidebar-bb" data-async-url="/siy/the-saga-is-antipattern-1354/bmar11/post_sidebar"></div>
</aside>
</div>
<div class="mod-actions-menu print-hidden"></div>
<div data-testid="unpublish-post-modal-container" class="unpublish-post-modal-container hidden"></div>
<div class="fullscreen-code js-fullscreen-code"></div>
<script src="https://assets.dev.to/assets/billboard-1b75959755e3f87ef58c28efef9eab9853df3b84cf27a937749b2c3449fd450d.js" defer="defer"></script>
<script src="https://assets.dev.to/assets/localizeArticleDates-ddf0f7415ce8497325dd1b64bc1e022762d4d14aec7f538e6988744eeaa9a501.js" defer="defer"></script>
<script src="https://assets.dev.to/assets/articleReactions-03b03e63c7319a6caa1788ca81e7b25dff9fe90b38ca051b8b979a773b011e3b.js" defer="defer"></script>
<script src="https://assets.dev.to/assets/favoriteControls-882b1c32df621133f9c47da91e59df01e50d77cb6cd48a6611a285ce9036acc6.js" defer="defer"></script>
<script>
</script>
<div class="js-billboard-container pb-4 crayons-layout__comments-billboard" data-async-url="/siy/the-saga-is-antipattern-1354/bmar11/post_fixed_bottom"></div>
<div id="runtime-banner-container"></div>
<div id="i18n-translations" data-translations="{&quot;en&quot;:{&quot;core&quot;:{&quot;add_comment&quot;:&quot;Add comment&quot;,&quot;beta&quot;:&quot;beta&quot;,&quot;comment&quot;:&quot;Comment&quot;,&quot;copy_link&quot;:&quot;Copy link&quot;,&quot;edit_profile&quot;:&quot;Edit profile&quot;,&quot;follow&quot;:&quot;Follow&quot;,&quot;follow_back&quot;:&quot;Follow back&quot;,&quot;following&quot;:&quot;Following&quot;,&quot;like&quot;:&quot;Like&quot;,&quot;loading&quot;:&quot;loading...&quot;,&quot;reaction&quot;:&quot;Reaction&quot;,&quot;report_abuse&quot;:&quot;Report abuse&quot;,&quot;search&quot;:&quot;Search&quot;,&quot;success_settings&quot;:&quot;Successfully updated settings.&quot;,&quot;search_placeholder&quot;:&quot;Search...&quot;,&quot;search_find_related_posts&quot;:&quot;Find related posts...&quot;,&quot;search_powered_by&quot;:&quot;Powered by Algolia&quot;,&quot;search_submit_search&quot;:&quot;Submit search for advanced filtering.&quot;,&quot;search_displaying_recommendations&quot;:&quot;Displaying Algolia Recommendations — Start typing to search&quot;,&quot;article_form_save_changes&quot;:&quot;Save changes&quot;,&quot;article_form_schedule&quot;:&quot;Schedule&quot;,&quot;article_form_publish&quot;:&quot;Publish&quot;,&quot;article_form_loading_preview&quot;:&quot;Loading preview&quot;,&quot;article_form_preview_loaded&quot;:&quot;Preview loaded&quot;,&quot;article_form_co_authors&quot;:&quot;Co-authors&quot;,&quot;article_form_co_authors_description&quot;:&quot;Add up to 4 co-authors from %{org_name}.&quot;,&quot;article_form_co_authors_placeholder&quot;:&quot;Add up to 4...&quot;,&quot;comments_preview&quot;:&quot;Preview&quot;,&quot;comments_continue_editing&quot;:&quot;Continue editing&quot;,&quot;survey_enter_response&quot;:&quot;Enter your response here...&quot;,&quot;survey_thank_you_response&quot;:&quot;Thank you for your response.&quot;,&quot;survey_thank_you_completing&quot;:&quot;Thank you for completing the survey!&quot;,&quot;dashboard_analytics_readers&quot;:&quot;Readers&quot;,&quot;dashboard_analytics_avg_read_time&quot;:&quot;avg. read time %{seconds}s&quot;,&quot;dashboard_analytics_comments&quot;:&quot;Comments&quot;,&quot;dashboard_analytics_reactions&quot;:&quot;Reactions&quot;,&quot;dashboard_analytics_unique_reactors&quot;:&quot;from %{count} unique users&quot;,&quot;dashboard_analytics_bookmarks&quot;:&quot;Bookmarks&quot;,&quot;dashboard_analytics_followers&quot;:&quot;New Followers&quot;,&quot;top_contributors_empty&quot;:&quot;No engagers found for this period.&quot;,&quot;top_contributors_reactions&quot;:&quot;reactions&quot;,&quot;top_contributors_comments&quot;:&quot;comments&quot;,&quot;top_contributors_weight_note&quot;:&quot;Comments carry more weight&quot;,&quot;follower_engagement_ratio&quot;:&quot;%{ratio}% of followers engaged&quot;,&quot;follower_engagement_detail&quot;:&quot;(%{engaged} of %{total})&quot;,&quot;dashboard_analytics_no_data&quot;:&quot;No data available for this period&quot;,&quot;dashboard_analytics_no_referrers&quot;:&quot;No traffic sources yet&quot;,&quot;stats_by&quot;:&quot;by&quot;,&quot;editor_new_title&quot;:&quot;New post title here...&quot;,&quot;editor_body_placeholder&quot;:&quot;Write your post content here...&quot;,&quot;tags_field_label&quot;:&quot;Add up to 4 tags&quot;,&quot;tags_field_placeholder&quot;:&quot;Add up to 4 tags...&quot;,&quot;counted_organization&quot;:{&quot;one&quot;:&quot;%{count} organization&quot;,&quot;other&quot;:&quot;%{count} organizations&quot;},&quot;counted_user&quot;:{&quot;one&quot;:&quot;%{count} person&quot;,&quot;other&quot;:&quot;%{count} people&quot;},&quot;not_following&quot;:&quot;You&#39;re not following anyone&quot;,&quot;following_everyone&quot;:&quot;You&#39;re following %{details} (everyone)&quot;,&quot;you_are_following&quot;:&quot;You&#39;re following&quot;,&quot;and&quot;:&quot;and&quot;}}}"></div>
</div>
</div>
<footer id="footer" class="crayons-footer print-hidden">
<div id="footer-container" class="crayons-footer__container">
<p class="fs-s crayons-footer__description">
<a class="c-link c-link--branded fw-medium" aria-label="DEV Community Home" href="/">DEV Community</a> — A space to discuss and keep up software development and manage your software career
</p>
<ul class="footer__nav-links flex gap-2 justify-center flex-wrap fs-s p-0" style="" />
<li class="footer__nav-link flex items-center">
<a href="/">
Home
</a>
<span class="dot ml-2"></span>
</li>
<li class="footer__nav-link flex items-center">
<a href="/challenges">
DEV Challenges
</a>
<span class="dot ml-2"></span>
</li>
<li class="footer__nav-link flex items-center">
<a href="/++">
DEV++
</a>
<span class="dot ml-2"></span>
</li>
<li class="footer__nav-link flex items-center">
<a href="/videos">
Videos
</a>
<span class="dot ml-2"></span>
</li>
<li class="footer__nav-link flex items-center">
<a href="/deved">
DEV Education Tracks
</a>
<span class="dot ml-2"></span>
</li>
<li class="footer__nav-link flex items-center">
<a href="/help">
DEV Help
</a>
<span class="dot ml-2"></span>
</li>
<li class="footer__nav-link flex items-center">
<a href="/advertise">
Advertise on DEV
</a>
<span class="dot ml-2"></span>
</li>
<li class="footer__nav-link flex items-center">
<a href="/organizations">
Organization Accounts
</a>
<span class="dot ml-2"></span>
</li>
<li class="footer__nav-link flex items-center">
<a href="/showcase">
DEV Showcase
</a>
<span class="dot ml-2"></span>
</li>
<li class="footer__nav-link flex items-center">
<a href="/about">
About
</a>
<span class="dot ml-2"></span>
</li>
<li class="footer__nav-link flex items-center">
<a href="/contact">
Contact
</a>
<span class="dot ml-2"></span>
</li>
<li class="footer__nav-link flex items-center">
<a href="/free-postgres-database-tier">
Free Postgres Database
</a>
<span class="dot ml-2"></span>
</li>
<li class="footer__nav-link flex items-center">
<a href="https://shop.forem.com/">
DEV Shop
</a>
<span class="dot ml-2"></span>
</li>
<li class="footer__nav-link flex items-center">
<a href="https://mlh.io/">
MLH
</a>
<span class="dot ml-2"></span>
</li>
</ul>
<ul class="footer__nav-links flex gap-2 justify-center flex-wrap fs-s p-0" style="" />
<li class="footer__nav-link flex items-center">
<a href="/code-of-conduct">
Code of Conduct
</a>
<span class="dot ml-2"></span>
</li>
<li class="footer__nav-link flex items-center">
<a href="/privacy">
Privacy Policy
</a>
<span class="dot ml-2"></span>
</li>
<li class="footer__nav-link flex items-center">
<a href="/terms">
Terms of Use
</a>
<span class="dot ml-2"></span>
</li>
</ul>
<div class="fs-s">
<p>Built on <a class="c-link c-link--branded" target="_blank" rel="noopener" href="https://www.forem.com">Forem</a> — the <a target="_blank" rel="noopener" class="c-link c-link--branded" href="https://dev.to/t/opensource">open source</a> software that powers <a target="_blank" rel="noopener" class="c-link c-link--branded" href="https://dev.to">DEV</a> and other inclusive communities.</p>
<p>Made with love and <a target="_blank" rel="noopener" class="c-link c-link--branded" href="https://dev.to/t/rails">Ruby on Rails</a>. DEV Community <span title="copyright">&copy;</span> 2016 - 2026.</p>
</div>
</div>
</footer>
<div id="snack-zone"></div>
<div id="global-signup-modal" class="authentication-modal hidden">
<div class="authentication-modal__container">
<figure class="authentication-modal__image-container">
<img class="authentication-modal__image" src="https://media2.dev.to/dynamic/image/width=190,height=,fit=scale-down,gravity=auto,format=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F8j7kvp660rqzt99zui8e.png"
alt="DEV Community" loading="lazy" />
</figure>
<div class="authentication-modal__content">
<p class="authentication-modal__description">
We&#39;re a place where coders share, stay up-to-date and grow their careers.
</p>
</div>
<div class="authentication-modal__actions">
<a href="https://dev.to/enter?signup_subforem=1" class="crayons-btn" aria-label="Log in" data-no-instant>
Log in
</a>
<a href="https://dev.to/enter?signup_subforem=1&amp;state=new-user" class="crayons-btn crayons-btn--ghost-brand js-global-signup-modal__create-account" aria-label="Create new account" data-no-instant>
Create account
</a>
</div>
</div>
</div>
<script src="https://assets.dev.to/assets/signupModalShortcuts-0b25469b985100a01e94cbd7fccaf7f0a4d776e129aac65c766aa32cb28ab29a.js" defer="defer"></script>
<div id="cookie-consent"></div>
<div id="reaction-category-resources" class="hidden" aria-hidden="true">
<img data-name="Like" data-slug="like" data-position="1" src="https://assets.dev.to/assets/sparkle-heart-5f9bee3767e18deb1bb725290cb151c25234768a0e9a2bd39370c382d02920cf.svg" width="18" height="18" />
<img data-name="Unicorn" data-slug="unicorn" data-position="2" src="https://assets.dev.to/assets/multi-unicorn-b44d6f8c23cdd00964192bedc38af3e82463978aa611b4365bd33a0f1f4f3e97.svg" width="18" height="18" />
<img data-name="Exploding Head" data-slug="exploding_head" data-position="3" src="https://assets.dev.to/assets/exploding-head-daceb38d627e6ae9b730f36a1e390fca556a4289d5a41abb2c35068ad3e2c4b5.svg" width="18" height="18" />
<img data-name="Raised Hands" data-slug="raised_hands" data-position="4" src="https://assets.dev.to/assets/raised-hands-74b2099fd66a39f2d7eed9305ee0f4553df0eb7b4f11b01b6b1b499973048fe5.svg" width="18" height="18" />
<img data-name="Fire" data-slug="fire" data-position="5" src="https://assets.dev.to/assets/fire-f60e7a582391810302117f987b22a8ef04a2fe0df7e3258a5f49332df1cec71e.svg" width="18" height="18" />
</div>
<script>
var userSignedIn = false;
if (document.readyState === 'complete' || document.readyState === 'interactive') {
initAuth();
} else {
document.addEventListener('DOMContentLoaded', initAuth);
}
function initAuth() {
var paramToken = new URLSearchParams(window.location.search).get('jwt');
if (paramToken && !userSignedIn) {
authenticateUser(paramToken);
} else {
var iframe = document.createElement('iframe');
iframe.style.display = 'none';
iframe.src = 'https://forem.com/auth_pass/iframe?passed_domain=' + encodeURIComponent(window.location.origin || (window.location.protocol + '//' + window.location.host));
document.body.appendChild(iframe);
window.addEventListener('message', function(event) {
if (event.origin !== 'https://forem.com' && event.origin !== window.location.origin) {
return;
}
var data = event.data;
if (data.authenticated && !userSignedIn) {
authenticateUser(data.token);
} else if(data.authenticated && window.ReactNativeWebView && window.ReactNativeWebView.postMessage) {
window.ReactNativeWebView.postMessage(JSON.stringify({
action: 'login',
token: data.token,
}));
}
});
}
function authenticateUser(token) {
fetch('/auth_pass/token_login', {
method: 'POST',
credentials: 'include',
headers: {
'Content-Type': 'application/json',
'X-CSRF-Token': getMetaContent('csrf-token'),
},
body: JSON.stringify({ token: token }),
})
.then(function(response) {
return response.json();
})
.then(function(data) {
if (data.success) {
if (document.head.querySelector('meta[name="user-signed-in"][content="false"]')) {
// Reload the page to update the user's state
location.reload();
}
}
})
.catch(function(error) {
console.error('Error during authentication:', error);
});
}
function getMetaContent(name) {
var element = document.querySelector('meta[name="' + name + '"]');
return element ? element.getAttribute('content') : '';
}
}
</script>
</body>
</html>