所以标题有点冗长,但我认为它很好地解释了我的问题。
我有一个Django项目,它通过使用Celery和RabbitMQ从另一个网站抓取货币数据,每60秒更新一次模型。当我在本地运行芹菜工作程序时,它运行得很好,但当我部署到Heroku时,模型不会更新。
当我检查日志(heroku-logs-tail(时,它显示任务正在运行,但它们没有更新数据库模型。我认为这一定是由于我的settings.py文件中的一些配置错误,但我尝试了许多解决方案,但都没有成功。我也尝试过改为使用Redis,但遇到了同样的问题(它在日志中运行良好,但实际上并没有更新数据库(。
以下是我认为可能导致问题的相关代码。
Settings.py(使用rabbitMQ时(:
CELERY_BROKER_URL = 'rabbitMQ_url_given_from_heroku'
BROKER_URL = os.environ.get("CELERY_BROKER_URL", "django://")
BROKER_POOL_LIMIT = 1
BROKER_CONNECTION_MAX_RETRIES = None
CELERY_TASK_SERIALIZER = "json"
CELERY_ACCEPT_CONTENT = ["json", "msgpack"]
Settings.py(使用Redis时(:
CELERY_BROKER_URL = 'Redis_url_given_from_heroku'
CELERRY_RESULT_BACKEND = 'django-db'
CELERY_ACCEPT_CONTENT = ['application/json']
CELERY_TASK_SERIALIZER = 'json'
CELERY_RESULT_SERIALIZER = 'json'
CELERY_TIMEZONE = 'UTC'
celery.py
import os
from celery import Celery
os.environ.setdefault('DJANGO_SETTINGS_MODULE', 'cryptoApi.settings')
app = Celery('cryptoApi')
app.config_from_object('django.conf:settings', namespace='CELERY')
app.autodiscover_tasks()
Procfile
web: gunicorn cryptoApi.wsgi --log-file -
worker: celery -A cryptoApi worker -l info
任何输入都将非常感谢
我怀疑您正在使用SQLite作为数据库。这不会像预期的那样在Heroku上起作用。
然而,关于这一点的大多数问题都有所不同:它们看起来像是在工作,但一段时间后,当部署新代码时或dyno重启后的第二天,数据就会丢失。
您根本看不到新数据的原因是工作人员在专用的dyno上运行,与web
dyno分离,每个dyno都有自己的SQLite数据库。您保存到其中一个的任何数据在其他数据上都不可见。
您必须切换到客户端-服务器数据存储。Heroku自己的Postgres服务通常是一个很好的起点。