<?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>Distributed Systems on Brave New Geek</title><link>https://bravenewgeek.com/category/distributed-systems-2/</link><description>Recent content in Distributed Systems on Brave New Geek</description><generator>Hugo</generator><language>en-us</language><lastBuildDate>Tue, 28 Apr 2020 14:28:33 -0500</lastBuildDate><atom:link href="https://bravenewgeek.com/category/distributed-systems-2/index.xml" rel="self" type="application/rss+xml"/><item><title>Liftbridge 1.0</title><link>https://bravenewgeek.com/liftbridge-1-0/</link><pubDate>Tue, 28 Apr 2020 13:12:21 -0500</pubDate><guid>https://bravenewgeek.com/liftbridge-1-0/</guid><description>&lt;p&gt;&lt;img loading="lazy" src="https://bravenewgeek.com/wp-content/uploads/2020/04/liftbridge_full-1024x228.png"&gt;&lt;/p&gt;
&lt;p&gt;&lt;a href="https://liftbridge.io"&gt;Liftbridge&lt;/a&gt; has evolved a lot since making the first commit in October 2017, but the vision has remained the same: provide a message-streaming solution with a focus on simplicity and usability. This is demonstrated through many of the design and implementation decisions. A few examples include the use of NATS as the messaging backbone, avoiding heavy dependencies on runtimes like the JVM and external coordination systems like ZooKeeper, compiling down to a small, single static binary, opting for a gRPC-based API, and relying on plain YAML configuration. Liftbridge is written in Go, and the code is structured with the hopes that it’s relatively easy for someone to hop in and contribute to the project.&lt;/p&gt;</description></item><item><title>Introducing Liftbridge: Lightweight, Fault-Tolerant Message Streams</title><link>https://bravenewgeek.com/introducing-liftbridge-lightweight-fault-tolerant-message-streams/</link><pubDate>Fri, 27 Jul 2018 17:42:49 -0500</pubDate><guid>https://bravenewgeek.com/introducing-liftbridge-lightweight-fault-tolerant-message-streams/</guid><description>&lt;p&gt;&lt;a href="https://github.com/liftbridge-io/liftbridge"&gt;&lt;img loading="lazy" src="https://bravenewgeek.com/wp-content/uploads/2018/07/liftbridge.png"&gt;&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;&lt;a href="https://twitter.com/tyler_treat/status/1019281381493526529"&gt;Last week&lt;/a&gt; I open sourced &lt;a href="https://github.com/liftbridge-io/liftbridge"&gt;Liftbridge&lt;/a&gt;, my latest project and contribution to the &lt;a href="https://www.cncf.io/"&gt;Cloud Native Computing Foundation&lt;/a&gt; ecosystem. Liftbridge is a system for lightweight, fault-tolerant (LIFT) message streams built on &lt;a href="https://nats.io/"&gt;NATS&lt;/a&gt; and &lt;a href="https://grpc.io/"&gt;gRPC&lt;/a&gt;. Fundamentally, it extends NATS with a &lt;a href="https://kafka.apache.org/"&gt;Kafka&lt;/a&gt;-like publish-subscribe log API that is highly available and horizontally scalable.&lt;/p&gt;
&lt;p&gt;I’ve been working on Liftbridge for the past couple of months, but it’s something I’ve been thinking about for over a year. I sketched out the design for it last year and &lt;a href="https://bravenewgeek.com/building-a-distributed-log-from-scratch-part-5-sketching-a-new-system/"&gt;wrote about it&lt;/a&gt; in January. It was largely inspired while I was working on &lt;a href="https://github.com/nats-io/nats-streaming-server"&gt;NATS Streaming&lt;/a&gt;, which I’m currently still the second top contributor to. My primary involvement with NATS Streaming was building out the early data replication and clustering solution for high availability, which has continued to evolve since I left the project. In many ways, Liftbridge is about applying a lot of the things I learned while working on NATS Streaming as well as my observations from being closely involved with the NATS community for some time. It’s also the product of scratching an itch I’ve had since these are the kinds of problems I enjoy working on, and I needed something to code.&lt;/p&gt;</description></item><item><title>There and Back Again: Why PaaS Is Passé (And Why It’s Not)</title><link>https://bravenewgeek.com/there-and-back-again-why-paas-is-passe-and-why-its-not/</link><pubDate>Tue, 06 Feb 2018 16:26:31 -0600</pubDate><guid>https://bravenewgeek.com/there-and-back-again-why-paas-is-passe-and-why-its-not/</guid><description>&lt;p&gt;In 10 years nobody will be talking about Kubernetes. Not because people stopped using it or because it fell out of favor, but because it became utility. Containers, Kubernetes, service meshes—they’ll all be there, the same way VMs, hypervisors, and switches will be. Compute is a commodity, and I don’t care how my workload runs so long as it meets my business’s SLOs and other requirements. Within AWS alone, there are now &lt;em&gt;innumerable&lt;/em&gt; ways to run a compute workload.&lt;/p&gt;</description></item><item><title>Building a Distributed Log from Scratch, Part 4: Trade-Offs and Lessons Learned</title><link>https://bravenewgeek.com/building-a-distributed-log-from-scratch-part-4-trade-offs-and-lessons-learned/</link><pubDate>Thu, 18 Jan 2018 16:01:13 -0600</pubDate><guid>https://bravenewgeek.com/building-a-distributed-log-from-scratch-part-4-trade-offs-and-lessons-learned/</guid><description>&lt;p&gt;In &lt;a href="https://bravenewgeek.com/building-a-distributed-log-from-scratch-part-3-scaling-message-delivery/"&gt;part three&lt;/a&gt; of this series we talked about scaling message delivery in a distributed log. In part four, we’ll look at some key trade-offs involved with such systems and discuss a few lessons learned while building NATS Streaming.&lt;/p&gt;
&lt;h3 id="competing-goals"&gt;Competing Goals&lt;/h3&gt;
&lt;p&gt;There are a number of competing goals when building a distributed log (these goals also extend to many other types of systems). Recall from &lt;a href="https://bravenewgeek.com/building-a-distributed-log-from-scratch-part-1-storage-mechanics/"&gt;part one&lt;/a&gt; that our key priorities for this type of system are performance, high availability, and scalability. The preceding parts of this series described at various levels how we can accomplish these three goals, but astute readers likely noticed that some of these things conflict with one another.&lt;/p&gt;</description></item><item><title>Building a Distributed Log from Scratch, Part 3: Scaling Message Delivery</title><link>https://bravenewgeek.com/building-a-distributed-log-from-scratch-part-3-scaling-message-delivery/</link><pubDate>Mon, 08 Jan 2018 16:10:40 -0600</pubDate><guid>https://bravenewgeek.com/building-a-distributed-log-from-scratch-part-3-scaling-message-delivery/</guid><description>&lt;p&gt;In &lt;a href="https://bravenewgeek.com/building-a-distributed-log-from-scratch-part-2-data-replication/"&gt;part two&lt;/a&gt; of this series we discussed data replication within the context of a distributed log and how it relates to high availability. Next, we’ll look at what it takes to scale the log such that it can handle non-trivial workloads.&lt;/p&gt;
&lt;h3 id="data-scalability"&gt;Data Scalability&lt;/h3&gt;
&lt;p&gt;A key part of scaling any kind of data-intensive system is the ability to partition the data. Partitioning is how we can scale a system linearly, that is to say we can handle more load by adding more nodes. We make the system &lt;em&gt;horizontally&lt;/em&gt; scalable.&lt;/p&gt;</description></item><item><title>Building a Distributed Log from Scratch, Part 2: Data Replication</title><link>https://bravenewgeek.com/building-a-distributed-log-from-scratch-part-2-data-replication/</link><pubDate>Wed, 27 Dec 2017 12:26:55 -0600</pubDate><guid>https://bravenewgeek.com/building-a-distributed-log-from-scratch-part-2-data-replication/</guid><description>&lt;p&gt;In &lt;a href="https://bravenewgeek.com/building-a-distributed-log-from-scratch-part-1-storage-mechanics/"&gt;part one&lt;/a&gt; of this series we introduced the idea of a message log, touched on why it’s useful, and discussed the storage mechanics behind it. In part two, we discuss data replication.&lt;/p&gt;
&lt;p&gt;We have our log. We know how to write data to it and read it back as well as how data is persisted. The caveat to this is, although we have a durable log, it’s a single point of failure (SPOF). If the machine where the log data is stored dies, we’re SOL. Recall that one of our three priorities with this system is high availability, so the question is how do we achieve high availability and fault tolerance?&lt;/p&gt;</description></item><item><title>Building a Distributed Log from Scratch, Part 1: Storage Mechanics</title><link>https://bravenewgeek.com/building-a-distributed-log-from-scratch-part-1-storage-mechanics/</link><pubDate>Thu, 21 Dec 2017 15:54:17 -0600</pubDate><guid>https://bravenewgeek.com/building-a-distributed-log-from-scratch-part-1-storage-mechanics/</guid><description>&lt;p&gt;The log is a totally-ordered, append-only data structure. It’s a powerful yet simple abstraction—a sequence of immutable events. It’s something that programmers have been using for a very long time, perhaps without even realizing it because it’s so simple. Whether it’s application logs, system logs, or access logs, logging is something every developer uses on a daily basis. Essentially, it’s a timestamp and an event, a &lt;em&gt;when&lt;/em&gt; and a &lt;em&gt;what&lt;/em&gt;, and typically appended to the end of a file. But when we generalize that pattern, we end up with something much more useful for a broad range of problems. It becomes more interesting when we look at the log not just as a system of record but a central piece in managing data and distributing it across the enterprise efficiently.&lt;/p&gt;</description></item><item><title>FIFO, Exactly-Once, and Other Costs</title><link>https://bravenewgeek.com/fifo-exactly-once-and-other-costs/</link><pubDate>Wed, 02 Aug 2017 10:14:20 -0500</pubDate><guid>https://bravenewgeek.com/fifo-exactly-once-and-other-costs/</guid><description>&lt;p&gt;There’s been &lt;a href="https://bravenewgeek.com/you-cannot-have-exactly-once-delivery-redux/"&gt;a lot&lt;/a&gt; &lt;a href="http://the-paper-trail.org/blog/exactly-not-atomic-broadcast-still-impossible-kafka/"&gt;of discussion&lt;/a&gt; &lt;a href="https://fpj.me/2017/07/04/no-consensus-in-exactly-once/"&gt;about&lt;/a&gt; &lt;a href="http://data.alishoker.com/2017/07/notes-on-exactly-once-semantics-in.html"&gt;exactly-once semantics&lt;/a&gt; &lt;a href="https://medium.com/@jaykreps/exactly-once-one-more-time-901181d592f9"&gt;lately&lt;/a&gt;, sparked by the recent &lt;a href="https://www.confluent.io/blog/exactly-once-semantics-are-possible-heres-how-apache-kafka-does-it/"&gt;announcement&lt;/a&gt; of support for it in Kafka 0.11. I’ve already &lt;a href="https://bravenewgeek.com/what-you-want-is-what-you-dont-understanding-trade-offs-in-distributed-messaging/"&gt;written at length&lt;/a&gt; about strong guarantees in messaging.&lt;/p&gt;
&lt;p&gt;My former coworker Kevin Sookocheff recently made a &lt;a href="https://sookocheff.com/post/messaging/dissecting-sqs-fifo-queues/"&gt;post&lt;/a&gt; about ordered and exactly-once message delivery as it relates to Amazon SQS. It does a good job of illustrating what the trade-offs are, and I want to drive home some points.&lt;/p&gt;
&lt;p&gt;In the article, Kevin shows how FIFO delivery is really only meaningful when you have one single-threaded publisher and one single-threaded receiver. Amazon’s FIFO queues allow you to control how restrictive this requirement is by applying ordering on a per-group basis. In other words, we can improve throughput if we can partition work into different ordered groups rather than a single totally ordered group. However, FIFO still effectively limits throughput on a group to a single publisher and single subscriber. If there are multiple publishers, they have to coordinate to ensure ordering is preserved with respect to our application’s semantics. On the subscriber side, things are simpler because SQS will only deliver messages in a group one at a time in order amongst subscribers.&lt;/p&gt;</description></item><item><title>You Cannot Have Exactly-Once Delivery Redux</title><link>https://bravenewgeek.com/you-cannot-have-exactly-once-delivery-redux/</link><pubDate>Fri, 30 Jun 2017 15:43:31 -0500</pubDate><guid>https://bravenewgeek.com/you-cannot-have-exactly-once-delivery-redux/</guid><description>&lt;p&gt;A couple years ago I wrote &lt;a href="https://bravenewgeek.com/you-cannot-have-exactly-once-delivery/"&gt;You Cannot Have Exactly-Once Delivery&lt;/a&gt;. It stirred up quite a bit of discussion and was even &lt;a href="https://twitter.com/tyler_treat/status/849449118405677057"&gt;referenced in a book&lt;/a&gt;, which I found rather surprising considering I’m not exactly an academic. Recently, the topic of exactly-once delivery has again become a &lt;a href="https://segment.com/blog/exactly-once-delivery/"&gt;popular point&lt;/a&gt; &lt;a href="https://bravenewgeek.com/smart-endpoints-dumb-pipes/"&gt;of discussion&lt;/a&gt;, particularly with the &lt;a href="https://www.confluent.io/blog/exactly-once-semantics-are-possible-heres-how-apache-kafka-does-it/"&gt;release of Kafka 0.11&lt;/a&gt;, which introduces support for idempotent producers, transactional writes across multiple partitions, and—wait for it—exactly-once semantics.&lt;/p&gt;
&lt;p&gt;Naturally, when this hit Hacker News, I received a lot of messages from people asking me, “what gives?” There’s literally a TechCrunch headline titled, &lt;a href="https://techcrunch.com/2017/06/30/confluent-achieves-holy-grail-of-exactly-once-delivery-on-kafka-messaging-service/"&gt;&lt;em&gt;Confluent achieves holy grail of “exactly once” delivery on Kafka messaging service&lt;/em&gt;&lt;/a&gt; (Jay assures me, they don’t write the headlines). The myth has been disproved!&lt;/p&gt;</description></item><item><title>Smart Endpoints, Dumb Pipes</title><link>https://bravenewgeek.com/smart-endpoints-dumb-pipes/</link><pubDate>Thu, 29 Jun 2017 19:02:46 -0500</pubDate><guid>https://bravenewgeek.com/smart-endpoints-dumb-pipes/</guid><description>&lt;p&gt;I read an interesting article recently called &lt;a href="http://programmingisterrible.com/post/162346490883/how-do-you-cut-a-monolith-in-half"&gt;How do you cut a monolith in half?&lt;/a&gt; There are a lot of thoughts in the article that resonate with me and some that I disagree with, prompting this response.&lt;/p&gt;
&lt;p&gt;The overall message of the article is don’t use a message broker to break apart a monolith because it’s like a cross between a load balancer and a database, with the disadvantages of both and the advantages of neither. The author argues that message brokers are a popular way to pull apart components over a network because they have low setup cost and provide easy service discovery, but they come at a high operational cost. My response to that is the same advice the author puts forward: &lt;em&gt;it depends&lt;/em&gt;.&lt;/p&gt;</description></item><item><title>Take It to the Limit: Considerations for Building Reliable Systems</title><link>https://bravenewgeek.com/take-it-to-the-limit-considerations-for-building-reliable-systems/</link><pubDate>Tue, 20 Dec 2016 19:55:52 -0600</pubDate><guid>https://bravenewgeek.com/take-it-to-the-limit-considerations-for-building-reliable-systems/</guid><description>&lt;p&gt;Complex systems usually operate in failure mode. This is because a complex system typically consists of many discrete pieces, each of which can fail in isolation (or in concert). In a microservice architecture where a given function potentially comprises several independent service calls, &lt;em&gt;high&lt;/em&gt; availability hinges on the ability to be &lt;em&gt;partially&lt;/em&gt; available. This is a core tenet behind resilience engineering. If a function depends on three services, each with a reliability of 90%, 95%, and 99%, respectively, partial availability could be the difference between 99.995% reliability and 84% reliability (assuming failures are independent). Resilience engineering means designing with failure as the normal.&lt;/p&gt;</description></item><item><title>So You Wanna Go Fast?</title><link>https://bravenewgeek.com/so-you-wanna-go-fast/</link><pubDate>Wed, 24 Feb 2016 19:30:14 -0600</pubDate><guid>https://bravenewgeek.com/so-you-wanna-go-fast/</guid><description>&lt;p&gt;I originally proposed this as a &lt;a href="https://www.gophercon.com/"&gt;GopherCon&lt;/a&gt; talk on writing “high-performance Go”, which is why it may seem rambling, incoherent, and—at times—not at all related to Go. The talk was rejected (probably because of the rambling and incoherence), but I still think it’s a subject worth exploring. The good news is, since it was rejected, I can take this where I want. The remainder of this piece is mostly the outline of that talk with some parts filled in, some meandering stories which may or may not pertain to the topic, and some lessons learned along the way. I think it might make a good talk one day, but this will have to do for now.&lt;/p&gt;</description></item><item><title>From the Ground Up: Reasoning About Distributed Systems in the Real World</title><link>https://bravenewgeek.com/from-the-ground-up-reasoning-about-distributed-systems-in-the-real-world/</link><pubDate>Fri, 01 Jan 2016 14:26:50 -0600</pubDate><guid>https://bravenewgeek.com/from-the-ground-up-reasoning-about-distributed-systems-in-the-real-world/</guid><description>&lt;p&gt;&lt;em&gt;The rabbit hole is deep. Down and down it goes. Where it ends, nobody knows. But as we traverse it, patterns appear. They give us hope, they quell the fear.&lt;/em&gt;&lt;/p&gt;
&lt;p&gt;Distributed systems literature is abundant, but as a practitioner, I often find it difficult to know where to start or how to synthesize this knowledge without a more formal background. This is a non-academic’s attempt to provide a line of thought for rationalizing design decisions. This piece doesn’t necessarily contribute any new ideas but rather tries to provide a holistic framework by studying some influential existing ones. It includes references which provide a good starting point for thinking about distributed systems. Specifically, we look at a few formal results and slightly less formal design principles to provide a basis from which we can argue about system design.&lt;/p&gt;</description></item><item><title>Infrastructure Engineering in the 21st Century</title><link>https://bravenewgeek.com/infrastructure-engineering-in-the-21st-century/</link><pubDate>Tue, 15 Dec 2015 18:57:41 -0600</pubDate><guid>https://bravenewgeek.com/infrastructure-engineering-in-the-21st-century/</guid><description>&lt;p&gt;Infrastructure engineering is an inherently treacherous problem space because it’s core to so many things. Systems today are increasingly distributed and increasingly complex but are built on unreliable components and will continue to be. This includes unreliable networks and faulty hardware. The 21st century engineer understands &lt;strong&gt;failure is routine&lt;/strong&gt;.&lt;/p&gt;
&lt;p&gt;Naturally, application developers would rather not have to think about low-level failure modes so they can focus on solving the problem at hand. Infrastructure engineers are then tasked with competing goals: provide enough abstraction to make application development tractable and provide enough reliability to make subsystems useful. The second goal often comes with an additional proviso in that there must be sufficient reliability without sacrificing performance to the point of no longer being useful. Anyone who has worked on enterprise messaging systems can tell you that these goals are often contradictory. The result is a wall of sand intended to keep the developer’s feet dry from the incoming tide. The 21st century engineer understands that &lt;strong&gt;in order to play in the sand, we all need to be comfortable getting our feet a little wet from time to time.&lt;/strong&gt;&lt;/p&gt;</description></item><item><title>You Own Your Availability</title><link>https://bravenewgeek.com/you-own-your-availability/</link><pubDate>Tue, 22 Sep 2015 11:12:16 -0500</pubDate><guid>https://bravenewgeek.com/you-own-your-availability/</guid><description>&lt;p&gt;There’s been a lot of discussion around “availability” lately. It’s often trumpeted with phrases like “&lt;a href="http://www.whoownsmyavailability.com/"&gt;you own your availability&lt;/a&gt;,” meaning there is no buck-passing when it comes to service uptime. The &lt;a href="http://venturebeat.com/2015/09/20/amazons-aws-outage-takes-down-netflix-reddit-medium-and-more/"&gt;AWS outage&lt;/a&gt; earlier this week served as a stark reminder that, while owning your availability is a commendable ambition, for many it’s still largely owned by Amazon and the like.&lt;/p&gt;
&lt;p&gt;In order to “own” your availability, it’s important to first understand what “availability” really means. Within the context of distributed-systems theory, availability is usually discussed in relation to the &lt;a href="https://bravenewgeek.com/cap-and-the-illusion-of-choice/"&gt;CAP theorem&lt;/a&gt;. &lt;a href="https://www.comp.nus.edu.sg/~gilbert/pubs/BrewersConjecture-SigAct.pdf"&gt;Formally&lt;/a&gt;, CAP defines availability as a &lt;em&gt;liveness&lt;/em&gt; property: “every request received by a non-failing node in the system must result in a response.” This is a weak definition for two reasons. First, the proviso “every request received by a &lt;em&gt;non-failing&lt;/em&gt; node” means that a system in which &lt;em&gt;all&lt;/em&gt; nodes have failed is trivially available.  Second, Gilbert and Lynch stipulate no upper bound on latency, only that operations &lt;em&gt;eventually&lt;/em&gt; return a response. This means an operation could take weeks to complete and availability would not be violated.&lt;/p&gt;</description></item><item><title>What You Want Is What You Don’t: Understanding Trade-Offs in Distributed Messaging</title><link>https://bravenewgeek.com/what-you-want-is-what-you-dont-understanding-trade-offs-in-distributed-messaging/</link><pubDate>Sun, 23 Aug 2015 17:59:39 -0500</pubDate><guid>https://bravenewgeek.com/what-you-want-is-what-you-dont-understanding-trade-offs-in-distributed-messaging/</guid><description>&lt;p&gt;If there’s one unifying theme of this blog, it’s that &lt;a href="https://bravenewgeek.com/distributed-systems-are-a-ux-problem/"&gt;distributed systems&lt;/a&gt; &lt;a href="https://bravenewgeek.com/cap-and-the-illusion-of-choice/"&gt;are&lt;/a&gt; &lt;a href="https://bravenewgeek.com/understanding-consensus/"&gt;riddled&lt;/a&gt; &lt;a href="https://bravenewgeek.com/scaling-shared-data/"&gt;with&lt;/a&gt; &lt;a href="https://bravenewgeek.com/stream-processing-and-probabilistic-methods/"&gt;trade-offs&lt;/a&gt;. Specifically, with distributed messaging, &lt;a href="https://bravenewgeek.com/you-cannot-have-exactly-once-delivery/"&gt;you cannot have exactly-once delivery&lt;/a&gt;. However, messaging trade-offs don’t stop at delivery semantics. I want to talk about what I mean by this and explain why many developers often have the wrong mindset when it comes to building distributed applications.&lt;/p&gt;
&lt;p&gt;The natural tendency is to build distributed systems as if they aren’t distributed at all—assuming data consistency, reliable messaging, and predictability. It’s much easier to reason about, but it’s also blatantly misleading.&lt;/p&gt;</description></item><item><title>Designed to Fail</title><link>https://bravenewgeek.com/designed-to-fail/</link><pubDate>Tue, 21 Jul 2015 20:17:17 -0500</pubDate><guid>https://bravenewgeek.com/designed-to-fail/</guid><description>&lt;p&gt;When it comes to reliability engineering, people often talk about things like fault injection, monitoring, and operations runbooks. These are all critical pieces for building systems which can withstand failure, but what’s less talked about is the need to design systems which &lt;em&gt;deliberately&lt;/em&gt; fail.&lt;/p&gt;
&lt;p&gt;Reliability design has a natural progression which closely follows that of architectural design. With monolithic systems, we care more about preventing failure from occurring. With service-oriented architectures, controlling failure becomes less manageable, so instead we learn to anticipate it. With highly distributed microservice architectures where failure is all but guaranteed, we &lt;em&gt;embrace&lt;/em&gt; it.&lt;/p&gt;</description></item><item><title>Service-Disoriented Architecture</title><link>https://bravenewgeek.com/service-disoriented-architecture/</link><pubDate>Sun, 07 Jun 2015 16:03:22 -0500</pubDate><guid>https://bravenewgeek.com/service-disoriented-architecture/</guid><description>&lt;p&gt;&lt;em&gt;“You can have a second computer once you’ve shown you know how to use the first one.” -Paul Barham&lt;/em&gt;&lt;/p&gt;
&lt;p&gt;The first rule of distributed systems is don’t distribute your system until you have an observable reason to. Teams break this rule on the regular. People have been talking about service-oriented architecture for a long time, but only recently have microservices been receiving the hype.&lt;/p&gt;
&lt;p&gt;The problem, as &lt;a href="http://martinfowler.com/bliki/MicroservicePremium.html"&gt;Martin Fowler observes&lt;/a&gt;, is that teams are becoming too eager to adopt a microservice architecture without first understanding the &lt;a href="http://highscalability.com/blog/2014/4/8/microservices-not-a-free-lunch.html"&gt;inherent overheads&lt;/a&gt;. A contributing factor, I think, is you only hear the success stories from companies who did it right, like Netflix. However, what folks often fail to realize is that these companies—in almost all cases—didn’t start out that way. There was a long and winding path which led them to where they are today. The inverse of this, which some refer to as &lt;a href="http://www.thoughtworks.com/radar/techniques/microservice-envy"&gt;microservice envy&lt;/a&gt;, is causing teams to rush into microservice hell. I call this service-&lt;em&gt;disoriented&lt;/em&gt; architecture (or sometimes disservice-oriented architecture when the architecture is DOA).&lt;/p&gt;</description></item><item><title>Distributed Systems Are a UX Problem</title><link>https://bravenewgeek.com/distributed-systems-are-a-ux-problem/</link><pubDate>Wed, 03 Jun 2015 19:33:29 -0500</pubDate><guid>https://bravenewgeek.com/distributed-systems-are-a-ux-problem/</guid><description>&lt;p&gt;Distributed systems are not strictly an engineering problem. It’s far too easy to assume a “backend” development concern, but the reality is there are implications at every point in the stack. Often the trade-offs we make lower in the stack in order to buy responsiveness bubble up to the top—so much, in fact, that it rarely &lt;em&gt;doesn’t&lt;/em&gt; impact the application in some way. Distributed systems affect the user. We need to shift the focus from system properties and guarantees to business rules and application behavior. We need to understand the limitations and trade-offs at each level in the stack and why they exist. We need to assume failure and plan for recovery. &lt;strong&gt;We need to start thinking of distributed systems as a UX problem.&lt;/strong&gt;&lt;/p&gt;</description></item><item><title>CAP and the Illusion of Choice</title><link>https://bravenewgeek.com/cap-and-the-illusion-of-choice/</link><pubDate>Sat, 18 Apr 2015 11:58:27 -0500</pubDate><guid>https://bravenewgeek.com/cap-and-the-illusion-of-choice/</guid><description>&lt;p&gt;The CAP theorem is widely discussed and often misunderstood within the world of distributed systems. It states that any networked, shared-data system can, at most, guarantee two of three properties: consistency, availability, and partition tolerance. I won’t go into detail on CAP since the literature is abundant, but the notion of “two of three”—while conceptually accessible—is utterly misleading. &lt;a href="http://www.infoq.com/articles/cap-twelve-years-later-how-the-rules-have-changed"&gt;Brewer has indicated this&lt;/a&gt;, echoed by many more, but there still seems to be a lot of confusion when the topic is brought up. The bottom line is &lt;a href="http://codahale.com/you-cant-sacrifice-partition-tolerance/"&gt;you can’t sacrifice partition tolerance&lt;/a&gt;, but it seems CAP is a bit more nuanced than that.&lt;/p&gt;</description></item></channel></rss>