This page is deprecated and no longer maintained. Posts that belong to a series now list the full series at the top of the post itself, so the index here may be out of date.

Reading Paths

Series

Curated routes through posts that belong together. Start with a series when you want context instead of a reverse chronological archive.

Kafka vs Redis Streams

Building the same stock ticker twice on real brokers: partitions, consumer groups, delivery semantics, co-partitioning, replication, stream processing, and an honest benchmark.

16 posts
Software Engineering

Kafka or Redis Streams: How to Choose

Choose between Kafka and Redis Streams by checking order, replay, recovery, capacity, and operational requirements.

KafkaRedisSystem Design
Software Engineering

Benchmarking Kafka vs Redis Streams: Throughput and Latency

My Kafka and Redis Streams tests separate throughput from latency and make the limits of a local benchmark explicit.

KafkaRedisSystem Design
Software Engineering

Building a Live Market Dashboard with SSE and Next.js

Connect a shared ticker engine to a Next.js dashboard through Server Sent Events.

KafkaRedisStreaming
Software Engineering

Stateful Streams: Edge vs Level Triggers and OHLC Windows

Store previous prices for edge alerts and group ticks into time windows for OHLC candles.

KafkaRedisStreaming
Software Engineering

Kafka ISR vs Redis Cluster: Replication and Failover

Stop a Kafka broker to test replica failover, then compare that behavior with Redis Cluster sharding.

KafkaRedisDistributed Systems
Software Engineering

Writing a Custom KafkaJS Partition Assigner for Local Joins

Assign matching partitions from two topics to the same KafkaJS consumer so it can join their records locally.

KafkaNode.jsSystem Design
Software Engineering

Co-Partitioning: Same Key, Same Partition, Both Topics

Matching keys, partition counts, and partitioners align records across topics, while local joins also need matching consumer assignments.

KafkaRedisDistributed Systems
Software Engineering

Redis Pub/Sub vs Streams: Ephemeral or Durable

Compare immediate Pub/Sub delivery with stream retention and later reads, including the limits of Redis persistence.

RedisDistributed SystemsSystem Design
Software Engineering

Exactly-Once in Kafka: Idempotent Producers and Transactions

Test producer idempotence and Kafka transactions, including which results a committed reader can see.

KafkaDistributed SystemsSystem Design
Software Engineering

Redis Streams: Stuck Messages, XAUTOCLAIM, and Dead Letters

Inspect pending Redis entries, reclaim idle deliveries with XAUTOCLAIM, and handle repeated failures with a dead letter stream.

RedisDistributed SystemsSystem Design
Software Engineering

At-Least-Once in Kafka: Retries and Dead Letter Queues

Test Kafka commit timing, bounded retries, duplicate processing, and a dead letter queue.

KafkaDistributed SystemsSystem Design
Software Engineering

Redis Streams Consumer Groups: Competing Consumers and PEL

Use XREADGROUP, the Pending Entries List, and XACK to distribute Redis stream entries and track incomplete work.

RedisKafkaDistributed Systems
Software Engineering

Kafka Consumer Groups: Lag, Draining, and Rebalancing

Observe partition assignments, consumer lag, and rebalancing as members join a Kafka group.

KafkaDistributed SystemsSystem Design
Software Engineering

Redis Streams Fundamentals: XADD, Entry IDs, and MAXLEN

Use XADD, entry IDs, stream keys, and MAXLEN to write, read, and retain Redis stream data.

RedisKafkaStreaming
Software Engineering

Kafka Partitions and Keys: Keeping Symbols in Order

Test how Kafka keys select partitions and preserve each symbol's append order.

KafkaDistributed SystemsSystem Design
Software Engineering

Kafka vs Redis Streams: Building a Stock Ticker Twice

I built a stock ticker with Kafka and Redis Streams to compare ordering, recovery, and local joins against real brokers.

KafkaRedisSystem Design

Crypto: age

Opening one small age file layer by layer: the passphrase header, scrypt, ChaCha20-Poly1305, key pairs, and a measured look at how long a brute-force attack takes.

6 posts

Backend Systems and Architecture

Queues, caching, locks, APIs, and the tradeoffs that show up when systems carry real traffic.

24 posts
Software Engineering

Kafka or Redis Streams: How to Choose

Choose between Kafka and Redis Streams by checking order, replay, recovery, capacity, and operational requirements.

KafkaRedisSystem Design
Software Engineering

Benchmarking Kafka vs Redis Streams: Throughput and Latency

My Kafka and Redis Streams tests separate throughput from latency and make the limits of a local benchmark explicit.

KafkaRedisSystem Design
Software Engineering

Building a Live Market Dashboard with SSE and Next.js

Connect a shared ticker engine to a Next.js dashboard through Server Sent Events.

KafkaRedisStreaming
Software Engineering

Stateful Streams: Edge vs Level Triggers and OHLC Windows

Store previous prices for edge alerts and group ticks into time windows for OHLC candles.

KafkaRedisStreaming
Software Engineering

Kafka ISR vs Redis Cluster: Replication and Failover

Stop a Kafka broker to test replica failover, then compare that behavior with Redis Cluster sharding.

KafkaRedisDistributed Systems
Software Engineering

Writing a Custom KafkaJS Partition Assigner for Local Joins

Assign matching partitions from two topics to the same KafkaJS consumer so it can join their records locally.

KafkaNode.jsSystem Design
Software Engineering

Co-Partitioning: Same Key, Same Partition, Both Topics

Matching keys, partition counts, and partitioners align records across topics, while local joins also need matching consumer assignments.

KafkaRedisDistributed Systems
Software Engineering

Redis Pub/Sub vs Streams: Ephemeral or Durable

Compare immediate Pub/Sub delivery with stream retention and later reads, including the limits of Redis persistence.

RedisDistributed SystemsSystem Design
Software Engineering

Exactly-Once in Kafka: Idempotent Producers and Transactions

Test producer idempotence and Kafka transactions, including which results a committed reader can see.

KafkaDistributed SystemsSystem Design
Software Engineering

Redis Streams: Stuck Messages, XAUTOCLAIM, and Dead Letters

Inspect pending Redis entries, reclaim idle deliveries with XAUTOCLAIM, and handle repeated failures with a dead letter stream.

RedisDistributed SystemsSystem Design
Software Engineering

At-Least-Once in Kafka: Retries and Dead Letter Queues

Test Kafka commit timing, bounded retries, duplicate processing, and a dead letter queue.

KafkaDistributed SystemsSystem Design
Software Engineering

Redis Streams Consumer Groups: Competing Consumers and PEL

Use XREADGROUP, the Pending Entries List, and XACK to distribute Redis stream entries and track incomplete work.

RedisKafkaDistributed Systems
Software Engineering

Kafka Consumer Groups: Lag, Draining, and Rebalancing

Observe partition assignments, consumer lag, and rebalancing as members join a Kafka group.

KafkaDistributed SystemsSystem Design
Software Engineering

Redis Streams Fundamentals: XADD, Entry IDs, and MAXLEN

Use XADD, entry IDs, stream keys, and MAXLEN to write, read, and retain Redis stream data.

RedisKafkaStreaming
Software Engineering

Kafka Partitions and Keys: Keeping Symbols in Order

Test how Kafka keys select partitions and preserve each symbol's append order.

KafkaDistributed SystemsSystem Design
Software Engineering

Kafka vs Redis Streams: Building a Stock Ticker Twice

I built a stock ticker with Kafka and Redis Streams to compare ordering, recovery, and local joins against real brokers.

KafkaRedisSystem Design
Software Engineering

Choosing the Right Queue System

Compare job queues, message brokers, event logs, and workflow engines by their delivery and recovery requirements.

System DesignQueuesMessaging
Software Engineering

Caching Strategies: Cache-Aside to Write-Behind

Compare cache patterns by their read path, write path, failure behavior, and risk of stale data.

CachingSystem DesignSoftware Engineering
Software Engineering

PostgreSQL Advisory Locks: What They Do and When to Use Them

Use PostgreSQL advisory locks to coordinate application work, with explicit choices about ownership and lock lifetime.

PostgreSQLDatabaseSystem Design
Software Engineering

PgBoss vs BullMQ: Job Queue Architectures Under the Hood

Compare how PgBoss and BullMQ store, claim, complete, and recover background jobs.

PostgreSQLRedisSystem Design
Software Engineering

API Design: Design-First vs Code-First

Compare writing an API contract before implementation with deriving the contract from code.

API DesignAPI DevelopmentSoftware Engineering
Software Engineering

Welcome to My New Blog: Migrating from WordPress to Next.js

I moved this blog from WordPress to Next.js to control its design, content, and performance.

Software EngineeringNext.jsTypeScript
Algorithms

Leetcode - Logger Rate Limiter Solution

Track the last printed timestamp for each message to enforce a ten second logging interval.

LeetCodeAlgorithmsSystem Design
Software Engineering

SOLID: Good OOP Principles

Examples of the five SOLID principles and the design problems each one addresses.

OOPDesign PatternsSoftware Engineering

Algorithm Patterns

Problem solving patterns from LeetCode, grouped around arrays, linked lists, heaps, stacks, and pointers.

28 posts
Algorithms

Leetcode - Merge k Sorted Lists Solution

Compare sequential, pairwise, and heap methods for merging sorted linked lists.

AlgorithmsLeetCodeLinked Lists
Algorithms

Leetcode - N-Queens II Solution

Count valid queen arrangements with backtracking, column checks, and diagonal masks.

AlgorithmsLeetCodeBacktracking
Algorithms

Leetcode - Valid Number Solution

Compare a regular expression, explicit parsing, a state machine, and boolean flags for validating numeric strings.

AlgorithmsLeetCodeString Processing
Algorithms

Leetcode - Rotate Array Solution

Rotate an array to the right with three reversals and constant extra space.

AlgorithmsLeetCodeArray Manipulation
Algorithms

Leetcode - N-Queens Solution

Use backtracking to find chessboard arrangements where no two queens attack each other.

AlgorithmsLeetCodeBacktracking
Data Structures

Understanding Priority Queue (Min-Heap)

Build a min heap and use it to insert items and remove the smallest item by priority.

Data StructuresAlgorithmsPriority Queue
Algorithms

Leetcode - Candy Solution

Use two passes to assign candies while satisfying each child's comparisons with neighboring ratings.

AlgorithmsLeetCodeGreedy
Algorithms

Leetcode - Best Time to Buy and Sell Stock II Solution

Add each positive price change to find the maximum profit from unlimited stock transactions.

AlgorithmsLeetCodeGreedy
Algorithms

Leetcode - Best Time to Buy and Sell Stock Solution

Track the lowest price seen so far to find the best profit from one stock transaction.

AlgorithmsLeetCodeTwo Pointers
Algorithms

Leetcode - Reverse Linked List Solution

Compare rebuilding a linked list with reversing its existing links in constant extra space.

AlgorithmsLeetCodeLinked Lists
Algorithms

Introduction to In-Place Manipulation of a Linked List

Reverse a linked list by changing its links while preserving access to the remaining nodes.

Data StructuresAlgorithmsLinked Lists
Data Structures

Introduction to Priority Queue

A priority queue selects the next item by priority, with heaps as a common implementation.

Data StructuresAlgorithmsPriority Queue
Algorithms

Leetcode - Container With Most Water Solution

Move two pointers toward each other to find the largest container area in linear time.

AlgorithmsLeetCodeTwo Pointers
Algorithms

Leetcode - Trapping Rain Water Solution

Calculate trapped water from the highest bars on each side, then reduce extra storage with two pointers.

AlgorithmsLeetCodeTwo Pointers
Algorithms

Leetcode - Palindrome Permutation Solution

Count character frequencies to check whether a string has a palindrome permutation.

AlgorithmsLeetCodeFrequency Counting
Algorithms

Introduction to Knowing What to Track

Choose the state an algorithm needs, such as counts, visited values, or the best result so far.

Data StructuresAlgorithmsPatterns
Algorithms

Leetcode - Logger Rate Limiter Solution

Track the last printed timestamp for each message to enforce a ten second logging interval.

LeetCodeAlgorithmsSystem Design
Algorithms

Leetcode - Design HashMap Solution

Build a HashMap with buckets and handle collisions through separate chaining.

LeetCodeAlgorithmsData Structures
Data Structures

Introduction to Hash Map

A hash map stores key and value pairs for lookup, insertion, and deletion.

Data StructuresAlgorithmsHashMap
Algorithms

Leetcode - Implement Queue Using Stacks Solution

Use two stacks to preserve queue order and make each operation amortized constant time.

LeetCodeAlgorithmsData Structures
Algorithms

Leetcode - Remove All Adjacent Duplicates In String Solution

Use a stack to remove adjacent duplicate pairs, including pairs created by earlier removals.

AlgorithmsLeetCodeStack
Data Structures

Introduction to Stacks

A stack removes the most recently added item first, which helps with matching, reversal, and nested operations.

Data StructuresAlgorithmsStack
Algorithms

Leetcode - Linked List Cycle Solution

Compare a visited node set with Floyd's algorithm for detecting cycles in a linked list.

AlgorithmsLeetCodeLinked Lists
Algorithms

Leetcode - Happy Number Solution

Use cycle detection to check whether repeated sums of squared digits reach 1.

AlgorithmsLeetCodeCycle Detection
Algorithms

Fast and Slow Pointers

Use two pointers with different speeds to detect cycles without a collection of visited nodes.

AlgorithmsData StructuresLinked Lists
Algorithms

Leetcode - Sum of Three Values Solution

Sort the array, fix one value, and use two pointers to find three values with the target sum.

AlgorithmsLeetCodeTwo Pointers
Algorithms

Leetcode - Valid Palindrome Solution

Compare characters from both ends while skipping punctuation and ignoring letter case.

AlgorithmsLeetCodeTwo Pointers
Data Structures

Introduction to Two Pointers

Use two array positions to reduce repeated searches when the input structure permits it.

Data StructuresAlgorithmsTwo Pointers

Career, Resilience, and Work

Personal posts about hard seasons, growth, team fit, leadership, and rebuilding after setbacks.

3 posts

Life, Love, and Music

Older personal writing about music, relationships, family, and the emotions that shaped the person behind the work.

5 posts