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

        说到队列的话,大家一定不会陌生,但是扯到优先级队列的话,还是有一部分同学是不清楚的,可能是不知道怎么去实现吧,其实呢,,,这东西已经烂大街了。。。很简单,用“堆”去实现的,在我们系统中有一个订单催付的场景,我们客户的客户在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跨平台或扫描二维码关注

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/328026.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

jstack(查看线程)、jmap(查看内存)和jstat(性能分析)命令

转载自 jstack(查看线程)、jmap(查看内存)和jstat(性能分析)命令 1&#xff0e;Jstack 1.1 jstack能得到运行java程序的java stack和native stack的信息。可以轻松得知当前线程的运行情况。如下图所示 注&#xff1a;这个和thread dump是同样的结果。但是thread dump是用ki…

RabbitMQ消息队列应用

消息通信组件Net分布式系统的核心中间件之一&#xff0c;应用与系统高并发&#xff0c;各个组件之间解耦的依赖的场景。本框架采用消息队列中间件主要应用于两方面&#xff1a;一是解决部分高并发的业务处理&#xff1b;二是通过消息队列传输系统日志。目前业界使用较多的消息队…

vue插槽面试题_VUE面试题解析,半年出一篇,建议收藏!

回答范例&#xff1a;vuex是vue专用的状态管理库。它以全局方式集中管理应用的状态&#xff0c;并且可以保证状态变更的可预测性。vuex主要解决的问题是多组件之间状态共享的问题&#xff0c;利用各种组件通信方式&#xff0c;我们虽然能够做到状态共享。但是往往需要在多个组件…

常用数据库连接串与驱动总结

1、sql server驱动com.microsoft.sqlserver.jdbc.SQLServerDriver//sql验证jdbc:sqlserver://127.0.0.1:1433;databasenamemydb;Usersa;Password1712682、oracle驱动oracle.jdbc.driver.OracleDriverjdbc:oracle:thin:127.0.0.1:1521:orcl3、mysql驱动com.mysql.jdbc.Driverjdb…

Mysql8.0可以使用解压版 这个比较快 好像现在都是解压版了

https://blog.csdn.net/Charonmomo/article/details/98440968 MySQL-mysql 8.0.17安装 2019年08月04日 09:59:12 Charonmomo 阅读数 1654 标签&#xff1a; MySQL 更多 个人分类&#xff1a; MySQL 版权声明&#xff1a;本文为博主原创文章&#xff0c;遵循 CC 4.0 by-sa 版…

公式冒号是什么意思_三角学中,这么一堆公式其实就说了2个事而已

[遇见数学创作小组] 作者: 心如止水(Java程序员。善于把复杂的数学知识&#xff0c;简洁易懂地表达出来)在学三角这部分的时候&#xff0c;有些书习惯列出诱导公式(induction formula)&#xff0c;都列出来的话可以写小半张纸。那什么是“诱导公式”呢&#xff1f;“诱导公式”…

.NET Core开发:项目实践

初始化项目 本来想详细讲一讲dotnet core的&#xff0c;但我对于dotnet core的研究还不到一星期&#xff0c;半吊子&#xff0c;脑子又笨&#xff0c;就不写那些理论出来误人子弟了&#xff0c;还是直接来一篇实践给大家做个参考。废话不多说&#xff0c;直接上项目&#xff0c…

如何使用jstack分析线程状态

转载自 如何使用jstack分析线程状态背景 记得前段时间&#xff0c;同事说他们测试环境的服务器cpu使用率一直处于100%&#xff0c;本地又没有什么接口调用&#xff0c;为什么会这样&#xff1f;cpu使用率居高不下&#xff0c;自然是有某些线程一直占用着cpu资源&#xff0c;那…

JAVA网络编程实战(笔记)

计算机网络简介 网络编程的目的&#xff1a; 无限电台。。。。传播交流信息&#xff0c;数据交换。通信 想要达到这个效果需要什么&#xff1a; 1.如何准确的定位网络上的一台主机 ip地址192.168.16.124&#xff1a; 端口&#xff0c;定位到这个计算机上的某个资源 2.找到…

让 Java 应用运行更快:性能调优工具及实践

转载自 让 Java 应用运行更快&#xff1a;性能调优工具及实践Java 应用性能优化是一个老生常谈的话题&#xff0c;笔者根据个人经验&#xff0c;将 Java 性能优化分为 4 个层级&#xff1a;应用层、数据库层、框架层、JVM 层。通过介绍 Java 性能诊断工具和思路&#xff0c;给…

github 公钥 私钥_github快速使用

##第一次使用github推荐方式Git第一步&#xff1a;下载git工具&#xff0c;这里是链接&#xff0c;选择适合自己的版本进行安装。第二步&#xff1a;安装完成后&#xff0c;鼠标右键找到Git bash&#xff0c;双击打开。第三步&#xff1a;设置SSH key众所周知ssh是加密传输。加…

ASP.NET Core 之 Identity 入门(一)

前言 在 ASP.NET Core 中&#xff0c;仍然沿用了 ASP.NET里面的 Identity 组件库&#xff0c;负责对用户的身份进行认证&#xff0c;总体来说的话&#xff0c;没有MVC 5 里面那么复杂&#xff0c;因为在MVC 5里面引入了OWIN的东西&#xff0c;所以很多初学者在学习来很费劲&…

蓝桥杯JAVA省赛2013-----B------2(马虎算式)

二、马虎的算式 【解析】&#xff1a;暴力穷举即可 枚举每个位上的数字、组合判断、暴力穷举 【答案】&#xff1a;142 方法一&#xff1a;暴力穷举 package com.kuang.Test; public class Test{public static void main(String[] args) {int ans 0;for(int a 1; a < …

简单解决“无法打开内核设备:\\Global\\vmx86”错误

简单解决“无法打开内核设备:\\Global\\vmx86”错误 本文链接&#xff1a;https://blog.csdn.net/tristan_tian/article/details/79434715 我是win10系统&#xff0c;在小娜搜索“服务”后右击选择使用管理员打开。然后在一大串服务中找到vm开头的服务项&#xff0c;全部都启…

按钮右对齐_Python Tkinter Button按钮

简介BUTTON小工具时使用的按钮添加到各种类型的Python应用&#xff0c;Python允许用户配置按钮的按我们的要求&#xff0c;各种选项可以被设置或重置的要求。BUTTON 小工具时使用的按钮添加到各种类型的Python应用。Python允许用户配置按钮的按我们的要求。各种选项可以被设置或…

Java 内存查看与分析

转载自 Java 内存查看与分析1&#xff1a;gc日志输出在jvm启动参数中加入 -XX:PrintGC -XX:PrintGCDetails -XX:PrintGCTimestamps -XX:PrintGCApplicationStopedTime&#xff0c;jvm将会按照这些参数顺序输出gc概要信息&#xff0c;详细信息&#xff0c;gc时间信息&#xff…

【长文干货】浅析分布式系统

测试开发者的共同关注&#xff01; 作者&#xff1a;wadehan&#xff0c;腾讯后台开发高级工程师 商业转载请联系腾讯WeTest获得授权&#xff0c;非商业转载请注明出处。 WeTest导读 我们常常会听说&#xff0c;某个互联网应用的服务器端系统多么牛逼&#xff0c;比如QQ、微信、…

hibernate配置详情2(Dept.hbm.xml)

<?xml version"1.0"?> <!DOCTYPE hibernate-mapping PUBLIC "-//Hibernate/Hibernate Mapping DTD 3.0//EN""http://hibernate.sourceforge.net/hibernate-mapping-3.0.dtd"><hibernate-mapping package"org.hibernate_on…