zoukankan      html  css  js  c++  java
  • RabbitMQ Queue分发多个Consumer

    多个Consumer的消息分发

    之前讲过一个queue对应一个consumer的小例子, 但是在实际项目中,一个consumer肯定是不够的,queue中的消息过多。一个consumer明显会处理过慢,等待时间过长。这时候就需要多个consumer来缓解压力。

    消息发布端

    无论是创建connection还是创建channel与之前的步骤都是一样的,在上面我们使用的是默认的交换机。在这里可以自己声明一个交换机

    这里是与上个例子不同的地方,创建了exchange,把queue绑定到了交换机上。然后去发布一百个消息

    //声明一个direct类型的交换机
    channel.ExchangeDeclare("firstExchange", "direct", true, false, null);
    
    //声明队列
     channel.QueueDeclare("firstTest", true, false, false, null);
    
     //绑定队列
      channel.QueueBind("firstTest", "firstExchange", "firstExchange_Demo_firstTest", null);
    
    //发布一百个消息
    
    for (var i = 0; i < 100; i++)
     {
          var msg = Encoding.UTF8.GetBytes($"{i} :Hello RabbitMQ");
          channel.BasicPublish("firstExchange", routingKey: "firstExchange_Demo_firstTest", basicProperties: null, body: msg);
    }

    Consumer

    这边大部分也与上个例子的代码一致。

    //使用订阅的方式
    //这里的创建队列,是为了防止 消费 在 生产 之前
    channel.QueueDeclare("firstTest", true, false, false, null);
    //绑定队列 
    channel.ExchangeDeclare("firstExchange", "direct", true, false, null); 
    channel.QueueBind("firstTest", "firstExchange", "firstExchange_Demo_firstTest", null); 
    
    var consumer = new EventingBasicConsumer(channel);
    
    consumer.Received += (sender, e) =>
    {
           var msg = Encoding.UTF8.GetString(e.Body);
    
            Console.WriteLine(msg);
    };
    //进行消费
     channel.BasicConsume("firstTest", true, consumer);

    然后可以运行多个consumer,然后再打开消息发布程序。观察我们不同的consumer窗口

    可以看到queue是把第n个消息发送给了第n个consumer。如果这时候有三个consumer。那么它们收到的消息顺序分别是

    consumer1    consumer2   consumer3

          1                      2                    3

          4                      5                    6

    image

    这会带来一个问题,当consumer过多的时候,消息就会分配的不均匀,导致某些concumer非常忙,有些特别闲。而且consumer也会有掉线的情况,甚至queue和rabbitmq也会有崩溃的情况,这时候应该如此保持我们的消息的有效性、持久性、以及准确性呢。这些在下一篇博文中会详细说到

  • 相关阅读:
    分页 工具类 前后台代码 Java JavaScript (ajax) 实现 讲解
    java 对小数位的处理 BigDecimal DecimalFormat 常用操作 浅解
    事务 锁 悲观锁 乐观锁 概念 应用场景 使用方式 小记
    多项目使用同一个zookeeper,遇到的坑
    java线程关键字之volatile
    数据库事务
    Web.xml配置详解之context-param
    WINDOWS上KAFKA运行环境安装
    hibernate 之session学习
    windows 安装hadoop
  • 原文地址:https://www.cnblogs.com/LiangSW/p/6181735.html
Copyright © 2011-2022 走看看