代码之家  ›  专栏  ›  技术社区  ›  Dimitrios Mistriotis

Django Celery SQS“未配置结果后端。”

  •  1
  • Dimitrios Mistriotis  · 技术社区  · 7 年前

    不是重复的 Celery: No Result Backend Configured? 因为使用了sqs。

    继续出现以下错误:

    未配置结果后端。请参阅文档了解更多信息 信息。

    我的生产设置如下:

    CELERY_BROKER_URL = 'sqs://%s:%s@' % (
        urllib.parse.quote(env.str('TASK_QUEUE_USER_ID'), safe=''),
        urllib.parse.quote(env.str('TASK_QUEUE_USER_SECRET'), safe=''))
    
    BROKER_URL = CELERY_BROKER_URL
    CELERY_ENABLE_REMOTE_CONTROL = False
    CELERY_RESULT_BACKEND = None # Disabling the results backend
    RESULT_BACKEND = None # Disabling the results backend
    
    CELERY_ACCEPT_CONTENT = ['application/json']
    CELERY_TASK_SERIALIZER = 'json'
    CELERY_RESULT_SERIALIZER = 'json'
    CELERY_DEFAULT_QUEUE = 'async_tasks'
    SQS_QUEUE_NAME = 'async_tasks'
    CELERY_ENABLE_REMOTE_CONTROL = False 
    CELERY_SEND_EVENTS = False
    
    
    CELERY_BROKER_TRANSPORT_OPTIONS = {
        'region': 'eu-west-2',
        'polling_interval': 3,
        'visibility_timeout': 3600,
    }
    CELERY_SEND_TASK_ERROR_EMAILS = True
    
    #
    # https://stackoverflow.com/questions/8048556/celery-with-amazon-sqs#8567665
    #
    CELERY_BROKER_TRANSPORT = 'sqs'
    BROKER_TRANSPORT = 'sqs'
    

    从命令行运行芹菜: DJANGO_ENV=production celery -A async_tasks worker -l info 连接到sqs和轮询,但当我尝试从命令行执行演示调用时 DJANGO_ENV=production python manage.py check_async :

    from django.core.management.base import BaseCommand, CommandError
    
    import async_tasks.tasks as tasks
    
    
    class Command(BaseCommand):
        help = 'Check if infrastructure for async tasks has been setup correctly.'
    
        def handle(self, *args, **options):
            try:
                print('Sending async request.')
                t = tasks.add.apply_async((2, 4))
                out = t.get(timeout=1)
                print(out)
                print(t.status)
            except Exception as e:
                print(e)
                raise CommandError('Error occured')
    

    我知道上面的错误。用redis开发机器,一切都很好。

    有什么想法吗?

    1 回复  |  直到 6 年前
        1
  •  1
  •   Sean Azlin    6 年前

    您需要配置芹菜结果后端,以便能够存储和收集任务结果。对于“fire-and-for get”模式,将芹菜与没有结果后端的sqs代理一起使用是可以的,但是如果您希望能够通过get()等方法访问任务的结果,这还不够。