首页 > 其他分享 >RabbitMQ-优先级队列及消息配置

RabbitMQ-优先级队列及消息配置

时间:2025-01-13 22:10:10浏览次数:1  
标签:false exchange 队列 RabbitMQ 消息 优先级 channel

优先级队列

C# 数据类型 queue----先进先出

RabbitMQ---队列-----默认也是先进先出~~

RabbitMQ 设置优先级----可以配置让 消费顺序,不按照 先进先出的默认规则;

给定的优先级---最终体现在消费者; 优先级越高,消费的时候,就优先消费。就在前面消费

案例:

设置 { "vip1", "hello2", "world3", "common4", "vip5" } 五个消息,带有vip的优先级设置最高,最后消费的顺序为 { "vip1", "vip5", "hello2", "world3", "common4" } 。

生产者

using (var channel = connection.CreateModel())
{
    //声明交换机exchang
    channel.ExchangeDeclare(exchange: "PriorityExchange", type: ExchangeType.Direct,
        durable: true, autoDelete: false, arguments: null);
    //声明队列queue---要使用优先级队列,必须在声明队列的时候,就要指定支持优先级的功能
    //队列优先级最高为10,不加x-max-priority,计算发布时设置了消息的优先级也不会生效
    channel.QueueDeclare(queue: "PriorityQueue", durable: true,
        exclusive: false, autoDelete: false,
        arguments: new Dictionary<string, object>() { { "x-max-priority", 10 } });
    //绑定exchange和queue
    channel.QueueBind(queue: "PriorityQueue", exchange: "PriorityExchange",
        routingKey: "Priority");
    Console.WriteLine("生产者准备就绪....");

    //一些待发送的消息
    string[] msgs = { "vip1", "hello2", "world3", "common4", "vip5" };
    //设置消息优先级
    IBasicProperties props = channel.CreateBasicProperties();

    foreach (string msg in msgs)
    {
        //vip开头的消息,优先级设置为9
        if (msg.StartsWith("vip"))
        {
            props.Priority = 9;
            channel.BasicPublish(exchange: "PriorityExchange",routingKey: "Priority",
                basicProperties: props, body: Encoding.UTF8.GetBytes(msg));
        }
        //其他消息的优先级为1
        else
        {
            props.Priority = 1;
            channel.BasicPublish(exchange: "PriorityExchange",routingKey: "Priority",
                basicProperties: props, body: Encoding.UTF8.GetBytes(msg));
        }
    }
}

消费者

using (var channel = connection.CreateModel())
{
    #region EventingBasicConsumer
    //定义消费者                                      
    var consumer = new EventingBasicConsumer(channel);
    consumer.Received += (model, ea) =>
    {
        Console.WriteLine($"正常收到消息:{Encoding.UTF8.GetString(ea.Body.ToArray())}");
    };
    Console.WriteLine("优先级队列:消费者准备就绪....");
    //处理消息
    channel.BasicConsume(queue: "PriorityQueue", autoAck: true, consumer: consumer);
    Console.ReadKey();
    #endregion
}

队列和消息配置

队列有消息的数量限制吗?每条的大小有限制吗? 都是可以配置的。

案例:设置消息数量为20,发30条,结果只保留了前20条。

using (var channel = connection.CreateModel())
{
    //创建队列
    Dictionary<string, Object> map = new Dictionary<string, Object>();
    //设置队列最大的条数20条
    map.Add("x-max-length", 20);

    ////设置队列溢出方式保留前20条
    map.Add("x-overflow", "reject-publish");
    //毫秒为单位,队列自创建起,过去几秒后队列自动删除
    map.Add("x-expires", 20000);
    //队列上消息过期时间,应小于队列过期时间 
    map.Add("x-message-ttl", 8000);

    channel.QueueDeclare("myQueue", false, false, false, map);

    channel.ExchangeDeclare("MyExchages", type: ExchangeType.Direct,
        durable: true, autoDelete: false);
    //消息队列绑定消息交换机
    channel.QueueBind("myQueue", "MyExchages", routingKey: "myroutingkeyTest");

    for (int i = 0; i < 30; i++)
    {
        channel.BasicPublish(exchange: "MyExchages", routingKey: "myroutingkeyTest",
            basicProperties: null,
            body: Encoding.UTF8.GetBytes($"测试队列消息长度==={i + 1}~"));
    }
    Console.Read();
}

标签:false,exchange,队列,RabbitMQ,消息,优先级,channel
From: https://www.cnblogs.com/nullcodeworld/p/18669521

相关文章

  • Java-数据结构-栈与队列(常考面试题与单调栈)
    在上一篇的学习中,我们学习了栈和队列的基本知识,以及它们对应都有哪些方法,在什么应用场景下如何使用,并且还对它们进行了模拟实现,而其实对于栈和队列的相关知识还远不止于此,而今天我们就对栈与队列进行复盘,认识更多使用它们的场景,夯实代码功底吧~一、常考面试题-思维以下习题在......
  • Java算法 数据结构 栈 队列 优先队列 比较器
    目录栈Stack性质构造方法代码示例队列Queue性质构造方法代码示例优先队列PriorityQueue性质构造方法代码示例比较器1.Comparator接口的方法2.常见的内置比较器1.自然排序比较器(naturalOrder())2.逆序排序比较器(reverseOrder())3.nullsFirst()......
  • leetcode周赛432 T4(单调栈 + 单调队列)
    一道练习单调栈+单调队列的好题题目链接:problem对于求合法子数组数量的题目,可以先考虑传统的枚举右端点,二分左端点的套路。此题用这种方法恰好可行,因为对于一个序列,左端增加一个数不会让操作数更少。因此对于固定右端点,合法的左端点一定是一段区间。所以现在问题转化为:用双指......
  • 数据结构:栈(Stack)和队列(Queue)—面试题(二)
    1.用队列实现栈。习题链接https://leetcode.cn/problems/implement-stack-using-queues/description/描述:请你仅使用两个队列实现一个后入先出(LIFO)的栈,并支持普通栈的全部四种操作(push、top、pop 和 empty)。实现 MyStack 类:voidpush(intx) 将元素x压入栈顶。int......
  • RabbitMQ 高可用方案:原理、构建与运维全解析
    文章目录前言:1集群方案的原理2RabbitMQ高可用集群相关概念2.1设计集群的目的2.2集群配置方式2.3节点类型3集群架构3.1为什么使用集群3.2集群的特点3.3集群异常处理3.4普通集群模式3.5镜像集群模式前言:在实际生产中,RabbitMQ常以集群方案部署。因选用它......
  • 说说你对HTML元素的显示优先级的理解
    在前端开发中,HTML元素的显示优先级通常是由多个因素共同决定的,包括HTML的源代码顺序、CSS样式规则、以及JavaScript的动态修改。这里我们主要讨论的是在没有JavaScript干预,且CSS规则不冲突的情况下的显示优先级。HTML源代码顺序:在默认情况下,HTML元素按照它们在源代码中出现的顺......
  • 说说CSS的优先级是如何计算的?
    CSS的优先级计算是一个相对复杂但又非常重要的概念,在前端开发中,它决定了当多个样式规则应用于同一个元素时,哪个规则将最终生效。以下是CSS优先级计算的详细解释:1.优先级计算的基础CSS的优先级主要由选择器的类型和它们出现的次数决定。每个选择器都有一个相应的权重值,这些权重......
  • 验证出栈顺序是否正确题解&队列
    (1)验证出栈顺序是否正确队列遵循先入后出的原则,故需要一个数组来模拟记录入栈和出栈再分别对出栈顺序进行遍历验证是否正确#include<iostream>usingnamespacestd;#definem100000intb[m],a[m],c[m];intmain(){ intt; cin>>t; while(t--){ intn;......
  • 数据结构:栈(Stack)和队列(Queue)—面试题(一)
    目录1、括号匹配2、逆波兰表达式求值 3、栈的压入、弹出序列4、最小栈 1、括号匹配习题链接https://leetcode.cn/problems/valid-parentheses/description/描述:给定一个只包括 '(',')','{','}','[',']' 的字符串 s ,判断字符串是否有效。有效字符串需满足:左括号必......
  • Redis 是一个开源的高性能键值对存储数据库,通常被用作缓存、消息队列和持久化数据库。
    Redis服务器是什么?Redis是一个开源的高性能键值对存储数据库,通常被用作缓存、消息队列和持久化数据库。Redis支持多种数据结构,如字符串、哈希、列表、集合、有序集合、位图等。它被广泛用于需要快速读写操作、低延迟的场景。Redis可以作为一个独立的数据库使用,也可以作为缓......