<?xml version="1.0" encoding="utf-8" standalone="yes"?><rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom"><channel><title>Backend on Lorbic</title><link>http://localhost:1313/tags/backend/</link><description>Recent content in Backend on Lorbic</description><generator>Hugo</generator><language>en</language><lastBuildDate>Sun, 09 Aug 2026 14:00:00 +0530</lastBuildDate><atom:link href="http://localhost:1313/tags/backend/index.xml" rel="self" type="application/rss+xml"/><item><title>Designing a Distributed Job Scheduler in Go: Partitioning, Locking, and Backpressure</title><link>http://localhost:1313/designing-a-distributed-job-scheduler/</link><pubDate>Sun, 09 Aug 2026 14:00:00 +0530</pubDate><guid>http://localhost:1313/designing-a-distributed-job-scheduler/</guid><description>&lt;p>Linux &lt;code>crontab&lt;/code> is one of the most elegant pieces of software ever written for single-host automation. It is simple, clear, and has kept Unix systems running reliably since 1975.&lt;/p>
&lt;p>The problem starts when we take a single-host tool and deploy it across a multi-node cloud setup.&lt;/p>
&lt;p>In &lt;a href="http://localhost:1313/how-multi-tenant-saas-works/">Relay&lt;/a>, a multi-tenant AI API gateway system design, background jobs power core operations: every top of the hour, a job rolls up raw API usage tokens into tenant billing metrics; every 15 minutes, another job scans for expired API keys and purges them from cache; every 30 seconds, a health checker pings upstream LLM provider endpoints.&lt;/p></description></item><item><title>Designing a Usage-Based Billing Pipeline for SaaS</title><link>http://localhost:1313/designing-a-usage-based-billing-pipeline-for-saas/</link><pubDate>Sat, 01 Aug 2026 17:26:52 +0530</pubDate><guid>http://localhost:1313/designing-a-usage-based-billing-pipeline-for-saas/</guid><description>&lt;p>In &lt;a href="http://localhost:1313/posts/2026-07-01-how-multi-tenant-saas-works/" data-preview-title="How Multi-Tenant SaaS Actually Works" data-preview-desc="A complete system design of Relay, a multi-tenant AI API gateway. Covers multi-tenant database architecture (silo vs pool vs bridge), API key authentication, provider routing with failover, dual-layer rate limiting, token-based billing, response caching, row-level security, tenant provisioning, and observability. Full Postgres schemas, mermaid diagrams, and Go snippets included." data-preview-time="37 min read">How Multi-Tenant SaaS Actually Works&lt;/a>, I left one major promise unfulfilled at the end: &lt;em>&amp;ldquo;Billing is an entire system design on its own. The billing pipeline gets its own post.&amp;rdquo;&lt;/em>&lt;/p></description></item><item><title>Couchbase Index Best Practices and Query Performance Tuning</title><link>http://localhost:1313/couchbase-index-best-practices-performance-tuning/</link><pubDate>Fri, 31 Jul 2026 23:00:00 +0530</pubDate><guid>http://localhost:1313/couchbase-index-best-practices-performance-tuning/</guid><description>&lt;p>Most Couchbase performance tickets I have seen end the same way: someone adds more nodes, the dashboard looks a little better for a week, and the same query shows up in the slow log a month later. The node count was never the problem. The index was.&lt;/p>
&lt;p>This is a working reference, not an essay. I already wrote &lt;a href="http://localhost:1313/what-couchbase-taught-me-about-system-thinking/">the reflective version&lt;/a> of what indexing in Couchbase teaches you about systems in general. This post skips the reflection and gets straight to the decisions: which index type to reach for, how to order composite keys, how to tell if a query is actually using what you built, and which four or five mistakes account for most of the slow queries you will ever debug. Couchbase&amp;rsquo;s own documentation is the primary source for the recommendations below. Every example runs against &lt;code>travel-sample&lt;/code>, the sample bucket Couchbase ships with every install, so you can paste these into your own cluster and see the plan yourself.&lt;/p></description></item><item><title>API Design for Backend Systems</title><link>http://localhost:1313/api-design-for-backend-systems/</link><pubDate>Sun, 26 Jul 2026 19:00:00 +0530</pubDate><guid>http://localhost:1313/api-design-for-backend-systems/</guid><description>&lt;p>A few weeks ago I designed &lt;a href="http://localhost:1313/how-multi-tenant-saas-works/">Relay&lt;/a>, a multi-tenant AI API gateway, as a system design exercise. That post covered the database, the auth, the billing. It did not cover the thing every one of those systems is sitting behind: the API itself.&lt;/p>
&lt;p>Here is the question that post left open. When someone builds &lt;code>GET /v1/requests&lt;/code> to list a tenant&amp;rsquo;s API call history, what should that endpoint actually look like? Offset or cursor pagination? What does the response envelope contain? What happens when Relay needs to add a filter that does not fit in a query string? What does a webhook payload look like when Relay tells a tenant &amp;ldquo;your batch job finished&amp;rdquo;? None of that is specific to AI gateways. It is the same decisions every backend API makes, made badly often enough that &amp;ldquo;REST API&amp;rdquo; has become a phrase that means &amp;ldquo;JSON over HTTP, structure unspecified.&amp;rdquo;&lt;/p></description></item><item><title>Cache-Driven Development: Saving Your Database From Itself</title><link>http://localhost:1313/cache-driven-development/</link><pubDate>Wed, 22 Jul 2026 12:00:00 +0530</pubDate><guid>http://localhost:1313/cache-driven-development/</guid><description>&lt;p>There is a moment in every backend engineer&amp;rsquo;s life when their database starts refusing connections.&lt;/p>
&lt;p>Picture 2 a.m. on a Tuesday. The app is operating under normal traffic, nothing unusual. But the database connection pool is saturated. Queries are timing out. The monitoring dashboard shows 50,000 database operations per second, far beyond what the system should be handling.&lt;/p>
&lt;p>When someone pulls the slow-query logs, the pattern is immediately clear. The same query appears thousands of times:&lt;/p></description></item><item><title>Designing a Distributed Rate Limiter with Redis</title><link>http://localhost:1313/designing-a-rate-limiter/</link><pubDate>Tue, 07 Jul 2026 17:00:00 +0530</pubDate><guid>http://localhost:1313/designing-a-rate-limiter/</guid><description>&lt;p>There is a class of bugs that only happen at midnight.&lt;/p>
&lt;p>Your API has a rate limit: 1000 requests per minute. A client hits 999 at 11:59:59 PM, then fires another 999 at 12:00:00 AM. Two windows, two clean counters, all 1998 requests allowed. Your database gets a spike it was never designed to handle, and you spend the next hour wondering how your rate limiter let this through.&lt;/p>
&lt;p>It did let it through. You just did not know it.&lt;/p></description></item><item><title>How Multi-Tenant SaaS Actually Works</title><link>http://localhost:1313/how-multi-tenant-saas-works/</link><pubDate>Wed, 01 Jul 2026 00:00:00 +0530</pubDate><guid>http://localhost:1313/how-multi-tenant-saas-works/</guid><description>&lt;p>For the past month I have been reading about multi-tenant SaaS architecture. Not as an academic exercise. I kept running into the same questions on every project I looked at: where exactly does tenant data go, how do you stop one customer&amp;rsquo;s bug from becoming every customer&amp;rsquo;s problem, how does billing actually work at the database level. The blog posts I found were either too abstract or skipped the hard parts entirely.&lt;/p></description></item><item><title>Python Background Workers: Architecture, Queues, and Retry Strategies</title><link>http://localhost:1313/building-production-ready-background-workers-in-python/</link><pubDate>Sun, 01 Feb 2026 13:00:00 +0530</pubDate><guid>http://localhost:1313/building-production-ready-background-workers-in-python/</guid><description>&lt;p>I thought processing audio in the background was simple: spawn a thread, run the script, save the file. Then I hit 200 concurrent requests, and it failed epically.&lt;/p>
&lt;p>The CPU spiked to full usage because of pydub&amp;rsquo;s processing. The TTS API didn&amp;rsquo;t rate-limit me but, it was horribly slow. Then the jobs started failing. Half the jobs died silently. The other half wrote corrupted files because of race conditions I didn&amp;rsquo;t know existed. And when I deployed a little fix? The deployment killed in-flight jobs, leaving orphaned audio segments scattered across cloud storage directory.&lt;/p></description></item></channel></rss>