docker Celery + rabbitmq RPC结果返回失败

kxe2p93d  于 2023-03-01  发布在  Docker
关注(0)|答案(1)|浏览(131)

我使用Celery 5.2.7+rabbitmq 3.9-management进行RPC。我的应用程序被分为3个不同的容器:* * worker**、rabbitmq和进行RPC调用的API
所有容器都通过一个docker-compose部署,并连接到一个bridge网络。整个集群在Ubuntu 20.04.3 LTS下的一台机器上工作。
工作场景如下:

  1. API接收用户请求
  2. api把gpu worker的一个作业放到rabbitmq上,等待响应。
  3. GPU工作器监听任务队列,并在新任务出现时执行计算
    1.当计算完成时,GPU工作者将结果发送回来(我猜是通过另一个rabbitmq队列)
    • 我的问题是API永远不会返回结果。正如我在日志中看到的,我的GPU工作人员在〈0.1秒内完成了工作,但我的API永远不会得到结果**
      设置:

工人:

#celery_worker.py
app = Celery('celery_worker', broker= f'amqp://{rabbitmq_username}:{rabbitmq_password}@{rabbitmq_host}:{rabbitmq_port}/', backend='rpc://')

@app.task
def remote_procedure(a, b):
    #some heavy computations
    return res

API主要:

#API main.py
from proj.celery_worker import remote_procedure

RESPONSE_TIMEOUT_SECONDS = 1.5

@app.get('/search/') 
def search(a,b):
    try:
        res = remote_procedure.apply_async((a,b), expires = RESPONSE_TIMEOUT_SECONDS-0.3, retry=False).get(timeout=RESPONSE_TIMEOUT_SECONDS)
    except celery.exceptions.TimeoutError:
        print('timeout')
        return {"res":"timeout"}
    return {"res":res}

def main():
    """
    Main function
    """

    uvicorn.run(app, host='127.0.0.1', port=CONFIG['port'])

if __name__ == '__main__':
    main()

撰写:

gpu_worker:
    build:
      context: .
      dockerfile: Dockerfile.worker
    deploy:
      resources:
        limits:
          memory: 10gb
        reservations:
          devices:
            - capabilities: [ gpu ]
    networks:
      - search_net
  
  api:
    build:
      context: .
      dockerfile: Dockerfile.api
    depends_on:
      - gpu_worker
    ports:
      - "8001:8000"
    environment:
      MAX_WORKERS: 32
    deploy:
      resources:
        limits:
          memory: 10gb
        reservations:
          devices:
            - capabilities: [ gpu ]
    networks:
      - search_net

  rabbitmq:
    image: rabbitmq:3.9-management
    hostname: rabbitmq
    container_name: 'rabbitmq'
    ports:
      - 5672:5672
      - 15672:15672
    volumes:
      - rabbitmq_data:/var/lib/rabbitmq/
      - rabbitmq_log:/var/log/rabbitmq/
    restart: on-failure
    networks:
      - search_net

volumes:
  rabbitmq_data:
  rabbitmq_log:

networks:
  search_net:
    driver: bridge

Dockerfile.worker:

...
ENTRYPOINT [ "celery", "-A", "proj.celery_worker", "worker", "--loglevel=DEBUG", "--pool=solo", "-c", "1"]

Dockerfile.api:

...
EXPOSE 80

# Start the app
CMD ["uvicorn", "app.main:app", "--host", "0.0.0.0", "--port", "8000"]

我没有设置任何其他参数,所以所有其他参数或配置必须是默认的。
我不太确定,但我觉得返回结果好像有什么问题,会不会是容器内部有网络问题?

2ul0zpep

2ul0zpep1#

这是一个celery的问题。RPC结果后端与rabbit仍然是错误的,有时会丢失结果。我已经使用redis后端的结果代替,它的工作。

相关问题