【问题标题】:Why declare Exchange in RabbitMQ?为什么要在 RabbitMQ 中声明 Exchange?
【发布时间】:2014-11-08 00:50:58
【问题描述】:

我正在使用 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);
        }
    }
}

消费者声明:

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);
            }
        }
    }

没有交易所声明的消费者:

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】:

    发布到队列让您只实现基本的发布-订阅方案,其中生产者和消费者使用确切的队列。在有多个消费者的情况下,一个消息队列会分布在多个消费者之间。

    发布到 exchanges 让您可以创建复杂的场景,因为 Exchange 和队列之间有 routing

    例如,fanout exchange 将消息路由到所有绑定队列。这样,您可以拥有一个生产者和多个消费者,并且每条消息都被复制到所有绑定的队列中并独立接收。

    另一个交换示例,主题交换根据消息中的路由键和队列上的模式将消息路由到绑定队列。这引入了一种有趣的可能性,即标记消息并有条件地传递它们。

    有关交换类型及其配置文件的完整参考,请参阅文档:

    https://www.rabbitmq.com/tutorials/amqp-concepts.html

    https://www.rabbitmq.com/getstarted.html

    【讨论】:

      猜你喜欢
      • 2016-09-16
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2011-09-08
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多