ulak
支持可靠异步投递的 PostgreSQL 事务型 Outbox 扩展
概览
| 扩展包名 | 版本 | 分类 | 许可证 | 语言 |
|---|---|---|---|---|
ulak | 0.0.2 | FEAT | Apache-2.0 | C |
| ID | 扩展名 | Bin | Lib | Load | Create | Trust | Reloc | 模式 |
|---|---|---|---|---|---|---|---|---|
| 2680 | ulak | 否 | 是 | 是 | 是 | 否 | 否 | ulak |
preload required
版本
| 类型 | 仓库 | 版本 | PG 大版本 | 包名 | 依赖 |
|---|---|---|---|---|---|
| EXT | PIGSTY | 0.0.2 | 1817161514 | ulak | - |
| RPM | PIGSTY | 0.0.2 | 1817161514 | ulak_$v | - |
| DEB | PIGSTY | 0.0.2 | 1817161514 | postgresql-$v-ulak | - |
构建
您可以使用 pig build 命令构建 ulak 扩展的 RPM / DEB 包:
pig build pkg ulak # 构建 RPM / DEB 包
安装
您可以直接安装 ulak 扩展包的预置二进制包,首先确保 PGDG 和 PIGSTY 仓库已经添加并启用:
pig repo add pgsql -u # 添加仓库并更新缓存
使用 pig 或者是 apt/yum/dnf 安装扩展:
pig install ulak; # 当前活跃 PG 版本安装
pig ext install -y ulak -v 18 # PG 18
pig ext install -y ulak -v 17 # PG 17
pig ext install -y ulak -v 16 # PG 16
pig ext install -y ulak -v 15 # PG 15
pig ext install -y ulak -v 14 # PG 14
dnf install -y ulak_18 # PG 18
dnf install -y ulak_17 # PG 17
dnf install -y ulak_16 # PG 16
dnf install -y ulak_15 # PG 15
dnf install -y ulak_14 # PG 14
apt install -y postgresql-18-ulak # PG 18
apt install -y postgresql-17-ulak # PG 17
apt install -y postgresql-16-ulak # PG 16
apt install -y postgresql-15-ulak # PG 15
apt install -y postgresql-14-ulak # PG 14
预加载配置:
shared_preload_libraries = 'ulak';
创建扩展:
CREATE EXTENSION ulak;
用法
来源:README, wiki, v0.0.2 release
ulak 在 PostgreSQL 内实现 transactional outbox pattern。消息会在事务中写入,然后由后台 worker 异步投递,并带有重试、circuit breaking 和 dead-letter 处理。
启用扩展
-- postgresql.conf
shared_preload_libraries = 'ulak'
CREATE EXTENSION ulak;
README 还展示了在自带 Docker 示例里设置 ulak.database。
定义 Endpoint 并发送消息
SELECT ulak.create_endpoint(
'my-webhook',
'http',
'{"url":"https://httpbin.org/post","method":"POST"}'::jsonb
);
BEGIN;
INSERT INTO orders (id, total) VALUES (1, 99.99);
SELECT ulak.send('my-webhook', '{"order_id":1,"total":99.99}'::jsonb);
COMMIT;
同一套 API 也记录了 kafka、mqtt、redis、amqp 和 nats endpoint 的用法。
投递控制与发布订阅
SELECT ulak.send_with_options(
'my-webhook',
'{"event":"order.created"}'::jsonb,
5,
NOW() + INTERVAL '10 minutes',
'order-123-created',
'550e8400-e29b-41d4-a716-446655440000'::uuid,
NOW() + INTERVAL '1 hour',
'order-123'
);
SELECT ulak.send_batch('my-webhook', ARRAY['{"id":1}'::jsonb, '{"id":2}'::jsonb]);
SELECT ulak.create_event_type('order.created', 'New order placed');
SELECT ulak.subscribe('order.created', 'my-webhook');
SELECT ulak.publish('order.created', '{"order_id":123}'::jsonb);
监控与恢复
SELECT * FROM ulak.health_check();
SELECT * FROM ulak.get_worker_status();
SELECT * FROM ulak.get_endpoint_health();
SELECT * FROM ulak.dlq_summary();
SELECT ulak.redrive_message(42);
SELECT ulak.redrive_endpoint('my-webhook');
SELECT ulak.redrive_all();
SELECT ulak.replay_message(100);
关键配置
README 点名列出了这些 ulak. GUC:
workerspoll_intervalbatch_sizemax_queue_sizecircuit_breaker_thresholdcircuit_breaker_cooldownhttp_timeoutdlq_retention_days
说明
v0.0.2 release notes 只记录了 Docker publish workflow 修复,因此当前 README 和 wiki 仍是用户侧最权威的使用来源。