Files
junhong_cmp_fiber/scripts/init_polling_config.sql
huang 931e140e8e
All checks were successful
构建并部署到测试环境(无 SSH) / build-and-deploy (push) Successful in 6m35s
feat: 实现 IoT 卡轮询系统(支持千万级卡规模)
实现功能:
- 实名状态检查轮询(可配置间隔)
- 卡流量检查轮询(支持跨月流量追踪)
- 套餐检查与超额自动停机
- 分布式并发控制(Redis 信号量)
- 手动触发轮询(单卡/批量/条件筛选)
- 数据清理配置与执行
- 告警规则与历史记录
- 实时监控统计(队列/性能/并发)

性能优化:
- Redis 缓存卡信息,减少 DB 查询
- Pipeline 批量写入 Redis
- 异步流量记录写入
- 渐进式初始化(10万卡/批)

压测工具(scripts/benchmark/):
- Mock Gateway 模拟上游服务
- 测试卡生成器
- 配置初始化脚本
- 实时监控脚本

Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
2026-02-05 17:32:44 +08:00

157 lines
8.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.
-- 轮询系统初始化配置脚本
-- 设计目标: 支持一亿张卡规模
-- 执行: 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 分钟