pg-walstream
A high-performance Rust library for PostgreSQL logical replication protocol parsing and streaming. This library provides a robust, type-safe interface for consuming PostgreSQL Write-Ahead Log (WAL) streams.
Features
- Full Protocol Support: Implements PostgreSQL logical replication protocol versions 1-4
- Streaming Transactions: Support for streaming large transactions (protocol v2+)
- Two-Phase Commit: Prepared transaction support (protocol v3+)
- Parallel Streaming: Multi-stream parallel replication (protocol v4+)
- Zero-Copy Operations: Efficient buffer management using the
bytescrate - Thread-Safe LSN Tracking: Atomic LSN feedback for producer-consumer patterns
- Connection Management: Built-in connection handling with exponential backoff retry logic
- Type-Safe API: Strongly typed message parsing with comprehensive error handling
Installation
Add this to your Cargo.toml:
[]
= "0.1.0"
System Dependencies
Make sure you have libpq development libraries installed:
Ubuntu/Debian:
CentOS/RHEL/Fedora:
# or
Quick Start
Complete Replication Stream
use ;
use Arc;
use Duration;
async
LSN Tracking
Thread-safe LSN tracking for feedback to PostgreSQL:
use SharedLsnFeedback;
use Arc;
let feedback = new_shared;
// Producer thread: read LSN from feedback
let = feedback.get_feedback_lsn;
// Consumer thread: update LSN after processing
feedback.update_applied_lsn;
PostgreSQL Setup
Before using this library, you need to configure PostgreSQL for logical replication:
1. Configure PostgreSQL
Edit postgresql.conf:
wal_level = logical
max_replication_slots = 4
max_wal_senders = 4
Restart PostgreSQL after making these changes.
2. Create a Publication
-- Create a publication for specific tables
CREATE PUBLICATION my_publication FOR TABLE users, orders;
-- Or publish all tables
CREATE PUBLICATION my_publication FOR ALL TABLES;
3. Create Replication User
-- Create a user with replication privileges
;
-- Grant necessary permissions
SELECT ON ALL TABLES IN SCHEMA public TO replication_user;
USAGE ON SCHEMA public TO replication_user;
Message Types
The library supports all PostgreSQL logical replication message types:
Protocol Version 1 Messages
- BEGIN: Transaction start
- COMMIT: Transaction commit
- ORIGIN: Replication origin
- RELATION: Table schema definition
- TYPE: Data type definition
- INSERT: Row insertion
- UPDATE: Row update
- DELETE: Row deletion
- TRUNCATE: Table truncation
- MESSAGE: Generic message
Protocol Version 2+ Messages (Streaming)
- STREAM_START: Streaming transaction start
- STREAM_STOP: Streaming transaction segment end
- STREAM_COMMIT: Streaming transaction commit
- STREAM_ABORT: Streaming transaction abort
Protocol Version 3+ Messages (Two-Phase Commit)
- BEGIN_PREPARE: Prepared transaction start
- PREPARE: Transaction prepare
- COMMIT_PREPARED: Commit prepared transaction
- ROLLBACK_PREPARED: Rollback prepared transaction
- STREAM_PREPARE: Stream prepare message
The project includes 95 comprehensive unit tests covering:
- Protocol message parsing
- Buffer operations
- LSN tracking and thread safety
- Error handling
- Retry logic
- Type conversions
Architecture
┌─────────────────────────────────────────┐
│ Application Layer │
│ (Your CDC / Replication Logic) │
└──────────────┬──────────────────────────┘
│
┌──────────────▼──────────────────────────┐
│ LogicalReplicationStream │
│ - Connection management │
│ - Event processing │
│ - LSN feedback │
└──────────────┬──────────────────────────┘
│
┌──────────────▼──────────────────────────┐
│ LogicalReplicationParser │
│ - Protocol parsing │
│ - Message deserialization │
└──────────────┬──────────────────────────┘
│
┌──────────────▼──────────────────────────┐
│ BufferReader / BufferWriter │
│ - Zero-copy operations │
│ - Binary protocol handling │
└─────────────────────────────────────────┘
Performance Considerations
- Zero-Copy: Uses
bytes::Bytesfor efficient buffer management - Atomic Operations: Thread-safe LSN tracking with minimal overhead
- Connection Pooling: Reusable connection with automatic retry
- Streaming Support: Handle large transactions without memory issues
Limitations
- Requires PostgreSQL 14 or later for full protocol support
- Logical replication slot must be created before streaming
- Binary protocol only (no text-based protocol support)
- Requires
replicationpermission for the database user
Resources
- PostgreSQL Logical Replication Documentation
- Logical Replication Message Formats
- Replication Protocol
Contributing
Contributions are welcome! Please feel free to submit a Pull Request.
Author
Daniel Shih (dog830228@gmail.com)