All checks were successful
构建并部署到测试环境(无 SSH) / build-and-deploy (push) Successful in 6m35s
实现功能: - 实名状态检查轮询(可配置间隔) - 卡流量检查轮询(支持跨月流量追踪) - 套餐检查与超额自动停机 - 分布式并发控制(Redis 信号量) - 手动触发轮询(单卡/批量/条件筛选) - 数据清理配置与执行 - 告警规则与历史记录 - 实时监控统计(队列/性能/并发) 性能优化: - Redis 缓存卡信息,减少 DB 查询 - Pipeline 批量写入 Redis - 异步流量记录写入 - 渐进式初始化(10万卡/批) 压测工具(scripts/benchmark/): - Mock Gateway 模拟上游服务 - 测试卡生成器 - 配置初始化脚本 - 实时监控脚本 Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
157 lines
8.0 KiB
SQL
157 lines
8.0 KiB
SQL
-- 轮询系统初始化配置脚本
|
||
-- 设计目标: 支持一亿张卡规模
|
||
-- 执行: psql -U user -d database -f scripts/init_polling_config.sql
|
||
|
||
-- ========================================
|
||
-- 1. 轮询配置初始化
|
||
-- 设计原则:
|
||
-- - 未实名卡:5分钟检查一次(避免过于频繁)
|
||
-- - 已实名卡:每天检查一次(状态稳定)
|
||
-- - 激活卡流量:每小时检查一次
|
||
-- ========================================
|
||
|
||
-- 删除已有配置(如果存在)
|
||
DELETE FROM tb_polling_config;
|
||
|
||
-- 优先级 10: 未实名卡(中频检查,每5分钟)
|
||
-- 预估:1000万未实名卡 × 12次/小时 = 1.2亿次/小时
|
||
INSERT INTO tb_polling_config (config_name, card_condition, card_category, carrier_id, priority, realname_check_interval, carddata_check_interval, package_check_interval, status, description)
|
||
VALUES
|
||
('未实名卡轮询', 'not_real_name', NULL, NULL, 10, 300, NULL, NULL, 1, '未实名卡每5分钟检查一次实名状态(一亿卡规模优化)');
|
||
|
||
-- 优先级 15: 行业卡(无需实名检查)
|
||
INSERT INTO tb_polling_config (config_name, card_condition, card_category, carrier_id, priority, realname_check_interval, carddata_check_interval, package_check_interval, status, description)
|
||
VALUES
|
||
('行业卡轮询', NULL, 'industry', NULL, 15, NULL, 3600, 3600, 1, '行业卡无需实名检查,每小时检查流量和套餐');
|
||
|
||
-- 优先级 20: 已实名卡(低频检查,每天一次)
|
||
-- 预估:3000万已实名卡 × 1次/天 = 很少
|
||
INSERT INTO tb_polling_config (config_name, card_condition, card_category, carrier_id, priority, realname_check_interval, carddata_check_interval, package_check_interval, status, description)
|
||
VALUES
|
||
('已实名卡轮询', 'real_name', NULL, NULL, 20, 86400, NULL, NULL, 1, '已实名卡每天检查一次实名状态(状态稳定,无需频繁检查)');
|
||
|
||
-- 优先级 30: 已激活卡(流量和套餐检查,每小时)
|
||
-- 预估:6000万激活卡 × 1次/小时 = 6000万次/小时
|
||
INSERT INTO tb_polling_config (config_name, card_condition, card_category, carrier_id, priority, realname_check_interval, carddata_check_interval, package_check_interval, status, description)
|
||
VALUES
|
||
('已激活卡轮询', 'activated', NULL, NULL, 30, NULL, 3600, 3600, 1, '已激活卡每小时检查流量和套餐(一亿卡规模优化)');
|
||
|
||
-- 优先级 100: 默认配置(兜底,保守策略)
|
||
INSERT INTO tb_polling_config (config_name, card_condition, card_category, carrier_id, priority, realname_check_interval, carddata_check_interval, package_check_interval, status, description)
|
||
VALUES
|
||
('默认轮询配置', NULL, NULL, NULL, 100, 86400, 86400, 86400, 1, '默认配置,每天检查一次(未匹配其他配置的卡)');
|
||
|
||
-- ========================================
|
||
-- 2. 并发控制配置初始化
|
||
-- 设计目标:支持 5 万 QPS 吞吐
|
||
-- 单 Worker 建议:500-1000 并发
|
||
-- 多 Worker 部署:8-16 个 Worker
|
||
-- ========================================
|
||
|
||
-- 删除已有配置(如果存在)
|
||
DELETE FROM tb_polling_concurrency_config;
|
||
|
||
-- 实名检查并发数(单 Worker)
|
||
INSERT INTO tb_polling_concurrency_config (task_type, max_concurrency, description)
|
||
VALUES
|
||
('realname', 500, '实名检查任务最大并发数(单 Worker,可部署多个 Worker 水平扩展)');
|
||
|
||
-- 卡流量检查并发数(单 Worker)
|
||
INSERT INTO tb_polling_concurrency_config (task_type, max_concurrency, description)
|
||
VALUES
|
||
('carddata', 1000, '流量检查任务最大并发数(单 Worker,流量检查占比最大)');
|
||
|
||
-- 套餐检查并发数(单 Worker)
|
||
INSERT INTO tb_polling_concurrency_config (task_type, max_concurrency, description)
|
||
VALUES
|
||
('package', 500, '套餐检查任务最大并发数(单 Worker)');
|
||
|
||
-- 停复机操作并发数(单 Worker)
|
||
INSERT INTO tb_polling_concurrency_config (task_type, max_concurrency, description)
|
||
VALUES
|
||
('stop_start', 100, '停复机操作最大并发数(需要谨慎控制)');
|
||
|
||
-- ========================================
|
||
-- 3. 数据清理配置初始化
|
||
-- 一亿卡规模每天产生大量数据,需要及时清理
|
||
-- ========================================
|
||
|
||
-- 删除已有配置(如果存在)
|
||
DELETE FROM tb_data_cleanup_config;
|
||
|
||
-- 流量历史记录清理配置(保留较短时间)
|
||
INSERT INTO tb_data_cleanup_config (table_name, retention_days, enabled, batch_size, description)
|
||
VALUES
|
||
('tb_data_usage_record', 30, 1, 50000, '保留30天流量历史,每批删除5万条(一亿卡每天产生大量数据)');
|
||
|
||
-- 操作日志清理配置
|
||
INSERT INTO tb_data_cleanup_config (table_name, retention_days, enabled, batch_size, description)
|
||
VALUES
|
||
('tb_account_operation_log', 90, 1, 50000, '保留90天操作日志,每批删除5万条');
|
||
|
||
-- 告警历史清理配置
|
||
INSERT INTO tb_data_cleanup_config (table_name, retention_days, enabled, batch_size, description)
|
||
VALUES
|
||
('tb_polling_alert_history', 14, 1, 50000, '保留14天告警历史,每批删除5万条');
|
||
|
||
-- 手动触发日志清理配置
|
||
INSERT INTO tb_data_cleanup_config (table_name, retention_days, enabled, batch_size, description)
|
||
VALUES
|
||
('tb_polling_manual_trigger_log', 30, 1, 50000, '保留30天手动触发日志,每批删除5万条');
|
||
|
||
-- 数据清理日志清理配置
|
||
INSERT INTO tb_data_cleanup_config (table_name, retention_days, enabled, batch_size, description)
|
||
VALUES
|
||
('tb_data_cleanup_log', 60, 1, 10000, '保留60天数据清理日志');
|
||
|
||
-- ========================================
|
||
-- 4. 告警规则初始化(一亿卡规模)
|
||
-- ========================================
|
||
|
||
-- 删除已有规则(如果存在)
|
||
DELETE FROM tb_polling_alert_rule;
|
||
|
||
-- 队列积压告警(阈值调高,适应大规模)
|
||
INSERT INTO tb_polling_alert_rule (rule_name, task_type, metric_type, operator, threshold, alert_level, cooldown_minutes, status, notify_channels, description)
|
||
VALUES
|
||
('实名检查队列积压', 'polling:realname', 'queue_size', '>', 500000, 'warning', 10, 1, 'log', '实名检查队列超过50万时告警'),
|
||
('流量检查队列积压', 'polling:carddata', 'queue_size', '>', 1000000, 'warning', 10, 1, 'log', '流量检查队列超过100万时告警'),
|
||
('实名检查队列严重积压', 'polling:realname', 'queue_size', '>', 2000000, 'critical', 5, 1, 'log', '实名检查队列超过200万时严重告警');
|
||
|
||
-- 失败率告警
|
||
INSERT INTO tb_polling_alert_rule (rule_name, task_type, metric_type, operator, threshold, alert_level, cooldown_minutes, status, notify_channels, description)
|
||
VALUES
|
||
('实名检查失败率过高', 'polling:realname', 'failure_rate', '>', 20, 'warning', 10, 1, 'log', '实名检查失败率超过20%时告警'),
|
||
('流量检查失败率过高', 'polling:carddata', 'failure_rate', '>', 20, 'warning', 10, 1, 'log', '流量检查失败率超过20%时告警');
|
||
|
||
-- ========================================
|
||
-- 初始化完成
|
||
-- ========================================
|
||
|
||
-- 验证初始化结果
|
||
SELECT '轮询配置初始化完成' AS message, COUNT(*) AS count FROM tb_polling_config;
|
||
SELECT '并发控制配置初始化完成' AS message, COUNT(*) AS count FROM tb_polling_concurrency_config;
|
||
SELECT '数据清理配置初始化完成' AS message, COUNT(*) AS count FROM tb_data_cleanup_config;
|
||
SELECT '告警规则初始化完成' AS message, COUNT(*) AS count FROM tb_polling_alert_rule;
|
||
|
||
-- ========================================
|
||
-- 容量规划参考(一亿卡)
|
||
-- ========================================
|
||
--
|
||
-- 检查次数估算(按上述配置):
|
||
-- - 未实名卡(10%):1000万 × 12次/小时 = 1.2亿次/小时
|
||
-- - 已实名卡(30%):3000万 × 1次/天 ≈ 125万次/小时
|
||
-- - 激活卡流量(60%):6000万 × 1次/小时 = 6000万次/小时
|
||
-- - 激活卡套餐(60%):6000万 × 1次/小时 = 6000万次/小时
|
||
-- 总计:约 2.4 亿次/小时 = 6.7万次/秒
|
||
--
|
||
-- 推荐部署:
|
||
-- - Worker 数量:16 个(每个处理约 4000 QPS)
|
||
-- - Redis 内存:16GB+(缓存 + 队列)
|
||
-- - 数据库连接池:每 Worker 50 连接
|
||
-- - Asynq 队列:critical/default/low 三个队列
|
||
--
|
||
-- 初始化时间估算:
|
||
-- - 1000 万卡:约 50 秒(10万/批,500ms间隔)
|
||
-- - 1 亿卡:约 500 秒 ≈ 8 分钟
|