<?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>Messaging on Brave New Geek</title><link>https://bravenewgeek.com/category/messaging/</link><description>Recent content in Messaging 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/messaging/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>Microservice Observability, Part 2: Evolutionary Patterns for Solving Observability Problems</title><link>https://bravenewgeek.com/microservice-observability-part-2-evolutionary-patterns-for-solving-observability-problems/</link><pubDate>Fri, 03 Jan 2020 14:18:10 -0600</pubDate><guid>https://bravenewgeek.com/microservice-observability-part-2-evolutionary-patterns-for-solving-observability-problems/</guid><description>&lt;p&gt;In &lt;a href="https://bravenewgeek.com/microservice-observability-part-1-disambiguating-observability-and-monitoring/"&gt;part one&lt;/a&gt; of this series, I described the difference between monitoring and observability and why the latter starts to become more important when dealing with microservices. Next, we’ll discuss some strategies and patterns for &lt;em&gt;implementing&lt;/em&gt; better observability. Specifically, we’ll look at the idea of an &lt;a href="https://bravenewgeek.com/the-observability-pipeline/"&gt;observability pipeline&lt;/a&gt; and how we can start to iteratively improve observability in our systems.&lt;/p&gt;
&lt;p&gt;To recap, observability can be described simply as the ability to ask questions of your systems without knowing those questions in advance. This requires capturing a variety of signals such as logs, metrics, and traces as well as tools for interpreting those signals like log analysis, SIEM, data warehouses, and time-series databases. A number of challenges surface as a result of this. &lt;a href="https://twitter.com/clintsharp"&gt;Clint Sharp&lt;/a&gt; does a great job &lt;a href="https://cribl.io/blog/the-observability-pipeline/"&gt;discussing&lt;/a&gt; the key problems, which I’ll summarize below along with some of my own observations.&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>Building a Distributed Log from Scratch, Part 5: Sketching a New System</title><link>https://bravenewgeek.com/building-a-distributed-log-from-scratch-part-5-sketching-a-new-system/</link><pubDate>Tue, 23 Jan 2018 12:08:53 -0600</pubDate><guid>https://bravenewgeek.com/building-a-distributed-log-from-scratch-part-5-sketching-a-new-system/</guid><description>&lt;p&gt;In &lt;a href="https://bravenewgeek.com/building-a-distributed-log-from-scratch-part-4-trade-offs-and-lessons-learned/"&gt;part four&lt;/a&gt; of this series we looked at some key trade-offs involved with a distributed log implementation and discussed a few lessons learned while building NATS Streaming. In this fifth and final installment, we’ll conclude by outlining the design for a new log-based system that draws from the previous entries in the series.&lt;/p&gt;
&lt;h3 id="the-context"&gt;The Context&lt;/h3&gt;
&lt;p&gt;For context, &lt;a href="https://nats.io/"&gt;NATS&lt;/a&gt; and &lt;a href="https://nats.io/documentation/streaming/nats-streaming-intro/"&gt;NATS Streaming&lt;/a&gt; are two different things. NATS Streaming is a log-based streaming system built on top of NATS, and NATS is a lightweight pub/sub messaging system. NATS was originally built (and then open sourced) as the control plane for Cloud Foundry. NATS Streaming was built in response to the community’s ask for higher-level guarantees—durability, at-least-once delivery, and so forth—beyond what NATS provided. It was built as a separate layer on top of NATS. I tend to describe NATS as a dial tone—ubiquitous and always on—perfect for “online” communications. NATS Streaming is the voicemail—leave a message after the beep and someone will get to it later. There are, of course, more nuances than this, but that’s the gist.&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>Thrift on Steroids: A Tale of Scale and Abstraction</title><link>https://bravenewgeek.com/thrift-on-steroids-a-tale-of-scale-and-abstraction/</link><pubDate>Thu, 30 Nov 2017 19:49:24 -0600</pubDate><guid>https://bravenewgeek.com/thrift-on-steroids-a-tale-of-scale-and-abstraction/</guid><description>&lt;p&gt;&lt;a href="https://thrift.apache.org/"&gt;Apache Thrift&lt;/a&gt; is an RPC framework developed at Facebook for building “scalable cross-language services.” It consists of an interface definition language (IDL), communication protocol, API libraries, and a code generator that allows you to build and evolve services independently and in a polyglot fashion across a wide range of languages. This is nothing new and has been around for over a decade now.&lt;/p&gt;
&lt;p&gt;There are a number of notable users of Thrift aside from Facebook, including Twitter (mainly by way of &lt;a href="https://twitter.github.io/finagle/"&gt;Finagle&lt;/a&gt;), Foursquare, Pinterest, Uber (via &lt;a href="https://uber.github.io/tchannel/"&gt;TChannel&lt;/a&gt;), and Evernote, among others—and for good reason, Thrift is mature and battle-tested.&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>Fast Topic Matching</title><link>https://bravenewgeek.com/fast-topic-matching/</link><pubDate>Wed, 28 Dec 2016 17:52:30 -0600</pubDate><guid>https://bravenewgeek.com/fast-topic-matching/</guid><description>&lt;p&gt;A common problem in messaging middleware is that of efficiently matching message topics with interested subscribers. For example, assume we have a set of subscribers, numbered 1 to 3:&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Subscriber&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Match Request&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;1&lt;/p&gt;
&lt;p&gt;forex.usd&lt;/p&gt;
&lt;p&gt;2&lt;/p&gt;
&lt;p&gt;forex.*&lt;/p&gt;
&lt;p&gt;3&lt;/p&gt;
&lt;p&gt;stock.nasdaq.msft&lt;/p&gt;
&lt;p&gt;And we have a stream of messages, numbered 1 to N:&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Message&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Topic&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;1&lt;/p&gt;
&lt;p&gt;forex.gbp&lt;/p&gt;
&lt;p&gt;2&lt;/p&gt;
&lt;p&gt;stock.nyse.ibm&lt;/p&gt;
&lt;p&gt;3&lt;/p&gt;
&lt;p&gt;stock.nyse.ge&lt;/p&gt;
&lt;p&gt;4&lt;/p&gt;
&lt;p&gt;forex.eur&lt;/p&gt;
&lt;p&gt;5&lt;/p&gt;
&lt;p&gt;forex.usd&lt;/p&gt;
&lt;p&gt;…&lt;/p&gt;
&lt;p&gt;…&lt;/p&gt;
&lt;p&gt;N&lt;/p&gt;
&lt;p&gt;stock.nasdaq.msft&lt;/p&gt;
&lt;p&gt;We are then tasked with routing messages whose topics match the respective subscriber requests, where a “&lt;em&gt;*”&lt;/em&gt; wildcard matches any word. This is frequently a bottleneck for message-oriented middleware like ZeroMQ, RabbitMQ, ActiveMQ, TIBCO EMS, et al. Because of this, there are a number of &lt;a href="http://zeromq.org/whitepapers:message-matching"&gt;well-known&lt;/a&gt; &lt;a href="http://wso2.com/library/articles/2015/05/article-fast-topic-matching-algorithm-implementation-for-wso2-message-broker/"&gt;solutions&lt;/a&gt; &lt;a href="https://www.rabbitmq.com/blog/2010/09/14/very-fast-and-scalable-topic-routing-part-1/"&gt;to the problem&lt;/a&gt;. In this post, I’ll describe some of these solutions, as well as a novel one, and attempt to quantify them through benchmarking. As usual, the code is available &lt;a href="https://github.com/tylertreat/fast-topic-matching"&gt;on GitHub&lt;/a&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>Benchmarking Commit Logs</title><link>https://bravenewgeek.com/benchmarking-commit-logs/</link><pubDate>Sun, 27 Nov 2016 13:28:55 -0600</pubDate><guid>https://bravenewgeek.com/benchmarking-commit-logs/</guid><description>&lt;p&gt;In this article, we look at &lt;a href="https://kafka.apache.org/"&gt;Apache Kafka&lt;/a&gt; and &lt;a href="http://nats.io/"&gt;NATS Streaming&lt;/a&gt;, two messaging systems based on the idea of a commit log. We’ll compare some of the features of both but spend less time talking about Kafka since by now it’s quite well known. Similar to &lt;a href="https://bravenewgeek.com/benchmarking-message-queue-latency/"&gt;previous&lt;/a&gt; &lt;a href="https://bravenewgeek.com/dissecting-message-queues/"&gt;studies&lt;/a&gt;, we’ll attempt to quantify their general performance characteristics through careful benchmarking.&lt;/p&gt;
&lt;p&gt;The purpose of this benchmark is to test drive the newly released NATS Streaming system, which was made generally available just in the last few months. NATS Streaming doesn’t yet support clustering, so we try to put its performance into context by looking at a similar configuration of Kafka.&lt;/p&gt;</description></item><item><title>Benchmarking Message Queue Latency</title><link>https://bravenewgeek.com/benchmarking-message-queue-latency/</link><pubDate>Sat, 13 Feb 2016 16:23:39 -0600</pubDate><guid>https://bravenewgeek.com/benchmarking-message-queue-latency/</guid><description>&lt;p&gt;About a year and a half ago, I published &lt;a href="https://bravenewgeek.com/dissecting-message-queues/"&gt;Dissecting Message Queues&lt;/a&gt;, which broke down a few different messaging systems and did some performance benchmarking. It was a naive attempt and had &lt;a href="https://bravenewgeek.com/benchmark-responsibly/"&gt;a lot of problems&lt;/a&gt;, but it was also my first time doing any kind of system benchmarking. It turns out benchmarking systems correctly is actually pretty difficult and many folks get it wrong. I don’t claim to have gotten it right, but over the past year and a half I’ve learned a lot, tried to build some better tools, and improve my methodology.&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>Breaking and Entering: Lose the Lock While Embracing Concurrency</title><link>https://bravenewgeek.com/breaking-and-entering-lose-the-lock-while-embracing-concurrency/</link><pubDate>Sun, 27 Dec 2015 19:12:53 -0600</pubDate><guid>https://bravenewgeek.com/breaking-and-entering-lose-the-lock-while-embracing-concurrency/</guid><description>&lt;p&gt;&lt;em&gt;This article originally appeared on Workiva’s engineering blog as a &lt;a href="https://techblog.workiva.com/tech-blog/breaking-and-entering-lose-lock-while-embracing-concurrency-part-i"&gt;two-part series&lt;/a&gt;.&lt;/em&gt;&lt;/p&gt;
&lt;p&gt;Providing robust message routing was a priority for us at Workiva when building our distributed messaging infrastructure. This encompassed directed messaging, which allows us to route messages to specific endpoints based on service or client identifiers, but also topic fan-out with support for wildcards and pattern matching.&lt;/p&gt;
&lt;p&gt;Existing message-oriented middleware, such as RabbitMQ, provide varying levels of support for these but don’t offer the rich features needed to power Wdesk. This includes transport fallback with graceful degradation, tunable qualities of service, support for client-side messaging, and pluggable authentication middleware. As such, we set out to build a new system, not by reinventing the wheel, but by repurposing it.&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>Fast, Scalable Networking in Go with Mangos</title><link>https://bravenewgeek.com/fast-scalable-networking-in-go-with-mangos/</link><pubDate>Sat, 10 Jan 2015 17:21:19 -0600</pubDate><guid>https://bravenewgeek.com/fast-scalable-networking-in-go-with-mangos/</guid><description>&lt;p&gt;In the past, I’ve looked at nanomsg and why it’s a formidable alternative to the well-regarded &lt;a href="http://www.bravenewgeek.com/distributed-messaging-with-zeromq/"&gt;ZeroMQ&lt;/a&gt;. Like ZeroMQ, nanomsg is a native library which markets itself as a way to build fast and scalable networking layers. I won’t go into detail on how nanomsg accomplishes this since my analysis of it already covers that fairly extensively, but instead I want to talk about a Go implementation of the protocol called &lt;a href="https://github.com/gdamore/mangos"&gt;Mangos&lt;/a&gt;. ((Full disclosure: I am a contributor on the Mangos project, but only because I was a user first!)) If you’re not familiar with nanomsg or Scalability Protocols, I recommend reading my &lt;a href="http://www.bravenewgeek.com/a-look-at-nanomsg-and-scalability-protocols/"&gt;overview&lt;/a&gt; of those first.&lt;/p&gt;</description></item></channel></rss>