我已经使用 RabbitMQ 作为 Broker 实现了 Celery。我依赖 Celery v4.4.7,因为我读到 v5.0+ 不再支持 RabbitMQ。就我而言,RabbitMQ 是必须的。
一切都已被容器化,然后在 Kubernetes 1.19 中部署为 Pod。我能够执行长时间运行的任务,乍一看似乎一切都很好。不过,我很少担心需要您的专业知识。
inbound_queue = "_IN"
outbound_queue = "_OUT"
app = Celery()
app.conf.update(
broker_url = 'pyamqp://%s//' % path,
broker_heartbeat = None,
broker_connection_timeout = int(timeout)
result_backend = 'rpc://',
result_persistent = True,
task_queues = (
Queue(algorithm_queue, Exchange(inbound_queue), routing_key='default', auto_delete=False),
Queue(result_queue, Exchange(outbound_queue), routing_key='default', auto_delete=False),
),
task_default_queue = inbound_queue,
task_default_exchange = inbound_exchange,
task_default_exchange_type = 'direct',
task_default_routing_key = 'default',
)
@app.task(bind=True,
name='osmq.tasks.add',
queue=inbound_queue,
reply_to = outbound_queue,
autoretry_for=(Exception,),
retry_kwargs={'max_retries': 5, 'countdown': 2})
def execute(self, data):
<method_implementation>
def callback(uuid):
task = app.AsyncResult(uuid)