<?xml version="1.0" encoding="UTF-8"?><rss version="2.0"><channel><title>Upstack Lab Blog</title><description>Engineering notes from building an AI-infrastructure learning platform.</description><link>https://blog.upstacklab.com/</link><language>en-us</language><item><title>A Redis Job Queue Was Enough</title><link>https://blog.upstacklab.com/blog/redis-job-queue-enough/</link><guid isPermaLink="true">https://blog.upstacklab.com/blog/redis-job-queue-enough/</guid><description>We almost reached for Kafka. Then we counted our jobs per second and put BullMQ on Redis instead. Two years later, here is why we have not regretted it.</description><pubDate>Sun, 10 May 2026 00:00:00 GMT</pubDate><category>redis</category><category>infrastructure</category><category>distributed-systems</category><category>devops</category></item><item><title>Write to Postgres Before You Publish the Event</title><link>https://blog.upstacklab.com/blog/write-before-publish/</link><guid isPermaLink="true">https://blog.upstacklab.com/blog/write-before-publish/</guid><description>The order in which you commit a row and publish a real-time event determines whether your UI and your database can ever disagree. Always write first.</description><pubDate>Sat, 25 Apr 2026 00:00:00 GMT</pubDate><category>postgres</category><category>real-time</category><category>distributed-systems</category></item><item><title>Why PgBouncer in Transaction Mode Is the Default</title><link>https://blog.upstacklab.com/blog/pgbouncer-transaction-mode/</link><guid isPermaLink="true">https://blog.upstacklab.com/blog/pgbouncer-transaction-mode/</guid><description>Postgres tops out at a few hundred concurrent connections. Workers and serverless handlers want thousands. Transaction-mode pooling is the cheap fix — and a small set of constraints you have to live with.</description><pubDate>Sun, 12 Apr 2026 00:00:00 GMT</pubDate><category>postgres</category><category>infrastructure</category><category>databases</category></item></channel></rss>