作者

微信: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

9.[完]其他常用的rabbitmq的参数和设置的更多相关文章

  1. mysqldump的常用语句及各参数详解

    mysqldump的常用语句及各参数详解 分类: MySQL 2011-01-11 17:55 1368人阅读 评论(0) 收藏 举报 数据库mysql服务器tableinsertdatabase m ...

  2. RabbitMQ arguments参数设置

    有发布端.消费端.消息路由.消息生命周期和身份认证标识等模块参数的设置. 具体请参考地址:http://www.rabbitmq.com/extensions.html

  3. Django中ORM常用字段及字段参数

    Object Relational Mapping(ORM) ORM介绍 ORM概念 对象关系映射(Object Relational Mapping,简称ORM)模式是一种为了解决面向对象与关系数据 ...

  4. Django orm常用字段和字段参数

    1.Object Relational Mapping(ORM) 1.1ORM介绍 ORM概念 对象关系映射(Object Relational Mapping,简称ORM)模式是一种为了解决面向对象 ...

  5. 十个最常用的JVM 配置参数

    1.-Xms:初始堆大小.只要启动,就占用的堆大小. 2.-Xmx:最大堆大小.java.lang.OutOfMemoryError:Java heap这个错误可以通过配置-Xms和-Xmx参数来设置 ...

  6. 常用邮箱的 IMAP/POP3/SMTP 设置

    通过网上查找的资料和自己的总结完成了下面的文章,看完之后相信大家对这三种协议会有更深入的理解.如有错误的地方望指正. POP3 POP3是Post Office Protocol 3的简称,即邮局协议 ...

  7. 【转】常用邮箱的 IMAP/POP3/SMTP 设置

    POP3 POP3是Post Office Protocol 3的简称,即邮局协议的第3个版本,它规定怎样将个人计算机连接到Internet的邮件服务器和下载电子邮件的电子协议.它是因特网电子邮件的第 ...

  8. 关于MySql链接url参数的设置

    jdbc.driverClassName=com.mysql.jdbc.Driverjdbc.url=jdbc:mysql://localhost:3306/database?useUnicode=t ...

  9. 内核参数SEMMSL SEMMNS SEMOPM SEMMNI参数的设置

    内核参数SEMMSL SEMMNS SEMOPM SEMMNI参数的设置  转自:http://www.dbafree.net/?p=92   这四个参数自己一直没搞清楚 今天问了下同事,大概整了一下 ...

随机推荐

  1. 三种梯度下降算法的区别(BGD, SGD, MBGD)

    前言 我们在训练网络的时候经常会设置 batch_size,这个 batch_size 究竟是做什么用的,一万张图的数据集,应该设置为多大呢,设置为 1.10.100 或者是 10000 究竟有什么区 ...

  2. wmic 查看主板信息

    查看主板信息的一个命令:wmic baseboard get 当然在命令提示符里查看,真的很费劲,所以我们将命令格式化一下:wmic baseboard get /format:HFORM >c ...

  3. CF76A Gift

    题目描述 有一个国家有N个城市和M条道路,这些道路可能连接相同的城市,也有可能两个城市之间有多条道路. 有一天,有一伙强盗占领了这个国家的所有的道路.他们要求国王献给他们礼物,进而根据礼物的多少而放弃 ...

  4. 高效率同步降压变换器,24V转3.3V降压芯片

    PW2312是一个高频,同步,整流,降压,开关模式转换器与内部功率MOSFET.它提供了一个非常紧凑的解决方案,以实现1.5A的峰值输出电流在广泛的输入电源范围内,具有良好的负载和线路调节. PW23 ...

  5. Windows Server 2008 R2系统安装

    把系统U盘插到服务器上,然后启动服务器进入BIOS界面选择U盘启动. 根据服务器的不同,进入BIOS界面的按钮也不一样,主流的有F10.F11.F12.F2.ESC.delete等. 在从BIOS启动 ...

  6. 我教你如何解决 Docker 下载 mcr.microsoft.com 镜像慢的办法

    我教你如何解决 Docker 下载 mcr.microsoft.com 镜像慢的办法 一.介绍 最近,我在写有关使用 Jenkins 搭建企业级持续集成环境的文章,准备了四台服务器,企业级别嘛,一台就 ...

  7. Java面向对象(三)—— 继承

    标签: java 继承 抽象类 this super abstract 概述 多个类中存在相同的属性和行为的时候,将这些内容抽取到单独一个类中,那么多个类无需在定义这些属性和行为,只要继承那个类即可. ...

  8. javamail发送邮件,支持yahoo,google,163.com,qq.com邮件发送

    https://www.iteye.com/blog/fangyunfeng-1847352 https://blog.csdn.net/weixin_38465623/article/details ...

  9. 题解 UVA11694 【Gokigen Naname谜题 Gokigen Naname】

    题目 题解 考场上连暴力都不会打的码农题,深搜是真的难 /kk 前置问题 怎么输出"\" cout<<"\\"; 2.怎么处理不在一个环里,可以考虑 ...

  10. 济南学校D1T3_hahaha

    [问题描述] 小Q对计算几何有着浓厚的兴趣.他经常对着平面直角坐标系发呆,思考一些有趣的问题.今天,他想到了一个十分有意思的题目: 首先,小Q会在轴正半轴和轴正半轴分别挑选个点.随后,他将轴的点与轴的 ...