【问题标题】:pika dropping basic_publish messages sporadicallypika 偶尔丢弃 basic_publish 消息
【发布时间】:2015-02-26 19:14:33
【问题描述】:

我正在尝试使用 Pika 发布消息,使用 Celery 任务。

from celery import shared_task
from django.conf import settings
import json

@shared_task
def publish_message():
    params = pika.URLParameters(settings.BROKER_URL + '?' + 'socket_timeout=10&' + 'connection_attempts=2')
    conn = pika.BlockingConnection(parameters=params)
    channel = conn.channel()
    channel.exchange_declare(
                exchange = 'foo',
                type='topic'
            )
    channel.tx_select()
    channel.basic_publish(
                exchange = 'foo',
                routing_key = 'bar',
                body = json.dumps({'foo':'bar'}),
                properties = pika.BasicProperties(content_type='application/json')
            )
    channel.tx_commit()
    conn.close()

从视图中调用此任务。

由于一些奇怪的原因,有时是随机的,消息没有排队。就我而言,每秒钟的消息都会被丢弃。我在这里错过了什么?

【问题讨论】:

  • 你为什么用exchange_declare
  • 发消息不需要声明exchange?这会影响这个吗?
  • 你想简单地将json.dumps({'foo':'bar'}) 放入队列foo 吗?
  • 是的。我删除了exchange_declare。一切正常。但消息仍然被丢弃。

标签: rabbitmq celery pika


【解决方案1】:

我建议您在 pika 中启用confirm_delivery。这将确保消息正确传递,并且如果由于某种原因无法传递消息。 Pika 将失败并出现异常,或者返回 False。

channel.confirm_delivery()
successful = channel.basic_publish(...)

如果过程失败,您可以尝试再次发送消息,或记录异常中的错误消息,以便您采取相应措施。

【讨论】:

    【解决方案2】:

    试试这个:

    chanel = conn.channel()
    try:
        chanel.queue_declare(queue='foo')
    except:
        pass
    
    chanel.basic_publish(
        exchange='',
        routing_key='foo',
        body=json.dumps({'foo':'bar'})
    )
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2021-11-22
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多