You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何在Flask-RESTful中实现指定日期时间发送短信的功能?

基于Flask-RESTful的定时短信发送实现方案及高并发适配实践

可落地的实现方案

以下方案覆盖从最小体量到中等规模的业务场景,可按需选型:

  • 轻量无额外依赖方案:Flask集成APScheduler
    适合用户量小于10万、定时任务峰值小于1000条/分钟的场景,直接在现有服务中嵌入调度能力,无需额外运维组件。示例代码如下:

    from flask import Flask, request
    from flask_apscheduler import APScheduler
    from your_sms_utils import send_sms # 自行封装的短信服务商调用接口
    
    app = Flask(__name__)
    # 初始化调度器,生产环境建议配置JOBS_STORE为MySQL/Redis避免任务丢失
    app.config["SCHEDULER_JOBSTORES"] = {
        "default": SQLAlchemyJobStore(url="mysql+pymysql://user:pass@localhost/sms_job")
    }
    scheduler = APScheduler()
    scheduler.init_app(app)
    scheduler.start()
    
    # 新增定时短信接口示例
    @app.post("/api/sms/schedule")
    def add_sms_task():
        req_data = request.get_json()
        task_id = req_data["task_id"]
        scheduler.add_job(
            id=task_id,
            func=send_sms,
            trigger="date", # 一次性定时触发
            run_date=req_data["send_time"], # 用户指定的发送时间,datetime格式
            args=[req_data["phone"], req_data["content"]]
        )
        return {"code": 0, "msg": "任务创建成功"}
    

    注意:多进程部署Flask时,需单独启动一个独立进程运行调度器,不要和Web Worker进程混用,避免重复调度同一任务

  • 解耦架构方案:独立调度服务 + 消息队列
    适合十万到百万级用户量的场景,将调度逻辑和业务API完全解耦:用户提交定时短信请求时,Flask API仅做参数校验、任务落库,然后将任务元信息写入消息队列(RabbitMQ、Redis均可),独立运行的调度服务(可选Celery Beat、XXL-JOB等成熟组件)监听到期任务,触发后下发给短信发送Worker执行发送,不会影响主API服务的可用性。

  • 零运维方案:云厂商托管服务
    不想自行维护调度组件的情况下,可直接使用云厂商的延时/定时消息能力:用户提交任务时调用云厂商定时消息接口,到期后消息自动推送到你的回调接口触发短信发送,调度能力完全由云厂商托管,无需考虑扩容、可用性问题。


大用户体量适配最佳实践

如果用户量超过百万、定时任务峰值超过1万条/分钟,需要从架构各层做优化:

  • 调度层优化
    • 弃用单节点调度,改用分布式调度框架(PowerJob、XXL-JOB集群、Celery Beat+Redis集群),支持水平扩容,避免单点故障
    • 用Redis ZSet做延迟队列替代直接轮询数据库:将任务执行时间作为score写入ZSet,调度器仅扫描ZSet中score小于当前时间的任务,性能比直接扫MySQL高10倍以上
    • 任务分片执行:将到期任务按手机号哈希、地域等维度分片,分配给不同的Worker节点执行,避免单节点压力过载
  • 发送层优化
    • 异步削峰:到期任务先写入Kafka/RocketMQ消息队列,下游发送Worker按短信服务商的限流阈值匀速消费,避免突增流量打垮服务商接口
    • 失败重试配置:对发送失败的任务做指数退避重试,重试3次失败的标记为异常进入人工处理队列,不要无限重试占用资源
    • 幂等校验:每个短信任务生成唯一ID,发送前先校验该ID是否已经执行过,避免调度重试、消息重复消费导致用户重复收到短信
  • 数据层优化
    • 冷热数据分离:已经发送完成/失败的历史任务定期归档到离线库,主库仅存未执行的待发送任务,降低任务扫描的查询压力
    • 分库分表:待执行任务量级超过百万时,按发送时间维度分表,每次扫描仅查询对应时间分片的表,查询效率提升明显
  • 稳定性保障
    • 配置全链路监控:对调度延迟、发送成功率、队列积压长度做指标监控,超过阈值及时告警
    • 灰度验证:调度逻辑迭代时先切1%流量验证,确认无异常再全量放量,避免全量故障导致大规模发送异常

内容的提问来源于stack exchange,提问作者faris404

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.10.04 20:45:05