Files
junhong_cmp_fiber/migrations/000165_create_public_outbox.up.sql
2026-07-24 16:07:18 +08:00

67 lines
4.0 KiB
SQL
Raw Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
-- 创建公共 Outbox该表及全部公共索引、约束只由 tech-public-foundation 维护。
CREATE TABLE tb_outbox_event (
id bigserial PRIMARY KEY,
event_id varchar(64) NOT NULL,
event_type varchar(150) NOT NULL,
payload_version integer NOT NULL DEFAULT 1,
aggregate_type varchar(100) NOT NULL,
aggregate_id varchar(100) NOT NULL,
resource_type varchar(100) NOT NULL,
resource_id varchar(100) NOT NULL,
business_key varchar(150) NOT NULL DEFAULT '',
request_id varchar(100) NOT NULL DEFAULT '',
correlation_id varchar(100) NOT NULL DEFAULT '',
payload jsonb NOT NULL,
status integer NOT NULL DEFAULT 1,
retry_count integer NOT NULL DEFAULT 0,
max_retries integer NOT NULL DEFAULT 10,
next_attempt_at timestamptz NOT NULL DEFAULT NOW(),
lease_owner varchar(100),
lease_expires_at timestamptz,
last_error_code varchar(100) NOT NULL DEFAULT '',
last_error_summary varchar(500) NOT NULL DEFAULT '',
delivered_at timestamptz,
created_at timestamptz NOT NULL DEFAULT NOW(),
updated_at timestamptz NOT NULL DEFAULT NOW(),
CONSTRAINT uq_outbox_event_id UNIQUE (event_id),
CONSTRAINT ck_outbox_event_status CHECK (status IN (1, 2, 3, 4)),
CONSTRAINT ck_outbox_event_payload_version CHECK (payload_version > 0),
CONSTRAINT ck_outbox_event_retry_count CHECK (retry_count >= 0 AND max_retries > 0)
);
CREATE INDEX idx_outbox_event_claim
ON tb_outbox_event (status, next_attempt_at, lease_expires_at, created_at);
CREATE INDEX idx_outbox_event_type_status
ON tb_outbox_event (event_type, status);
CREATE INDEX idx_outbox_event_aggregate
ON tb_outbox_event (aggregate_type, aggregate_id, created_at);
CREATE INDEX idx_outbox_event_resource
ON tb_outbox_event (resource_type, resource_id, created_at);
CREATE INDEX idx_outbox_event_request_id ON tb_outbox_event (request_id) WHERE request_id <> '';
CREATE INDEX idx_outbox_event_correlation_id ON tb_outbox_event (correlation_id) WHERE correlation_id <> '';
COMMENT ON TABLE tb_outbox_event IS '公共可靠事件 Outbox';
COMMENT ON COLUMN tb_outbox_event.id IS 'Outbox记录主键ID';
COMMENT ON COLUMN tb_outbox_event.event_id IS '跨重试保持稳定的事件唯一ID';
COMMENT ON COLUMN tb_outbox_event.event_type IS '稳定事件类型编码';
COMMENT ON COLUMN tb_outbox_event.payload_version IS '事件载荷结构版本';
COMMENT ON COLUMN tb_outbox_event.aggregate_type IS '产生事件的聚合或业务事实类型';
COMMENT ON COLUMN tb_outbox_event.aggregate_id IS '产生事件的聚合或业务事实ID';
COMMENT ON COLUMN tb_outbox_event.resource_type IS '事件主要资源类型';
COMMENT ON COLUMN tb_outbox_event.resource_id IS '事件主要资源ID';
COMMENT ON COLUMN tb_outbox_event.business_key IS '业务幂等键,空字符串表示未提供';
COMMENT ON COLUMN tb_outbox_event.request_id IS '来源HTTP请求ID空字符串表示无请求上下文';
COMMENT ON COLUMN tb_outbox_event.correlation_id IS '跨事务和异步链路关联ID';
COMMENT ON COLUMN tb_outbox_event.payload IS '结构化事件载荷快照';
COMMENT ON COLUMN tb_outbox_event.status IS '投递状态 1=待投递, 2=投递中, 3=已投递, 4=投递失败';
COMMENT ON COLUMN tb_outbox_event.retry_count IS '已发生的投递重试次数';
COMMENT ON COLUMN tb_outbox_event.max_retries IS '允许的最大投递重试次数';
COMMENT ON COLUMN tb_outbox_event.next_attempt_at IS '下一次允许领取投递的时间';
COMMENT ON COLUMN tb_outbox_event.lease_owner IS '当前Relay投递租约持有者';
COMMENT ON COLUMN tb_outbox_event.lease_expires_at IS '当前Relay投递租约过期时间';
COMMENT ON COLUMN tb_outbox_event.last_error_code IS '最近一次投递失败的稳定错误编码';
COMMENT ON COLUMN tb_outbox_event.last_error_summary IS '最近一次投递失败的安全摘要';
COMMENT ON COLUMN tb_outbox_event.delivered_at IS '事件成功提交到任务队列的时间';
COMMENT ON COLUMN tb_outbox_event.created_at IS 'Outbox记录创建时间';
COMMENT ON COLUMN tb_outbox_event.updated_at IS 'Outbox记录更新时间';