Protecting Architecture with Automated Tests in Python
Learn how to enforce layered architecture in Python projects using PyTestArch for automated architecture tests.
Architecture decisions, service design, and the trade-offs behind them — the judgment half of our writing.
Learn how to enforce layered architecture in Python projects using PyTestArch for automated architecture tests.
Build a rate limiting system for GenAI APIs. Learn token bucket implementation, quota management with Redis, and test multi-level limits with real load scenarios.
Learn practical strategies to prevent Denial of Wallet attacks in GenAI apps. Compare rate limiting algorithms and implement cost-aware protection with actionable checklists.
Prevent Denial of Wallet with cost-aware rate limiting. Learn how heterogeneous request costs shape design, trade-offs, and when to build custom limits.
This post defines the Staff Engineer as a senior IC who leads through influence and broad technical judgment. It offers high-level guidance on architecture, communication, learning, time management, and execution, and calls out common pitfalls to avoid.
Ownership in a services architecture goes beyond code - it also covers design, operations, and evolution. This article covers ownership principles, supporting team structures, and common pitfalls.
Exploring how the word "test" is often used in software development technique names in misleading ways, with examples from Test-Driven Development and Contract Testing.
Learn how to implement a scalable caching layer using Twemproxy, Memcached, and Ketama consistent hashing in Kubernetes. This article provides a practical guide for software architects and developers.
This article evaluates different caching architectures, comparing sidecar containers and dedicated caching proxies. It discusses the evolution of caching from client libraries to advanced proxy layers, highlighting their strengths and limitations in modern application architectures.
This post explores effective ways to manage high traffic and large-scale data by distributing caching responsibilities among multiple nodes. It emphasizes the significance of cache partitioning, contrasts it with data replication, and introduces essential methods like consistent hashing to ensure balanced load distribution.
In this blog post, we explore how embracing slow, analytical thinking, supported by Architecture Decision Records, can lead to more deliberate and durable architectural decisions.
In this short note, we share our thoughts on a panel discussion featuring Daniel Terhorst-North, who compared software development to surgery.
Recently, our team embarked on a major architectural transformation - moving from a monolith to a services-based architecture. As expected, the engineers on our team understood the rationale behind this shift, but the business stakeholders had concerns.
The Transactional Outbox Pattern is widely discussed in theory. In this blog post, we present a reference implementation of the pattern and provide a hands-on guide that bridges the gap between theory and real-world application.
Knot.x serves as a pivotal integration layer, seamlessly blending content and style from Adobe Experience Manager with data from various sources to create sophisticated personalized websites, revolutionizing the construction and performance of digital platforms while offering flexibility and cost savings, making it a widely adopted solution in Adobe Experience Manager (AEM) projects.