不公平分发

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


相关文章
|
8月前
|
并行计算 Go 调度
Goroutine调度机制深度探究
【2月更文挑战第17天】Goroutine作为Go语言轻量级的并发执行体,其高效的调度机制是Go语言并发性能卓越的关键。本文将深入探究Goroutine的调度原理、调度器的实现以及调度过程中的优化策略,帮助读者全面了解Goroutine调度机制的内部工作机理,从而更好地利用Go语言的并发特性。
|
1月前
|
负载均衡 算法 Linux
深入探索Linux内核调度机制:公平与效率的平衡####
本文旨在剖析Linux操作系统内核中的进程调度机制,特别是其如何通过CFS(完全公平调度器)算法实现多任务环境下资源分配的公平性与系统响应速度之间的微妙平衡。不同于传统摘要的概览性质,本文摘要将直接聚焦于CFS的核心原理、设计目标及面临的挑战,为读者揭开Linux高效调度的秘密。 ####
37 3
|
6月前
|
编译器 调度 C++
协程问题之机制保障中提到的早值班机制和稳定性周会机制分别是什么
协程问题之机制保障中提到的早值班机制和稳定性周会机制分别是什么
|
8月前
|
监控 算法 自动驾驶
软件体系结构 - 调度算法(1) 最早截至时间优先
【4月更文挑战第19天】软件体系结构 - 调度算法(1) 最早截至时间优先
399 0
|
6月前
|
缓存
线程操纵术并行策略问题之工作窃取机制问题如何解决
线程操纵术并行策略问题之工作窃取机制问题如何解决
|
机器学习/深度学习 人工智能 缓存
基于改进Slime Mold算法的多处理器公平调度
基于改进Slime Mold算法的多处理器公平调度 常州大学计算机科学与人工智能学院,常州213164 * 通信地址应为的作者。 † 这些作者对这项工作做出了同样的贡献。 算法2023,16(10),473;https://doi.org/10.3390/a16100473(注册DOI) 接收日期:2023年9月25日/修订日期:2023.10月4日/接受日期:2024.10月7日 (本文属于《可持续制造的特刊调度理论与算法》)
105 0
基于改进Slime Mold算法的多处理器公平调度
|
设计模式 存储 API
游戏服务器架构:网络服务器端程序线程划分
游戏服务器架构:网络服务器端程序线程划分
|
人工智能 负载均衡 监控
支付宝定时任务怎么做?三层分发任务处理框架介绍
本文将从单机定时调度开始,循序渐进地带领大家了解五福定制三层分发任务处理框架。
24736 3
支付宝定时任务怎么做?三层分发任务处理框架介绍
为什么IT领导者应该优先考虑同理心
为什么IT领导者应该优先考虑同理心
107 0
|
消息中间件 负载均衡 算法
消息消费负载和重新分布机制|学习笔记
快速学习消息消费负载和重新分布机制
消息消费负载和重新分布机制|学习笔记