ulak

支持可靠异步投递的 PostgreSQL 事务型 Outbox 扩展

概览

扩展包名版本分类许可证语言
ulak0.0.2FEATApache-2.0C
ID扩展名BinLibLoadCreateTrustReloc模式
2680ulakulak

preload required

版本

类型仓库版本PG 大版本包名依赖
EXTPIGSTY0.0.21817161514ulak-
RPMPIGSTY0.0.21817161514ulak_$v-
DEBPIGSTY0.0.21817161514postgresql-$v-ulak-
OS / PGPG18PG17PG16PG15PG14
el8.x86_64
el8.aarch64
el9.x86_64
el9.aarch64
el10.x86_64
el10.aarch64
d12.x86_64
d12.aarch64
d13.x86_64
d13.aarch64
u22.x86_64
u22.aarch64
u24.x86_64
u24.aarch64

构建

您可以使用 pig build 命令构建 ulak 扩展的 RPM / DEB 包:

pig build pkg ulak         # 构建 RPM / DEB 包

安装

您可以直接安装 ulak 扩展包的预置二进制包,首先确保 PGDGPIGSTY 仓库已经添加并启用:

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 也记录了 kafkamqttredisamqpnats 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:

  • workers
  • poll_interval
  • batch_size
  • max_queue_size
  • circuit_breaker_threshold
  • circuit_breaker_cooldown
  • http_timeout
  • dlq_retention_days

说明

v0.0.2 release notes 只记录了 Docker publish workflow 修复,因此当前 README 和 wiki 仍是用户侧最权威的使用来源。


最后修改 2026-04-19: update extension stub docs (aa5941a)