分离芹菜用于开发和生产
Isolate celery for development and production
我使用 virtualenv 为我的开发服务器和生产服务器使用相同的服务器。
我的问题是 celery 不知道 运行 任务在哪个项目中。我不想在我的开发服务器上生产 运行ning 中的任务,反之亦然。
我试过使用不同的代理地址,但它不能正常工作:
生产监督脚本:
[program:production-celery]
command=/home/user/.virtualenvs/production.site.com/bin/celery --app=myproject.celeryconfig:app worker -E -n production --loglevel=INFO --without-mingle --without-gossip -Q default,celery
directory = /home/user/.virtualenvs/production.site.com/myproject
environment=DJANGO_SETTINGS_MODULE='myproject.settings.production'
发展:
[program:development-celery]
command=/home/user/.virtualenvs/development.site.com/bin/celery --app=myproject.celeryconfig:app worker -E -n development --loglevel=INFO --without-mingle --without-gossip -Q default,celery
directory = /home/user/.virtualenvs/development.site.com/myproject
environment=DJANGO_SETTINGS_MODULE='myproject.settings.development'
生产芹菜配置:
import os
from celery import Celery
os.environ.setdefault('DJANGO_SETTINGS_MODULE', 'myproject.settings.production')
app = Celery('myproject', broker='amqp://', backend='amqp')
app.config_from_object('django.conf:settings')
app.autodiscover_tasks(lambda: settings.INSTALLED_APPS)
app.conf.update(
CELERY_ACCEPT_CONTENT = ['pickle', 'json'],
CELERY_TIMEZONE='Europe/Oslo',
CELERY_ENABLE_UTC=True,
CELERYBEAT_SCHEDULER = 'djcelery.schedulers.DatabaseScheduler',
CELERY_SEND_TASK_ERROR_EMAILS = True,
CELERY_SEND_ERROR_EMAILS = True,
CELERY_STORE_ERRORS_EVEN_IF_IGNORED = True,
CELERY_IGNORE_RESULT = False,
CELERY_TASK_RESULT_EXPIRES = 172800,
)
开发celeryconfig:
import os
from celery import Celery
os.environ.setdefault('DJANGO_SETTINGS_MODULE', 'myproject.settings.development')
app = Celery('myproject', broker='amqp://development:development@localhost/development')
app.config_from_object('django.conf:settings')
app.autodiscover_tasks(lambda: settings.INSTALLED_APPS)
app.conf.update(
CELERY_ACCEPT_CONTENT = ['pickle', 'json'],
CELERY_TIMEZONE='Europe/Oslo',
CELERY_ENABLE_UTC=True,
CELERY_SEND_TASK_ERROR_EMAILS = False,
CELERY_STORE_ERRORS_EVEN_IF_IGNORED = True,
CELERY_IGNORE_RESULT = False,
)
有人知道为什么生产任务会 运行 开发吗?
TL;DR
尽可能快地分离您的开发服务器和生产服务器。
完整答案
在同一台服务器上同时进行开发和生产会导致很多问题。
您将花费大量时间编写代码来处理可能产生的边缘情况。例如,开发人员可能有一个新功能,您正在测试它,但它有一个错误并且您遇到了内存问题 - 您的生产可能会受到影响。
另一件事是您使用的第 3 方服务,例如 rabbitMQ - 您尝试定义不同的队列,但您发现您遇到了问题,您需要编写更多代码来维护它 (def make_sure_new_feature_not_deleteing_users_on_prudction()
)。每次你开始玩新东西(redis、memcache、sentry 等)时都可能发生这种情况,你将不得不配置不同的 ports/urls/queues name/
最佳解决方案是使用完全相同的代码在不同的机器上运行(几乎)相同的配置。
我使用 virtualenv 为我的开发服务器和生产服务器使用相同的服务器。
我的问题是 celery 不知道 运行 任务在哪个项目中。我不想在我的开发服务器上生产 运行ning 中的任务,反之亦然。
我试过使用不同的代理地址,但它不能正常工作:
生产监督脚本:
[program:production-celery]
command=/home/user/.virtualenvs/production.site.com/bin/celery --app=myproject.celeryconfig:app worker -E -n production --loglevel=INFO --without-mingle --without-gossip -Q default,celery
directory = /home/user/.virtualenvs/production.site.com/myproject
environment=DJANGO_SETTINGS_MODULE='myproject.settings.production'
发展:
[program:development-celery]
command=/home/user/.virtualenvs/development.site.com/bin/celery --app=myproject.celeryconfig:app worker -E -n development --loglevel=INFO --without-mingle --without-gossip -Q default,celery
directory = /home/user/.virtualenvs/development.site.com/myproject
environment=DJANGO_SETTINGS_MODULE='myproject.settings.development'
生产芹菜配置:
import os
from celery import Celery
os.environ.setdefault('DJANGO_SETTINGS_MODULE', 'myproject.settings.production')
app = Celery('myproject', broker='amqp://', backend='amqp')
app.config_from_object('django.conf:settings')
app.autodiscover_tasks(lambda: settings.INSTALLED_APPS)
app.conf.update(
CELERY_ACCEPT_CONTENT = ['pickle', 'json'],
CELERY_TIMEZONE='Europe/Oslo',
CELERY_ENABLE_UTC=True,
CELERYBEAT_SCHEDULER = 'djcelery.schedulers.DatabaseScheduler',
CELERY_SEND_TASK_ERROR_EMAILS = True,
CELERY_SEND_ERROR_EMAILS = True,
CELERY_STORE_ERRORS_EVEN_IF_IGNORED = True,
CELERY_IGNORE_RESULT = False,
CELERY_TASK_RESULT_EXPIRES = 172800,
)
开发celeryconfig:
import os
from celery import Celery
os.environ.setdefault('DJANGO_SETTINGS_MODULE', 'myproject.settings.development')
app = Celery('myproject', broker='amqp://development:development@localhost/development')
app.config_from_object('django.conf:settings')
app.autodiscover_tasks(lambda: settings.INSTALLED_APPS)
app.conf.update(
CELERY_ACCEPT_CONTENT = ['pickle', 'json'],
CELERY_TIMEZONE='Europe/Oslo',
CELERY_ENABLE_UTC=True,
CELERY_SEND_TASK_ERROR_EMAILS = False,
CELERY_STORE_ERRORS_EVEN_IF_IGNORED = True,
CELERY_IGNORE_RESULT = False,
)
有人知道为什么生产任务会 运行 开发吗?
TL;DR
尽可能快地分离您的开发服务器和生产服务器。
完整答案
在同一台服务器上同时进行开发和生产会导致很多问题。
您将花费大量时间编写代码来处理可能产生的边缘情况。例如,开发人员可能有一个新功能,您正在测试它,但它有一个错误并且您遇到了内存问题 - 您的生产可能会受到影响。
另一件事是您使用的第 3 方服务,例如 rabbitMQ - 您尝试定义不同的队列,但您发现您遇到了问题,您需要编写更多代码来维护它 (def make_sure_new_feature_not_deleteing_users_on_prudction()
)。每次你开始玩新东西(redis、memcache、sentry 等)时都可能发生这种情况,你将不得不配置不同的 ports/urls/queues name/
最佳解决方案是使用完全相同的代码在不同的机器上运行(几乎)相同的配置。