使用 Celery 和 Rabbitmq 的任务队列和结果队列

时间:2021-03-16 08:08:31

标签: rabbitmq celery

我已经使用 RabbitMQ 作为 Broker 实现了 Celery。我依赖 Celery v4.4.7,因为我读到 v5.0+ 不再支持 RabbitMQ。就我而言,RabbitMQ 是必须的。

一切都已被容器化,然后在 Kubernetes 1.19 中部署为 Pod。我能够执行长时间运行的任务,乍一看似乎一切都很好。不过,我很少担心需要您的专业知识。

  1. 我已经声明了入站和出站队列,但 Celery 创建了他自己的队列,我在这些队列(入站或出站)中没有看到任何消息:
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>

  1. 我已经实现了回调以通过 REST API 获取结果。但是,随机地,当状态成功时,它可以返回或不返回一些结果。这可能与消息持久性有关。具体来说,当我实现花 API 来获取信息时,状态是成功的并且结果是部分显示的(缩短的 json 消息) - 当我调用 AsyncResult 时,对于相同的状态,结果是 None 或正确的。我不明白rabbitmq 队列和kombu 之间的机制,它似乎缓存了结果消息。我必须保证每次任务成功执行时都检索结果。
def callback(uuid):
    task = app.AsyncResult(uuid)


0 个答案:

没有答案
相关问题