<?xml version="1.0" encoding="utf-8" standalone="yes"?><rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom"><channel><title>Go on Ikwuka Okoye</title><link>https://ikwukao.dev/tags/go/</link><description>Recent content in Go 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/go/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 a High-Throughput TCP Server in Go</title><link>https://ikwukao.dev/journal/strata-log-tcp/</link><pubDate>Tue, 11 Aug 2026 00:00:00 +0000</pubDate><guid>https://ikwukao.dev/journal/strata-log-tcp/</guid><description>&lt;p&gt;When building a high-throughput backend service, it is easy to focus on the application protocol and overlook the network boundary underneath it.&lt;/p&gt;
&lt;p&gt;Strata-Log takes the opposite approach.&lt;/p&gt;
&lt;p&gt;The project uses raw TCP connections as its ingestion layer, making connection handling, timeouts, concurrency, and shutdown behavior explicit.&lt;/p&gt;
&lt;p&gt;That creates a useful engineering environment for understanding what actually happens between a client sending data and a backend processing it.&lt;/p&gt;
&lt;h2 id="why-raw-tcp"&gt;Why Raw TCP?&lt;/h2&gt;
&lt;p&gt;Higher-level protocols and frameworks are valuable because they provide useful abstractions.&lt;/p&gt;</description></item><item><title>Building Platform-Infra: Using Terraform to Manage Local Kubernetes Infrastructure</title><link>https://ikwukao.dev/journal/platform-infra-terraform-kubernetes/</link><pubDate>Tue, 11 Aug 2026 00:00:00 +0000</pubDate><guid>https://ikwukao.dev/journal/platform-infra-terraform-kubernetes/</guid><description>&lt;h2 id="building-platform-infra-using-terraform-to-manage-local-kubernetes-infrastructure"&gt;Building Platform-Infra: Using Terraform to Manage Local Kubernetes Infrastructure&lt;/h2&gt;
&lt;p&gt;Infrastructure becomes difficult to reason about when environments are created through a collection of undocumented commands.&lt;/p&gt;
&lt;p&gt;That problem becomes even more noticeable when several services, containers, configuration files, namespaces, and deployment steps are involved.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Platform-Infra&lt;/strong&gt; started from that observation.&lt;/p&gt;
&lt;p&gt;The project is a master orchestration repository designed to manage the infrastructure and deployment configuration surrounding my backend services using Infrastructure as Code principles.&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 OpsPilot: Building a Modular DevOps Operations Toolkit</title><link>https://ikwukao.dev/journal/designing-opspilot/</link><pubDate>Mon, 10 Aug 2026 00:00:00 +0000</pubDate><guid>https://ikwukao.dev/journal/designing-opspilot/</guid><description>&lt;h2 id="designing-opspilot-building-a-modular-devops-operations-toolkit"&gt;Designing OpsPilot: Building a Modular DevOps Operations Toolkit&lt;/h2&gt;
&lt;p&gt;As backend systems become more complex, the operational work surrounding them becomes increasingly difficult to ignore.&lt;/p&gt;
&lt;p&gt;Running services, inspecting environments, managing containers, checking infrastructure, and performing repetitive maintenance tasks can quickly turn into a collection of shell commands, scripts, and undocumented procedures.&lt;/p&gt;
&lt;p&gt;That was the problem I wanted to explore with &lt;strong&gt;OpsPilot&lt;/strong&gt;.&lt;/p&gt;
&lt;p&gt;Rather than building another collection of unrelated scripts, I wanted to create a structured operations toolkit that could grow alongside the systems it manages.&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 a Reliable REST API Client in Go for PokedexCLI</title><link>https://ikwukao.dev/journal/pokedexcli-api-client/</link><pubDate>Sun, 09 Aug 2026 00:00:00 +0000</pubDate><guid>https://ikwukao.dev/journal/pokedexcli-api-client/</guid><description>&lt;h2 id="building-a-reliable-rest-api-client-in-go-for-pokedexcli"&gt;Building a Reliable REST API Client in Go for PokedexCLI&lt;/h2&gt;
&lt;p&gt;A command-line application becomes considerably more interesting when it has to communicate with a remote service.&lt;/p&gt;
&lt;p&gt;PokedexCLI does not contain all of its data locally. Much of the information the application needs comes from the Pokémon API, which means the application has to deal with HTTP requests, JSON responses, network failures, pagination, and external service boundaries.&lt;/p&gt;
&lt;p&gt;Rather than allowing every command to construct its own HTTP requests, I treated API communication as a dedicated responsibility.&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>Caching API Responses in PokedexCLI: Reducing Network Work in Go</title><link>https://ikwukao.dev/journal/pokedexcli-caching/</link><pubDate>Sun, 09 Aug 2026 00:00:00 +0000</pubDate><guid>https://ikwukao.dev/journal/pokedexcli-caching/</guid><description>&lt;h2 id="caching-api-responses-in-pokedexcli-reducing-network-work-in-go"&gt;Caching API Responses in PokedexCLI: Reducing Network Work in Go&lt;/h2&gt;
&lt;p&gt;One of the easiest performance problems to overlook in an API-driven application is repeated work.&lt;/p&gt;
&lt;p&gt;If an application repeatedly requests the same resource from a remote service, every request introduces network latency and another dependency on the availability of that service.&lt;/p&gt;
&lt;p&gt;PokedexCLI provides a useful environment for exploring this problem because the application repeatedly interacts with the Pokémon API while the user navigates locations and explores areas.&lt;/p&gt;</description></item><item><title>Designing a CLI Architecture for PokedexCLI in Go</title><link>https://ikwukao.dev/journal/pokedexcli-architecture/</link><pubDate>Sun, 09 Aug 2026 00:00:00 +0000</pubDate><guid>https://ikwukao.dev/journal/pokedexcli-architecture/</guid><description>&lt;h2 id="designing-a-cli-architecture-for-pokedexcli-in-go"&gt;Designing a CLI Architecture for PokedexCLI in Go&lt;/h2&gt;
&lt;p&gt;Building a command-line application can look deceptively simple.&lt;/p&gt;
&lt;p&gt;At first, the requirements for PokedexCLI seem straightforward: accept a command, execute it, call the Pokémon API when necessary, and print the result.&lt;/p&gt;
&lt;p&gt;But even a small CLI becomes difficult to maintain when command handling, application state, networking, caching, and presentation logic are allowed to grow together.&lt;/p&gt;
&lt;p&gt;For PokedexCLI, I wanted to approach the problem as a real software-engineering exercise rather than simply building a collection of commands that happened to work.&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 PokedexCLI Taught Me About Backend Engineering in Go</title><link>https://ikwukao.dev/journal/pokedexcli-command-lessons-learned/</link><pubDate>Sun, 09 Aug 2026 00:00:00 +0000</pubDate><guid>https://ikwukao.dev/journal/pokedexcli-command-lessons-learned/</guid><description>&lt;h2 id="what-building-pokedexcli-taught-me-about-backend-engineering-in-go"&gt;What Building PokedexCLI Taught Me About Backend Engineering in Go&lt;/h2&gt;
&lt;p&gt;PokedexCLI began as a relatively small Go application.&lt;/p&gt;
&lt;p&gt;The premise is simple: interact with Pokémon data through a command-line interface.&lt;/p&gt;
&lt;p&gt;But projects do not remain simple merely because their initial requirements are simple.&lt;/p&gt;
&lt;p&gt;As functionality grows, the application has to deal with API communication, pagination, application state, caching, command dispatch, data modeling, errors, and testing.&lt;/p&gt;
&lt;p&gt;That made PokedexCLI valuable as more than a CLI exercise.&lt;/p&gt;</description></item><item><title>Designing This Portfolio as an Engineering Project</title><link>https://ikwukao.dev/journal/designing-this-project/</link><pubDate>Wed, 05 Aug 2026 00:00:00 +0000</pubDate><guid>https://ikwukao.dev/journal/designing-this-project/</guid><description>&lt;p&gt;A technical portfolio should do more than list technologies.&lt;/p&gt;
&lt;p&gt;For an engineer working in backend systems, distributed systems, and platform engineering, the portfolio itself is an opportunity to demonstrate how problems are approached, how systems are designed, and how engineering decisions are communicated.&lt;/p&gt;
&lt;p&gt;That became the foundation for this project.&lt;/p&gt;
&lt;h2 id="more-than-a-portfolio"&gt;More Than a Portfolio&lt;/h2&gt;
&lt;p&gt;The intention behind this site is to present engineering work in a way that reflects the work itself.&lt;/p&gt;</description></item><item><title>Building OpsPilot: Why I Started a DevOps Platform</title><link>https://ikwukao.dev/journal/building-opspilot/</link><pubDate>Tue, 04 Aug 2026 00:00:00 +0000</pubDate><guid>https://ikwukao.dev/journal/building-opspilot/</guid><description>&lt;p&gt;OpsPilot started with a simple question: &lt;strong&gt;what would happen if I built the operational tooling I kept wishing I had?&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;As I continued working across backend engineering, DevOps, and cloud-native infrastructure, I found myself repeatedly dealing with the same categories of operational work. Instead of treating those tasks as isolated scripts and commands, I wanted to explore what it would look like to bring them together into a coherent engineering platform.&lt;/p&gt;</description></item><item><title>PokedexCLI</title><link>https://ikwukao.dev/projects/pokedexcli/</link><pubDate>Wed, 22 Jul 2026 00:00:00 +0000</pubDate><guid>https://ikwukao.dev/projects/pokedexcli/</guid><description>A Go-based CLI project exploring API integration, caching, stateful commands, and clean backend-oriented application structure.</description></item></channel></rss>