p
pratik
@pratikgajjar
Factlib: Bulletproof Microservices Messaging Using the Outbox Pattern and PostgreSQL WAL
Submitted Apr 20, 2025
Topic of your submission:
Distributed systems
Type of submission:
Demo - side project; open source project; something I have built in my org
I am submitting for:
Rootconf Annual Conference 2025
Building Reliable Microservices at Scale with Factlib
In the world of microservices, ensuring reliable message delivery between services remains a significant challenge. We developed Factlib to tackle this problem head-on by implementing the outbox pattern - a battle-tested approach for achieving reliable message delivery with transactional guarantees. Factlib leverages PostgreSQL’s Write-Ahead Log (WAL) for high-performance, low-latency event capture, avoiding the traditional polling overhead while maintaining strong consistency guarantees.
This talk dives into Factlib’s architecture, demonstrating how we combined PostgreSQL’s WAL capabilities with Kafka for message distribution, wrapped in a clean Golang API using Protocol Buffers. We’ll walk through real implementation examples, performance characteristics, and the challenges we overcame when building a production-grade solution that processes millions of transactions daily.
Key Takeaways
- Understand how to implement the outbox pattern using PostgreSQL WAL for reliable, high-throughput microservices communication
- Learn practical strategies for achieving exactly-once delivery semantics in distributed systems without sacrificing performance
Target Audience
This talk is ideal for backend engineers, distributed systems architects, and database specialists who work with microservices architectures and face challenges with cross-service data consistency. It will be especially valuable for teams using PostgreSQL who want to level up their event-driven architecture implementations.
Speaker Bio
Pratik is Engineering Lead at TriOTech (FamApp), where I focus on building scalable distributed systems.
{{ gettext('Login to leave a comment') }}
{{ gettext('Post a comment…') }}{{ errorMsg }}
{{ gettext('No comments posted yet') }}