feat: 实现 IoT 卡轮询系统(支持千万级卡规模)
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>
This commit is contained in:
2026-02-05 17:32:44 +08:00
parent b11edde720
commit 931e140e8e
104 changed files with 16883 additions and 87 deletions

View File

@@ -0,0 +1,156 @@
-- 轮询系统初始化配置脚本
-- 设计目标: 支持一亿张卡规模
-- 执行: 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 分钟