不公平分发

简介: 在最开始的时候我们学习到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);
        }
    }
}


相关文章
|
SQL 消息中间件 分布式计算
Hadoop常见端口总结
大数据常见端口汇总:
2524 0
Hadoop常见端口总结
|
网络协议 应用服务中间件 程序员
Docker实战:Docker安装Gitlab教程,非常实用
GitLab 是一个用于代码仓库管理系统的开源项目,使用Git作为代码管理工具,并在此基础上搭建起来的Web服务平台, 通过该平台可以实现Github类似的web系统,可以实现浏览代码、管理项目、管理团队人员、管理代码分支、代码提交记录等功能。Gitlab是目前互联网公司最流行的代码版本控制平台。
Docker实战:Docker安装Gitlab教程,非常实用
|
Python
AHP层次分析法Python代码:让AHP帮你选一个最符合你的礼物
AHP层次分析法Python代码:让AHP帮你选一个最符合你的礼物
737 0
AHP层次分析法Python代码:让AHP帮你选一个最符合你的礼物
|
存储 关系型数据库 MySQL
架构面试题汇总:40道题吃透mysql(2024版)
架构面试题汇总:40道题吃透mysql(2024版)
|
小程序 前端开发 Unix
微信小程序 | 实现活动报名登记
微信小程序 | 实现活动报名登记
840 0
微信小程序 | 实现活动报名登记
操作系统 生产者 - 消费者问题
操作系统 生产者 - 消费者问题
621 0
操作系统 生产者 - 消费者问题
|
存储 SQL 架构师
性能大PK count(*)、count(1)和count(列)
最近的工作中,我听到组内两名研发同学在交流数据统计性能的时候,聊到了以下内容: 数据统计你怎么能用 count(*) 统计数据呢,count(*) 太慢了,要是把数据库搞垮了那不就完了么,赶紧改用 count(1),这样比较快...... 有点儿好奇,难道 count(1) 的性能真的就比 count(*) 要好吗? 印象中网上有很多的文章都有过类似问题的讨论,那 MySQL 统计数据总数 count(*) 、count(1)和count(列名) 哪个性能更优呢?今天我们就来聊一聊这个问题。
性能大PK count(*)、count(1)和count(列)
|
存储 人工智能 供应链
新时代火热技术栈:大数据->人工智能(AI)->区块链
新时代火热技术栈:大数据->人工智能(AI)->区块链
新时代火热技术栈:大数据->人工智能(AI)->区块链
|
芯片 异构计算
FPGA-xilinx系列芯片的复位,你真的明白吗?(二)
FPGA-xilinx系列芯片的复位,你真的明白吗?
730 0
FPGA-xilinx系列芯片的复位,你真的明白吗?(二)
|
JSON Android开发 数据格式
Android 购物车实现(思路+步骤+源码)
Android 购物车实现(思路+步骤+源码)
1118 0
Android 购物车实现(思路+步骤+源码)

热门文章

最新文章