不公平分发

简介: 在最开始的时候我们学习到RabbitMQ分发消息采用的轮训分发,但是在某种场景下这种策略并不是很好,比方说有两个消费者在处理任务,其中有个消费者1处理任务的速度非常快,而另外一个消费者2处理速度却很慢,这个时候我们还是采用轮训分发的化就会到这处理速度快的这个消费者很大一部分时间处于空闲状态,而处理慢的那个消费者一直在干活,这种分配方式在这种情况下其实就不太好,但是RabbitMQ并不知道这种情况它依然很公平的进行分发。

在最开始的时候我们学习到RabbitMQ分发消息采用的轮训分发,但是在某种场景下这种策略并不是很好,比方说有两个消费者在处理任务,其中有个消费者1处理任务的速度非常快,而另外一个消费者2


处理速度却很慢,这个时候我们还是采用轮训分发的化就会到这处理速度快的这个消费者很大一部分时间处于空闲状态,而处理慢的那个消费者一直在干活,这种分配方式在这种情况下其实就不太好,但是


RabbitMQ并不知道这种情况它依然很公平的进行分发。


为了避免这种情况,我们可以设置参数channel.basicQos(1);


public class UnfairWork {
    public   final static String QUEUE_NAME="hello3";
    public static void main(String[] args) throws Exception {
        System.out.println("c1应答短....");
        Channel channel = untils.getChannel();
        /**
         * 不公平分发
         * 设置参数
         */
        int prefetchCount=1;
        channel.basicQos(1);
        /**
         * 消费者信息
         * 1.消费哪个队列
         * 2.消费成功以后是否要自动应答,true自动应答,false手动挡
         * 3.消费者未成功消费的回调内容1
         * 4.消费者取消的回调
         *
         */
        //声明 接收消息
        DeliverCallback deliverCallback=(consumerTag, delivery)->{
            try {
                Thread.sleep(1000);
            } catch (InterruptedException e) {
                e.printStackTrace();
            }
            //1.消息标记
            // 2.false 代表只应答接收到的哪个传递的信息,true为应答所有的消息包括传递过来的消息
            channel.basicAck(delivery.getEnvelope().getDeliveryTag(),false);
            System.out.println("接收到的消息"+new String(delivery.getBody()));
        };
        //取消   消息的回调
        CancelCallback cancelCallback= consumerTag -> {
            System.out.println(consumerTag+"消息消费者中断");
        };
        channel.basicConsume(QUEUE_NAME,false,deliverCallback,cancelCallback);
    }
}


/**
 * 这个和轮循的代码是一样的
 */
public class UnfairProduce {
    public static  final  String QUEUE_NAME="hello3";
    public static void main(String[] args) throws IOException, TimeoutException {
        Channel channel = untils.getChannel();
        channel.queueDeclare(QUEUE_NAME,false,false,false,null);
        //从控制太中接受消息
        Scanner scanner = new Scanner(System.in);
        while(scanner.hasNext())
        {
            String message=scanner.next();
            channel.basicPublish("",QUEUE_NAME,null,message.getBytes(StandardCharsets.UTF_8));;
            System.out.println("发送消息完成"+message);
        }
    }
}


相关文章
|
网络协议 应用服务中间件 程序员
Docker实战:Docker安装Gitlab教程,非常实用
GitLab 是一个用于代码仓库管理系统的开源项目,使用Git作为代码管理工具,并在此基础上搭建起来的Web服务平台, 通过该平台可以实现Github类似的web系统,可以实现浏览代码、管理项目、管理团队人员、管理代码分支、代码提交记录等功能。Gitlab是目前互联网公司最流行的代码版本控制平台。
Docker实战:Docker安装Gitlab教程,非常实用
|
存储 关系型数据库 MySQL
架构面试题汇总:40道题吃透mysql(2024版)
架构面试题汇总:40道题吃透mysql(2024版)
|
小程序 前端开发 Unix
微信小程序 | 实现活动报名登记
微信小程序 | 实现活动报名登记
729 0
微信小程序 | 实现活动报名登记
操作系统 生产者 - 消费者问题
操作系统 生产者 - 消费者问题
578 0
操作系统 生产者 - 消费者问题
|
存储 分布式计算 大数据
Hologres X TapTap,毫秒级实时在线推荐
本文将会介绍TapTap基于Hologres在实时推荐场景的最佳实践。
2036 0
Hologres X TapTap,毫秒级实时在线推荐
|
弹性计算 Kubernetes Cloud Native
CI/CD pipeline 集成的最佳实践|学习笔记
快速学习CI/CD pipeline 集成的最佳实践
348 0
CI/CD pipeline 集成的最佳实践|学习笔记
|
SQL 关系型数据库 MySQL
RDS For MySQL IOPS使用率高
RDS For MySQL IOPS使用率高
|
XML Java Maven
一个封装好的dialog工具类,减少重复的代码,简洁又方便使用!
一个封装好的dialog工具类,减少重复的代码,简洁又方便使用!
一个封装好的dialog工具类,减少重复的代码,简洁又方便使用!
百亿数据分库分表核心流程详解
前言 俗话说:面试造火箭,入职拧螺丝。尽管99.99%的业务都不需要用到分库分表,但是分库分表还是频繁出现在大厂的面试中。 分库分表涉及到的内容非常多,有很多细节,如果在面试中被问到了,既是挑战,也是机会,如果你能回答好的话,会给你的面试加很多分。 由于业务量的关系,绝大部分同学都很难有实际分库分表的机会,因此很多同学在碰到这个问题时很容易懵逼。 因此今天跟大家分享一下分库分表的相关知识,本文内容源于实际高并发+海量数据业务下的实战和个人的思考总结。
|
存储 人工智能 供应链
新时代火热技术栈:大数据->人工智能(AI)->区块链
新时代火热技术栈:大数据->人工智能(AI)->区块链
新时代火热技术栈:大数据->人工智能(AI)->区块链