如何在Django+Celery+Beat环境下减少Redis请求量?
解决Upstash每日请求上限问题:调整Celery/Beat配置
问题背景
项目基于Django + Celery + Beat部署在fly.io,fly.toml进程配置如下:
[processes] app = "gunicorn --bind :8000 zzrec.wsgi" beat = "celery -A zzrec beat -l info -S django" celery = "celery -A zzrec worker -l INFO"
开发环境使用免费层时触发Upstash报错:
ResponseError: max daily request limit exceeded. Limit: 10000, Usage: 10000.
需求:将任务检查频率从每秒改为每分钟,避免触发请求上限。
具体解决方案
1. 修改Celery Beat的周期任务频率
由于使用的是django-celery-beat(启动参数-S django),有两种修改方式:
- 通过Django Admin后台:
- 登录项目的Django管理后台,找到「周期任务(Periodic Tasks)」菜单
- 找到设置为每秒执行的任务,将其关联的「间隔调度(Interval Schedule)」修改为每分钟一次(即
every=1,period=minutes)
- 直接修改数据库:
- 连接到项目的数据库,找到
django_celery_beat_intervalschedule表 - 更新对应任务的调度记录,把
every字段设为1,period字段设为minutes
- 连接到项目的数据库,找到
2. 降低Celery Worker的Redis轮询频率
Celery Worker默认会频繁轮询Redis获取任务,可通过配置减少请求次数:
- 修改Celery配置文件:
在项目的zzrec/celery.py中添加以下配置:from celery import Celery app = Celery('zzrec') # 保留原有配置,新增以下内容 app.conf.update( BROKER_TRANSPORT_OPTIONS={ 'polling_interval': 60.0, # 每分钟轮询一次Redis 'max_retries': 3, } ) - 直接修改fly.toml命令:
如果找不到配置文件,可在fly.toml的celery进程命令中添加参数:celery = "celery -A zzrec worker -l INFO --broker-transport-options polling_interval=60"
3. 重新部署生效
执行部署命令更新fly.io上的服务:
fly deploy
验证
部署完成后,观察Upstash的请求统计,确认每日用量不会超过10000次的上限。
内容的提问来源于stack exchange,提问作者Radek
相关产品推荐
相关产品推荐

