1. 项目概述:把裕群地铁站超市折扣做成实时提醒服务
将线下折扣信息做成可订阅的通知服务需要完整的技术链路。
数据源包括超市页面、API、和社区用户上报(例如会员微信/Telegram群)。
核心模块:抓取器(Scraper)、数据存储(DB)、消息队列、通知推送(Email/SMS/Push)。
对延迟敏感:折扣往往是短时窗口(例如每天19:00-21:00),推送延迟应<100s。
因此在架构上优先考虑VPS性能、缓存与CDN,以及DDoS防御策略,保证推送可靠性。
2. 抓取与数据处理:频率、反爬与缓存策略
抓取频率建议:高优先级店铺每5分钟一次,次级店铺每30分钟一次。
反爬应使用IP池、随机UA和合理速率,避免触发目标站点防护。
抓取结果先写入Redis作短期缓存(TTL 300s),再批量写入MySQL作为历史。
示例:使用Scrapy + Redis队列,抓取并去重后推入Kafka做异步消费与通知。
缓存策略:页面缓存TTL设为60-300秒,静态资源交由CDN缓存7天。
3. 服务器与VPS推荐配置与成本估算
线上生产建议使用两层:前端负载层+后端任务处理层。
示例生产配置(单机型):Ubuntu 22.04, Nginx, Node.js 18, MySQL 8, Redis 6。
实际VPS配置示例表格如下(含成本参考):
| 用途 | CPU | 内存 | 磁盘 | 带宽/月 | 预估费用/月(SGD) |
| 前端负载 | 4 vCPU | 8 GB | 160 GB NVMe | 5 TB | 25 |
| 后端任务 | 2 vCPU | 4 GB | 80 GB NVMe | 3 TB | 12 |
| 备份/备用 | 1 vCPU | 2 GB | 40 GB SSD | 1 TB | 6 |
4. 真实案例:裕群站折扣推送系统的部署与性能数据
案例背景:为“裕群地铁站周边3家超市”做折扣提醒,峰值发送量为每晚20:00-21:00。
部署方式:前端Nginx反向代理+Node.js API,后端Celery风格任务队列处理抓取与推送。
负载测试:使用wrk压力测试,配置为4 vCPU/8GB实例,结果为平均处理1000 req/s,p95延迟85ms。
监控指标:CPU平均75%峰值、Redis命中率98%、MySQL慢查询<1%。
根据监控,夜间批量推送窗口使用水平扩容至6 vCPU以保持通知延迟<2s。
5. CDN、域名、SSL与DDoS防御方案
使用Cloudflare或Akamai做CDN和首层DDoS防护,启用WAF规则与速率限制。
域名建议注册带地区标识的二级域名,例如 yq-discounts.example.sg,启用HSTS与Let's Encrypt证书。
DDoS防护策略:Cloudflare设置IP速率限制(例如每IP 100 req/min),并开启挑战页面在异常流量时。
服务器侧使用fail2ban限制SSH、api暴力请求,并配置iptables基础防护规则。
日志与告警:异常流量自动触发PagerDuty/Slack告警并启动流量切换到备用节点。
6. 会员优惠管理与数据展示(前端与后端示例)
会员体系分三级:普通/银卡/金卡,后端通过JWT管理会话并记录会员ID。
会员优惠规则存储在MySQL表 promo_rules,示例字段:id,store,floor,start_time,end_time,tier_discount。
前端展示用API如 /api/promos?station=yuhun 返回JSON并被前端缓存5分钟。
示例数据库数据(部分)与推送统计展示如下表:
| 商店 | 楼层 | 折扣时段 | 银卡折扣 | 金卡折扣 |
| 裕群超市A | 1楼 | 19:00-21:00 | 5% | 10% |
| 裕群超市B | B1 | 20:00-22:00 | 8% | 12% |
| 裕群超市C | 2楼 | 18:30-20:00 | 3% | 7% |
7. 备份、恢复与运维SOP
数据备份:MySQL每天全量快照并每小时增量,保留7天;重要快照异地存储。
恢复演练:每月一次数据库恢复演练,目标RTO<30分钟,RPO<1小时。
自动化运维:使用Ansible发布镜像、Terraform管理VPC与DNS记录。
安全升级:定期(每周)系统包与依赖扫描,关键补丁立即应用并回滚策略到位。
事故流程:流量异常→自动切换至只读模式→通告用户→流量缓解后逐步恢复写入。
来源:省钱攻略 裕群地铁站新加坡超市在几楼折扣时段与会员优惠