【问题标题】:rabbitmq amqp - listening to ack messages from consumerrabbitmq amqp - 监听来自消费者的确认消息
【发布时间】:2014-12-19 20:23:20
【问题描述】:

我在同一台机器上有一个生产者和经纪人。生产者发送消息如下:

channel = connection.createChannel();

//Create a durable queue (if not already present)
channel.queueDeclare(merchantId, true, false, false, null);

//Publish message onto the queue
channel.basicPublish("", consumerId, true, false,
    MessageProperties.MINIMAL_PERSISTENT_BASIC, "myMessage");

消费者坐在另一台机器上并收听消息。它使用这样的显式确认:

while (true) {
    QueueingConsumer.Delivery delivery = consumer.nextDelivery();
    //Handle message here  
    channel.basicAck(delivery.getEnvelope().getDeliveryTag(), false);
}   

据我了解,ack 是为了让代理将消息出列。

但是我的生产者如何知道消费者发送的 ack?

【问题讨论】:

    标签: rabbitmq amqp producer-consumer


    【解决方案1】:

    生产者和消费者通常不互动。这是由 AMQP 协议设计的。例如,特定消息的消费可能在它发布后很长时间才完成,让生产者长时间运行并没有任何意义。另一个例子是当发布者向代理发送一条消息时,由于路由逻辑,消息被复制到多个队列,导致歧义(因为多个消费者可以确认同一条消息)。 AMQP 协议是异步的(大部分情况下),让发布者知道它的消息正在被消费只是不适合 AMQP 异步模型。

    其中有一些例外,特别是 RPC 调用。然后生产者变成生产者-消费者。它发送一条消息,然后立即等待回复(有一个很好的 RabbitMQ 手册 - Direct reply-torelated to RPC with RabbtiMQ)。

    一般来说,您可以确保将消息传递给带有Confirms (aka Publisher Acknowledgements) 以及Dead Letter ExchangesAlternate Exchanges 的代理。这些涵盖了消息可能从正常流程中丢失的大多数情况。

    【讨论】:

      最近更新 更多