Building larger systems often requires connecting decoupled services, deploying containerized applications, and managing data across multiple distributed and replicated data stores. Deploying and managing these systems creates new challenges in terms of scalability, observability, and maintainability. This collection of articles covers various aspects of designing and scaling distributed systems, from communicating between services to handling long-running jobs and improving cache hit ratios.
Understanding When to Use Redis
Sharding high-throughput Redis without downtime
Enhancing Scalability and Reducing Latency Without Missing a Beat
Harnessing the Power of Go Interfaces for Decoupling and Scaling at Inngest
Zero-Downtime Migrations in Producer/Consumer Systems
Derisking Product Rollouts with Feature Flags
Using Static Code Analysis to Share Types Between Services
Offloading Execution Flow to the Database
Balancing Normalization and Revision History
Handling Long-Running Jobs with AWS SQS
Reducing Database Round-Trips with Boring Queries
Communicating between services with gRPC
Paginating Large, Ordered Data Sets with Cursor-Based Pagination
Choosing an Implementation for Unique Identifiers
Implementing Transactions with Side Effects
Communicating between Java and Go using gRPC
Efficient Caching with Reduced Roundtrips
Boring Technologies, Reliable Foundations
Improving Cache Hit Ratios with Connected DataLoaders
Efficient Caching with Reduced Roundtrips
Versioning Features for Sustainable Product Evolution
Designing APIs to Last