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

posted @ 2019-08-24 21:11  XIAOBING-TANG  阅读(915)  评论(0编辑  收藏  举报