为什么要在 RabbitMQ 中声明 Exchange?

问题描述 投票:5回答:1

我正在用RabbitMQ做一个项目。我的代码如下。

生产者。

public static void Main()
{
    var factory = new ConnectionFactory() { HostName = "localhost" };
    using (var connection = factory.CreateConnection())
    {
        using (var channel = connection.CreateModel())
        {
            channel.QueueDeclare("hello", false, false, false, null);

            string message = "Hello World!";
            var body = Encoding.UTF8.GetBytes(message);

            channel.BasicPublish("", "hello", null, body);
            Console.WriteLine(" [x] Sent {0}", message);
        }
    }
}

已声明Exchange的消费者:

public static void Main()
{
    var factory = new ConnectionFactory() { HostName = "localhost" };
    using (var connection = factory.CreateConnection())
    {
        using (var channel = connection.CreateModel())
        {
            channel.ExchangeDeclare("hello", "direct",false, false, false, null);
            channel.QueueDeclare("hello", false, false, false, null);

            var consumer = new QueueingBasicConsumer(channel);
            channel.BasicConsume("hello", true, consumer);

            Console.WriteLine(" [*] Waiting for messages." +
                                     "To exit press CTRL+C");
            while (true)
            {
                var ea = (BasicDeliverEventArgs)consumer.Queue.Dequeue();

                var body = ea.Body;
                var message = Encoding.UTF8.GetString(body);
                Console.WriteLine(" [x] Received {0}", message);
            }
        }
    }

未声明Exchange的消费者

public static void Main()
{
    var factory = new ConnectionFactory() { HostName = "localhost" };
    using (var connection = factory.CreateConnection())
    {
        using (var channel = connection.CreateModel())
        {
            channel.QueueDeclare("hello", false, false, false, null);

            var consumer = new QueueingBasicConsumer(channel);
            channel.BasicConsume("hello", true, consumer);

            Console.WriteLine(" [*] Waiting for messages." +
                                     "To exit press CTRL+C");
            while (true)
            {
                var ea = (BasicDeliverEventArgs)consumer.Queue.Dequeue();

                var body = ea.Body;
                var message = Encoding.UTF8.GetString(body);
                Console.WriteLine(" [x] Received {0}", message);
            }
        }
    }

这两段消费者代码都能很好的工作,那么声明交换的主要用途是什么呢?我很困惑。谁能说明一下?

c# rabbitmq rabbitmq-exchange
1个回答
11
投票

发布到 队列 让你只可以实现基本的发布-订阅场景,其中生产者和消费者使用确切的队列。在多个消费者的情况下,一个单一的消息队列会在多个消费者之间分配。

发布到 交换 让你创建复杂的场景,因为 路由 交易所和队列之间。

例如,一个 兑换 将消息路由到所有绑定队列。这样,你可以有一个生产者和多个消费者,而且每个消息都是 抄袭 到所有绑定的队列,并独立接收。

另一个交换的例子,一个 话锋一转 将消息路由到绑定队列,基于 路由键 和队列中的模式。这就引入了一种有趣的可能性,即 标识 消息,并有条件地传递它们。

完整的交换类型和它们的简介请参考文档。

https:/www.rabbitmq.comtutorialsamqp-concepts.html。

https:/www.rabbitmq.comgetstarted.html

© www.soinside.com 2019 - 2024. All rights reserved.