第六章 玩转Java整合RabbitMQ 工作队列模型实战(2)

第3集 玩转RabbitMQ工作队列 轮训策略实战

简介:RabbitMQ工作队列 轮训策略讲解实战

  • 工作队列

    • 消息生产能力大于消费能力,增加多几个消费节点

    • 和简单队列类似,增加多个几个消费节点,处于竞争关系

    • 默认策略:round robin 轮训

      image-20210108140237110

 
 
 
xxxxxxxxxx
 
 
 
 
public class Send {
    private final static String QUEUE_NAME = "work_mq_rr";
    public static void main(String[] argv) throws Exception {
        ConnectionFactory factory = new ConnectionFactory();
        factory.setHost("10.211.55.13");
        factory.setUsername("admin");
        factory.setPassword("password");
        factory.setVirtualHost("/dev");
        factory.setPort(5672);
        try (
                //创建连接
                Connection connection = factory.newConnection();
                //创建信道
                Channel channel = connection.createChannel()) {
            /**
             * 队列名称
             * 持久化配置
             * 排他配置
             * 自动删除
             * 其他参数
             */
            channel.queueDeclare(QUEUE_NAME, false, false, false, null);
            //轮训发送 10个
            for(int i=0;i<10;i++){
                String message = "Hello World!"+i;
                channel.basicPublish("", QUEUE_NAME, null, message.getBytes(StandardCharsets.UTF_8));
                System.out.println(" [x] Sent '" + message + "'");
            }
        }
    }
}
 
 
  • 消费者代码1
 
 
 
xxxxxxxxxx
 
 
 
 
public class Recv1 {
    private final static String QUEUE_NAME = "work_mq_rr";
    public static void main(String[] argv) throws Exception {
        ConnectionFactory factory = new ConnectionFactory();
        factory.setHost("10.211.55.13");
        factory.setUsername("admin");
        factory.setPassword("password");
        factory.setVirtualHost("/xdclass1");
        factory.setPort(5672);
        Connection connection = factory.newConnection();
        Channel channel = connection.createChannel();
        channel.queueDeclare(QUEUE_NAME, false, false, false, null);
        System.out.println(" [*]Waiting for messages. To exit press CTRL+C");
        DeliverCallback deliverCallback = (consumerTag, delivery) -> {
            //模拟消费缓慢
            try {
                TimeUnit.SECONDS.sleep(3);
            } catch (InterruptedException e) {
                e.printStackTrace();
            }
            String message = new String(delivery.getBody(), "UTF-8");
            System.out.println("[x] Received '" + message + "'");
            //手工确认消息消费,不是多条确认
            channel.basicAck(delivery.getEnvelope().getDeliveryTag(), false);
        };
        //关闭自动确认消息
        channel.basicConsume(QUEUE_NAME, false, deliverCallback, consumerTag -> { });
    }
}
 
 
  • 消费者代码2
 
 
 
xxxxxxxxxx
 
 
 
 
public class Recv2 {
    private final static String QUEUE_NAME = "work_mq_rr";
    public static void main(String[] argv) throws Exception {
        ConnectionFactory factory = new ConnectionFactory();
        factory.setHost("10.211.55.13");
        factory.setUsername("admin");
        factory.setPassword("password");
        factory.setVirtualHost("/xdclass1");
        factory.setPort(5672);
        Connection connection = factory.newConnection();
        Channel channel = connection.createChannel();
        channel.queueDeclare(QUEUE_NAME, false, false, false, null);
        System.out.println(" [*]  Waiting for messages. To exit press CTRL+C");
        DeliverCallback deliverCallback = (consumerTag, delivery) -> {
            //模拟消费缓慢
            try {
                TimeUnit.SECONDS.sleep(3);
            } catch (InterruptedException e) {
                e.printStackTrace();
            }
            String message = new String(delivery.getBody(), "UTF-8");
            System.out.println(" [x] Received '" + message + "'");
            //手工确认消息消费,不是多条确认
            channel.basicAck(delivery.getEnvelope().getDeliveryTag(), false);
        };
        //关闭自动确认消息
        channel.basicConsume(QUEUE_NAME, false, deliverCallback, consumerTag -> { });
    }
}
 
 
  • 轮训策略验证

    • 先启动两个消费者,再启动生产者
    • 缺点:存在部分节点消费过快,部分节点消费慢,导致不能合理处理消息

 

 

 

 

 

 

第4集 玩转RabbitMQ工作队列 公平策略实战

简介:RabbitMQ工作队列 公平策略讲解实战

  • 公平策略验证

    • 修改消费者策略
    • 解决消费者能力消费不足的问题,降低消费时间问题

     

    image-20210108141609019

posted @ 2021-10-25 17:48  老吴IT代码笔记*  阅读(37)  评论(0编辑  收藏  举报