AMQP:Exchange、Queue 和 Routing Key,以及 Binding Key:声明和引用命名交换

AMQP: Exchange, Queue, and Routing Key, and Binding Key: Declaring and referencing a named exchange

我正在尝试使用 rabbitmq-c 创建一个 amq.fanout 类型的交换,它是 RabbitMQ 的 amqp 客户端。但是,我对我必须为此声明的内容感到困惑。根据 this,我必须声明交换名称和类型,以及可选的交换持久性和生命周期语义。

当我声明一个交易所时,看起来我可以提供 'exchange',我认为它是交易所的 name,以及交易所 类型,例如amq.fanout。来自 examples/amqp_exchange_declare.c

amqp_exchange_declare(conn,
    1,
    amqp_cstring_bytes(exchange),
    amqp_cstring_bytes(exchangetype),
    0, 0, 0, 0, 
    amqp_empty_table);

但是如果我看一个发布的例子,在名为 exchange 的第二个参数中有一个地方可以提供交换 type。例如,examples/amqp_producer.c

amqp_basic_publish(conn,
                                1,
                                amqp_cstring_bytes("amq.direct"),
                                amqp_cstring_bytes(queue_name),
                                0,
                                0,
                                NULL,
                                message_bytes)

但是没有地方可以提供交易所的 名称。那么我怎样才能发布到指定的交易所呢?

为什么我要提供 queue_name 来发布?我应该只发布到交易所——队列应该对发布者隐藏。这些只是示例中命名不当的变量,还是我遗漏了一些基本知识?

looking at the docs 我看到第三个参数是要使用的交换。

int amqp_basic_publish   (   amqp_connection_state_t     state,
    amqp_channel_t  channel,
    amqp_bytes_t    exchange,
    amqp_bytes_t    routing_key,
    amqp_boolean_t  mandatory,
    amqp_boolean_t  immediate,
    struct amqp_basic_properties_t_ const *     properties,
    amqp_bytes_t    body 
)       

可能令人困惑的是在许多示例中使用了 "amq.direct" 交换...这不是交换类型。相反,这是一个名为 "amq.direct" 的内置默认交换。它恰好是 "direct" 交换类型,但 "amq.direct" 是交换的名称,而不是类型。

命名有点混乱,一开始...老实说,我花了将近一年的时间才弄明白。 :)

常见的简单示例是执行 "publish to queue",通过 amq.direct 交换推送消息,队列名称作为路由键。这会将消息直接发布到该队列。大多数时候,这仅对演示或 RPC (request/response) 场景有用,您需要将响应发布到特定的回复队列。

我前阵子写了a blog post on the relationships between exchanges, queues and bindings。它可能有助于消除一些困惑。

希望对您有所帮助!