作者

微信: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. LeetCode530. 二叉搜索树的最小绝对差

    题目 又是常见的BST,要利用BST的性质,即中序遍历是有序递增序列. 法一.中序遍历 1 class Solution { 2 public: 3 vector<int>res; 4 v ...

  2. 基于Dockfile构建JAVA环境网站镜像

    查看本地目录 [root@docker tomcat]# ls apache-tomcat-8.5.16.tar.gz  Dockerfile  jdk-8u91-linux-x64.tar.gz   ...

  3. 记录Js动态加载页面.append、html、appendChild、repend添加元素节点不生效以及解决办法

    今天再优化blog页面的时候添加了个关注按钮和图片,但是页面上这个按钮和图片时有时无,本来是搞后端的,被这个前端的小问题搞得抓耳挠腮的! 网上各种查询解决方案,把我解决问题的艰辛历程分享出来,希望大家 ...

  4. 第一章:起步(python环境搭建)

    Python 环境搭建 学习python的第一步,就是要学习python开发环境的配置,在配置好python开发环境后,你需要再安装一款比较趁手的编辑器,事实上,python解释器本身就可以进行一些编 ...

  5. 推荐大家去撸60元的阿里云ACA DevOps认证

    要试题的右边扫码支付10元,私聊博客哈,说出你微信号,留下邮箱,发你邮箱Pdf文件,这么便宜拿证!!

  6. 常用的hadoop和yarn的端口总结

    节点 默认端口 用途说明 HDFS DataNode 50010 datanode服务端口,用于数据传输 50075 http服务的端口 50475 https服务的端口 50020 ipc服务的端口 ...

  7. Maven 本地仓库

    概述 Maven 的本地资源库是用来存储所有项目的依赖关系(插件 Jar 和其他文件,这些文件被 Maven 下载)到本地文件夹.很简单,当你建立一个 Maven 项目,所有相关文件将被存储在你的 M ...

  8. 在这个应用中,我使用了 MQ 来处理异步流程、Redis 缓存热点数据、MySQL 持久化数据,还有就是在系统中调用另外一个业务系统的接口,对我的应用来说这些都是属于 RPC 调用,而 MQ、MySQL 持久化的数据也会存在于一个分布式文件系统中,他们之间的调用也是需要用 RPC 来完成数据交互的。

    在这个应用中,我使用了 MQ 来处理异步流程.Redis 缓存热点数据.MySQL 持久化数据,还有就是在系统中调用另外一个业务系统的接口,对我的应用来说这些都是属于 RPC 调用,而 MQ.MySQ ...

  9. maven project builder fails when running on jdk>9

    java.lang.NoClassDefFoundError: Could not initialize class org.codehaus.plexus.archiver.jar.JarArchi ...

  10. 从零开始学Java (三)基础语法

    1. 基本数据类型 整数类型:byte,short,int,long 浮点数类型:float,double 字符类型:char 布尔类型:boolean java最小单位是bit,一个byte占用8个 ...