概述

由于种种原因,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个地方需要改动:

    1. 申明队列时需要加入自定义的属性
    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实现优先级队列的更多相关文章

  1. 笔试算法题(57):基于堆的优先级队列实现和性能分析(Priority Queue based on Heap)

    议题:基于堆的优先级队列(最大堆实现) 分析: 堆有序(Heap-Ordered):每个节点的键值大于等于该节点的所有孩子节点中的键值(如果有的话),而堆数据结构的所有节点都按照完全有序二叉树 排.当 ...

  2. 基于rabbitMQ 消息延时队列方案 模拟电商超时未支付订单处理场景

    前言 传统处理超时订单 采取定时任务轮训数据库订单,并且批量处理.其弊端也是显而易见的:对服务器.数据库性会有很大的要求,并且当处理大量订单起来会很力不从心,而且实时性也不是特别好 当然传统的手法还可 ...

  3. C# RabbitMQ优先级队列实战项目演练

    一.需求背景 当用户在商城上进行下单支付,针对客户等级的不同和订单金额的大小划分客户级别,需要优先处理给标识为大订单的客户发送一份订单邮件提醒.那么我们应用程序如何解决这样的需求场景呢?今天阿笨给大家 ...

  4. 个推基于 Apache Pulsar 的优先级队列方案

    作者:个推平台研发工程师 祥子 一.业务背景在个推的推送场景中,消息队列在整个系统中占有非常重要的位置.当 APP 有推送需求的时候, 会向个推发送一条推送命令,接到推送需求后,我们会把APP要求推送 ...

  5. SpringBoot | 第三十八章:基于RabbitMQ实现消息延迟队列方案

    前言 前段时间在编写通用的消息通知服务时,由于需要实现类似通知失败时,需要延后几分钟再次进行发送,进行多次尝试后,进入定时发送机制.此机制,在原先对接银联支付时,银联的异步通知也是类似的,在第一次通知 ...

  6. 什么是Java优先级队列?

    PriorityQueue是基于无界优先级队列和优先级堆构建的重要Java API之一.本文通过适当的代码示例深入了解了有关此API及其用法的一些复杂信息.另在上篇文章中我们简单地谈了下Java编译器 ...

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

    说到队列的话,大家一定不会陌生,但是扯到优先级队列的话,还是有一部分同学是不清楚的,可能是不知道怎么去实现吧,其实呢,,,这东西已 经烂大街了...很简单,用“堆”去实现的,在我们系统中有一个订单催付 ...

  8. java PriorityBlockingQueue 基于优先级队列,的读出操作可以阻止.

    java PriorityBlockingQueue 基于优先级队列.的读出操作可以阻止. package org.rui.thread.newc; import java.util.ArrayLis ...

  9. RabbitMQ 优先级队列-为队列赋权

    RabbitMQ 消息收发是按顺序收发,一般情况下是先收到的消息先处理,即可以实现先进先出的消息处理.但如果消息者宕机或其他原因,导致消息接收以后,未确认,那么消息会重新Requeue到队列中,就打破 ...

随机推荐

  1. 魔性の分块 | | jzoj1243 | | 线段树の暴力

    题目的打开方式是酱紫的 然而作为一只蒻蒟根本不会线段树该怎么办呢? sro  MZX  orz 是这样说的:用分块啊! 分块 根据紫萱学姐的教程,分块的打开姿势是这样的: 我们要对一个数组进行整体操作 ...

  2. extjs学习(关于grid)

    1.想要调整某一列在表格中的顺序,可以使用mapping(索引是从0开始的) var store = new Ext.data.ArrayStore({ data:data, fields:[ {na ...

  3. ORACLE 10.2.01升级10.2.05 for windows 详细文档

    最近要做一个数据库的升级工作,提前在自己的PC机上练习了一下,这种文档在网上很多,但是大多都是使用命令编辑脚本,其实数据库还有一个DBUA的升级工具可以使用,使升级工作方便了很多. OS环境:wind ...

  4. Ubuntu16.04下面配置java环境变量

    我在ubuntu 16.04下面配置java环境变量的时候,开始在网上查信息的时候,没太注意ubuntu的版本,结果在.bashrc下面设置,在.profile下面设置,都不成功, 后面才想起来搜索u ...

  5. iOS 的文字滚动条效果的实现

    UILabel *label = [[UILabel alloc]initWithFrame:CGRectMake(50, 100, 300, 50)]; label.text  = @"欢 ...

  6. Linux下Bash入门学习笔记

    学习好shell编程是很有用的,可以使用shell脚本轻巧地完成有趣的工作. 本文地址:http://www.cnblogs.com/yhLinux/p/4047516.html 1. Bash实例, ...

  7. ArcGIS10.1 api for Flex开发用于ArcGIS 9.3时QueryTask 'Error #2032'错误的解决方案

    因客户GIS软件需求,将应用降级到低版本ArcGIS9.3,不仅数据有些样式.配色.字符有些问题,API也要相应“降级”,解决如下: 利用9.3+flex做QueryTask时候出现了[RPC Fau ...

  8. 使用IConfigurationSectionHandler在web.config中增加自定义配置

    一. 场景    这里仅举一个简单应用的例子,我希望在web.config里面增加网站的基本信息,如:网站名称,网站版本号,是否将网站暂时关闭等.二. 基本实现方法1. 定义配置节点对应的类:Site ...

  9. Xcode自定义Eclipse中常用的快捷键

    转载自http://joeyio.com/2013/07/22/xcode_key_binding_like_eclipse/ Xcode自定义Eclipse中常用的快捷键 22 July 2013 ...

  10. Services (服务)

    */ .hljs { display: block; padding: 0.5em; background: #F0F0F0; } .hljs, .hljs-subst, .hljs-tag .hlj ...