zoukankan      html  css  js  c++  java
  • 9.[完]其他常用的rabbitmq的参数和设置

    作者

    微信:tangy8080
    电子邮箱:914661180@qq.com
    更新时间:2019-08-12 20:42:25 星期一

    欢迎您订阅和分享我的订阅号,订阅号内会不定期分享一些我自己学习过程中的编写的文章
    如您在阅读过程中发现文章错误,可添加我的微信 tangy8080 进行反馈.感谢您的支持。

    文章主题

    介绍在rabbit的使用过程中经常用的一些参数

    前置条件

    有一些rabbit的使用经验


    QueueDeclare中的参数详细说明

    • queue 队列的名称

    • durable 是否是持久化的,队列的声明默认是存放到内存中的,如果rabbitmq重启会丢失,如果想重启之后还存在就要使队列持久化,保存到Erlang自带的Mnesia数据库中,当rabbitmq重启之后会读取该数据库

    • exclusive 是否排外.排外有以下两个特性
      A.当连接关闭时connection.close()该队列是否会自动删除
      B.该队列是否是私有的private,其他通道channel是不能访问的,如果强制访问会报异常:com.rabbitmq.client.ShutdownSignalException: channel error; protocol method: #method<channel.close>(reply-code=405, reply-text=RESOURCE_LOCKED - cannot obtain exclusive access to locked queue 'queue_name' in vhost '/', class-id=50, method-id=20)一般等于true的话用于一个队列只能有一个消费者来消费的场景
      -是否自动删除,当前最后一个consumer断开之后,autodelete被触发

    • arguments,参数(可选,由插件和特定于代理的功能使用).这个在C#的代理里没有注释.相关参数可以在这里找到

    A.Message TTL(x-message-ttl):设置队列中的所有消息的生存周期(统一为整个队列的所有消息设置生命周期), 也可以在发布消息的时候单独为某个消息指定剩余生存时间,单位毫秒
    设置整个队列消息过期时间配置如下:

      channel.QueueDeclare("mytest", false, false, false, new Dictionary<string, object>
                {
                    //{"x-message-ttl", 1000*8 }   //queue中的所有message只能存活 8s。。。。
                });
    

    设置单个消息的TTL的配置如下:

    var properties = channel.CreateBasicProperties();
    properties.Expiration = "8000";
    
    

    B.Auto Expire(x-expires):当队列在指定的时间没有被访问(consume, basicGet, queueDeclare…)就会被删除,Features=Exp.注意这里是删除队列.不是队列中的消息

    C.Max Length(x-max-length):限定队列的消息的最大值长度,超过指定长度将会把最早的几条删除掉,Feature=Lim

    D.Max Length Bytes(x-max-length-bytes):限定队列最大占用的空间大小, 一般受限于内存、磁盘的大小, Features=Lim B

    E.Dead letter exchange(x-dead-letter-exchange): 当队列消息长度大于最大长度、或者过期的等,将从队列中删除的消息推送到指定的交换机中去而不是丢弃掉,Features=DLX

    F.Dead letter routing key(x-dead-letter-routing-key):将删除的消息推送到指定交换机的指定路由键的队列中去, Feature=DLK

    G.Maximum priority(x-max-priority):优先级队列,声明队列时先定义最大优先级值(定义最大值一般不要太大),在发布消息的时候指定该消息的优先级, 优先级更高(数值更大的)的消息先被消费,

    H.Lazy mode(x-queue-mode=lazy): Lazy Queues: 先将消息保存到磁盘上,不放在内存中,当消费者开始消费的时候才加载到内存中

    I.Master locator(x-queue-master-locator):


    dead-letter-exchange 死信队列

    死信队列:DLX,dead-letter-exchange
    利用DLX,当消息在一个队列中变成死信 (dead message) 之后,它能被重新publish到另一个Exchange,这个Exchange就是DLX

    消息变成死信有以下几种情况

    • 消息被拒绝(basic.reject / basic.nack),并且requeue = false
    • 消息TTL过期
    • 队列达到最大长度

    死信处理过程

    • DLX也是一个正常的Exchange,和一般的Exchange没有区别,它能在任何的队列上被指定,实际上就是设置某个队列的属性。
    • 当这个队列中有死信时,RabbitMQ就会自动的将这个消息重新发布到设置的Exchange上去,进而被路由到另一个队列。
    • 可以监听这个队列中的消息做相应的处理。

    死信队列的设置

     channel.QueueDeclare("mytest", false, false, false, new Dictionary<string, object>
                {
                    {"x-max-length",10 },
                    {"x-dead-letter-exchange","mydead_exchange" },
                    { "x-dead-letter-routing-key","mydead_queue"}
                });
    
    • x-dead-letter-exchange,指定消息如果变成死信.将投放到的交换机
    • x-dead-letter-routing-key 执行路由key, 消费者可以通过该key进行路由消费

    消息确认机制

    消费端确认

    • 自动确认,message出队列的时候就自动确认
    • 手工确认
    void BasicAck(ulong deliveryTag, bool multiple);
    

    multiple: true x< deliveryTag 的所有message都会被确认

    • 手工拒绝
    #requeue true:消息重新进队列.然后重新投递  false:直接扔掉
    void BasicNack(ulong deliveryTag, bool multiple, bool requeue);
    
    #直接扔掉
    void BasicReject(ulong deliveryTag, bool requeue);
    
    #重新进队列 requeue true:发送给新的consumer, false:发送给相同的consumer 
    void BasicRecover(bool requeue);
    

    生产方确认

    transaction机制, publish 送message到rabbitmq中,我们一定要知道,这个消息已经发送成功了,也就是,rabbitmq
    一定要告诉publish,这条消息已经被确认收到

    channel.ConfirmSelect();
    for (int i = 0; i < 10; i++)
    {
        channel.BasicPublish(string.Empty, "mytest", null, Encoding.UTF8.GetBytes(string.Format("{0} 你好", i)));
    }
    var isallpublished = channel.WaitForConfirms();
    

    消息的持久化

    对队列进行持久化设置仅代表队列的相关属性会被持久化.但队列中的消息需要单独设置

    var properties = channel.CreateBasicProperties();
    properties.Persistent = true;   //持久化
    
    /// <summary>
    /// Sets <see cref="P:RabbitMQ.Client.IBasicProperties.DeliveryMode" /> to either persistent (2) or non-persistent (1).
    /// </summary>
    bool Persistent { get; set; }
    
    /// <summary>Non-persistent (1) or persistent (2).</summary>
    byte DeliveryMode { get; set; }
    

    Lazy Queue和Default

    • Lazy Queue 队列会尽可能的将消息存入磁盘中,而在消费者消费到相应的消息时才会被加载到内存中,它的一个重要的设计目标是能够支持更长的队列,即支持更多的消息存储。当消费者由于各种各样的原因(比如消费者下线、宕机亦或者是由于维护而关闭等)而致使长时间内不能消费消息造成堆积时,惰性队列就很有必要了

    • 当生产者将消息发送到RabbitMQ的时候,队列中的消息会尽可能的存储在内存之中,这样可以更加快速的将消息发送给消费者。即使是持久化的消息,在被写入磁盘的同时也会在内存中驻留一份备份。当RabbitMQ需要释放内存的时候,会将内存中的消息换页至磁盘中,这个操作会耗费较长的时间,也会阻塞队列的操作,进而无法接收新的消息

    在实际使用时,可以考虑使用Lazy Queue,已达到更大的消息吞吐量和避免内存占用过高.

    镜像队列mirror

    镜像队列主要解决将消息存放在单个队列中,如果该队列所在节点出现问题.将造成消息丢失
    镜像队列的配置:

    • Virtual host: 可选参数,针对指定vhost下的queue进行设置
    • Name: policy的名称
    • Pattern: queue的匹配模式(正则表达式)
    • Definition:镜像定义,包括三个部分ha-mode, ha-params, ha-sync-mode
      -ha-mode:指明镜像队列的模式,有效值为 all/exactly/nodes
              -all:表示在集群中所有的节点上进行镜像
              -exactly:表示在指定个数的节点上进行镜像,节点的个数由ha-params指定
              -nodes:表示在指定的节点上进行镜像,节点名称通过ha-params指定
      -ha-params:ha-mode模式需要用到的参数
      -ha-sync-mode:进行队列中消息的同步方式,有效值为automatic和manual
    • priority:可选参数,policy的优先级

    引用链接

    https://blog.csdn.net/any11/article/details/83069067
    https://www.jianshu.com/p/7f8a06f70aa6

    请尽量按照自己期望的生活 email:18980489167@189.cn
  • 相关阅读:
    【SpringBoot】常用Starter介绍和整合模板引擎Freemaker、thymeleaf
    【SpringBoot】SpringBoot拦截器实战和 Servlet3.0自定义Filter、Listener
    【SpringBoot】单元测试进阶实战、自定义异常处理、t部署war项目到tomcat9和启动原理讲解
    【SpringBoot】SpringBoot热部署和配置文件自动注入实战
    IntelliJ IDEA备忘
    接口与抽象类
    泛型(11)-泛型与数组
    泛型(10)-泛型擦除与转换
    泛型(9)-泛型方法与方法重载
    泛型(8)-Java7的"菱形"语法与泛型构造器
  • 原文地址:https://www.cnblogs.com/gytangyao/p/11406107.html
Copyright © 2011-2022 走看看