<?xml version="1.0" encoding="UTF-8"?><rss version="2.0"><channel><title>Anh Vo</title><description>Notes from a developer who likes to dig until things make sense.</description><link>https://dighard.dev/</link><item><title>3,500 connections to PostgreSQL, and almost none of them working</title><link>https://dighard.dev/posts/tornado-postgres-connections/</link><guid isPermaLink="true">https://dighard.dev/posts/tornado-postgres-connections/</guid><description>Our Tornado app hit PostgreSQL&apos;s connection limit. When I looked closer, most of those connections were just sitting there, idle or stuck in a transaction.</description><pubDate>Wed, 28 Oct 2026 00:00:00 GMT</pubDate><category>postgresql</category><category>python</category><category>tornado</category><category>incident</category></item><item><title>Why I write runbooks and playbooks</title><link>https://dighard.dev/posts/runbooks-and-playbooks/</link><guid isPermaLink="true">https://dighard.dev/posts/runbooks-and-playbooks/</guid><description>A runbook tells you how to do a known task. A playbook tells you how to think when you don&apos;t know what&apos;s wrong yet. I needed both.</description><pubDate>Tue, 20 Oct 2026 00:00:00 GMT</pubDate><category>operations</category><category>incident</category><category>datadog</category><category>postgresql</category></item><item><title>VACUUM in PostgreSQL</title><link>https://dighard.dev/posts/postgresql-vacuum/</link><guid isPermaLink="true">https://dighard.dev/posts/postgresql-vacuum/</guid><description>If PostgreSQL never overwrites a row, where do all the old versions go? And why didn&apos;t my table shrink after I deleted most of it?</description><pubDate>Thu, 24 Sep 2026 00:00:00 GMT</pubDate><category>postgresql</category><category>databases</category><category>operations</category></item><item><title>Understanding MVCC in PostgreSQL</title><link>https://dighard.dev/posts/postgresql-mvcc/</link><guid isPermaLink="true">https://dighard.dev/posts/postgresql-mvcc/</guid><description>What does transaction B see while transaction A is changing the same row? I finally sat down to find out what happens under a simple UPDATE.</description><pubDate>Thu, 10 Sep 2026 00:00:00 GMT</pubDate><category>postgresql</category><category>databases</category><category>internals</category></item><item><title>Deploying during business hours</title><link>https://dighard.dev/posts/zero-downtime-deploys/</link><guid isPermaLink="true">https://dighard.dev/posts/zero-downtime-deploys/</guid><description>Our system takes payments all day, so every deploy meant downtime. Here&apos;s how we got to rolling deploys without Kubernetes, one question at a time.</description><pubDate>Sun, 02 Aug 2026 00:00:00 GMT</pubDate><category>deployment</category><category>traefik</category><category>docker</category><category>postgresql</category></item><item><title>Why UFW doesn&apos;t block Docker ports</title><link>https://dighard.dev/posts/ufw-docker/</link><guid isPermaLink="true">https://dighard.dev/posts/ufw-docker/</guid><description>I denied a port in UFW, but the container behind it was still reachable from the internet. It took me a while to stop blaming UFW and start reading iptables.</description><pubDate>Tue, 21 Jul 2026 00:00:00 GMT</pubDate><category>linux</category><category>docker</category><category>networking</category><category>security</category></item><item><title>A backup is only a hope until you restore it</title><link>https://dighard.dev/posts/restore-your-backups/</link><guid isPermaLink="true">https://dighard.dev/posts/restore-your-backups/</guid><description>We had nightly backups that nobody had ever restored. Then someone asked what we&apos;d get back if we lost the database at 2 PM.</description><pubDate>Sun, 14 Jun 2026 00:00:00 GMT</pubDate><category>postgresql</category><category>backup</category><category>disaster-recovery</category></item><item><title>Hazelcast auto-discovery on Kubernetes</title><link>https://dighard.dev/posts/hazelcast-kubernetes-discovery/</link><guid isPermaLink="true">https://dighard.dev/posts/hazelcast-kubernetes-discovery/</guid><description>Scale a Hazelcast deployment up and the new pods just join the cluster, with no member list anywhere. I liked that it worked. I didn&apos;t like not knowing why.</description><pubDate>Fri, 05 Jun 2026 00:00:00 GMT</pubDate><category>kubernetes</category><category>distributed-systems</category><category>java</category><category>hazelcast</category></item><item><title>Reading Spring Reactive</title><link>https://dighard.dev/posts/spring-reactive/</link><guid isPermaLink="true">https://dighard.dev/posts/spring-reactive/</guid><description>I could read Mono and Flux, but I couldn&apos;t say what they actually bought anyone. So I sat down and figured out what &quot;reactive&quot; really changes.</description><pubDate>Mon, 04 May 2026 00:00:00 GMT</pubDate><category>java</category><category>spring</category><category>concurrency</category></item><item><title>How Docker containers talk to each other</title><link>https://dighard.dev/posts/docker-networking/</link><guid isPermaLink="true">https://dighard.dev/posts/docker-networking/</guid><description>How does a container reach another container, the host, or the internet underneath? What actually carries the packets?</description><pubDate>Wed, 22 Apr 2026 00:00:00 GMT</pubDate><category>docker</category><category>linux</category><category>networking</category></item><item><title>Why we chose Spring Modulith</title><link>https://dighard.dev/posts/spring-modulith/</link><guid isPermaLink="true">https://dighard.dev/posts/spring-modulith/</guid><description>Our customers couldn&apos;t run a dozen microservices, but our monolith was getting tangled. Spring Modulith gave us boundaries without the containers.</description><pubDate>Fri, 20 Mar 2026 00:00:00 GMT</pubDate><category>java</category><category>spring</category><category>architecture</category></item><item><title>Do I really need to think about isolation levels?</title><link>https://dighard.dev/posts/isolation-levels/</link><guid isPermaLink="true">https://dighard.dev/posts/isolation-levels/</guid><description>Just querying the database as usual works, right up until two people try to book the last ticket at the same time.</description><pubDate>Tue, 22 Jul 2025 00:00:00 GMT</pubDate><category>postgresql</category><category>databases</category><category>transactions</category></item><item><title>How SSL/TLS actually works</title><link>https://dighard.dev/posts/how-tls-works/</link><guid isPermaLink="true">https://dighard.dev/posts/how-tls-works/</guid><description>I thought I understood the TLS handshake. Then I dug a little deeper and found out the picture in my head was from an older version of TLS.</description><pubDate>Fri, 14 Mar 2025 00:00:00 GMT</pubDate><category>security</category><category>networking</category><category>tls</category></item><item><title>Prefer dependency injection to hardwiring resources</title><link>https://dighard.dev/posts/dependency-injection-over-hardwiring/</link><guid isPermaLink="true">https://dighard.dev/posts/dependency-injection-over-hardwiring/</guid><description>A static utility class looked tidy, until I tried to test it. Notes on Effective Java&apos;s Item 5, and why it stuck with me.</description><pubDate>Mon, 18 Nov 2024 00:00:00 GMT</pubDate><category>java</category><category>design</category><category>testing</category></item><item><title>Changing annotation values at runtime with Java Reflection</title><link>https://dighard.dev/posts/java-reflection-change-annotation/</link><guid isPermaLink="true">https://dighard.dev/posts/java-reflection-change-annotation/</guid><description>Annotations are supposed to be fixed once the code is compiled. I needed one to change, so I went looking for where Java actually keeps them.</description><pubDate>Tue, 08 Oct 2024 00:00:00 GMT</pubDate><category>java</category><category>reflection</category><category>testing</category></item></channel></rss>