Files
junhong_cmp_fiber/migrations/000253_add_polling_failure_alert.up.sql
邹进 dae44bed30 feat: 按运营商账户调度的迁移、配置与账户队列 Lua
- 迁移 000251~000254:运营商账户调度参数、请求检查场景(预置 8 个)、卡轮询失败告警表,以及调度模式、步骤、退避、告警等受控系统配置(默认 legacy,行为不变);并发配置表注释标记废弃
- 受控系统配置注册与 JSON 结构校验:步骤只能是 4 种检查类型且不重复、退避序列递增
- yaml 增加 NSQ 地址、msg_timeout、租约、续期间隔、分发间隔、默认执行上限与 max_in_flight;引入 go-nsq
- 测试环境 docker-compose 增加 nsqlookupd 与 nsqd,Worker 注入 NSQ 地址
- 账户队列 Redis 结构与 Lua:领取(执行上限、优先占比、按限流组剩余 QPS 估算)、抢执行权、续期、收尾、请求检查(合并、冷却、执行中打优先标记)、移出、发布失败释放
2026-10-25 18:28:42 +09:00

47 lines
3.3 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.
-- 卡轮询失败告警(add-carrier-polling-scheduler)。
-- 背景:新调度按"卡 × 检查类型"记连续失败并退避重试;持续失败需要告警,由运营联系上游或关闭该卡轮询。
--
-- 设计选择:
-- 1. 同一卡同一检查类型只保留一条未处理告警(部分唯一索引),后续失败更新计数与最近错误。
-- 2. status:1-未处理 2-已恢复(首次成功自动转入)3-已关闭轮询 4-已处理(人工标记)。
-- 3. check_type 取值 card_status / carddata / realname / package;停复机方向在停复机指令队列接入同一张表。
-- 4. alert_level:card 卡级 / carrier 账户级(同账户窗口内告警数超阈值时产生,card_id 为 0)。
-- 5. 告警写入走异步,失败只记日志,不影响轮询;不使用数据库外键(ENG-MODEL-001)。
CREATE TABLE tb_polling_failure_alert (
id BIGSERIAL PRIMARY KEY,
alert_level VARCHAR(20) NOT NULL DEFAULT 'card',
card_id BIGINT NOT NULL DEFAULT 0,
iccid VARCHAR(30) NOT NULL DEFAULT '',
carrier_id BIGINT NOT NULL DEFAULT 0,
check_type VARCHAR(30) NOT NULL,
error_category VARCHAR(50) NOT NULL DEFAULT '',
fail_count INTEGER NOT NULL DEFAULT 0,
first_failed_at TIMESTAMPTZ,
last_failed_at TIMESTAMPTZ,
last_error VARCHAR(500) NOT NULL DEFAULT '',
status SMALLINT NOT NULL DEFAULT 1,
handled_by BIGINT NOT NULL DEFAULT 0,
handled_at TIMESTAMPTZ,
handle_remark VARCHAR(500) NOT NULL DEFAULT '',
recovered_at TIMESTAMPTZ,
created_at TIMESTAMPTZ NOT NULL DEFAULT NOW(),
updated_at TIMESTAMPTZ NOT NULL DEFAULT NOW(),
CONSTRAINT ck_polling_failure_alert_status CHECK (status IN (1, 2, 3, 4)),
CONSTRAINT ck_polling_failure_alert_level CHECK (alert_level IN ('card', 'carrier'))
);
CREATE UNIQUE INDEX uk_polling_failure_alert_open ON tb_polling_failure_alert (alert_level, card_id, carrier_id, check_type) WHERE status = 1;
CREATE INDEX idx_polling_failure_alert_carrier ON tb_polling_failure_alert (carrier_id, status, last_failed_at DESC);
CREATE INDEX idx_polling_failure_alert_card ON tb_polling_failure_alert (card_id, created_at DESC);
CREATE INDEX idx_polling_failure_alert_created ON tb_polling_failure_alert (created_at DESC);
COMMENT ON TABLE tb_polling_failure_alert IS '卡轮询失败告警:同一卡同一检查类型只保留一条未处理告警';
COMMENT ON COLUMN tb_polling_failure_alert.alert_level IS '告警级别 card-卡级 carrier-账户级';
COMMENT ON COLUMN tb_polling_failure_alert.card_id IS '卡ID,账户级告警为 0';
COMMENT ON COLUMN tb_polling_failure_alert.check_type IS '检查类型 card_status / carddata / realname / package;账户级告警为 all';
COMMENT ON COLUMN tb_polling_failure_alert.error_category IS '最近错误类别(网关错误类别或上游错误分类)';
COMMENT ON COLUMN tb_polling_failure_alert.fail_count IS '连续失败次数;账户级告警为窗口内告警数';
COMMENT ON COLUMN tb_polling_failure_alert.last_error IS '最近错误(脱敏截断)';
COMMENT ON COLUMN tb_polling_failure_alert.status IS '状态 1-未处理 2-已恢复 3-已关闭轮询 4-已处理';