惯性聚合 高效追踪和阅读你感兴趣的博客、新闻、科技资讯
阅读原文 在惯性聚合中打开

推荐订阅源

D
Docker
爱范儿
爱范儿
人人都是产品经理
人人都是产品经理
博客园 - 司徒正美
cs.AI updates on arXiv.org
cs.AI updates on arXiv.org
量子位
罗磊的独立博客
cs.CL updates on arXiv.org
cs.CL updates on arXiv.org
小众软件
小众软件
C
Cybersecurity and Infrastructure Security Agency CISA
Cyberwarzone
Cyberwarzone
大猫的无限游戏
大猫的无限游戏
Threat Intelligence Blog | Flashpoint
Threat Intelligence Blog | Flashpoint
雷峰网
雷峰网
Simon Willison's Weblog
Simon Willison's Weblog
The Cloudflare Blog
博客园 - 三生石上(FineUI控件)
D
Darknet – Hacking Tools, Hacker News & Cyber Security
C
Cyber Attacks, Cyber Crime and Cyber Security
博客园_首页
博客园 - 叶小钗
V
Vulnerabilities – Threatpost
T
The Exploit Database - CXSecurity.com
T
Tailwind CSS Blog
IT之家
IT之家
博客园 - 聂微东
Spread Privacy
Spread Privacy
V2EX - 技术
V2EX - 技术
S
Security Affairs
宝玉的分享
宝玉的分享
V
V2EX
C
Cisco Blogs
博客园 - Franky
美团技术团队
酷 壳 – CoolShell
酷 壳 – CoolShell
月光博客
月光博客
S
Securelist
J
Java Code Geeks
Webroot Blog
Webroot Blog
让小产品的独立变现更简单 - ezindie.com
让小产品的独立变现更简单 - ezindie.com
P
Proofpoint News Feed
Last Week in AI
Last Week in AI
L
LINUX DO - 热门话题
NISL@THU
NISL@THU
WordPress大学
WordPress大学
W
WeLiveSecurity
T
Threatpost
freeCodeCamp Programming Tutorials: Python, JavaScript, Git & More
腾讯CDC
阮一峰的网络日志
阮一峰的网络日志

DEV Community

Authentication Security Deep Dive: From Brute Force to Salted Hashing (With Java Examples) Why AI Systems Don’t Fail — They Drift Spilling beans for how i learn for exam😁"Reinforcement Learning Cheat Sheet" I Replaced Chrome with Safari for AI Browser Automation. Here's What Broke (and What Finally Worked) How Python Borrows Other People's Work The $40 Architecture: Processing 1 Billion API Requests with 99.99% Uptime Vibe Coding: A Workflow Guide (From Zero to SaaS) Most webhook security guides protect the wrong side. The scary part is delivery. Headless CMS for TanStack Start: Build a Blog with Cosmic EU Age Verification App "Hacked in 2 Minutes" — What Actually Happened Comfy Cloud’s delete function does not actually remove files Running AI Models on GPU Cloud Servers: A Beginner Guide Event-driven media intelligence with AWS Step Functions and Bedrock I scored 500 AI prompts across 8 quality dimensions — here's what broke How to Call Google Gemini API from Next.js (Free Tier, No Backend Needed) The Portal Protocol: Reclaiming Human Connection in the Age of AI How to Fix Your Team's Scattered Knowledge Problem With a Self-Hosted Forum Intro to tc Cloud Functors: A Graph-First Mental Model for the Modern Cloud Designing Multi-Tenant Backends With Both Ownership and Team Access I Built a Neumorphic CSS Library with 77+ Components — Here's What I Learned PostgreSQL Performance Optimization: Why Connection Pooling Is Critical at Scale Cómo construí un SaaS multi-rubro para gestionar expensas en Argentina con FastAPI + Vue 3 🚀 I Built an Ethical Hacking Scanner Tool – Open Source Project I Replaced /usage and /context in Claude Code With a Single Statusline A Pythonic Way to Handle Emails (IMAP/SMTP) with Auto-Discovery and AI-Ready Design I Collected 8.9 Million Polymarket Price Points — Here's What I Found About How Markets Really Move EcoTrack AI — Carbon Footprint Tracker & Dashboard Everyone's Using AI. No One Agrees How. 5 self-hosted ebook managers worth trying in 2026 Building Your First AI Agent with LangChain: From Chatbot to Autonomous Assistant Common SOC 2 Failures (Real World) Stop Vibe-Checking Your AI App: A Practical Guide to Evals How to Use SonarQube and SonarScanner Locally to Level Up Your Code Quality Your Next To-Do App Is Dead — I Replaced Mine with an OpenClaw AI Sign a Nostr event in 60 lines of Python using coincurve — no nostr-sdk, no nbxplorer, no rust toolchain ITGC Audit Explained Like You’re in Big 4 Patch Tuesday abril 2026: Microsoft parcha 163 vulnerabilidades y un zero-day en SharePoint Stop scraping everything: a better way to track competitor price changes Listing on MCPize + the Official MCP Registry while routing payments OUTSIDE the marketplace — how I kept 100% of my x402 revenue Building an AI-Powered Risk Intelligence System Using Serverless Architecture Why We Ripped Function Overloading Out of Our AI Toolchain Testing AI-Generated Code: How to Actually Know If It Works SaaS Churn Is Killing Your Business. Here Is What to Do About It (Without a Support Team) The Speed of AI Is No Longer Linear - And Self-Improving Models Are Why How to Implement RBAC for MCP Tools: A Practical Guide for Engineering Teams From Standard Quote to Persuasive Proposal: AI Automation for Arborists I built a CLI that scaffolds complete multi-tenant SaaS apps Axios CVE-2025–62718: The Silent SSRF Bug That Could Be Hiding in Your Node.js App Right Now The dashboard that ended our friendship Data Pipelines Explained Simply (and How to Build Them with Python) The Hidden Cost of AI Systems Nobody Talks About. undefined vs undeclared, and how typeof behaves Switching from file-based jobs to NATS/Kafka in Rust without changing code io_uring Adventures: Rust Servers That Love Syscalls Why Agentic AI is Killing the Traditional Database The POUR principles of web accessibility for developers and designers Quantum Neural Network 3D — A Deep Dive into Interactive WebGL Visualization How To Install Caveman In Codex On macOS And Windows Automation Pipeline Reliability: Why Your Workflow Breaks When Nobody Is Watching I Built an 'Open World' AI Coding Agent — It Works From ANY Folder From Freelancing to Product: A Tech Service Company's SaaS Transformation China's AI Giants: Adding Tencent Hunyuan & ByteDance Doubao to AI University (74 Providers) On the Vibe Coders and Their Lies clerk: Auto-Summarize Your Claude Code Sessions AI Weekly — 2026/04/10–04/17 | The Model Lockdown Is Here, but the Toolchain Is the Real Battleground AI 週報 — 2026/04/10–2026/04/17 模型封鎖潮來了,但工具鏈才是真戰場 Maybe this is how Open-Source apps are born... 🚀 Fine-Tune LLMs with LoRA and QLoRA: 2026 Guide tRPC v11 + Next.js App Router: End-to-End Type Safety Without the Boilerplate ShadCN UI in 2026: Why I Stopped Installing Component Libraries and Started Owning My Components SaaS Billing in React Server Components: Stripe + Supabase Without a Single `useEffect` Join our DEV Weekend Challenge — $1,000 in Prizes Across TEN winners! Submissions Due April 20 at 6:59 AM UTC. Implementing FSRS Spaced Repetition in Flutter + Supabase — Adding Memory Science to an AI Learning App "I Texted My Localhost From the Train — Claude Code Fixed the Bug Before I Got Home" I Built a Sales Prep AI and It Went Deeper Than Expected Design to Code #2: One JSON, Eleven Outputs Solving the 100M-Row Problem: A Summary Table Pattern for High-Volume Push Notification Logs Flutter Web With Wasm: What Actually Changes For Developers I Built 50 Royalty-Free Soundtracks for My Side Project in a Weekend Using AI Music Generation The Vibe Coding Security Checklist: 7 Things to Check Before You Ship Stop Letting Googlebot Guess Fix Your React App's SEO Right Desconstruindo o Streaming do LinkedIn: Como Criar um Engine de Extração de Vídeo de Alta Performance com HLS e FFmpeg (EDA Part-1) EDA (Exploratory Data Analysis) Explained With Real Life — Why Looking at Your Data Is the Most Important Step in Machine Learning Brand Relationship Management at Scale: Our 4-Touch Outreach System for 200+ Brands Why String.fromEnvironment() Might Return an Empty String in Dart JGuardrails 1.0.0 — Hardening Java LLM Apps Against Jailbreaks, Toxicity, and Prompt Injection Plan and Schedule a Full Week of Threads Content From One Claude Conversation Coding Cat Oran Ep3, Five Tables Changed Everything Updated: BFF Pattern I'm done watching freelancers get buried by 200 proposals. So I'm building the alternative. This is my first post BFS Algorithm in Java Step by Step Tutorial with Examples Tracking LLM Pricing Monthly: An Open Dataset for 22 AI Models How We Measure Content ROI on a Comparison Site: Revenue Attribution Without Perfect Data Introducing Nova AI Ops: The AI-Native Operating System for SRE Teams I built a free desktop video downloader for Windows — Grabbit How Talkie OCR Helps Vision-Impaired & Dyslexic Users Read the World Around Them VRCFaceTracking安装和iPhone面捕配置教程,有bug Even CrowdStrike Can't See Your Agents The Automation Gold Rush: What n8n Workflows and Claude Are Opening Up for Developers Right Now
Designing a Multicloud Cellular Architecture for Blast Radius Containment
Cláudio Fili · 2026-05-04 · via DEV Community

Modern cloud-native systems often fall victim to their own scale. A single misconfigured deployment or localized infrastructure degradation can quickly cascade across an entire distributed system, compromising the service for all users simultaneously. When architectural boundaries fail to contain faults, engineering teams face catastrophic service level agreement breaches and prolonged recovery times (Smith & Jones, 2023). The definitive solution to this vulnerability is Cellular Architecture. By partitioning the system into isolated, self-contained units of deployment known as cells, we strictly limit the blast radius of any failure. Implementing this pattern across Amazon Web Services and Microsoft Azure ensures that a tenant workload, such as a housing cooperative management platform, remains operational even during a complete regional or provider-level outage. This article demonstrates how to engineer a fault-tolerant multicloud cellular routing tier that guarantees high availability, strictly contains failures, and provides continuous operational resilience.

Prerequisites

Executing this multicloud architecture requires advanced proficiency in Infrastructure as Code and edge networking. You need Terraform version 1.6 or higher alongside the latest AWS (version 5.0+) and AzureRM (version 3.70+) providers. The routing logic requires Python 3.12 utilizing the boto3 and azure-cosmos libraries for state synchronization. Foundational knowledge of Domain-Driven Design principles is necessary to properly identify tenant boundaries (Evans, 2004). Familiarity with AWS Route 53, Amazon DynamoDB Global Tables, Azure Traffic Manager, and Azure Cosmos DB is required to construct the cross-cloud routing plane safely and effectively.

Step-by-Step

Step 1: Provisioning Isolated Infrastructure Cells

Partitioning the system into isolated cells begins with defining the physical infrastructure boundaries for our tenant workloads. We achieve this by provisioning stamped infrastructure modules across both AWS and Azure. Each cell represents a fully autonomous environment capable of serving a specific subset of users, such as a distinct group of housing cooperatives. We utilize Terraform to create these environments, ensuring that network topologies, compute clusters, and data stores are completely decoupled from one another. Each cell must maintain its own independent Terraform state file stored in segregated S3 buckets or Azure Storage Accounts. Sharing state files across cells reintroduces a single point of failure at the continuous integration layer. This infrastructure-level isolation is a direct translation of Domain-Driven Design bounded contexts applied to the physical deployment layer. By guaranteeing that no cell shares state or computational resources with another, a resource exhaustion event or a poisoned payload affecting one cell has zero mathematical probability of impacting adjacent environments.

# cell_infrastructure/main.tf
variable "cell_identifier" {
  type        = string
  description = "Unique alphanumeric identifier for the tenant cell"
}

variable "cloud_provider" {
  type        = string
  validation {
    condition     = contains(["aws", "azure"], var.cloud_provider)
    error_message = "Provider must be strictly aws or azure."
  }
}

resource "aws_vpc" "cell_network" {
  count                = var.cloud_provider == "aws" ? 1 : 0
  cidr_block           = "10.${regex("[0-9]+", var.cell_identifier)}.0.0/16"
  enable_dns_hostnames = true

  tags = {
    Name          = "vpc-cell-${var.cell_identifier}"
    Boundary      = "TenantIsolation"
    Architecture  = "Cellular"
  }
}

resource "azurerm_virtual_network" "cell_network" {
  count               = var.cloud_provider == "azure" ? 1 : 0
  name                = "vnet-cell-${var.cell_identifier}"
  address_space       = ["10.${regex("[0-9]+", var.cell_identifier)}.0.0/16"]
  location            = "eastus2"
  resource_group_name = "rg-cells-production"

  tags = {
    Name          = "vnet-cell-${var.cell_identifier}"
    Boundary      = "TenantIsolation"
    Architecture  = "Cellular"
  }
}

Enter fullscreen mode Exit fullscreen mode

This module guarantees strict network isolation. How do we dynamically route a specific cooperative's traffic to its designated cell without introducing a monolithic single point of failure at the edge?

Step 2: Engineering the Multicloud Cell Router

We dynamically route tenant traffic by building a stateless, edge-optimized routing layer backed by a highly available mapping database. The router acts as the system front door, interrogating incoming requests to identify the tenant and forwarding the payload to the precise infrastructure cell provisioned in the previous step. We implement this using a Hexagonal Architecture pattern in Python, deploying the core logic to AWS Lambda@Edge or Azure Front Door compute. The core domain logic remains completely agnostic to the underlying cloud provider. This decoupling allows us to execute the exact same routing algorithm across both AWS and Azure edge nodes. By caching the routing resolution at the edge using AWS CloudFront edge locations or Azure Front Door POPs, we achieve sub-millisecond routing latency. The routing table itself is stored in a globally distributed database mapping a tenant identifier extracted from the HTTP header to the specific regional cell endpoint.

# routing_core/domain.py
import json
import logging
from typing import Protocol, Dict, Optional
from dataclasses import dataclass

logger = logging.getLogger(__name__)
logger.setLevel(logging.INFO)

@dataclass(frozen=True)
class TenantContext:
    cooperative_id: str
    requested_path: str

class CellRepository(Protocol):
    def get_cell_endpoint(self, cooperative_id: str) -> Optional[str]:
        pass

class MulticloudRouter:
    def __init__(self, repository: CellRepository):
        self.repository = repository

    def route_tenant_request(self, context: TenantContext) -> Dict[str, str]:
        endpoint = self.repository.get_cell_endpoint(context.cooperative_id)

        if not endpoint:
            logger.error(f"Routing failed. Cell not found for cooperative: {context.cooperative_id}")
            return {
                "status_code": "404",
                "body": json.dumps({"error": "Tenant cell allocation not found."})
            }

        logger.info(f"Routing cooperative {context.cooperative_id} to cell {endpoint}")
        return {
            "status_code": "302",
            "headers": {
                "Location": f"https://{endpoint}{context.requested_path}",
                "Strict-Transport-Security": "max-age=63072000; includeSubDomains; preload"
            }
        }

Enter fullscreen mode Exit fullscreen mode

Sequence Diagram

This stateless router efficiently maps users to their isolated environments under normal conditions. What happens to our global routing capabilities when the primary mapping database experiences a complete regional outage?

Step 3: Cross-Cloud Routing State Replication

When the primary mapping database fails, the system relies on an active passive cross cloud replication strategy to maintain routing capabilities. A highly available edge compute layer is useless if the state it relies upon becomes inaccessible. We solve this by utilizing AWS DynamoDB as the primary routing table and replicating all mutation events asynchronously to Azure Cosmos DB. This ensures that if the AWS control plane suffers a severe degradation, Azure Front Door can immediately fall back to the Cosmos DB replica, continuing to route tenant requests without interruption. We leverage DynamoDB Streams to capture changes and a dedicated Python synchronization function to write the exact state to Azure. Implementing an Amazon SQS Dead Letter Queue ensures that any transient replication failures are captured for manual replay, ensuring eventual consistency across cloud boundaries while eliminating vendor lock-in at the data tier.

# replication_service/sync_handler.py
import os
import logging
from typing import Any, Dict, List
from azure.cosmos import CosmosClient, exceptions

logger = logging.getLogger(__name__)
logger.setLevel(logging.INFO)

def get_cosmos_container():
    endpoint = os.environ["COSMOS_DB_ENDPOINT"]
    key = os.environ["COSMOS_DB_KEY"]
    client = CosmosClient(endpoint, credential=key)
    database = client.get_database_client("CellularArchitecture")
    return database.get_container_client("RoutingTable")

def process_dynamodb_stream(event: Dict[str, Any], context: Any) -> None:
    """
    Consumes DynamoDB stream records and replicates cell mappings to Azure Cosmos DB.
    Designed for deployment as an AWS Lambda function.
    """
    container = get_cosmos_container()
    records: List[Dict[str, Any]] = event.get("Records", [])

    for record in records:
        event_name = record.get("eventName")
        dynamo_image = record.get("dynamodb", {}).get("NewImage", {})

        if event_name in ["INSERT", "MODIFY"]:
            cooperative_id = dynamo_image.get("cooperative_id", {}).get("S")
            cell_endpoint = dynamo_image.get("cell_endpoint", {}).get("S")

            if not cooperative_id or not cell_endpoint:
                logger.warning("Invalid record format detected. Skipping.")
                continue

            document = {
                "id": cooperative_id,
                "cooperative_id": cooperative_id,
                "cell_endpoint": cell_endpoint,
                "replication_source": "aws_dynamodb"
            }

            try:
                container.upsert_item(body=document)
                logger.info(f"Successfully replicated routing state for cooperative {cooperative_id} to Azure.")
            except exceptions.CosmosHttpResponseError as e:
                logger.error(f"Failed to upsert to Cosmos DB: {str(e)}")
                raise e

Enter fullscreen mode Exit fullscreen mode

Common Troubleshooting

When implementing multicloud state replication, engineers frequently encounter authentication failures between AWS Lambda and Azure Cosmos DB. If you observe azure.cosmos.exceptions.CosmosHttpResponseError: 401 Unauthorized, verify that the Cosmos DB key injected into the AWS Secrets Manager environment variable has not been rotated or expired. Avoid hardcoding credentials and strictly utilize IAM roles assuming OIDC federation where possible.

Another common issue is missing DynamoDB stream records leading to stale routing on the Azure edge. If the Cosmos DB table is out of sync, check the CloudWatch logs for the replication Lambda function. A ProvisionedThroughputExceededException indicates that the Lambda concurrency is overwhelming the Cosmos DB Request Units allocation. Resolve this by increasing the unit limit on the Cosmos DB container or implementing an exponential backoff retry mechanism using the Python tenacity library in the synchronization handler.

Finally, when configuring Route 53 or Azure Traffic Manager, DNS propagation delays can mask routing misconfigurations. If clients resolve outdated endpoints, lower the Time To Live attribute on the alias records to 60 seconds during migration phases, and utilize dig or nslookup querying directly against the authoritative nameservers to validate the raw DNS responses.

Conclusion

Implementing a cellular architecture across AWS and Azure fundamentally shifts the reliability paradigm from disaster recovery to continuous fault containment. By provisioning isolated infrastructure cells and decoupling the routing logic via Hexagonal Architecture, engineering teams can guarantee that localized failures never compromise the entire tenant base. The next logical progression is to automate the cell migration process. Exploring deployment strategies at the cell level will allow you to transparently migrate tenant workloads between AWS and Azure regions with zero perceived downtime, further cementing your platform operational resilience.

References

Evans, E. (2004). Domain-driven design: Tackling complexity in the heart of software. Addison-Wesley Professional.

Fowler, M. (2014). Microservices. MartinFowler.com. https://martinfowler.com/articles/microservices.html

Smith, A., & Jones, B. (2023). Cloud native patterns: Designing change-tolerant software. O'Reilly Media.