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

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

生产者

  1. public class Producer
  2. {
  3. private const string QueueName = "test_work2_queue";
  4.  
  5. public static void Send()
  6. {
  7. //获取一个连接
  8. IConnection connection = ConnectionHelper.GetConnection();
  9.  
  10. //从连接中获取一个通道
  11. IModel channel = connection.CreateModel();
  12.  
  13. //声明队列
  14. channel.QueueDeclare(QueueName, false, false, false, null);
  15.  
  16. //每次只向消费者发送一条消息,消费者使用后,手动确认后,才会发送另外一条
  17. channel.BasicQos(0, 1, false);
  18.  
  19. for (int i = ; i < ; i++)
  20. {
  21. string msg = "hello world " + i;
  22.  
  23. //发送消息
  24. channel.BasicPublish("", QueueName, null, Encoding.Default.GetBytes(msg));
  25. Console.WriteLine($"send {msg}");
  26. }
  27.  
  28. channel.Close();
  29. connection.Close();
  30. }
  31. }

消费者1

  1. public class Consumer1
  2. {
  3. private const string QueueName = "test_work2_queue";
  4. public static void Receive()
  5. {
  6. //获取连接
  7. IConnection connection = ConnectionHelper.GetConnection();
  8.  
  9. //创建通道
  10. IModel channel = connection.CreateModel();
  11.  
  12. //声明队列
  13. channel.QueueDeclare(QueueName, false, false, false, null);
  14.  
  15. channel.BasicQos(0, 1, false);
  16.  
  17. //添加消费者
  18. EventingBasicConsumer consumer = new EventingBasicConsumer(channel);
  19.  
  20. //注册事件
  21. consumer.Received += (s, e) =>
  22. {
  23. byte[] bytes = e.Body;
  24. string msg = Encoding.Default.GetString(bytes);
  25. Console.WriteLine("consumer1 : " + msg);
  26. Thread.Sleep();//休息2秒
  27. channel.BasicAck(e.DeliveryTag, false);//手动确认,false表示只确认当前这条消息已收到,ture表示在当前这条消息及之前(小于 DelivertTag )的所有未确认的消息都已收到.
  28. };
  29.  
  30. //监听队列,第2个参数设置为手动确认.true 则为自动确认.
  31. channel.BasicConsume(QueueName, false, "", false, false, null, consumer);
  32. }
  33. }

消费者2

  1. Console.WriteLine("consumer2 : " + msg);
  2. 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. [洛谷P3254]圆桌问题

    题目大意:有$m$个单位,每个单位有$r_i$个代表,有$n$张餐桌,每张餐桌可容纳$c_i$个代表.要求同一个单位的代表不在同一个餐桌就餐.若可以,输出$1$以及其中一种方案,否则输出$0$ 题解: ...

  2. 【NOIP模拟赛】beautiful 乱搞(平衡树)+ST

    biubiu~~~ 我用平衡树处理的这道题,然而这种方法还是要看评测姬..... 正解是乱搞....就是枚举每一位数作为中位数,比他小的看做-1比他大的看做1,那么我们从一开始就有了一个绵延的山,我们 ...

  3. BZOJ1191:超级英雄(二分图匹配)

    [HNOI2006]超级英雄Hero 题目链接:https://www.lydsy.com/JudgeOnline/problem.php?id=1191 Description: 现在电视台有一种节 ...

  4. codeforces 1015C

    C. Songs Compression time limit per test 1 second memory limit per test 256 megabytes input standard ...

  5. 迅雷Bolt图像拉伸不清晰的解决办法

    迅雷Bolt库中的图像拉伸的效果锯齿比较严重,常见的导致锯齿的情况: 1.在使用ImageObject时,drawmode为1拉伸模式下: 2.使用Bitmap类的Stretch函数拉伸图像: 虽然I ...

  6. eclipse调试java技巧

    详细内容请看: http://www.oschina.net/question/82993_69439

  7. RPC-Thrift(二)

    TTransport TTransport负责数据的传输,先看类结构图. 阻塞Server使用TServerSocket,它封装了ServerSocket实例,ServerSocket实例监听到客户端 ...

  8. 【20160815】noip模拟(未完)

    #include<cstdio> #include<cstdlib> #include<cstring> #include<iostream> #inc ...

  9. [POJ1113&POJ1696]凸包卷包裹算法和Graham扫描法应用各一例

    凸包的算法比较形象好理解 代码写起来也比较短 所以考前看一遍应该就没什么问题了..>_< POJ1113 刚开始并没有理解为什么要用凸包,心想如果贴着城堡走不是更好吗? 突然发现题目中有要 ...

  10. 【BZOJ】1782: [Usaco2010 Feb]slowdown 慢慢游

    [算法]DFS序+树状数组 [题解]题意相当于统计前i-1个点在第i个点的祖先的个数,显然可以用dfs维护,用树状数组差分维护前缀和. 出栈不新加节点就要注意左闭右开,即in[a[i]]处+1,ou[ ...