RabbitMQ与.net core(四) 消息的优先级 与 死信队列
1.消息的优先级
假如现在有个需求,我们需要让一些优先级最高的通知推送到客户端,我们可以使用redis的sortedset,也可以使用我们今天要说的rabbit的消息优先级属性
Producer代码
- using RabbitMQ.Client;
- using System;
- using System.Collections.Generic;
- using System.Text;
- using System.Threading;
- using System.Threading.Tasks;
- namespace RabbitMQConsole
- {
- class Program
- {
- static void Main(string[] args)
- {
- ConnectionFactory factory = new ConnectionFactory();
- factory.HostName = "39.**.**.**";
- factory.Port = ;
- factory.VirtualHost = "/";
- factory.UserName = "root";
- factory.Password = "root";
- var exchange = "change4";
- var route = "route2";
- var queue9 = "queue9";
- using (var connection = factory.CreateConnection())
- {
- using (var channel = connection.CreateModel())
- {
- channel.ExchangeDeclare(exchange, type: "fanout", durable: true, autoDelete: false);
- //x-max-priority属性必须设置,否则消息优先级不生效
- channel.QueueDeclare(queue9, durable: true, exclusive: false, autoDelete: false,arguments: new Dictionary<string, object> { { "x-max-priority", } });
- channel.QueueBind(queue9, exchange, queue9);
- while(true)
- {
- var messagestr = Console.ReadLine();
- var messagepri = Console.ReadLine();
- var props = channel.CreateBasicProperties();
- props.Persistent = true;
- props.Priority = (byte)int.Parse(messagepri);//设置消息优先级
- channel.BasicPublish(exchange, route, true, props, Encoding.UTF8.GetBytes(messagestr));
- }
- }
- }
- }
- }
- }
consumer代码
- using RabbitMQ.Client;
- using RabbitMQ.Client.Events;
- using System;
- using System.Collections.Generic;
- using System.Text;
- using System.Threading;
- namespace RabbitMQClient
- {
- class Program
- {
- private static readonly ConnectionFactory rabbitMqFactory = new ConnectionFactory()
- {
- HostName = "39.**.**.**",
- Port = ,
- UserName = "root",
- Password = "root",
- VirtualHost = "/"
- };
- static void Main(string[] args)
- {
- var exchange = "change4";
- var route = "route2";
- var queue9 = "queue9";
- using (IConnection conn = rabbitMqFactory.CreateConnection())
- using (IModel channel = conn.CreateModel())
- {
- channel.ExchangeDeclare(exchange, "fanout", durable: true, autoDelete: false);
- channel.QueueDeclare(queue9, durable: true, exclusive: false, autoDelete: false, arguments: new Dictionary<string, object> { { "x-max-priority", } });
- channel.QueueBind(queue9, exchange, route);
- channel.BasicQos(prefetchSize: , prefetchCount: , global: false);
- EventingBasicConsumer consumer = new EventingBasicConsumer(channel);
- consumer.Received += (model, ea) =>
- {
- Byte[] body = ea.Body;
- String message = Encoding.UTF8.GetString(body);
- Console.WriteLine( message);
- channel.BasicAck(deliveryTag: ea.DeliveryTag, multiple: false);
- };
- channel.BasicConsume(queue: queue9, autoAck: false, consumer: consumer);
- Console.ReadLine();
- }
- }
- }
- }
运行producer
在运行consumer
可以看出消息是按优先级消费的
2.死信队列
死信队列可以用来做容错机制,当我们的消息处理异常时我们可以把消息放入到死信队列中,以便后期处理,死信的产生有三种
1.消息被拒(basic.reject or basic.nack)并且没有重新入队(requeue=false);
2.当前队列中的消息数量已经超过最大长度。
3.消息在队列中过期,即当前消息在队列中的存活时间已经超过了预先设置的TTL(Time To Live)时间;
看代码
- using RabbitMQ.Client;
- using System;
- using System.Collections.Generic;
- using System.Text;
- using System.Threading;
- using System.Threading.Tasks;
- namespace RabbitMQConsole
- {
- class Program
- {
- static void Main(string[] args)
- {
- ConnectionFactory factory = new ConnectionFactory();
- factory.HostName = "39.**.**.**";
- factory.Port = ;
- factory.VirtualHost = "/";
- factory.UserName = "root";
- factory.Password = "root";
- var exchangeA = "changeA";
- var routeA = "routeA";
- var queueA = "queueA";
- var exchangeD = "changeD";
- var routeD = "routeD";
- var queueD = "queueD";
- using (var connection = factory.CreateConnection())
- {
- using (var channel = connection.CreateModel())
- {
- channel.ExchangeDeclare(exchangeD, type: "fanout", durable: true, autoDelete: false);
- channel.QueueDeclare(queueD, durable: true, exclusive: false, autoDelete: false);
- channel.QueueBind(queueD, exchangeD, routeD);
- channel.ExchangeDeclare(exchangeA, type: "fanout", durable: true, autoDelete: false);
- channel.QueueDeclare(queueA, durable: true, exclusive: false, autoDelete: false, arguments: new Dictionary<string, object> {
- { "x-dead-letter-exchange",exchangeD}, //设置当前队列的DLX
- { "x-dead-letter-routing-key",routeD}, //设置DLX的路由key,DLX会根据该值去找到死信消息存放的队列
- { "x-message-ttl",} //设置消息的存活时间,即过期时间
- });
- channel.QueueBind(queueA, exchangeA, routeA);
- var properties = channel.CreateBasicProperties();
- properties.Persistent = true;
- //发布消息
- channel.BasicPublish(exchange: exchangeA,
- routingKey: routeA,
- basicProperties: properties,
- body: Encoding.UTF8.GetBytes("message"));
- }
- }
- }
- }
- }
这样10秒后消息过期,我们可以看到queueD中有了消息
RabbitMQ与.net core(四) 消息的优先级 与 死信队列的更多相关文章
- SpringCloud 2020.0.4 系列之 Stream 消息出错重试 与 死信队列 的实现
1. 概述 老话说的好:出错不怕,怕的是出了错,却不去改正.如果屡次出错,无法改对,就先记下了,然后找援军解决. 言归正传,今天来聊一下 Stream 组件的 出错重试 和 死信队列. RabbitM ...
- RabbitMQ 入门系列:9、扩展内容:死信队列:真不适合当延时队列。
系列目录 RabbitMQ 入门系列:1.MQ的应用场景的选择与RabbitMQ安装. RabbitMQ 入门系列:2.基础含义:链接.通道.队列.交换机. RabbitMQ 入门系列:3.基础含义: ...
- RabbitMQ(4) 未路由的消息、TTL和死信
未路由的消息 当生产这发送的消息到达指定的交换器后,如果交换器无法根据自身类型.绑定的队列以及消息的路由键找到匹配的队列,默认情况下消息将被丢弃.可以通过两种方式 处理这种情况,一是在发送是设置man ...
- MQ发送的消息都到了死信队列中了
MQ在发送消息的时候,设置的过期时间太短.(昨天项目上线遇到了,开发中也遇到一次.)谨记!!!
- RabbitMQ 设置消息的优先级
在RabbitMQ中,可以设置消息的优先级,也就相当于在队列中置顶某条消息,让某个消息优先得到处理的功能. 既然是设置消息的优先级,那么就是针对生产者,也就是消息发布端. 设置消息的优先级一共有2个步 ...
- RabbitMQ高级之消息限流与延时队列
人生终将是场单人旅途,孤独之前是迷茫,孤独过后是成长. 楔子 本篇是消息队列RabbitMQ的第五弹. 上篇本来打算讲述RabbitMQ的一些高级用法: 如何保证消息的可靠性? 消息队列如何进行限流? ...
- 消息队列RabbitMQ(五):死信队列与延迟队列
死信队列 引言 死信队列,英文缩写:DLX .Dead Letter Exchange(死信交换机),其实应该叫做死信交换机才更恰当. 当消息成为Dead message后,可以被重新发送到另一个交换 ...
- .Net Core&RabbitMQ死信队列
过期时间 RabbitMQ可以为消息和队列设置过期时间Time To Live(TTL).其目的即过期. 消息过期时间 消息存储在队列中时,如果想为其设置一个有限的生命周期,而不是一直存储着,可以为其 ...
- 【RabbitMQ】一文带你搞定RabbitMQ死信队列
本文口味:爆炒鱿鱼 预计阅读:15分钟 一.说明 RabbitMQ是流行的开源消息队列系统,使用erlang语言开发,由于其社区活跃度高,维护更新较快,性能稳定,深得很多企业的欢心(当然,也包括我 ...
随机推荐
- JAVA压缩 解压缩zip 并解决linux下中文乱码
1. [代码][Java]代码 1:再压缩前,要设置linux模式, 需要使用第三方ant-1.6.5.jar 如果是文件目录,则ZipEntry zipEntry=new ZipEntry(b ...
- ros ddns
ROS5X-6X脚本(10-15分钟执行一次) #DDNS本站帐号 :global ddnsuser "用户名" #DDNS本站密码 :global ddnspass " ...
- Vertex Modifier of Surface Shader
[Vertex Modifier of Surface Shader] Surface shader compilation directive vertex:functionName 可以用于指定 ...
- Python基础:函数的介绍及应用
# 函数的定义 def firstFun(): print("----------------------") print("剑来") print(" ...
- 【LA5135 训练指南】井下矿工 【双连通分量】
题意 有一座地下稀有金属矿由n条隧道和一些连接点组成,其中每条隧道连接两个连接点.任意两个连接点之间最多只有一条隧道.为了降低矿工的危险,你的任务是在一些连接点处安装太平井和相应的逃生装置,使得不管哪 ...
- 【LA11248 训练指南】网络扩容【最大流】
题意: 给定一个有向网络,每条边均有一个容量.问是否存在一个从点1到点N,流量为C的流.如果不存在,是否可以恰好修改一条弧的容量,使得存在这样的流? 分析: 先跑一遍最大流,如果最大流大于等于C,则输 ...
- 《DNA比对》蓝桥杯复赛试题
题目描述 脱氧核糖核酸即常说的DNA,是一类带有遗传信息的生物大分子.它由4种主要的脱氧核苷酸(dAMP.dGMP.dCMT和dTMP)通过磷酸二酯键连接而成.这4种核苷酸可以分别记为:A.G.C.T ...
- Android 重写EditText回车事件
之前遇到的问题没来得及记录下来,趁今晚有空就重新回忆并写下了. 我们在用到EditText这个空间时经常需要重写软键盘中的回车事件以配合我们接下来的响应,比如点击回车变成搜索.发送.完成等. Edit ...
- 系统性能信息模块之psutil模块
一.psutil模块介绍 官方网址:https://pypi.org/ psutil模块安装:https://github.com/giampaolo/psutil/blob/master/INSTA ...
- Red Hat 6.5 网络yum源的配置
第一次接触Linux系统,用虚拟机安装了一个rad hat6.5版本64位的,傻瓜式安装.安装好之后简单的写了一个C代码,进行gcc编译的时候,提示没有该命令,上网查找了一下说没有安装gcc编译器,用 ...