<?xml version="1.0" encoding="utf-8" standalone="yes"?><rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom"><channel><title>Distributed Systems on Ikwuka Okoye</title><link>https://ikwukao.dev/tags/distributed-systems/</link><description>Recent content in Distributed Systems on Ikwuka Okoye</description><generator>Hugo</generator><language>en-US</language><lastBuildDate>Tue, 11 Aug 2026 00:00:00 +0000</lastBuildDate><atom:link href="https://ikwukao.dev/tags/distributed-systems/index.xml" rel="self" type="application/rss+xml"/><item><title>Building a Concurrent TCP Server in Go: Connections, Deadlines, and Graceful Shutdown</title><link>https://ikwukao.dev/journal/concurrent-tcp-server-go/</link><pubDate>Tue, 11 Aug 2026 00:00:00 +0000</pubDate><guid>https://ikwukao.dev/journal/concurrent-tcp-server-go/</guid><description>&lt;h2 id="building-a-concurrent-tcp-server-in-go-connections-deadlines-and-graceful-shutdown"&gt;Building a Concurrent TCP Server in Go: Connections, Deadlines, and Graceful Shutdown&lt;/h2&gt;
&lt;p&gt;TCP makes it possible to build extremely simple network services.&lt;/p&gt;
&lt;p&gt;Open a listener. Accept a connection. Read bytes. Process them.&lt;/p&gt;
&lt;p&gt;The complexity appears when the server has to do this for many clients at the same time while remaining responsive when clients become slow, disappear unexpectedly, or send data indefinitely.&lt;/p&gt;
&lt;p&gt;That was one of the core engineering problems behind &lt;strong&gt;Strata-Log&lt;/strong&gt;.&lt;/p&gt;</description></item><item><title>Building Distributed Rate Limiting with Redis and Lua</title><link>https://ikwukao.dev/journal/redis-rate-limiting-with-lua/</link><pubDate>Mon, 10 Aug 2026 00:00:00 +0000</pubDate><guid>https://ikwukao.dev/journal/redis-rate-limiting-with-lua/</guid><description>&lt;h2 id="building-distributed-rate-limiting-with-redis-and-lua"&gt;Building Distributed Rate Limiting with Redis and Lua&lt;/h2&gt;
&lt;p&gt;Rate limiting sounds simple until an application runs on more than one machine.&lt;/p&gt;
&lt;p&gt;A single process can keep a counter in memory.&lt;/p&gt;
&lt;p&gt;A distributed gateway cannot rely on local state alone.&lt;/p&gt;
&lt;p&gt;While building Flux-Gateway, I used Redis and Lua scripts to explore how traffic control can remain atomic when multiple gateway instances are operating simultaneously.&lt;/p&gt;
&lt;h2 id="why-local-rate-limiting-is-not-enough"&gt;Why Local Rate Limiting Is Not Enough&lt;/h2&gt;
&lt;p&gt;Imagine two gateway instances:&lt;/p&gt;</description></item><item><title>Designing a Fault-Tolerant API Gateway in Go</title><link>https://ikwukao.dev/journal/designing-a-fault-tolerant-api-gateway-in-go/</link><pubDate>Mon, 10 Aug 2026 00:00:00 +0000</pubDate><guid>https://ikwukao.dev/journal/designing-a-fault-tolerant-api-gateway-in-go/</guid><description>&lt;h2 id="designing-a-fault-tolerant-api-gateway-in-go"&gt;Designing a Fault-Tolerant API Gateway in Go&lt;/h2&gt;
&lt;p&gt;An API gateway sits at an uncomfortable boundary.&lt;/p&gt;
&lt;p&gt;It receives traffic from clients, but the work is usually performed somewhere else. Every request that passes through the gateway eventually depends on downstream services, networks, databases, caches, or other infrastructure.&lt;/p&gt;
&lt;p&gt;That makes the gateway more than a reverse proxy.&lt;/p&gt;
&lt;p&gt;It becomes one of the places where reliability decisions have to be made.&lt;/p&gt;
&lt;p&gt;This is the problem I wanted to explore while building &lt;strong&gt;Flux-Gateway&lt;/strong&gt;, a high-performance API gateway and reverse proxy written in Go.&lt;/p&gt;</description></item><item><title>Designing Strata-Log: Architecture for a High-Throughput Distributed Log Engine</title><link>https://ikwukao.dev/journal/strata-log-architecture/</link><pubDate>Mon, 10 Aug 2026 00:00:00 +0000</pubDate><guid>https://ikwukao.dev/journal/strata-log-architecture/</guid><description>&lt;p&gt;Building a log aggregation system looks deceptively simple at first.&lt;/p&gt;
&lt;p&gt;Accept a connection, read some data, and write it somewhere.&lt;/p&gt;
&lt;p&gt;The difficulty begins when the system has to do that thousands of times concurrently without allowing network traffic, memory allocation, disk I/O, or shutdown behavior to become bottlenecks.&lt;/p&gt;
&lt;p&gt;That problem became the foundation for &lt;strong&gt;Strata-Log&lt;/strong&gt;, an experimental high-throughput distributed log aggregation engine built in Go.&lt;/p&gt;
&lt;p&gt;The project is deliberately focused on the lower layers of the system: TCP connections, concurrency, memory reuse, buffering, disk writes, and graceful shutdown.&lt;/p&gt;</description></item><item><title>Building a Circuit Breaker in Go</title><link>https://ikwukao.dev/journal/building-a-circuit-breaker-in-go/</link><pubDate>Sun, 09 Aug 2026 00:00:00 +0000</pubDate><guid>https://ikwukao.dev/journal/building-a-circuit-breaker-in-go/</guid><description>&lt;h2 id="building-a-circuit-breaker-in-go"&gt;Building a Circuit Breaker in Go&lt;/h2&gt;
&lt;p&gt;A backend service does not operate in isolation.&lt;/p&gt;
&lt;p&gt;Even a relatively simple HTTP handler may depend on databases, caches, authentication services, payment providers, internal APIs, or other microservices.&lt;/p&gt;
&lt;p&gt;When one of those dependencies becomes unhealthy, repeatedly calling it can make the original problem much worse.&lt;/p&gt;
&lt;p&gt;This is where the &lt;strong&gt;circuit breaker pattern&lt;/strong&gt; becomes useful.&lt;/p&gt;
&lt;p&gt;While building Flux-Gateway, I implemented a circuit breaker in Go to explore how a gateway can detect repeated upstream failures and stop sending traffic to a dependency that is already known to be unhealthy.&lt;/p&gt;</description></item><item><title>Building Strata-Log: Designing a High-Throughput Distributed Log Aggregator in Go</title><link>https://ikwukao.dev/journal/building-strata-log/</link><pubDate>Sun, 09 Aug 2026 00:00:00 +0000</pubDate><guid>https://ikwukao.dev/journal/building-strata-log/</guid><description>&lt;h2 id="building-strata-log-designing-a-high-throughput-distributed-log-aggregator-in-go"&gt;Building Strata-Log: Designing a High-Throughput Distributed Log Aggregator in Go&lt;/h2&gt;
&lt;p&gt;Log aggregation looks simple until the volume increases.&lt;/p&gt;
&lt;p&gt;At low traffic levels, accepting a connection, reading log lines, and writing them to disk is straightforward. The problem changes when thousands of clients begin producing data concurrently and the system has to keep accepting connections without allowing slow storage operations to become a bottleneck.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Strata-Log&lt;/strong&gt; started from that problem.&lt;/p&gt;
&lt;p&gt;The goal was to build a high-throughput log aggregation engine in Go that could safely process large numbers of concurrent log streams over raw TCP while keeping memory usage predictable and the architecture understandable.&lt;/p&gt;</description></item><item><title>Designing Fail-Fast Boundaries for Microservices</title><link>https://ikwukao.dev/journal/fail-fast-microservices/</link><pubDate>Sun, 09 Aug 2026 00:00:00 +0000</pubDate><guid>https://ikwukao.dev/journal/fail-fast-microservices/</guid><description>&lt;h2 id="designing-fail-fast-boundaries-for-microservices"&gt;Designing Fail-Fast Boundaries for Microservices&lt;/h2&gt;
&lt;p&gt;One of the easiest mistakes to make in distributed systems is assuming that a failed request is simply a request that returned an error.&lt;/p&gt;
&lt;p&gt;A timeout is more expensive.&lt;/p&gt;
&lt;p&gt;The system may have spent seconds holding connections, goroutines, memory, and other resources before discovering that the dependency could not respond.&lt;/p&gt;
&lt;p&gt;That is why fail-fast behavior is an important reliability mechanism.&lt;/p&gt;
&lt;h2 id="slow-failure-is-still-failure"&gt;Slow Failure Is Still Failure&lt;/h2&gt;
&lt;p&gt;Consider a request travelling through several services:&lt;/p&gt;</description></item><item><title>What Building an AI Agent Taught Me About Backend Engineering</title><link>https://ikwukao.dev/journal/ai-agent-lessons-learned/</link><pubDate>Sun, 09 Aug 2026 00:00:00 +0000</pubDate><guid>https://ikwukao.dev/journal/ai-agent-lessons-learned/</guid><description>&lt;h2 id="what-building-an-ai-agent-taught-me-about-backend-engineering"&gt;What Building an AI Agent Taught Me About Backend Engineering&lt;/h2&gt;
&lt;p&gt;Building an AI agent initially appears to be an exercise in working with language models.&lt;/p&gt;
&lt;p&gt;In practice, much of the work quickly becomes familiar backend engineering.&lt;/p&gt;
&lt;p&gt;Requests need validation.&lt;/p&gt;
&lt;p&gt;State needs to be managed.&lt;/p&gt;
&lt;p&gt;External services need timeouts.&lt;/p&gt;
&lt;p&gt;Failures need to be handled.&lt;/p&gt;
&lt;p&gt;Operations need to be observable.&lt;/p&gt;
&lt;p&gt;Components need clear boundaries.&lt;/p&gt;
&lt;p&gt;The language model adds a new dimension, but many of the underlying engineering principles remain the same.&lt;/p&gt;</description></item></channel></rss>