首页 > 其他分享 >RabbitMQ 使用记录

RabbitMQ 使用记录

时间:2022-12-02 12:45:11浏览次数:39  
标签:绑定 Exchange 队列 记录 RabbitMQ 交换机 键值 使用 路由

RabbitMQ交换机类型
RabbitMQ共有四种交换机类型: 

  • Direct Exchange:直连交换机,根据Routing Key(路由键)进行投递到不同队列。
  • Fanout Exchange:扇形交换机,采用广播模式,根据绑定的交换机,路由到与之对应的所有队列。
  • Topic Exchange:主题交换机,对路由键进行模式匹配后进行投递,符号#表示一个或多个词,*表示一个词。
  • Header Exchange:头交换机,不处理路由键。而是根据发送的消息内容中的headers属性进行匹配。

 

Direct Exchange

单个绑定,一个路由键对应一个队列。如下所示:

 

 

 多个绑定,一个路由键对应多个队列,则消息会分别投递到两个队列中,如下所示:

 

Fanout Exchange

 扇形交换机,采用广播模式,根据绑定的交换机,路由到与之对应的所有队列。一个发送到交换机的消息都会被转发到与该交换机绑定的所有队列上。很像子网广播,每台子网内的主机都获得了一份复制的消息。Fanout交换机转发消息是最快的。

 

Topic Exchange

主题交换机,对路由键进行模式匹配后进行投递,符号#表示一个或多个词,*表示一个词。因此“abc.#”能够匹配到“abc.def.ghi”,但是“abc.*” 只会匹配到“abc.def”。如下所示:

 

 

Header Exchange 

头交换机,不处理路由键。而是根据发送的消息内容中的headers属性进行匹配。在绑定Queue与Exchange时指定一组键值对;当消息发送到RabbitMQ时会取到该消息的headers与Exchange绑定时指定的键值对进行匹配;如果完全匹配则消息会路由到该队列,否则不会路由到该队列。headers属性是一个键值对,可以是Hashtable,键值对的值可以是任何类型。而fanout,direct,topic 的路由键都需要要字符串形式的。

匹配规则x-match有下列两种类型:

x-match = all :表示所有的键值对都匹配才能接受到消息

x-match = any :表示只要有键值对匹配就能接受到消息

消息头交换机,如下图所示:

 发送端代码

// See https://aka.ms/new-console-template for more information
using RabbitMQ.Client;
using System.Text;

Console.WriteLine("Hello, World!");

RabbitMQSend.Send(args);

public static class RabbitMQSend
{
    public static void Send(string[] args)
    {
        var factory = new ConnectionFactory() { HostName = "localhost", UserName = "admin", Password = "1234567891000", Port = 5672 };
        using (var connection = factory.CreateConnection())
        {
            using (var channel = connection.CreateModel())
            {
                // 设置交换机 type为交换机的类型 这里设为直连交换机
                channel.ExchangeDeclare(exchange: "direct_exc", type: "direct");

                //  消息持久化 成持久化的 durable 要设置 True
                var properties = channel.CreateBasicProperties();
                properties.Persistent = true;

                string message = "Hello World!";
                var body = Encoding.UTF8.GetBytes(message);
                while (true)
                {
                    Task.Delay(500).GetAwaiter().GetResult();
                    foreach (var item in args)
                    {
                        // 设置消息要发送的交换机和 routingKey路由键,根据路由键发送到具体的队列中
                        channel.BasicPublish(exchange: "direct_exc",
                                 routingKey: item,
                                 basicProperties: properties,
                                 body: body);
                    }
                }
            }
        }
    }
}

接收端代码

 

标签:绑定,Exchange,队列,记录,RabbitMQ,交换机,键值,使用,路由
From: https://www.cnblogs.com/ZGXF/p/16944102.html

相关文章