<?xml version="1.0" encoding="utf-8" standalone="yes"?>
<rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom" xmlns:content="http://purl.org/rss/1.0/modules/content/">
  <channel>
    <title>Architecture on Elastocera</title>
    <link>https://elastocera.com/tags/architecture/</link>
    <description>Recent content in Architecture on Elastocera</description>
    <image>
      <title>Elastocera</title>
      <url>https://elastocera.com/images/forest-og.jpg</url>
      <link>https://elastocera.com/images/forest-og.jpg</link>
    </image>
    <generator>Hugo -- 0.157.0</generator>
    <language>en</language>
    <lastBuildDate>Mon, 23 Mar 2026 10:00:00 -0300</lastBuildDate>
    <atom:link href="https://elastocera.com/tags/architecture/index.xml" rel="self" type="application/rss+xml" />
    <item>
      <title>Cloud-Native, Same Old Fragility</title>
      <link>https://elastocera.com/posts/cloud-native-same-old-fragility/</link>
      <pubDate>Mon, 23 Mar 2026 10:00:00 -0300</pubDate>
      <guid>https://elastocera.com/posts/cloud-native-same-old-fragility/</guid>
      <description>Why modern distributed systems still fail in simple ways, and what we are no longer seeing.</description>
        <enclosure url="https://elastocera.com/images/spider-og.jpg" length="0" type="image/jpeg"/>
      <content:encoded><![CDATA[<blockquote>
<p>Modern systems are distributed.<br>
But fragility didn’t disappear.<br>
It just became harder to see.</p>
</blockquote>
<p>They run across <span class="tooltip-term" data-tooltip="Cluster: a group of nodes managed by a container orchestrator like Kubernetes. Region: a geographic deployment zone within a cloud provider. Provider: the cloud platform itself (AWS, Azure, GCP). Distribution across these layers increases availability in theory, but multiplies failure surfaces in practice."> clusters, regions, providers </span>.
They are <span class="tooltip-term" data-tooltip="Observable: instrumented with metrics, logs, and traces. Containerized: packaged in isolated runtime units (containers). Orchestrated: managed by platforms like Kubernetes that automate scheduling, scaling, and recovery. These properties are often mistaken for resilience, but they describe operational convenience, not fault tolerance."> observable, containerized, orchestrated </span>.</p>
<p>They look resilient.</p>
<p>And yet, they still fail in surprisingly simple ways.</p>
<p>Not because distribution failed.<br>
But because <strong>our understanding didn’t evolve with it</strong>.</p>
<h2 id="the-illusion-of-resilience">The Illusion of Resilience</h2>
<p>Cloud-native architectures are often assumed to be resilient by default.</p>
<p>They are not.</p>
<p>What we actually built are systems that:</p>
<ul>
<li>scale well</li>
<li>deploy fast</li>
<li>look observable</li>
</ul>
<p>But resilience is something else entirely.<br>
And we rarely design for it.</p>
<blockquote>
<p>A system is not resilient because it is distributed.
It is resilient because it can survive the loss of what it depends on (<a href="https://elastocera.com/field-notes/the-layer-illusion/" class="fn-ref" title="The Layer Illusion">FN-0013</a>).</p>
</blockquote>
<p>And most systems today cannot.</p>
<h2 id="the-happy-path-trap">The Happy Path Trap</h2>
<p>Most systems are designed around success.</p>
<p>Requests succeed.<br>
Dependencies respond.<br>
Flows complete.</p>
<p>Failure exists.<br>
But as an afterthought.</p>
<ul>
<li>generic retries</li>
<li>vague error handling</li>
<li>logs that assume context</li>
</ul>
<blockquote>
<p>If your system only knows how to succeed, failure becomes undefined behavior (<a href="https://elastocera.com/field-notes/the-first-incident-test/" class="fn-ref" title="The First Incident Test">FN-0015</a>).</p>
</blockquote>
<p>This is where fragility begins.</p>
<p>Not in infrastructure.<br>
In assumptions.</p>
<h2 id="the-illusion-of-testing">The Illusion of Testing</h2>
<p>Modern delivery pipelines create confidence.</p>
<p>But often, it is misplaced.</p>
<p>We test components in isolation.<br>
We mock dependencies.<br>
We simulate behavior, not reality.<br>
We validate expected outputs.</p>
<p>And then we assume the system will behave.</p>
<blockquote>
<p>Mocks don’t fail like real systems do (<a href="https://elastocera.com/field-notes/illusion-of-isolation/" class="fn-ref" title="The Illusion of Isolation">FN-0004</a>).</p>
</blockquote>
<p>Integration is where reality lives.<br>
And it is often the least tested part.</p>
<blockquote>
<p>Passing tests prove consistency, not correctness under stress.</p>
</blockquote>
<h2 id="hidden-spofs-in-plain-sight">Hidden SPOFs in Plain Sight</h2>
<p><span class="tooltip-term" data-tooltip="SPOF (Single Point of Failure): any component whose failure causes the entire system or a critical path to become unavailable. In cloud native architectures, SPOFs are often hidden behind layers of abstraction: shared DNS resolvers, centralized identity providers, or a single observability pipeline."> Single points of failure </span> did not disappear (<a href="https://elastocera.com/field-notes/hidden-spofs-platform-layers/" class="fn-ref" title="Hidden SPOFs in Platform Layers">FN-0002</a>).</p>
<p>They became harder to see.</p>
<h3 id="dns">DNS</h3>
<p>The most fundamental layer of the internet.</p>
<p>Still misconfigured.<br>
Still under-tested.<br>
Still capable of bringing entire systems down.</p>
<blockquote>
<p>The most critical systems are often the least questioned.</p>
</blockquote>
<h3 id="observability">Observability</h3>
<p>Dashboards are everywhere.</p>
<p>But visibility is not understanding.</p>
<p>When the observability stack fails (or lacks context), diagnosis becomes guesswork.</p>
<blockquote>
<p>A system is observable until it fails outside the path it was designed to show.</p>
</blockquote>
<h3 id="external-dependencies">External Dependencies</h3>
<p>Modern systems rely on external services:</p>
<ul>
<li><span class="tooltip-term" data-tooltip="Identity Provider (IdP): a service that authenticates users and issues tokens or credentials used by applications to authorize access. Examples include Active Directory, Okta, Keycloak, and cloud native IAM services. A failure in the IdP can lock users and services out of every system that depends on it."> identity providers </span></li>
<li><span class="tooltip-term" data-tooltip="CI/CD (Continuous Integration / Continuous Delivery): automated pipelines that build, test, and deploy software. When the CI/CD platform itself fails, teams lose the ability to ship fixes, including fixes for the incident that caused the CI/CD failure."> CI/CD platforms </span></li>
<li>third-party APIs</li>
</ul>
<p>Failures in these integrations are not just technical.</p>
<p>They are organizational.</p>
<blockquote>
<p>Failures in integrated systems don’t just break flows, they break ownership.</p>
</blockquote>
<p>No one knows who should fix the problem.<br>
So no one does it fast enough.</p>
<h2 id="cognitive-fragility">Cognitive Fragility</h2>
<p>As systems evolved, so did abstraction.</p>
<p>Platforms simplified complexity.<br>
Interfaces reduced <span class="tooltip-term" data-tooltip="Cognitive load: the mental effort required to understand and operate a system. In software engineering, high cognitive load means engineers must hold too many details in working memory to reason about system behavior. Abstractions reduce cognitive load by hiding complexity, but they also hide failure modes."> cognitive load </span>.</p>
<p>This is necessary.</p>
<p>But it also distances decision-making from reality.</p>
<p>And it comes with a cost.</p>
<blockquote>
<p>Abstractions reduce cognitive load, but they also hide the system (<a href="https://elastocera.com/field-notes/abstractions-simplify-usage-not-operation/" class="fn-ref" title="Abstractions Simplify Usage, Not Operation">FN-0006</a>).</p>
</blockquote>
<p>Over time, this creates <strong>cognitive blind spots</strong> (<a href="https://elastocera.com/field-notes/the-abstraction-tax/" class="fn-ref" title="The Abstraction Tax">FN-0010</a>):</p>
<ul>
<li>dependencies no one maps</li>
<li>behaviors no one understands</li>
<li>failure modes no one anticipates</li>
</ul>
<blockquote>
<p>You cannot reason about what you cannot see.</p>
</blockquote>
<p>And when the system fails:</p>
<blockquote>
<p>The system breaks, and the organization struggles to respond.</p>
</blockquote>
<h2 id="not-another-disaster-recovery-problem">Not Another Disaster Recovery Problem</h2>
<p>This is not primarily a recovery problem.</p>
<p>It is an understanding problem.<br>
And understanding does not scale by default.</p>
<p><span class="tooltip-term" data-tooltip="Disaster Recovery (D.R.): the set of policies, tools, and procedures designed to recover technology infrastructure after a disruptive event. D.R. strategies often assume that failures are well understood and isolated, an assumption that breaks down in distributed systems where causality is diffuse and dependencies are poorly mapped."> Disaster recovery strategies </span> often assume we know what failed.</p>
<p>In reality, we often don’t.</p>
<blockquote>
<p>You can’t recover from failures you don’t understand.</p>
</blockquote>
<p><em>For a deeper look into recovery strategies, see our previous notes on <a href="/posts/openshift-dr-strategies-fail-executive-level">disaster recovery</a>.</em></p>
<h2 id="closing">Closing</h2>
<p>We built distributed systems.<br>
But not distributed understanding.</p>
<p>And so, fragility remains.</p>
<p>Not where we used to look.<br>
But exactly where we stopped looking.</p>
<h2 id="fragility-map">Fragility Map</h2>

<div id="graph-elastocera-map" style="width:100%; height:600px; min-height:500px;"></div>

<script>
document.addEventListener("DOMContentLoaded", function () {

  const raw = `\n[\n  \u007b \u0022data\u0022: \u007b \u0022id\u0022: \u0022wild\u0022, \u0022label\u0022: \u0022Systems in the Wild\u0022, \u0022type\u0022: \u0022concept\u0022, \u0022url\u0022: \u0022\/series\/systems-in-the-wild\u0022, \u0022clickable\u0022: true \u007d\u007d,\n  \u007b \u0022data\u0022: \u007b \u0022id\u0022: \u0022dc\u0022, \u0022label\u0022: \u0022Distributed Cognition\u0022, \u0022type\u0022: \u0022concept\u0022 \u007d\u007d,\n  \u007b \u0022data\u0022: \u007b \u0022id\u0022: \u0022patterns\u0022, \u0022label\u0022: \u0022Patterns\u0022, \u0022type\u0022: \u0022pattern\u0022 \u007d\u007d,\n  \u007b \u0022data\u0022: \u007b \u0022id\u0022: \u0022notes\u0022, \u0022label\u0022: \u0022Architecture Notes\u0022, \u0022type\u0022: \u0022note\u0022 \u007d\u007d,\n\n  \u007b \u0022data\u0022: \u007b \u0022source\u0022: \u0022wild\u0022, \u0022target\u0022: \u0022dc\u0022 \u007d\u007d,\n  \u007b \u0022data\u0022: \u007b \u0022source\u0022: \u0022dc\u0022, \u0022target\u0022: \u0022patterns\u0022 \u007d\u007d,\n  \u007b \u0022data\u0022: \u007b \u0022source\u0022: \u0022patterns\u0022, \u0022target\u0022: \u0022notes\u0022 \u007d\u007d\n]`;

  let elements;
  try {
    elements = JSON.parse(raw);
  } catch (e) {
    console.error("Erro ao parsear graph:", e);
    return;
  }

  const cy = cytoscape({
    container: document.getElementById("graph-elastocera-map"),

    elements: elements,

    userZoomingEnabled: false,

    style: [
    {
        selector: 'node',
        style: {
        'label': 'data(label)',
        'color': '#fff',
        'text-valign': 'center',
        'text-halign': 'center',
        'font-size': '14px',
        'text-outline-width': 2,
        'text-outline-color': '#111',
        'background-color': '#666',
        }
    },
    {
        selector: 'node[type="reality"]',
        style: { 'background-color': '#1f77b4' }
    },
    {
        selector: 'node[type="cognition"]',
        style: { 'background-color': '#17becf' }
    },
    {
        selector: 'node[type="pattern"]',
        style: { 'background-color': '#2ca02c' }
    },
    {
        selector: 'node[type="note"]',
        style: { 'background-color': '#d62728' }
    },
    {
        selector: 'node[type="concept"]',
        style: { 'background-color': '#9467bd' }
    },
    {
        selector: 'edge',
        style: {
        'line-color': '#888',
        'width': 2,
        'curve-style': 'bezier'
        }
    },
    {
      selector: 'node.hovered',
      style: {
        'border-width': 4,
        'border-color': '#ffffff'
      }
    },
    {
      selector: 'node[?url]',
      style: {
        'border-width': 2,
        'border-color': '#ffffff',
        'border-opacity': 0.4
      }
    },
    {
      selector: 'node.hovered-clickable',
      style: {
        'border-width': 4,
        'border-color': '#ffffff',

        'shadow-blur': 30,
        'shadow-color': '#ffffff',
        'shadow-opacity': 1,

        'cursor': 'pointer'
      }
    }    
    ],

    layout: {
    name: 'cose',
    animate: false,
    padding: 20,
    fit: true
    }
  });

  function startPulse(node) {
    if (!node.data('url')) return;

    node.animate({
      style: { 'border-opacity': 1 }
      
    }, {
      duration: 800
    }).animate({
      style: { 'border-opacity': 0.5 }
    }, {
      duration: 800,
      complete: function() { startPulse(node); }
    });
  }

  cy.on('tap', 'node', function(evt) {
    const url = evt.target.data('url');
    if (url && url.startsWith('/')) {
      window.location.href = url;
    }
  });

  cy.on('mouseover', 'node', function(evt) {
    const node = evt.target;
    node.stop();
    node.addClass('hovered');

    if (node.data('url')) {
      node.addClass('hovered-clickable');
      cy.container().style.cursor = 'pointer';
    }

    node.animate({
      position: { x: node.position('x'), y: node.position('y') - 6 }
    }, { duration: 120 });
  });

  cy.on('mouseout', 'node', function(evt) {
    const node = evt.target;
    node.stop();
    node.removeClass('hovered');
    node.removeClass('hovered-clickable');
    cy.container().style.cursor = 'default';

    node.animate({
      position: { x: node.position('x'), y: node.position('y') + 6 }
    }, { 
      duration: 120,
      complete: function() {
        startPulse(node);
      }
    });
  });

  cy.ready(function() {
    cy.nodes('[url]').forEach(n => {
      startPulse(n);
    });
  });
});
</script>

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