【问题标题】:In RabbitMQ why exchange accepts messages on second run?在 RabbitMQ 中,为什么 exchange 在第二次运行时接受消息?
【发布时间】:2013-09-24 12:57:00
【问题描述】:

情况就是这样。

我正在使用 PHP PECL AMQP RabbitMQ 客户端。当我第一次尝试发送消息进行交换时,没有任何反应。似乎消息还没有发送,AMQPQueue::get 什么也不返回,即使 AMQPExchange::publish 返回 true。

之后(即第二次交换声明之后)一切正常。

会是什么?

UPD。代码示例。

<?php
$connection = new AMQPConnection;
//config...
$connection->connect();

$channel = new AMQPChannel($connection);

$exchange = new AMQPExchange($channel);
$exchange->setName('test_exchange');
$exchange->setType(AMQP_EX_TYPE_DIRECT);
$exchange->declareExchange();
$exchange->setFlags(AMQP_DURABLE);

$exchange->bind('test_exchange', 'test_routing_key');
$exchange->publish('test_message', 'test_routing_key');

$queue = new AMQPQueue($channel);
$queue->setName('test_routing_key');
$queue->declareQueue();
$queue->bind('test_exchange', 'test_routing_key');
var_dump($queue->get(AMQP_AUTOACK));

【问题讨论】:

  • 可以粘贴代码吗
  • 可以粘贴代码吗
  • 你去,示例代码。

标签: php rabbitmq amqp


【解决方案1】:

发布和路由是有区别的: 发布意味着将消息发送到交换,而路由意味着将消息交换发送到绑定实体(例如队列或另一个交换)。

您的第一条消息已发布,但未路由,因为当时没有队列绑定到具有匹配路由键的交换器。 AMQPExchange::publish 返回 true 只是确认交换收到了消息。

参见this picture 取自RabbitMQ - AMQP 0-9-1 Model Explained 部分。

如果您明确需要知道消息是否被路由到至少一个队列,您可以设置强制标志:(RabbitMQ - Reliability Guide)

如果消息可能以更复杂的方式路由,但生产者仍然需要知道它们是否到达了至少一个队列,它可以在 basic.publish 上设置强制标志,确保 basic.return(包含回复代码和一些文字解释)如果没有适当地绑定队列,将被发送回客户端。

【讨论】:

  • 有道理。我会检查的。
猜你喜欢
  • 2020-06-08
  • 2020-01-02
  • 2021-10-18
  • 1970-01-01
  • 2014-11-08
  • 2017-04-06
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多