RabbitMQ公平队列原理和使用

分库分表/哨兵模式/RabbitMQ/Redis持久化 1.分库分表:公司数据到达一定规模的时候,进行分库分表 某些表到达一定规模后,建立索引也无法性能提升,这时我们会考虑把单表拆分 应用层依赖类中间件 这类分库分表中间件的特点就是和应用强耦合, 需要应用显示依赖相应的jar包(以Java为例),比如知名的TDDL、 当当开源的sharding-jdbc、蘑菇街的TSharding、携程开源的Ctrip-DAL等。 2。哨兵模式 哨兵 -》独立运行的进程 @通过发送命令,让Redis服务器返回监控状态,包括主服务器和从服务器。 @当哨兵监测到master宕机, 阅读详情

RabbitMQ公平队列原理和使用

 目前消息转发机制是平均分配,这样就会出现俩个消费者,奇数的任务很耗时,偶数的任何工作量很小,造成的原因就是近当消息到达队列进行转发消息。并不在乎有多少任务消费者并未传递一个应答给RabbitMQ。仅仅盲目转发所有的奇数给一个消费者,偶数给另一个消费者。

为了解决这样的问题,我们可以使用basicQos方法,传递参数为prefetchCount= 1。这样告诉RabbitMQ不要在同一时间给一个消费者超过一条消息。
换句话说,只有在 消费者空闲的时候会发送下一条信息。调度分发消息的方式,也就是告诉RabbitMQ每次只给消费者处理一条消息,也就是等待消费者处理完毕并自己对刚刚处理的消息进行确认之后,才发送下一条消息,防止消费者太过于忙碌,也防止它太过去清闲。
通过 设置channel.basicQos(1);

  服务器能力不同,能者多劳。 均摊模式的话,都处理相同数量的

 消息队列 发出去的消息被消费完了 然后收到 ack包 才可以继续发给他

 公平队列原理:队列服务器向消费者发送消息的时候,消费者采用手动应答模式,队列服务器必须要收到消费者发送ack结果通知,才会发送下一个消息。(快的处理的多,消费的多)

producer:

package com.toov5.Producer;

import java.io.IOException;
import java.util.concurrent.TimeoutException;

import com.rabbitmq.client.Channel;
import com.rabbitmq.client.Connection;
import com.toov5.utils.MQConnectionUtils;

public class Producer {
    // 队列名称
    private static final String UEUE_NAME = "test_queue";

    public static void main(String[] args) throws IOException, TimeoutException {
        // 创建新的连接
        Connection connection = MQConnectionUtils.newConnection();
        // 创建Channel
        Channel channel = connection.createChannel();
        // 创建队列
        channel.queueDeclare(UEUE_NAME, false, false, false, null);
        channel.basicQos(1); // 保证 取一个消费  队列给消费者发送消息时候 一个消息
        for (int i = 0; i < 10; i++) {
            // 创建message
            String msg = "toov5_message";
            System.out.println("生产者投递消息" + msg + i);
            // 生产者发送消息
            channel.basicPublish("", UEUE_NAME, null, msg.getBytes());
        }
        // 关闭通道和连接
        channel.close();
        connection.close();

    }
}

 

Consumer1

package com.toov5.Consumer;

import java.io.IOException;
import java.util.concurrent.TimeoutException;

import com.rabbitmq.client.AMQP.BasicProperties;
import com.rabbitmq.client.Channel;
import com.rabbitmq.client.Connection;
import com.rabbitmq.client.DefaultConsumer;
import com.rabbitmq.client.Envelope;
import com.toov5.utils.MQConnectionUtils;

public class Consumer1 {
  
     //队列名称
        private static final String QUEUE_NAME = "test_queue";
        
        public static void main(String[] args) throws IOException, TimeoutException {
            System.out.println("消费者启动..........1");
            //创建新的连接
        Connection connection = MQConnectionUtils.newConnection();
           //创建Channel
            final Channel channel = connection.createChannel();
            // 消费者关联队列
             channel.queueDeclare(QUEUE_NAME, false, false, false, null);
             channel.basicQos(1);
              DefaultConsumer defaultConsumerr = new DefaultConsumer(channel) {
                  //监听获取消息
                    @Override
                    public void handleDelivery(String consumerTag, Envelope envelope, BasicProperties properties,
                            byte[] body) throws IOException {
                        String msg =new String(body,"UTF-8");
                        System.out.println("消费者获取生产者消息:"+msg);
                        try {
                            //模拟应答等待时间
                            Thread.sleep(1000);
                        } catch (Exception e) {
                            
                        }finally {
                           channel.basicAck(envelope.getDeliveryTag(), false);  //手动应答 告诉消息队列服务器 消费成功
                        }
                    }
              };
            //牵手模式设置  默认自动应答模式  true:自动应答模式  
              channel.basicConsume(QUEUE_NAME, false, defaultConsumerr);//    fanse手动应答          

        }
}

 

Consumer2

package com.toov5.Consumer;

import java.io.IOException;
import java.util.concurrent.TimeoutException;

import com.rabbitmq.client.AMQP.BasicProperties;
import com.rabbitmq.client.Channel;
import com.rabbitmq.client.Connection;
import com.rabbitmq.client.DefaultConsumer;
import com.rabbitmq.client.Envelope;
import com.toov5.utils.MQConnectionUtils;

public class Consumer2 {
  
     //队列名称
        private static final String QUEUE_NAME = "test_queue";
        
        public static void main(String[] args) throws IOException, TimeoutException {
            System.out.println("消费者启动..........2");
            //创建新的连接
        Connection connection = MQConnectionUtils.newConnection();
           //创建Channel
            final Channel channel = connection.createChannel();
            // 消费者关联队列
             channel.queueDeclare(QUEUE_NAME, false, false, false, null);
              channel.basicQos(1);
              DefaultConsumer defaultConsumerr = new DefaultConsumer(channel) {
                  //监听获取消息
                    @Override
                    public void handleDelivery(String consumerTag, Envelope envelope, BasicProperties properties,
                            byte[] body) throws IOException {
                        String msg =new String(body,"UTF-8");
                        System.out.println("消费者获取生产者消息:"+msg);
                        try {
                            //模拟应答等待时间
                            Thread.sleep(300);
                        } catch (Exception e) {
                            
                        }finally {
                        channel.basicAck(envelope.getDeliveryTag(), false);  //手动应答 告诉消息队列服务器 消费成功
                        }
                    }
              };
            //牵手模式设置  默认自动应答模式  true:自动应答模式  
              channel.basicConsume(QUEUE_NAME, false, defaultConsumerr);//    fanse手动应答          
        }
}

运行结果:

睡眠少的(执行快的) 指定的多

 注意 每个消费者 必须要应答 一下! 队列服务器没有收到应答 就不会发送下一个给消费者~

 

完全公平队列的实现 高效的完全公平队列的C++实现。 立即下载

相关推荐

离线脚本部署redis主从+哨兵(一主一从三哨兵)

其中含有redis安装包,主从+哨兵配置,部署和启停脚本,需修改后再使用,修改的地方用中文标注

解读公平队列调度

如果我们有两个每个类的子队列,它们将接收40%和60%的分配(也就是说,以2:3的比例),并且所有的数据包都是相同的大小,那么我们可以通过每个类的一个子队列发送两个数据包,另三个来实现WFQ。这是因为在WFQ下,分组是根据虚拟时钟按照GPS完成时间的顺序发送的,并且如果所有子队列总是活动的,则虚拟时钟以与墙时钟时间相同的速率运行(或者,如果子队列的固定子集总是活动的,则以与墙钟时间成比例的速率运行)。让我们假设每个类总是活动的,其中,如果路由器每次查看类的队列时它都不是空的,则类活动的。

qq_43222996的博客 2215

Python之美——Python2与Python3多版本共存

Python多版本共存的方法Python2、Python3共存的方法python2下载及环境变量配置第一步、打开Python官网,下载Python2第二步、python2环境变量配置测试结果 Python2、Python3共存的方法 方法如下: 1.先确保不同版本解释器的python.exe所在的路径在环境变量中 2.拷贝各自的python.exe并重命名即可 步骤(理解不了下面有图示): 1、首先你需要将不同的python版本安装,且都已经将跟版本的环境变量配置好了,python3和2的下载方式

chenchen5152的博客 3946

公平队列的实现

公平队列的实现(金庆的专栏) 公平队列(Fair Queuing)是一种调度算法,与先进先出队列不同, 公平队列分成几个子队列,每个子队列公平地得到处理。  例如上海地铁站充值窗口有两个,一个站外,一个站内,由同一位服务人员受理, 服务人员会轮流处理两个窗口的请求,两个窗口的队列将公平地得到处理。  公平队列应用于路由器,保证不同的数据流得到公平处理。  Zeromq的消息处理也应用了公平队列,不

金庆的专栏 5924

C++动态规划详解

动态规划思想 一、动态规划概念: 动态规划(dp)是研究多步决策过程最优化问题的一种数学方法。在动态规划中,为了寻找一个问题的最优解(即最优决策过程),将整个问题划分成若干个相应的阶段,并在每个阶段都根据先前所作出的决策作出当前阶段最优决策,进而得出整个问题的最优解。即记住已知问题的答案,在已知的答案的基础上解决未知的问题。 在这类问题中,可能会有许多可行解。每一个解都对应于一个值,我们希望找到具有最优值的解。动态规划算法与分治法类似,其基本思想也是将待求解问题分解成若干个子问题,先求解子问题,然后

weixin_51951103的博客 2万+

STM32H743必要外围电路分析

写在前面:这篇博客是我第一次绘制STM32最小系统板的过程记录。 2020-1-11 BOOT STM32采用ARM内核,和ARM处理器一样,都有专门的boot脚决定单片机从何处启动。 在官方数据手册的第105页,我们可以看到 系统复位后,在SYSTICK的第四个上升沿锁存BOOT引脚的值,复位后,BOOT引脚可以由用户自由配置而不会影响系统正常运行。 BOOT引脚决定了自举存储器地址,当BO...

Cui_Hongwei的博客 1万+

linux 公平 队列_Linux的公平调度(CFS)原理 - kummer话你知

1、CFS的基本思路在CFS算法引入之前,Linux使用过几种不同的调度算法,一开始的调度器是复杂度为O(n)的始调度算法(实际上每次会遍历所有任务,所以复杂度为O(n)), 这个算法的缺点是当内核中有很多任务时,调度器本身就会耗费不少时间,所以,从linux2.5开始引入赫赫有名的O(1)调度器,然而,linux是集全球很多程序员的聪明才智而发展起来的超级内核,没有最好,只有更好,在O(1)调度...

weixin_39627408的博客 398

【电子元件篇】电力电子中的变压器原理、作用、选型与测量指南-超简单解读

变压器虽小,却是电力电子的 “关键纽带”——从识别符号型号,到理解 “传交流隔直流” 的特点,再到按用途选参数、用万用表检测,只要抓住 “场景对应核心” 的逻辑,就能轻松掌握它的用法。

2301_81299416的博客 3026

第二节、算法中的公平——队列

1、栗子 学校食堂打饭、火车站买火车票、公交站等车,都要排队,先来的先上车,车满了,其余只能等下一班了。 这对大多数人而言,都是相对公平的方式。 在算法中,也有类似的公平——队列(queue)。 队列遵循先进先出(First In First Out,简写FIFO)的规则,同栈的实现一样,队列的实现也有数组实现和链表实现两种方式。 数组实现和链表实现没有绝对的优劣,平时接触数据比较多,所有首选数...

weixin_33853794的博客 316

duilib入门基础一 容器之 BOX、VBOX、HBOX布局及其子控件align排列方式

序 容器 duilib有以下主要布局容器 Box(自由布局容器) VBox(垂直布局容器) HBox(水平布局容器) TabBox(多标签布局容器) TileBox(格子布局容器) ChildBox(子布局容器) ScrollableBox(可滚动容器) 一、Box容器布局 Box容器及其扩展VBox HBox是其中最常用的容器。 相对Box来说,HBox, VBox更好理解些 1.1 VBox HBox VBox下的各个控件垂...

目前打算换一个工作,有招聘windows c++方向的也欢迎联系,北京、济南 最好 3083

【光伏风电功率预测】基于 ICEEMDAN + MSCNN-BiGRU-Attention 的并行预测模型

本文提出一种基于ICEEMDAN分解与多尺度深度学习的光伏/风电功率并行预测框架。针对多能源、多时间尺度、强非平稳特性带来的建模挑战,该模型首先通过改进的ICEEMDAN算法将原始功率序列分解为不同频段的IMF分量;随后为每个IMF构建包含多尺度CNN、双向GRU和注意力机制的子模型,实现局部特征提取与时序依赖建模;最后通过并行预测与重构获得最终功率输出。实验表明,该方法能有效解决模式混叠问题,提升预测精度,并支持光伏/风电的独立或联合预测部署,适用于风光联合调度等工程场景。

专注AI大模型,软件混淆,授权 155

微服务架构-分布式消息中间件-082:RabbitMQ消息确认机制&公平队列&发布订阅实现原理

082:RabbitMQ消息确认机制&公平队列&发布订阅实现原理1 Rabbitmq上节课内容简单回顾2 传统的队列存在那些缺陷3 Rabbitmq消费者如何实现手动ack4 Rabbitmq如何实现公平队列5 如何保证消息中间件消息不丢失6 如何开启Rabbitmq持久化功能7 Rabbitmq发布订阅的实现原理8 Rabbitmq实现发布订阅功能 1 Rabbitmq上节课内容简单回顾 课题内容 1.RabbitMQ如何保证消息不丢失? 2.RabbitMQ消息确认机制原理 3.Rabb

枫火的博客 3237

手把手教你学Simulink--基础储能管理场景实例:基于Simulink的锂电池健康状态(SOH)在线评估仿真

本文详细介绍了基于Simulink的锂电池健康状态(SOH)在线评估仿真方法。主要内容包括:1)SOH定义与量化指标(容量SOH、内阻SOH及综合SOH);2)基于Thevenin模型参数辨识和递推最小二乘法(RLS)的在线评估原理;3)100次充放电循环的仿真场景设置;4)Simulink建模步骤(主电路搭建、核心模块实现及信号流连接);5)仿真结果分析,显示SOH评估误差<2%,响应时间45秒,满足在线评估需求;6)提出多参数融合评估、深度学习辅助辨识等优化方向。该方法为储能系统寿命管理提供了有效

MHD0815的博客 182

82.分布式消息中间件-RabbitMQ消息确认机制&公平队列&发布订阅实现原理

一、解决Rabbitmq创建账号权限的问题 二、Rabbitmq上节课内容简单回顾 vitualhost类似数据库的分库 三、传统的队列存在那些缺陷 点对点: 由多个消费者,会 轮询均摊 四、Rabbitmq消费者如何实现手动ack 消费者和MQ服务器端第一次建立链接时:拉取消息 推送消息 RabbitMQ如何保证消息不丢失 1.使用消息确认机制+持久技术 A.消费者确认收到消息机制...

封神之路 710

零基础学simulink仿真建模--使用Simulink来构建一个混合动力无人机中燃料电池与锂电池协同控制的仿真模型

延长飞行时间:燃料电池的能量密度高于锂电池,适合长时间稳定供电。提高功率密度:锂电池能够快速响应瞬时高功率需求,比如起飞和加速阶段。优化能源管理:通过有效的能量管理系统,可以根据实际需求动态调整燃料电池和锂电池的工作状态,从而提高整体效率。通过上述步骤,我们简要介绍了如何基于Simulink实现混合动力无人机中燃料电池与锂电池协同控制的仿真模型。

amy_mhd的博客 190

精雕软件(JDpaint) 5.5 绿色版

精雕软件(JDpaint) 5.5 绿色版精雕软件(JDpaint) 5.5 绿色版精雕软件(JDpaint) 5.5 绿色版

RabbitMQ-工作队列

介绍 RabbitMQ是消息代理。它接收信息和转发信息。你可以把他考虑成一个邮局。当你讲邮寄的信放在邮局时,你可以确定邮差先生或者女士会把邮件最终送到你的收件人手中。当然邮局和RabbitMQ最大的区别,RabbitMq不接受纸张,它只接收,存储,转发二进制的数据消息快。 下面讲一些RabbitMQ中的术语: Producer 生成只不过意味着发送信息。发送信息的程序是生产者 Queue ...

huskyui 318

SIMATIC S7-1200, S7-1500 PID 控制[手册]

SIMATIC S7-1200, S7-1500 PID 控制[手册]

分布式实战之RabbitMQ

virtual host :虚拟主机 简单队列(均摊消费(也是系统默认的))和工作队列(公平型队列) – 均摊消费存在的问题 如果每个消费者处理业务的时间不相同,可能对消费者处理比较慢的服务不公平,应该是能者多劳嘛!!! – 工作队列就是能者多劳 – 公平队列的原理 队列服务器向消费者发送消息,消费者采用手动应答模式,队列服务器必须收到消费者发送的ack结果通知,才会继续发送下一个消息。 应答模式 – 自动应答 不在乎消费者对消息处理是否成功,都会告诉消息队列删除消息 – 手动应答 消费者处理完业务逻辑,.

zhaogot的博客 180

Statistics and Machine Learning Toolbox

Statistics and Machine Learning Toolbox(带书签),MATLAB统计学习工具

RU DOS版、EFI版32bit/64bit BIOS常用工具

DOS版、EFI版的RU工具,可用来查看IO、MEM、PCI、SMBIOS等资源。亲测在EFI SHELL下可用。

消息队列-RabbitMQ各种消息使用

实现公平队列 公平队列:也就是能力强的消费者处理的消息多一点,能者多劳。也叫工作队列。 如何实现公平消费:使用手动 ack 模式,也就是消费者手动发送消息告诉 mq 服务器端,消息消费完成,可以从队列删除该消息。 主动拉去:消费者和MQ服务器端第一次建立连接的时候。 主动推送:消费者已经和MQ服务器端保持长连接了,只要生产者投递消息,MQ服务端会立即将消息转发给消费者。 公平队列实现原理:MQ服务端没次只会给消费者发送一条消息,如果消费者没有返回ack,就不会继续发消息。 实现代码: 生产者: public

weixin_44044929的博客 1485

RabbitMQ(三)入门 —— RabbitMQ的五种模式和四种交换机

官网说明的七种模式 举例前五种 如何保证消息不丢失?持久化,以及消息确认机制主要以有交换器的来讲。 死信队列:1、消息堆积超过容量 2、消费失败后3次 3、消息堆积过期 疑问:死信队列也发生上述情况怎么办? rabbitmq的幂等性。重发,错误日志。 ...

宏哥的博客 7502

RabbitMQ的应用总结

只有在 消费者空闲的时候会发送下一条信息。调度分发消息的方式,也就是告诉RabbitMQ每次只给消费者处理一条消息,也就是等待消费者处理完毕并自己对刚刚处理的消息进行确认之后,才发送下一条消息,防止消费者太过于忙碌,也防止它太过去清闲。

z_ssyy的博客 311

RabbitMQ

文章目录1.什么是消息队列2.消息队列有什么用3.什么是交换机4.RabbitMQ的四种交换机4.1.Direct Exchange(直连交换机)4.2.Fanout Exchange(扇形交换机)4.3.Topic Exchange(主题交换机)4.4.Headers Exchanges(头部交换机)5.RabbitMQ的五种队列5.1.Simple Work Queue (简单工作队列)5.2...

QAQ123666的博客 323

RabbitMq | 工作对列(公平形对列)

均摊消费弊端: 消费者1处理业务时间1s,消费者2处理业务时间0.5s时间,如果每个消费处理消息的业务时间不相同,对消费者处理慢的不公平 工作对列称为能者多劳 公平队列原理: 队列服务器向消费者发送消息的时候,消费者采用手动应答模式,队列服务器必 须要收到消费者发送ack结果通知,才会继续发送一下一个消息。 ...

俺老孙来也 239

rabbitMQ笔记

RabbitMQ是有erlang语言开发,所以必须erlang环境才能运行 对比: Erlang语言最初目的是进行大型电信交换机设备的软件开发,是一种适合于大规模并发处理的高性能编程语言。 管理平台:http://127.0.0.1:15672 默认账号:guest/guset Virtual hosts: 想mysql有数据库的概念并且可以指定用户对库和表...

FUSIPING的博客 595

RabbitMQ消息中间件概述

AMQP 的出现其实也是应了广大人民群众的需求,虽然在同步消息通讯的世界里有很多公开标准(如 COBAR的 IIOP ,或者是 SOAP 等),但是在异步消息处理中却不是这样,只有大企业有一些商业实现(如微软的 MSMQ ,IBM 的 Websphere MQ 等),因此,在 2006 年的 6 月,Cisco 、Redhat、iMatix 等联合制定了 AMQP 的公开标准。功能实现:一个生产者发送消息,多个消费者获取消息(同样的消息),包括一个生产者,一个交换机,多个队列,多个消费者。

weixin_57763462的博客 608

RabbitMQ消息中间件的用法

1.什么是RabbitMQ RabbitMQ是一个由erlang开发的AMQP(Advanced Message Queue )的开源实现。AMQP 的出现其实也是应了广大人民群众的需求,虽然在同步消息通讯的世界里有很多公开标准(如 COBAR的 IIOP ,或者是 SOAP 等),但是在异步消息处理中却不是这样,只有大企业有一些商业实现(如微软的 MSMQ ,IBM 的 Websph...

dianbiao3588的博客 173

3.RABBITMQ_6种工作模式

RabbitMQ的基本结构 Simple工作模式 不用显示声明交换机,只需声明一个队列 生产者指定队列名发送消息给mq,然后会有一个默认的交换机将消息转发给这个队列。 消费者负责监听这个队列,一有消息就会得到通知做出响应。 golang代码示例 工作队列模式(Work queues) 和简单队列模式基本一样,不过有一点不同,该模式有多个消费者在监听队列。 rabbitmq会以轮询的方...

像素格子的博客 321
上一篇: RabbitMQ整合Spring Booot【公平队列】
下一篇: RabbitMQ发布订阅模式原理和实现(交换机)
Art&Code
博客等级 码龄7年 77粉丝 554原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值