说到队列的话,大家一定不会陌生,但是扯到优先级队列的话,还是有一部分同学是不清楚的,可能是不知道怎么去实现吧,其实呢,,,这东西已经烂大街了。。。很简单,用“堆”去实现的,在我们系统中有一个订单催付的场景,我们客户的客户在tmall,taobao下的订单,taobao会及时将订单推送给我们,如果在用户设定的时间内未付款那么就会给用户推送一条短信提醒,很简单的一个功能对吧,但是,tmall商家对我们来说,肯定是要分大客户和小客户的对吧,比如像施华蔻,百雀林这样大商家一年起码能够给我们贡献几百万,所以理应当然,他们的订单必须得到优先处理,而曾经我们的后端系统是使用redis来存放的定时轮询,大家都知道redis只能用List做一个简简单单的消息队列,并不能实现一个优先级的场景,所以订单量大了后采用rabbitmq进行改造和优化,如果发现是大客户的订单给一个相对比较高的优先级,否则就是默认优先级,好了,废话不多说,我们来看看如何去设置。

一:优先级队列

  既然是优先级队列,那么必然要在Queue上开一个口子贴上一个优先级的标签,为了看怎么设置,我们用一下rabbitmq的监控UI,看看这个里面是如何

手工的创建优先级队列。

从这个图中可以看到在Arguments栏中有特别多的小属性,其中有一项就是"Maximum priority",这项的意思就是说可以定义优先级的最大值,其实

想想也是,不可能我们定义的优先级是一个非常大的数字,比如int.MaxValue,大多情况下都是10以内的数字就可以了,再或者我们曾今接触过的 MSMQ,

它的优先级只是一些枚举值,什么High,Normal,Low,不知道大家可否记得? 下面来看下代码中该如何实现呢???

1. 在Queue上附加优先级属性

Dictionary<string, object> dic = new Dictionary<string, object>();
dic.Add("x-max-priority", 20);
channel.QueueDeclare(queue: "hello",durable: true,exclusive: false,autoDelete: false,arguments: dic);

上面的代码做了一个简单的队列声明,queuename="hello",持久化,排外。。。然后把"x-max-priority"塞入到字典中作为arguments参数,看起来还

是非常简单吧~~~

2. 在Message上指定优先级属性

 var properties = channel.CreateBasicProperties();properties.Priority = 1;channel.BasicPublish(exchange: "",routingKey: "hello",basicProperties: null,body: body);

通过上面的代码可以看到,在Message上设置优先级,我是通过在channel通道上设置Priority属性,之后塞到basicProperties中就可以了,好了,有上面这两

个基础之后,下面就可以开始测试了,准备向rabbitmq推送10条记录,其中第5条的优先级最高,所以应该首先就print出来,如下图:

static void Main(string[] args)
{    var sb = new StringBuilder();        for (int i = 0; i < 11; i++){sb.Append(i);}       var factory = new ConnectionFactory() { HostName = "192.168.23.136", UserName = "datamip", Password = "datamip" };       using (var connection = factory.CreateConnection()){               using (var channel = connection.CreateModel()){channel.ExchangeDeclare(exchange: "mydirect", type: ExchangeType.Direct, durable: true);Dictionary<string, object> dic = new Dictionary<string, object>();dic.Add("x-max-priority", 20);                  for (int i = 0; i < 10; i++){channel.QueueDeclare(queue: "hello",durable: true,exclusive: false,autoDelete: false,arguments: dic);                      string message = string.Format("{0} {1}", i, sb.ToString());                

var body = Encoding.UTF8.GetBytes(message);                var properties = channel.CreateBasicProperties();properties.Priority = (i == 5) ? (byte)10 : (byte)i;channel.BasicPublish(exchange: "",routingKey: "hello",basicProperties: properties,body: body);Console.WriteLine(" [x] Sent {0}", i);}}}Console.WriteLine(" Press [enter] to exit.");Console.ReadLine();
}

图中可以看到10条消息我都送到rabbitmq中去了,接下来打开consume端,来看看所谓的index=5 是否第一个送出来??

static void Main(string[] args)
{        for (int m = 0; m < int.MaxValue; m++){            var factory = new ConnectionFactory() { HostName = "192.168.23.136", UserName = "datamip", Password = "datamip" };            using (var connection = factory.CreateConnection())       using (var channel = connection.CreateModel()){                 var result = channel.BasicGet("hello", true);             if (result != null){                    var str = Encoding.UTF8.GetString(result.Body);Console.WriteLine("{0}  消息内容 {1}", m, str);System.Threading.Thread.Sleep(1);}}}Console.WriteLine(" Press [enter] to exit.");Console.ReadLine();
}

一切都是这么的完美,接下来为了进行可视化验证,你可以在WebUI中观察观察,可以发现在Queue上面多了一个 Pri 标记,有意思吧。

好了,这么重要的功能,是不是已经让你足够兴奋啦, 希望大家能够好好的在实际场景中运用吧

原文地址:http://www.cnblogs.com/huangxincheng/p/6029214.html

.NET社区新闻,深度好文,微信中搜索dotNET跨平台或扫描二维码关注

体验Rabbitmq强大的【优先级队列】之轻松面对现实业务场景相关推荐

  1. Rabbitmq如何设置优先级队列?如何限流?如何重试?如何处理幂等性?

    优先级队列 方式一:可以通过RabbitMQ管理界面配置队列的优先级属性,如下图的x-max-priority 方式二:代码设置 Map<String,Object> args = new ...

  2. RabbitMQ认知篇 - 优先级队列

    优先级队列 RabbitMQ在3.5.0版本的时候提供了优先级队列的实现.客户端通过配置队列的x-max-priority参数的方式设置一个队列支持的最大优先级(但是不能使用策略的方式配置)以此来声明 ...

  3. 优先级队列用的的数据结构

    2019独角兽企业重金招聘Python工程师标准>>> 优先级队列和队列没有本质的区别 只是 每次出队列的时候出队列中优先级最高的 这里假定数字越小,优先级越高 优先级队列 是不同于 ...

  4. Rabbitmq超级详细的笔记,包括安装,基本命令,rabbitmq的七种消息模式,以及死信队列,延迟队列,优先级队列和惰性队列的介绍

    RabbitMQ 文章目录 RabbitMQ 1 RabbitMQ介绍 1.1 基本介绍 1.2 RabbitMQ的安装 1.2.1 ubuntu20.04 安装rabbitmq 1.2.2 cent ...

  5. GoLang 使用 RabbitMQ 优先级队列

    ​​​​​​​参考:golang实现rabbitmq消息队列_知更鸟女孩的博客-CSDN博客_golang消息队列 golang rabbitmq消费者设计_消息队列之RabbitMQ详细指北_wei ...

  6. RabbitMQ的优先级队列

    优先级队列 队列需要设置优先级队列,消息需要设置消息的优先级.消费者需要等待消息已经发送到队列中,然后对队列中的消息进行排序,最后再去消费. Map<String, Object> arg ...

  7. 云计算设计模式(十六)——优先级队列模式

    优先发送到服务,以便具有较高优先级的请求被接收和高于一个较低优先级的更快速地处理请求.这种模式是在应用程序是有用的,它提供不同的服务级别保证或者针对独立客户. 背景和问题 应用程序可以委托给其他服务的 ...

  8. 【重难点】【RabbitMQ 01】消息队列的作用、主流的消息队列、RabbitMQ 基于什么传输消息、RabbitMQ 模型架构、死信队列和延迟队列

    [重难点][RabbitMQ 01]消息队列的作用.主流的消息队列.RabbitMQ 基于什么传输消息.RabbitMQ 模型架构.死信队列和延迟队列 文章目录 [重难点][RabbitMQ 01]消 ...

  9. c语言中优先级队列_C ++中的优先级队列

    c语言中优先级队列 A Priority Queue is a variant of a Queue such that it's elements are ordered based on thei ...

最新文章

  1. 成为梵高、毕加索?你最喜欢的人脸识别与神经风格迁移来啦!
  2. 在web开发中的三个层次使用事务
  3. MySQL唯一索引与主键的区别:主键相当于一本书的页码,索引相当于书的目录
  4. 欢乐纪中A组周六赛【2019.5.18】
  5. 单元测试怎么测试线程_单元测试线程代码的5个技巧
  6. linux内核优化项,Linux内核优化配置
  7. HDU2066一个人的旅行(dijkstra)
  8. avl树 php,PHP实现平衡二叉树(AVL树)
  9. 分布式系统中的序列化与反序列化
  10. MYSQL 二进制还原
  11. SpringBoot系列(2):SpringBoot集成单机版Redis
  12. 使用Jade和Grunt加快HTML的产生
  13. I2C协议关于ack和nack的思考
  14. IDA反汇编工具使用详解
  15. react报错Error: Too many re-renders. React limits the number of renders to prevent an infinite loop.
  16. linux中shell脚本批处理命令
  17. Excel 创建多级列表
  18. 工业互联网平台IMSA---1.3.启动过程详解2
  19. 推荐丨办公软件WPS新版本--2019
  20. Android车牌号自动扫描识别的算法

热门文章

  1. MetroGridHelper: A helpful debugging assistant for designers and developers alike
  2. 【POJ】【最小生成树】1789 Truck History
  3. Visual Studio怎么使用中文帮助文档
  4. .NET 6新特性试用 | 最小Web API
  5. 5月TIOBE编程榜,Java、PHP降级,C#再度上升!
  6. C# 搭建自己的NuGet服务器,上传自定义NuGet包
  7. 盘点大厂的那些开源项目 - 华为
  8. 为什么我们总是「习惯性辩解」?
  9. 【追加功能】OFFICE插件管理工具重整后再上路,更好用易用。
  10. 基于.NetCore3.1搭建项目系列 —— 认证授权方案之Swagger加锁