我使用Celery 5.2.7+rabbitmq 3.9-management进行RPC。我的应用程序被分为3个不同的容器:* * worker**、rabbitmq和进行RPC调用的API。
所有容器都通过一个docker-compose部署,并连接到一个bridge
网络。整个集群在Ubuntu 20.04.3 LTS下的一台机器上工作。
工作场景如下:
- API接收用户请求
- api把gpu worker的一个作业放到rabbitmq上,等待响应。
- GPU工作器监听任务队列,并在新任务出现时执行计算
1.当计算完成时,GPU工作者将结果发送回来(我猜是通过另一个rabbitmq队列)
- 我的问题是API永远不会返回结果。正如我在日志中看到的,我的GPU工作人员在〈0.1秒内完成了工作,但我的API永远不会得到结果**
设置:
- 我的问题是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"]
我没有设置任何其他参数,所以所有其他参数或配置必须是默认的。
我不太确定,但我觉得返回结果好像有什么问题,会不会是容器内部有网络问题?
1条答案
按热度按时间2ul0zpep1#
这是一个
celery
的问题。RPC
结果后端与rabbit
仍然是错误的,有时会丢失结果。我已经使用redis
后端的结果代替,它的工作。