C#使用RabbitMQ-4_路由模式(直连交换机)

简介

RabbitMQ中的路由模式是一种根据Routing Key有条件地将消息筛选后发送给消费者的模式。在路由模式中,生产者向交换机发送消息时,会指定一个Routing Key。交换机接收生产者的消息后,根据消息的Routing Key将其路由到与Routing Key完全匹配的队列。消费者只从其绑定的队列中接收消息,因此只接收筛选后的消息。

路由模式的一些特征与优点:

  1. Direct交换机:在路由模式下,使用的交换机类型是Direct交换机。这种类型的交换机会根据消息的路由键来决定将消息投递到哪些队列。
  2. 路由键(RoutingKey):生产者发送消息时需要指定一个路由键。这个路由键是一个字符串,用于指示消息应该被发送到哪个队列。消费者在创建队列和绑定到交换机时也会指定一个路由键。
  3. 精确匹配:Direct交换机会将消息精确地发送到指定路由键的队列。这意味着只有当队列的路由键完全匹配消息的路由键时,消息才会被投递到该队列。
  4. 解耦:路由模式允许生产者和消费者之间的解耦,生产者不需要知道具体的队列名称,只需要知道路由键即可。这使得系统更加灵活,容易扩展和维护。
  5. 动态绑定:在实际应用中,可以根据需要动态地创建队列并绑定到交换机,而不需要重启或修改已有的生产者代码。
  6. 负载均衡:如果多个队列绑定了相同的路由键,Direct交换机会使用轮询(round-robin)的方式将消息均匀地分发到这些队列中,这可以用于实现负载均衡。
  7. 优先级支持:在路由模式中,还可以为队列设置不同的优先级,以便处理不同重要性的消息。

生产者代码

我们使用channel.ExchangeDeclare("hello", "direct")声明一个(Direct)直连交换机,然后在控制台输入一个路由键,存到变量routingKey中,最后通过代码

cs 复制代码
channel.BasicPublish("hello", routingKey, null, body);

使用BasicPublish方法将消息发布到名为"hello"的交换机,和routingKey队列中

cs 复制代码
class MyClass
{
    public static void Main(string[] args)
    {
        var factory = new ConnectionFactory();
        factory.HostName = "localhost"; //RabbitMQ服务在本地运行
        factory.UserName = "guest"; //用户名
        factory.Password = "guest"; //密码

        //创建连接
        using (var connection = factory.CreateConnection())
        {
            //创建通道
            using (var channel = connection.CreateModel())
            {
                //声明了一个直接交换机(direct),命名为"hello"
                channel.ExchangeDeclare("hello", "direct");

                Console.WriteLine("生产者:请输入路由key");
                var routingKey = Console.ReadLine();

                string msg;
                Console.WriteLine("请输入要发送的消息内容:");
                while (!string.IsNullOrEmpty(msg = Console.ReadLine()))
                {
                    var body = Encoding.UTF8.GetBytes(msg);

                    channel.BasicPublish("hello", routingKey, null, body); //开始传递
                    Console.WriteLine("已发送: {0}", msg);
                }
            }
        }
    }
}

消费者代码

在消费者代码中,我们如法炮制,在控制台输入一个路由键,存储在变量routingKey中。通过下面代码

cs 复制代码
var queueName = channel.QueueDeclare().QueueName;

声明一个新的队列,并将这个队列的名称赋值给变量queueName,然后通过下面代码

cs 复制代码
channel.QueueBind(queueName, "hello", routingKey);

将队列绑定到名为"hello"的交换机,并指定路由键。这样,该队列就可以接收通过该路由键发送的消息。

cs 复制代码
class MyClass
{
    static void Main(string[] args)
    {
        //创建连接工厂
        var factory = new ConnectionFactory();
        factory.HostName = "localhost";
        factory.UserName = "guest";
        factory.Password = "guest";
        //创建连接
        using (var connection = factory.CreateConnection())
        {
            //创建通道
            using (var channel = connection.CreateModel())
            {
                //声明了一个交换机
                channel.ExchangeDeclare("hello", "direct");

                //声明一个新的队列,并将这个队列的名称赋值给变量 queueName
                var queueName = channel.QueueDeclare().QueueName;

                //从控制台获取一个路由key
                Console.WriteLine("消费者:请输入路由key");
                var routingKey = Console.ReadLine();

                channel.QueueBind(queueName, "hello", routingKey);

                //事件的基本消费者
                var consumer = new EventingBasicConsumer(channel);

                consumer.Received += (model, ea) =>
                {
                    var body = ea.Body.ToArray();
                    var message = Encoding.UTF8.GetString(body);

                    Thread.Sleep(1000);

                    Console.WriteLine("已接收: {0}", message);
                };

                channel.BasicConsume(queueName, true, consumer);
                Console.ReadKey();
            }
        }
    }
}

代码演示

像第一章一样,我们将生产者,消费者都分别打包发布。然后我们运行三次消费者代码,分别输入三个不同的路由键,如key1、key2、key3。然后运行两次生产者代码,分别输入key1、key2为路由键。我们在生产者发送消息时,只会发送给我们指定好与之对应相同路由键的消费者。

相关推荐
金刚猿14 分钟前
简单理解下基于 Redisson 库的分布式锁机制
分布式·分布式锁·redisson
我一直在流浪37 分钟前
Kafka - 消费者程序仅消费一半分区消息的问题
分布式·kafka
张彦峰ZYF2 小时前
投资策略规划最优决策分析
分布式·算法·金融
processflow流程图4 小时前
分布式kettle调度平台v6.4.0新功能介绍
分布式
全栈开发圈4 小时前
干货分享|分布式数据科学工具 Xorbits 的使用
分布式
运维&陈同学7 小时前
【zookeeper01】消息队列与微服务之zookeeper工作原理
运维·分布式·微服务·zookeeper·云原生·架构·消息队列
时差9537 小时前
Flink Standalone集群模式安装部署
大数据·分布式·flink·部署
菠萝咕噜肉i7 小时前
超详细:Redis分布式锁
数据库·redis·分布式·缓存·分布式锁
只因在人海中多看了你一眼10 小时前
分布式缓存 + 数据存储 + 消息队列知识体系
分布式·缓存
zhixingheyi_tian13 小时前
Spark 之 Aggregate
大数据·分布式·spark