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

推荐订阅源

IntelliJ IDEA : IntelliJ IDEA – the Leading IDE for Professional Development in Java and Kotlin | The JetBrains Blog
IntelliJ IDEA : IntelliJ IDEA – the Leading IDE for Professional Development in Java and Kotlin | The JetBrains Blog
G
GRAHAM CLULEY
P
Privacy & Cybersecurity Law Blog
Threat Intelligence Blog | Flashpoint
Threat Intelligence Blog | Flashpoint
宝玉的分享
宝玉的分享
P
Proofpoint News Feed
H
Help Net Security
V
Visual Studio Blog
阮一峰的网络日志
阮一峰的网络日志
C
Cisco Blogs
人人都是产品经理
人人都是产品经理
Know Your Adversary
Know Your Adversary
freeCodeCamp Programming Tutorials: Python, JavaScript, Git & More
Recorded Future
Recorded Future
I
Intezer
罗磊的独立博客
T
The Exploit Database - CXSecurity.com
Blog — PlanetScale
Blog — PlanetScale
Malwarebytes
Malwarebytes
Spread Privacy
Spread Privacy
T
Tor Project blog
V
Vulnerabilities – Threatpost
云风的 BLOG
云风的 BLOG
腾讯CDC
B
Blog RSS Feed
Stack Overflow Blog
Stack Overflow Blog
F
Future of Privacy Forum
MyScale Blog
MyScale Blog
Latest news
Latest news
IT之家
IT之家
MongoDB | Blog
MongoDB | Blog
The Hacker News
The Hacker News
S
Securelist
博客园 - 【当耐特】
C
CXSECURITY Database RSS Feed - CXSecurity.com
T
Threat Research - Cisco Blogs
Jina AI
Jina AI
Cisco Talos Blog
Cisco Talos Blog
B
Blog
博客园 - 三生石上(FineUI控件)
Last Week in AI
Last Week in AI
CTFtime.org: upcoming CTF events
CTFtime.org: upcoming CTF events
M
MIT News - Artificial intelligence
V
V2EX
D
Darknet – Hacking Tools, Hacker News & Cyber Security
The Cloudflare Blog
The GitHub Blog
The GitHub Blog
博客园 - 聂微东
F
Full Disclosure
C
CERT Recently Published Vulnerability Notes

DEV Community

400+ Remote Companies Using React in 2026 Gizmo Guard - Safeguard Bot (Powered by Gemma4) Gizmo Guard - Safeguard Bot (Powered by Gemma4) Grafana 'No Data' after migration: 7 reconcilers we had to kill first CrimsonOS: Building a Mobile OS from the Firmware Up I’ve Been Building a Python Game Engine Counting tokens is dumb. So we built a free metric for AI proficiency. Best Free AI Tools for Developers in 2026 I Replaced ChatGPT With Gemma 4 In My Product. It Felt Like The Same Radio Show With A Different Host. Selling Without Stripe in a Country That Stripe Can't Reach: When Compliance Becomes a Technical Problem How I built a fallback loop to save my recommendation engine Solana's Biggest Consensus Overhaul Is Live for Testing. Here's What Builders Need to do right now. Your agent keeps using that word ... OpenSparrow v2.3 – visual admin panel, zero dependencies, now with ERD and M2M support Why AI Engineering Is Becoming More Like Distributed Systems Engineering How I Cut My LLM Costs by 90% Without Changing My App Logic Security Is Important. Automate It I killed my SaaS after 17 days and rebuilt it into something else GitHub Actions for HIPAA-compliant deployments How to Stop Your LLM Agent From Looping Itself Into Oblivion Apache Kafka for Beginners: Building Real-Time Streaming Systems with Python Dating the Crawler AI-Assisted Frontend Reviews Using Gemma 4 Building Secure Multi-Agent Systems: My Takeaways from Google I/O 2026 The Most Underrated Announcement from Google I/O 2026 Was Buried in a 90-Second Demo How to Fix CUDA Out of Memory Errors in Stable Diffusion WebUI My Experience Building My First Token And Having it Exist On-Chain. African Creators Deserve Better: How I Built a Payment Gateway for Every Corner of the Continent React CRUD basics Should Websites Allow AI Search Crawlers? Chunking Strategies for AI Code Review on Large Repos Beyond the Prompt: How to Build Stateful AI Agents with Persistent Memory and Self-Learning Loops What 10 University Visits in Cameroon Taught Me About Building AI for the Real World, and Why Gemma 4 Was the Answer The Universal Remote for AI: A Deep Dive into the Model Context Protocol (MCP) AgentGuard 0.3.0 — macOS menu bar app, Telegram rollback, and more Antigravity CLI: A Hands-On Guide to Google's Terminal Coding Agent Shopify Functions vs Shopify Scripts: A Migration Walkthrough What Actually Survives a Chicago-Area Winter on Your Deck Rethinking Geo-Blocking and Stripe's Failures in Global Access: A Cautionary Tale of Misoptimization I Built a Free Brat Generator - Here's What I Learned About Next.js Performance published Found a Second Layer to a GitHub Follow Botnet? AI Daily Digest: May 22, 2026 — Agentic Workflows, Coding Agents & Embodied AI How I Secured Internal Microservice Calls Without Passing JWTs Stop Mixing Them Up: SLI vs SLO vs SLA Explained Rebuilding My Engineering Mind Building a Music Production Ecosystem Instead of Just Releasing Plugins The Vonage Dev Discussion: How AI is transforming software development I Gave Our Enterprise AI a Memory. It Started Citing Last Quarter's Incidents. 𝐓𝐡𝐞 𝐂𝐨𝐦𝐦𝐮𝐧𝐢𝐜𝐚𝐭𝐢𝐨𝐧 𝐒𝐭𝐲𝐥𝐞 𝐂𝐫𝐢𝐬𝐢𝐬 Hermes Agent in the Wild: How I Turned It Into an AI Ops Employee Navigating the Hazy Jungle of Global E-commerce: How We Built a Reliable System for Digital Creators in Tanzania The Cost of Cross-Platform Development: Native Module Integration AI-Native Apps Will Swallow the Web I switched my Gemma 4 model three times in 72 hours. Here's the decision tree I wish I'd had. Inside #100DaysofSolana: A Guided Path into Web3 I Built and Shipped TinyHab: an ADHD-Friendly Habit Tracker for iOS I'm an ECE Student Who Vibe Codes Hardware Projects — Here's What Google I/O 2026 Actually Changed for Me From Fragmented Pipelines to Coherent Intelligence — Why Gemma 4 Actually Changes How I Work Our AI Inference Bill Dropped 65% After We Stopped Treating Every Query the Same Why P95 Latency Is the Only Metric That Matters at 3 AM Recycling made easy: a Polish recycling assistant powered by Gemma 4 The Complete Guide to Running a Midnight Node: Setup, Sync & Monitoring De CSRF a RCE: una visita web cuesta una shell en OpenYak Why We Built a Faster Wiki Building a Browser-Based Inkarnate Alternative for D&D Battle Maps Apache Kafka How to Build a FinTech Platform as a Solo Developer (By Any Means Necessary) Your LLM Logs Deserve Better — Send Claude Code Events to Bronto I built a free tool to track subscriptions and stop getting surprised by charges Building the TEYZIX CORE Internship Portal — My Full-Stack Development Journey PocketCFO: a private personal-finance brain that runs entirely in your browser Go Idioms I Wish I Knew Earlier Hey how are you guys I'm newbie web developer , learning wordpress+elementor Right now I don't know what to make I don't know what to write or use what color can you tell me about it ? Google I/O 2026 Blew My Mind — Here's What It Means for the Family App I'm Building 5 Things I Learned in My First Month as a Dev Intern EU AI Sovereignty Belongs in the Workflow Layer Why AI Coding Agents Need Business Context, Not Just Code Context How I Built 9 Claude AI Features into a Production SaaS Expo SDK 56 HashiCorp built an MCP server for writing Terraform. I built one for reviewing it Why Enterprise AI Agent Deployments Keep Failing Date Shear: A New Term for a Common Programming Pain Point Compass v1.1.0 · we shipped a memory plugin that catches its own consumption drift Zod Validation: Type-Safe APIs & Forms in TypeScript (Complete Guide) GitHub Actions CI/CD: Build a Complete Node.js Pipeline (2026) MCP in 2026: The numbers behind the ecosystem explosion working with an ai model mirror Learnt new things Four Metrics That Actually Tell You Whether Your Enterprise RAG Is Working Beyond the Stateless Prompt: Building an Auditable Product Intelligence Pipeline with Cascadeflow and Hindsight Most Creators Are Building in Pieces. I’m Building the Entire System. The Hidden Privacy Problem in Every AI App CVE-2026-26007: Subgroup Confinement Attack in pyca/cryptography The One Thing I See in Every Developer Who Gets Unstuck AI Memory Governance for Legal Tech: How Contract AI Agents Handle Privileged Data Two tables, zero migrations, full LINQ — a .NET data engine that's been running our production for 3 months Join the GitHub Finish-Up-A-Thon Challenge: $3,000 Prize Pool! I Replaced a $50/Month OCR API with Gemma 4’s Native Vision (And You Can Too) Building a Data-Driven Medical Image Enhancement Pipeline with Differential Evolution 🔥🩻 Why I Like Small Software
Microservices Didn't Fail. People Did
Alan Bradley · 2026-05-22 · via DEV Community

The pattern was sound. The history is clear. What broke microservices wasn't the architecture — it was practitioners who applied the deployment unit without the engineering discipline the original authors said it required.

There is a version of the microservices post-mortem that treats the pattern itself as the problem. Distributed systems are hard. Eventual consistency is hard. Operational overhead compounds. Better to stay with the monolith. This is the wrong conclusion, drawn from the wrong evidence, by people who perhaps should never have adopted microservices in the first place.

Microservices did not fail. A generation of engineers adopted an architectural pattern without the domain modelling discipline it demands, kept the synchronous call patterns from the systems they were supposed to be replacing, and then blamed the architecture when the complexity became unmanageable. That is not a failure of microservices. It is a failure of craft.


What the Original Authors Actually Said

Fred George was talking about micro-services — note the hyphen, the original form — at conferences as early as 2012. His framing was specific and unambiguous: very small services, a hundred or two hundred lines of code, communicating asynchronously, each doing one thing and signalling when done. He called the underlying philosophy programmer anarchy — not because it was chaotic, but because it required engineers senior and capable enough to operate without the management scaffolding that larger, less capable teams depend on.

George was explicit on this point, and it is the part most consistently erased from the mainstream narrative: microservices require a higher class of engineer. Not because the individual services are technically complex — they are not, that is rather the point — but because drawing correct service boundaries demands deep domain knowledge, and building an async event-driven system that actually holds together requires engineers who understand what they are doing and why. It is not a pattern that compensates for weak engineering. It exposes it.

In 2014, Martin Fowler and James Lewis codified what had been circulating in the practitioner community into the article that would introduce the term to the mainstream. They described services built around business capabilities, independently deployable, each owning its own data. They described communication via lightweight mechanisms, positioning this explicitly against the ESB-era orchestration that SOA had become. And they used a phrase the industry would adopt as a slogan while ignoring its meaning: smart endpoints, dumb pipes.

Microservice communities favour an alternative approach: smart endpoints and dumb pipes. Applications built from microservices aim to be as decoupled and as cohesive as possible — they own their own domain logic and act as filters in the classical Unix sense.

— Martin Fowler & James Lewis, Microservices, martinfowler.com, 2014

The Unix reference is not rhetorical. The intellectual lineage of microservices runs directly through Unix philosophy: do one thing and do it well, compose small sharp tools via pipes, keep the pipes dumb and let the intelligence live at the endpoints. This is a forty-year-old idea applied to distributed systems. The message bus is the pipe. The service is the tool. The insight was not new — it was being rediscovered at network scale.

Fowler and Lewis also listed decentralised data management as a defining property — not an optimisation, not a preference, a defining property. Each service owns its data. Not a shared Postgres instance with schema-level separation. Not a common ORM pointed at a central database. Complete data ownership, per service, with no exceptions. It was almost universally abandoned in practice because doing it correctly requires the kind of domain thinking not every team could bring.


The Problem Microservices Were Built To Solve

The original context matters enormously, and stripping it out is how you end up with a five-person startup running fifteen services on Kubernetes. Microservices emerged at organisations — Netflix, Amazon — where the primary engineering bottleneck was not performance, not data volume, not technical complexity. It was people. Hundreds of engineers. Conway's Law made operational: when your organisation is large enough, your architecture will mirror your team structure whether you intend it to or not. The insight was to design for that deliberately.

Context — The goal was independent deployability at organisational scale: the ability for a team of eight to ship their service without synchronising with twenty other teams. The service boundary was, first and foremost, a team boundary. The architecture served the org chart. Without that organisational pressure, most of the complexity budget of microservices buys you nothing.

If your team does not have that problem, you probably do not need this solution. A well-structured monolith, deployed with confidence, will outperform a prematurely distributed system on every axis that matters to a small team. Reaching for microservices without the scale that motivates them is not an architectural decision. It is CV-driven development.


How We Build When Microservices Are the Right Call

When the problem genuinely calls for it — independent teams, independent domains, engineering capability to execute properly — the approach is simple. Not easy. Simple. There is a difference, and it matters.

Services communicate exclusively via events on a message bus. Not synchronous HTTP. Not REST calls between services. Events. A service does its work, emits an event signalling completion, and its responsibility ends there. It has no knowledge of what consumes that event or how many things do. The bus is infrastructure — provisioned once, configured like a database. You are not dynamically discovering it at runtime. The addressing problem that service discovery exists to solve simply does not arise, because you are not making point-to-point calls between services.

Each service owns its data completely. This is where the lake and pond model becomes operational. The event stream is the lake: the canonical, append-only record of everything that has happened across the system. Each service maintains its own pond — a local materialised view of the data relevant to its domain, hydrated by subscribing to the events it cares about. A service never queries another service's store. It never calls another service to assemble a response. It already has what it needs, because it built it from events as they arrived.

This resolves the one objection people reliably raise: how do you serve synchronous queries at the user-facing edge? Frontend-supporting services — the Backend for Frontend pattern — subscribe to events across relevant domains and maintain pre-aggregated read models locally. When a request arrives, they answer from their own store. There is no cross-service call at query time, no dependency chain, no distributed join to fail.

Concrete Example — Order Placement

A customer places an order. The order service validates, persists, and emits one event: OrderPlaced. Its job is done. It does not call the inventory service. It does not call the payment service. It does not know either exists.

The inventory service is subscribed to OrderPlaced. It reserves stock and emits InventoryReserved. The payment service is subscribed to InventoryReserved. It charges the customer and emits PaymentConfirmed. Each service reacts, does its work, signals completion. No service is aware of the others. No orchestration layer exists. No saga coordinator manages the sequence.

The customer's dashboard needs to show order status synchronously. A BFF service has been subscribed to all of these events since the system started and has maintained a local read model — its own pond — built from that stream. When the request arrives, it answers from local state. The response time is a single local query. There is nothing to discover, no chain to traverse, nothing to fail.

The simplicity here is not cosmetic. It is the proof that the design is correct. When a system requires a service mesh, a circuit breaker library, and a distributed tracing platform just to understand what is happening at runtime, that is not operational maturity — it is the system telling you something went wrong at design time.


Where the Industry Went Wrong

The mainstream implementation made one foundational mistake and spent the next decade building infrastructure to manage the consequences. It kept synchronous HTTP as the primary communication mechanism between services. Everything else — the service discovery registries, the circuit breakers, the service meshes, the distributed tracing pipelines — is a direct and inevitable consequence of that one decision.

  • Synchronous HTTP between services creates a distributed monolith. Call chains couple services at runtime. Latency compounds with every hop. Failures cascade. You carry the full operational burden of distributed systems and the full coupling of a monolith, simultaneously.
  • Service discovery — Consul, Eureka, Kubernetes service meshes — exists entirely to manage dynamic addressing in synchronous architectures. It is a solution to a problem that should not exist. In a correctly designed async system, you never ask where another service is.
  • The Saga pattern, in most implementations, is a sign that service boundaries were drawn incorrectly. If completing a business operation requires coordinated state changes across multiple services, those services were not decomposed around their actual bounded contexts. The saga is not the solution — it is the symptom.
  • Shared databases between services are not a pragmatic shortcut. They are a categorical error. If two services share a schema, they are modules in a distributed monolith. Calling them microservices changes nothing about their coupling.
  • Istio is impressive engineering that exists entirely to manage problems generated by synchronous inter-service communication. Its presence as a default recommendation in microservices literature is a precise measure of how far the mainstream drifted from the original intent.

None of this is a failure of the architectural pattern. It is a failure of practitioners who adopted a deployment strategy without the domain modelling discipline that makes it coherent. This requires engineers who can reason about bounded contexts, who understand event-driven systems, who have the discipline to hold service boundaries under delivery pressure. It was never a template any team could lift and apply without thinking. The original authors were clear about this. The industry chose not to listen, and then blamed the architecture for the results.


The Honest Position

Microservices, built as their originators described — async, event-driven, each service owning its domain and its data completely — are simple. Not operationally trivial, but architecturally simple: no service discovery, no synchronous call chain to trace, no distributed transaction to coordinate, no saga to manage. Each service does one thing, signals when done, and has no knowledge of what comes next. The system's complexity lives in the domain, where it belongs, not in the infrastructure. Simplicity is not a constraint we work within — it is the standard we hold the design to. When you find yourself reaching for a service mesh or a saga orchestrator, the question is not which tool to reach for. It is what decision, made earlier, made that tool feel necessary.


Originally published at uradical.io.