work工作消息队列Round-robin与Fair dispatch
一:介绍
1.模型
有两种情形,分别是轮训分发与公平分发。

2.出现的场景
考虑到simple queue中的缺点。
因为生产者发送消息后,消费者消费要花费时间,这个会造成消息的堆积。
二:Round robin--轮循
1.发送程序
这个与简单程序类似,只是发送多条数据而已。
package com.mq.work.round; import com.mq.utils.ConnectionUtil;
import com.rabbitmq.client.Channel;
import com.rabbitmq.client.Connection; public class RoundWorkSend {
private static final String QUENE_NAME="test_work_queue";
public static void main(String[] args) throws Exception {
//获取一个连接
Connection connection= ConnectionUtil.getConnection();
//从连接中获取一个通道
Channel channel=connection.createChannel();
//创建队列声明
channel.queueDeclare(QUENE_NAME,false,false,false,null); //消息与发送放入for循环
for (int i=0;i<50;i++){
String msg="hello "+i;
System.out.println("[send msg]:"+msg);
channel.basicPublish("",QUENE_NAME,null,msg.getBytes());
Thread.sleep(i*1);
} //关闭连接
channel.close();
connection.close();
}
}
2.消费者一
package com.mq.work.round; import com.mq.utils.ConnectionUtil;
import com.rabbitmq.client.*; import java.io.IOException; public class RoundWorkReceive1 {
private static final String QUENE_NAME="test_work_queue";
public static void main(String[] args)throws Exception{
//获取一个连接
Connection connection = ConnectionUtil.getConnection();
//创建通道
Channel channel = connection.createChannel();
//创建队列声明
channel.queueDeclare(QUENE_NAME,false,false,false,null);
//创建消费者
DefaultConsumer consumer=new DefaultConsumer(channel){
@Override
public void handleDelivery(String consumerTag, Envelope envelope, AMQP.BasicProperties properties, byte[] body) throws IOException {
String msg=new String(body,"utf-8");
System.out.println("[1]receive msg:"+msg);
try {
Thread.sleep(200);
} catch (InterruptedException e) {
e.printStackTrace();
}finally {
System.out.println("done");
}
}
};
//监听队列
boolean autoAck=true;
channel.basicConsume(QUENE_NAME,autoAck,consumer);
}
}
3.消费者二
package com.mq.work.round; import com.mq.utils.ConnectionUtil;
import com.rabbitmq.client.*; import java.io.IOException; public class RoundWorkReceive2 {
private static final String QUENE_NAME="test_work_queue";
public static void main(String[] args)throws Exception{
//获取一个连接
Connection connection = ConnectionUtil.getConnection();
//创建通道
Channel channel = connection.createChannel();
//创建队列声明
channel.queueDeclare(QUENE_NAME,false,false,false,null);
//创建消费者
DefaultConsumer consumer=new DefaultConsumer(channel){
@Override
public void handleDelivery(String consumerTag, Envelope envelope, AMQP.BasicProperties properties, byte[] body) throws IOException {
String msg=new String(body,"utf-8");
System.out.println("[2]receive msg:"+msg);
try {
Thread.sleep(300);
} catch (InterruptedException e) {
e.printStackTrace();
}finally {
System.out.println("done");
}
}
};
//监听队列
boolean autoAck=true;
channel.basicConsume(QUENE_NAME,autoAck,consumer);
}
}
4.现象
send

receive1:

receive2:

三:fair dispatcher
1.介绍
使用公平分发需要关闭自动应答,改成手动。
有一种通俗的说法是:能者多劳。
2.生产者
需要改动的地方是:每个消费者在得到确认消息之前,消息队列不得发送一个消息给消费者,一次只能处理一个消息。
package com.mq.work.fair; import com.mq.utils.ConnectionUtil;
import com.rabbitmq.client.Channel;
import com.rabbitmq.client.Connection; public class FairWorkSend {
private static final String QUENE_NAME="test_work_queue";
public static void main(String[] args) throws Exception {
//获取一个连接
Connection connection= ConnectionUtil.getConnection();
//从连接中获取一个通道
Channel channel=connection.createChannel();
//创建队列声明
channel.queueDeclare(QUENE_NAME,false,false,false,null); //限制发送给一个消费者不得超过1条
int prefetchCount=1;
channel.basicQos(prefetchCount); //消息与发送放入for循环
for (int i=0;i<50;i++){
String msg="hello "+i;
System.out.println("[send msg]:"+msg);
channel.basicPublish("",QUENE_NAME,null,msg.getBytes());
Thread.sleep(i*1);
} //关闭连接
channel.close();
connection.close();
}
}
3.消费者一
需要改动的行数,14,18,33,38
package com.mq.work.fair; import com.mq.utils.ConnectionUtil;
import com.rabbitmq.client.*; import java.io.IOException; public class FairWorkReceive1 {
private static final String QUENE_NAME="test_work_queue";
public static void main(String[] args)throws Exception{
//获取一个连接
Connection connection = ConnectionUtil.getConnection();
//创建通道
final Channel channel = connection.createChannel();
//创建队列声明
channel.queueDeclare(QUENE_NAME,false,false,false,null); //一次只能发送一个消息
channel.basicQos(1); //创建消费者
DefaultConsumer consumer=new DefaultConsumer(channel){
@Override
public void handleDelivery(String consumerTag, Envelope envelope, AMQP.BasicProperties properties, byte[] body) throws IOException {
String msg=new String(body,"utf-8");
System.out.println("[1]receive msg:"+msg);
try {
Thread.sleep(200);
} catch (InterruptedException e) {
e.printStackTrace();
}finally {
System.out.println("done");
//手动应答
channel.basicAck(envelope.getDeliveryTag(),false);
}
}
};
//监听队列,不是自动应答
boolean autoAck=false;
channel.basicConsume(QUENE_NAME,autoAck,consumer);
}
}
3.消费者二
与消费者一不同点在于消费每个消息的时间不同。
package com.mq.work.fair; import com.mq.utils.ConnectionUtil;
import com.rabbitmq.client.*; import java.io.IOException; public class FairWorkReceive2 {
private static final String QUENE_NAME="test_work_queue";
public static void main(String[] args)throws Exception{
//获取一个连接
Connection connection = ConnectionUtil.getConnection();
//创建通道
final Channel channel = connection.createChannel();
//创建队列声明
channel.queueDeclare(QUENE_NAME,false,false,false,null); //一次只能发送一个消息
channel.basicQos(1); //创建消费者
DefaultConsumer consumer=new DefaultConsumer(channel){
@Override
public void handleDelivery(String consumerTag, Envelope envelope, AMQP.BasicProperties properties, byte[] body) throws IOException {
String msg=new String(body,"utf-8");
System.out.println("[1]receive msg:"+msg);
try {
Thread.sleep(500);
} catch (InterruptedException e) {
e.printStackTrace();
}finally {
System.out.println("done");
//手动应答
channel.basicAck(envelope.getDeliveryTag(),false);
}
}
};
//监听队列,不是自动应答
boolean autoAck=false;
channel.basicConsume(QUENE_NAME,autoAck,consumer);
}
}
4.现象
消费者一:

消费者二:

work工作消息队列Round-robin与Fair dispatch的更多相关文章
- BS架构下使用消息队列的工作流程
异步通信 对于BS(Browser-Server 浏览器)架构,很多情景下server的处理时间较长. 如果浏览器发送请求后,保持跟server的连接,等待server响应,那么一方面会对用户的体验有 ...
- [Go]TCP服务中增加消息队列与工作池
之前的处理中每一个连接都会创建一个主groutine , 每个连接中的主groutine中创建出读groutine 和写groutine 每个连接处理业务再单独开出一个groutine ,这样如果有1 ...
- 消息队列rabbitmq的五种工作模式(go语言版本)
前言:如果你对rabbitmq基本概念都不懂,可以移步此篇博文查阅消息队列RabbitMQ 一.单发单收 二.工作队列Work Queue 三.发布/订阅 Publish/Subscribe 四.路由 ...
- [日常工作]GS使用消息队列进行凭证实时记账 提高性能配置方法
1. 安装消息队列服务 使用平台技术部的一键安装工具,安装. 自带jdk以及activeMQ 自动注册服务. 比较方便. 2. 修改/gsp/config下面的MQ配置文件,将消息队列服务修改为当前虚 ...
- 柯南君:看大数据时代下的IT架构(5)消息队列之RabbitMQ--案例(Work Queues起航)
二.Work Queues(using the Java Client) 走起 在第上一个教程中我们写程序从一个命名队列发送和接收消息.在这一次我们将创建一个工作队列,将用于分发耗时的任务在多个工 ...
- 高性能消息队列 CKafka 核心原理介绍(上)
欢迎大家前往腾讯云技术社区,获取更多腾讯海量技术实践干货哦~ 作者:闫燕飞 1.背景 Ckafka是基础架构部开发的高性能.高可用消息中间件,其主要用于消息传输.网站活动追踪.运营监控.日志聚合.流式 ...
- 三.RabbitMQ之异步消息队列(Work Queue)
上一篇文章简要介绍了RabbitMQ的基本知识点,并且写了一个简单的发送和接收消息的demo.这一篇文章继续介绍关于Work Queue(工作队列)方面的知识点,用于实现多个工作进程的分发式任务. 一 ...
- 一个无锁消息队列引发的血案(五)——RingQueue(中) 休眠的艺术
目录 (一)起因 (二)混合自旋锁 (三)q3.h 与 RingBuffer (四)RingQueue(上) 自旋锁 (五)RingQueue(中) 休眠的艺术 (六)RingQueue(中) 休眠的 ...
- RabbitMQ,Apache的ActiveMQ,阿里RocketMQ,Kafka,ZeroMQ,MetaMQ,Redis也可实现消息队列,RabbitMQ的应用场景以及基本原理介绍,RabbitMQ基础知识详解,RabbitMQ布曙
消息队列及常见消息队列介绍 2017-10-10 09:35操作系统/客户端/人脸识别 一.消息队列(MQ)概述 消息队列(Message Queue),是分布式系统中重要的组件,其通用的使用场景可以 ...
随机推荐
- Hbase 集群安装(Hadoop 2.6.0 hbase0.99.2)
一:说明 该安装是在hadoop集群安装后进行,详情可见上一篇博客虚拟机centos7系统下安装hadoop ha和yarn ha(详细) .其中涉及五台机器,两台master(机器名:master, ...
- Linux - 日志处理一
Linux 日志处理 history # 历时命令默认1000条 HISTTIMEFORMAT="%Y-%m-%d %H:%M:%S " # 让history命令显示具体时间 hi ...
- POJ3635 Full Tank?【Dijkstra+DP】
题意: n个城市之间有m条双向路.每条路要耗费一定的油量.每个城市的油价是固定并且已经给出的.有q个询问,表示从城市s走到e,油箱的容量为c,求最便宜的方案. 思路: 用Dijkstra+Heap即可 ...
- shiro自定义realm认证(五)
上一节介绍了realm的作用: realm:需要根据token中的身份信息去查询数据库(入门程序使用ini配置文件),如果查到用户返回认证信息,如果查询不到返回null.token就相当于是对用户输入 ...
- JavaScript中Function的拓展
Function 是什么东西,就是JavaScript中的顶级类,系统级别的类.我们平时写的函数方法例如下. function Animal() { } Animal就是Function的实例,但是在 ...
- NSIS程序安装包制作
nsis下载地址:http://www.pc6.com/softview/SoftView_14342.html nsis使用: 启动NSIS程序主界面,选择"可视化脚本编辑器(VNISEd ...
- ROC,AUC,PR,AP介绍及python绘制
这里介绍一下如题所述的四个概念以及相应的使用python绘制曲线: 参考博客:http://kubicode.me/2016/09/19/Machine%20Learning/AUC-Calculat ...
- Linux动态频率调节系统CPUFreq之一:概述【转】-- 非常好的博客
转自:http://blog.csdn.net/droidphone/article/details/9346981 目录(?)[-] sysfs接口 软件架构 cpufreq_policy ...
- C#删除WebBrowser控件Session
转载:http://www.hackdig.com/?02/hack-1464.htm 因为要搞一个类似帐号多开的小辅助,但是很坑爹的发现,在一个WebBrowser中,就算重新登录,显示的仍然是上一 ...
- windows service 的错误 错误 14001:
1.Windows服务启动时报:“错误 14001:由于应用程序配置不正确,应用程序未能启动.重新安装应用程序可能会纠正这个问题.”的错误. 原因:Windows 服务程序 配置文件中 <a ...