上篇文章讲的轮询分发 : 1个队列,无论多少个消费者,无论消费者处理消息的耗时长短,大家消费的数量都一样.

而公平分发,又叫 : 能者多劳,顾名思义,处理得越快,消费得越多.

生产者

    public class Producer
{
private const string QueueName = "test_work2_queue"; public static void Send()
{
//获取一个连接
IConnection connection = ConnectionHelper.GetConnection(); //从连接中获取一个通道
IModel channel = connection.CreateModel(); //声明队列
channel.QueueDeclare(QueueName, false, false, false, null); //每次只向消费者发送一条消息,消费者使用后,手动确认后,才会发送另外一条
channel.BasicQos(0, 1, false); for (int i = ; i < ; i++)
{
string msg = "hello world " + i; //发送消息
channel.BasicPublish("", QueueName, null, Encoding.Default.GetBytes(msg));
Console.WriteLine($"send {msg}");
} channel.Close();
connection.Close();
}
}

消费者1

    public class Consumer1
{
private const string QueueName = "test_work2_queue";
public static void Receive()
{
//获取连接
IConnection connection = ConnectionHelper.GetConnection(); //创建通道
IModel channel = connection.CreateModel(); //声明队列
channel.QueueDeclare(QueueName, false, false, false, null); channel.BasicQos(0, 1, false); //添加消费者
EventingBasicConsumer consumer = new EventingBasicConsumer(channel); //注册事件
consumer.Received += (s, e) =>
{
byte[] bytes = e.Body;
string msg = Encoding.Default.GetString(bytes);
Console.WriteLine("consumer1 : " + msg);
Thread.Sleep();//休息2秒
channel.BasicAck(e.DeliveryTag, false);//手动确认,false表示只确认当前这条消息已收到,ture表示在当前这条消息及之前(小于 DelivertTag )的所有未确认的消息都已收到.
}; //监听队列,第2个参数设置为手动确认.true 则为自动确认.
channel.BasicConsume(QueueName, false, "", false, false, null, consumer);
}
}

消费者2

                Console.WriteLine("consumer2 : " + msg);
Thread.Sleep();//休息1秒

运行效果:

由于 消费者1处理一条消息要2秒,而消费者2只要1秒,所以消费者2处理得多一些.

方法解释:

channel.BasicQos(0, 1, false)

参数1: prefetchSize:0

参数2: prefetchCount:1 ,告诉RabbitMQ,不要同时给一个消费者推送多于1条消息,即一旦有1个消息还没有ack(确认),则该消费者将block掉,直到有消息确认

global:true\false 是否将上面设置应用于channel,简单点说,就是上面限制是channel级别的还是consumer级别

备注:据说prefetchSize 和global这两项,rabbitmq没有实现,暂且不研究.

channel.BasicAck(e.DeliveryTag, false)

参数1 : deliveryTag : e.DeliveryTag,该消息的标记 ,ulong 类型.
参数2 : multiple:是否批量.true:将一次性确认所有小于 deliveryTag 的消息.

RabbitMQ (四) 工作队列之公平分发的更多相关文章

  1. RabbitMQ学习第二记:工作队列的两种分发方式,轮询分发(Round-robin)和 公平分发(Fair dispatch)

    1.什么是RabbitMQ工作队列 我们在应用程序使用消息系统时,一般情况下生产者往队列里插入数据时速度是比较快的,但是消费者消费数据往往涉及到一些业务逻辑处理导致速度跟不上生产者生产数据.因此如果一 ...

  2. 轻松搞定RabbitMQ(二)——工作队列之消息分发机制

    转自 http://blog.csdn.net/xiaoxian8023/article/details/48681987 上一篇博文中简单介绍了一下RabbitMQ的基础知识,并写了一个经典语言入门 ...

  3. RabbitMQ的轮询模式和公平分发

    一.常用的消息模式 我们在工作的使用中,经常会遇到多个消费者监听同一个队列的情况,模型如下图所示: 当有多个消费者时,我们的消息会被哪个消费者消费呢,我们又该如何均衡消费者消费信息的多少呢: 主要有两 ...

  4. RabbitMQ简单应用の公平分发(fair dipatch)

    公平分发(fair dipatch)和轮询分发其实基本一致,只是每次分发的机制变了,由原来的平均分配到现在每次只处理一条消息 1.MQ连接工厂类Connection package com.mmr.r ...

  5. 【python】-- RabbitMQ 队列消息持久化、消息公平分发

    RabbitMQ 队列消息持久化 假如消息队列test里面还有消息等待消费者(consumers)去接收,但是这个时候服务器端宕机了,这个时候消息是否还在? 1.队列消息非持久化 服务端(produc ...

  6. rabbitmq 公平分发和消息接收确认(转载)

    原文地址:http://www.jianshu.com/p/f63820fe2638 当生产者投递消息到broker,rabbitmq把消息分发到消费者. 如果设置了autoAck=true 消费者会 ...

  7. RabbitMQ之工作队列

    工作队列 工作队列(又称:任务队列Task Queues)是为了避免等待一些占用大量资源.时间的操作,当我们把任务Task当做消息发送队列中,一个运行在后台的工作者worker进程就会取出任务然后处理 ...

  8. 持久化和公平分发.py

    1.消息持久化在实际应用中,可能会发生消费者收到Queue中的消息,但没有处理完成就宕机(或出现其他意外)的情况,这种情况下就可能会导致消息丢失.为了避免这种情况发生,我们可以要求消费者在消费完消息后 ...

  9. RabbitMQ基本用法、消息分发模式、消息持久化、广播模式

    RabbitMQ基本用法 进程queue用于同一父进程创建的子进程间的通信 而RabbitMQ可以在不同父进程间通信(例如在word和QQ间通信) 示例代码 生产端(发送) import pika c ...

随机推荐

  1. BZOJ3243 [Noi2013]向量内积 【乱搞】

    题目链接 BZOJ3243 题解 模数只有\(2\)或\(3\),可以大力讨论 如果模数为\(2\),乘积结果只有\(1\)或\(0\) 如果一个向量和前面所有向量乘积都为\(1\),那么其和前面向量 ...

  2. C++——类继承以及类初始化顺序

    对于类以及类继承, 几个主要的问题:1) 继承方式: public/protected/private继承. 这是c++搞的, 实际上继承方式是一种允许子类控制的思想. 子类通过public继承, 可 ...

  3. [NOIP2003] 传染病控制 搜索+剪枝

    搜索的最广泛应用优化——剪枝 这道题的dp和贪心都是无正确性的,所以,搜~~~~~~~ 搜的时候你发现不剪枝极容易被卡掉(然而良心NOIP没有这么做,不剪枝仍然飞快),所以我们需要一些玄学的剪枝最常见 ...

  4. git使用笔记(七)版本回退和撤销

    By francis_hao    Nov 21,2016 从版本库初始化开始,每一步的撤销操作 添加第一个文件 在空的版本库中创建了一个文件并git add到了缓存区,这时候怎么撤销呢? 撤销单个文 ...

  5. 怎么把centos虚拟机zip文件导入vm虚拟机中

    执行以上三步就可以将一个压缩的centoszip文件导入到虚拟机中

  6. Kafka自我学习1-Multi-broker cluster

    ====================================Testing environment =========================================== ...

  7. javascript学习教程

    我来班门弄斧一下吧,把我JavaScript学习过程中常去的一些网站分享给大家: =========================增加================================ ...

  8. Hibernate中inverse、cascade的说明

    一: 前沿:刚刚学习hibernate时,对于inverse很是纠结,不知道什么时候该用什么时候不该用,在网上找了一些资料,说的也很含糊,我都不知道如果写了"inverse=true&quo ...

  9. Ubuntu下修改NAT模式的IP地址

    1,查看虚拟机的网段 在编辑->虚拟网络编辑器->NAT设置->网关 IP  可以查看到虚拟机的网关 如图 2,图形化设置: 图中 Netmask设置的是255.255.255.0 ...

  10. 如何根据pom.xml文件下载jar包

    遇到过这种情况:从网上下载了一个项目, 使用的maven, 但是我想要新建一个项目, 但是不需要使用maven. 但是我怎么样才能将他那个项目的所有引用的jar包给下载下载下来呢; 1.下载一个mav ...