<?xml version="1.0" encoding="UTF-8"?><rss version="2.0"><channel><title>Engineering</title><description>Architecture, distributed systems, event-driven design, and the craft of principled software engineering.</description><link>https://engineering.david-hayes.com/</link><item><title>Build your own webhook transport</title><link>https://engineering.david-hayes.com/blog/build-your-own-webhook-transport/</link><guid isPermaLink="true">https://engineering.david-hayes.com/blog/build-your-own-webhook-transport/</guid><description>How to build a webhook registry and delivery system on Postgres using outbox rows, delivery attempts, signatures, retries, and inbound inbox rows.</description><pubDate>Thu, 02 Jul 2026 00:00:00 GMT</pubDate></item><item><title>Implement a durable work queue in Postgres</title><link>https://engineering.david-hayes.com/blog/durable-work-postgres/00-introduction/</link><guid isPermaLink="true">https://engineering.david-hayes.com/blog/durable-work-postgres/00-introduction/</guid><description>How to implement common queue and messaging patterns in Postgres: competing consumers, transactional outbox, idempotent handlers, leases, and dead letters.</description><pubDate>Thu, 02 Jul 2026 00:00:00 GMT</pubDate></item><item><title>The claim loop</title><link>https://engineering.david-hayes.com/blog/durable-work-postgres/01-claim-loop/</link><guid isPermaLink="true">https://engineering.david-hayes.com/blog/durable-work-postgres/01-claim-loop/</guid><description>Minimal Postgres claim loop: enqueue, SKIP LOCKED claim, complete, and handler retry with an interactive simulation.</description><pubDate>Thu, 02 Jul 2026 00:00:00 GMT</pubDate></item><item><title>Crash recovery</title><link>https://engineering.david-hayes.com/blog/durable-work-postgres/02-recovery/</link><guid isPermaLink="true">https://engineering.david-hayes.com/blog/durable-work-postgres/02-recovery/</guid><description>Leases, lease cleanup, at-least-once delivery, and handler idempotency for Postgres inbox workers.</description><pubDate>Thu, 02 Jul 2026 00:00:00 GMT</pubDate></item><item><title>Many workers</title><link>https://engineering.david-hayes.com/blog/durable-work-postgres/03-workers/</link><guid isPermaLink="true">https://engineering.david-hayes.com/blog/durable-work-postgres/03-workers/</guid><description>Multi-worker contention, delivery guarantees, and per-key ordering before consistent hash.</description><pubDate>Thu, 02 Jul 2026 00:00:00 GMT</pubDate></item><item><title>Partitioning at scale</title><link>https://engineering.david-hayes.com/blog/durable-work-postgres/04-partitioning/</link><guid isPermaLink="true">https://engineering.david-hayes.com/blog/durable-work-postgres/04-partitioning/</guid><description>Consistent hash, heartbeats, rebalance windows, and multi-worker simulation with ring ownership.</description><pubDate>Thu, 02 Jul 2026 00:00:00 GMT</pubDate></item><item><title>Production controls</title><link>https://engineering.david-hayes.com/blog/durable-work-postgres/05-production/</link><guid isPermaLink="true">https://engineering.david-hayes.com/blog/durable-work-postgres/05-production/</guid><description>Lease renewal, fencing, graceful drain, and housekeeping for Postgres-backed durable work after order:9182 ships.</description><pubDate>Thu, 02 Jul 2026 00:00:00 GMT</pubDate></item><item><title>Choose the right durable-work shape</title><link>https://engineering.david-hayes.com/blog/durable-work-postgres/06-shapes/</link><guid isPermaLink="true">https://engineering.david-hayes.com/blog/durable-work-postgres/06-shapes/</guid><description>How to choose inbox, outbox, projection, CDC, and saga patterns when implementing durable work in Postgres.</description><pubDate>Thu, 02 Jul 2026 00:00:00 GMT</pubDate></item><item><title>Cross-service handoffs</title><link>https://engineering.david-hayes.com/blog/durable-work-postgres/07-handoffs/</link><guid isPermaLink="true">https://engineering.david-hayes.com/blog/durable-work-postgres/07-handoffs/</guid><description>Transactional outbox, transport choices, webhooks, contracts, and when brokers fit. Work that leaves your database commit.</description><pubDate>Thu, 02 Jul 2026 00:00:00 GMT</pubDate></item><item><title>Schema and operations</title><link>https://engineering.david-hayes.com/blog/durable-work-postgres/08-operations/</link><guid isPermaLink="true">https://engineering.david-hayes.com/blog/durable-work-postgres/08-operations/</guid><description>Full Postgres schema, inbox SQL, observability, testing, and schema evolution for order:9182.</description><pubDate>Thu, 02 Jul 2026 00:00:00 GMT</pubDate></item><item><title>Performance and scaling</title><link>https://engineering.david-hayes.com/blog/durable-work-postgres/09-performance/</link><guid isPermaLink="true">https://engineering.david-hayes.com/blog/durable-work-postgres/09-performance/</guid><description>Claim-path tuning, indexes, and an interactive performance tuner for Postgres claim loops.</description><pubDate>Thu, 02 Jul 2026 00:00:00 GMT</pubDate></item><item><title>Build a small durable workflow engine in Postgres</title><link>https://engineering.david-hayes.com/blog/durable-work-postgres/10-workflows/</link><guid isPermaLink="true">https://engineering.david-hayes.com/blog/durable-work-postgres/10-workflows/</guid><description>How to extend a Postgres durable queue into a simple durable workflow engine with workflow definitions, step scheduling, timers, signals, and versioning.</description><pubDate>Thu, 02 Jul 2026 00:00:00 GMT</pubDate></item><item><title>How this fits with DDD, Event Sourcing, CQRS, and sagas</title><link>https://engineering.david-hayes.com/blog/durable-work-postgres/11-enterprise-patterns/</link><guid isPermaLink="true">https://engineering.david-hayes.com/blog/durable-work-postgres/11-enterprise-patterns/</guid><description>How Postgres durable work fits with DDD, domain events, transactional outbox, event sourcing, CQRS projections, sagas, CDC, and workflow engines.</description><pubDate>Thu, 02 Jul 2026 00:00:00 GMT</pubDate></item></channel></rss>