如何基于RabbitMQ实现优先级队列
概述
由于种种原因,RabbitMQ到目前为止,官方还没有实现优先级队列,只实现了Consumer的优先级处理。
但是,迫于种种原因,应用层面上又需要优先级队列,因此需求来了:如何为RabbitMQ加入优先级队列特性。
查询资料后,得知RabbitMQ虽然官方没有支持此特性,但是社区已经有相关优先级队列插件了,并且这个插件被列在RabbitMQ官方网站中了。
地址如下:http://www.rabbitmq.com/community-plugins.html

插件安装
不要立刻下载这个url中的那个链接,要先根据你想要更新目标的rabbitmq版本再去另外一个地方下载相应插件,如:

会列出两大版本的插件目录(选择对应目录进入下载,否则会报错...):


插件如何安装?
进入rabbitmq安装目录,进入plugins目录,将上面这个ez文件拷贝到plugins目录中,然后运行命令来enable这个插件
centos下,默认路径在:/usr/lib/rabbitmq/lib/rabbitmq_server-3.3.4/plugins(版本号可能会变化)
windows下,默认路径在:C:\Program Files\RabbitMQ Server\rabbitmq_server-3.3.4\plugins(版本号可能会变化)
把ez文件拷贝过去,然后运行列举插件列表命令:

找到这个优先级队列插件名为:rabbitmq_priority_queue
执行:rabbitmq-plugins enable rabbitmq_priority_queue
ok,重新启动rabbitmq-server服务。
这样,server端的配置算完成了。
C#代码端需要作出的更改
下面看看客户端类库的编写:
我们先要定义优先级枚举,继承自byte,因为RabbitMQ的C#客户端优先级是用byte来传递的:
先定义3个级别的优先级:低、中、高(其实可以定义很多级别,只是为了简化,因此只定义了3个级别)

有2个地方需要改动:
- 申明队列时需要加入自定义的属性
- 发送消息到rabbitmq时,设置自定义属性
internal static IDictionary<string, object> QueueArguments
{
get
{
IDictionary<string, object> arguments=new Dictionary<string, object>();
arguments["x-max-priority"] = ;//定义队列优先级为10个级别
return arguments;
}
}
channel.QueueDeclare("queueName", true, false, false, QueueArguments);//QueueArguments就是上面定义的这个dictionary
var headers = channel.CreateBasicProperties();
headers.Priority = (byte)msg.Priority;//在这里把继承自byte的枚举转换成byte
channel.BasicPublish("exchange", "route", headers, SerializerUtility.Serialize2Bytes(msg));
其他注意的地方
在装了优先级队列插件的rabbitmq-server实例中,所有的Durable队列必须用如上的方式,设置x-max-priority属性,否则rabbitmq-server服务会crash
如何基于RabbitMQ实现优先级队列的更多相关文章
- 笔试算法题(57):基于堆的优先级队列实现和性能分析(Priority Queue based on Heap)
议题:基于堆的优先级队列(最大堆实现) 分析: 堆有序(Heap-Ordered):每个节点的键值大于等于该节点的所有孩子节点中的键值(如果有的话),而堆数据结构的所有节点都按照完全有序二叉树 排.当 ...
- 基于rabbitMQ 消息延时队列方案 模拟电商超时未支付订单处理场景
前言 传统处理超时订单 采取定时任务轮训数据库订单,并且批量处理.其弊端也是显而易见的:对服务器.数据库性会有很大的要求,并且当处理大量订单起来会很力不从心,而且实时性也不是特别好 当然传统的手法还可 ...
- C# RabbitMQ优先级队列实战项目演练
一.需求背景 当用户在商城上进行下单支付,针对客户等级的不同和订单金额的大小划分客户级别,需要优先处理给标识为大订单的客户发送一份订单邮件提醒.那么我们应用程序如何解决这样的需求场景呢?今天阿笨给大家 ...
- 个推基于 Apache Pulsar 的优先级队列方案
作者:个推平台研发工程师 祥子 一.业务背景在个推的推送场景中,消息队列在整个系统中占有非常重要的位置.当 APP 有推送需求的时候, 会向个推发送一条推送命令,接到推送需求后,我们会把APP要求推送 ...
- SpringBoot | 第三十八章:基于RabbitMQ实现消息延迟队列方案
前言 前段时间在编写通用的消息通知服务时,由于需要实现类似通知失败时,需要延后几分钟再次进行发送,进行多次尝试后,进入定时发送机制.此机制,在原先对接银联支付时,银联的异步通知也是类似的,在第一次通知 ...
- 什么是Java优先级队列?
PriorityQueue是基于无界优先级队列和优先级堆构建的重要Java API之一.本文通过适当的代码示例深入了解了有关此API及其用法的一些复杂信息.另在上篇文章中我们简单地谈了下Java编译器 ...
- 体验Rabbitmq强大的【优先级队列】之轻松面对现实业务场景
说到队列的话,大家一定不会陌生,但是扯到优先级队列的话,还是有一部分同学是不清楚的,可能是不知道怎么去实现吧,其实呢,,,这东西已 经烂大街了...很简单,用“堆”去实现的,在我们系统中有一个订单催付 ...
- java PriorityBlockingQueue 基于优先级队列,的读出操作可以阻止.
java PriorityBlockingQueue 基于优先级队列.的读出操作可以阻止. package org.rui.thread.newc; import java.util.ArrayLis ...
- RabbitMQ 优先级队列-为队列赋权
RabbitMQ 消息收发是按顺序收发,一般情况下是先收到的消息先处理,即可以实现先进先出的消息处理.但如果消息者宕机或其他原因,导致消息接收以后,未确认,那么消息会重新Requeue到队列中,就打破 ...
随机推荐
- Ant: Class not found: javac1.8
今天用ant,在选择build.xml,run as ant build后出错Ant: Class not found: javac1.8 分析问题:是否是eclipse中的ant版本和java的版本 ...
- iOS.Animation.Math-behind-CATransform3D
iOS CoreAnimation: Math behind CATransform3D 1. What's CATransform? Matrix Transform: "User spa ...
- onethink和thinkphp3.2学习
thinkphp发布3.2版本之后,也发布了一个简单的内容管理系统onthink,这样有助于理解thinkphp3.2的使用: 一.首先最关键的一点是thinkphp3.2中加入了命名空间的使用 什么 ...
- python json模块
import json dic = {"name":"liao","age":18} data = json.dumps(dic) #转化为 ...
- ZOJ3791_An Easy Game
给出两个等长的字符串,每次需要改变m个数字,每次必须改变k个数字,求从第一个串变化到第二个串的方案数. DP.f[i][j]改变i步后,有j个位置被改变的方案数.然后直接枚举当前改变的几个位置是前面重 ...
- php memcache扩展 出现错误dyld: Symbol not found: _mmc_queue_free
mac 10.10 系统安装php memcache扩展 在使用memcache的时候出现错误dyld: Symbol not found: _mmc_queue_free需要重新编译memcache ...
- K/3 Cloud开发之旅--环境准备篇
K/3 Cloud是金蝶软件新推出的一款产品,介绍我就不多说了,谁用谁知道啊,那么我们如果要基于它做开发需要什么环境呢 开发环境必备软件 1 操作系统Windows X86/X64 或者Windows ...
- windows下nginx的启动关闭
Windows下Nginx的启动.停止等命令 在Windows下使用Nginx,我们需要掌握一些基本的操作命令,比如:启动.停止Nginx服务,重新载入Nginx等,下面我就进行一些简单的介绍. .启 ...
- Ajax参数详解
1.url: 要求为String类型的参数,(默认为当前页地址)发送请求的地址. 2.type: 要求为String类型的参数,请求方式(post或get)默认为get.注意其他http请求方法,例如 ...
- PHP限制提现时间-----周一至周五 9点到17点
$time = time(); $err_msg = '请在周一至周五 9:00-17:00 提交申请!'; $week = date('w', $time); $hour = date('H', $ ...