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
9.[完]其他常用的rabbitmq的参数和设置的更多相关文章
- mysqldump的常用语句及各参数详解
mysqldump的常用语句及各参数详解 分类: MySQL 2011-01-11 17:55 1368人阅读 评论(0) 收藏 举报 数据库mysql服务器tableinsertdatabase m ...
- RabbitMQ arguments参数设置
有发布端.消费端.消息路由.消息生命周期和身份认证标识等模块参数的设置. 具体请参考地址:http://www.rabbitmq.com/extensions.html
- Django中ORM常用字段及字段参数
Object Relational Mapping(ORM) ORM介绍 ORM概念 对象关系映射(Object Relational Mapping,简称ORM)模式是一种为了解决面向对象与关系数据 ...
- Django orm常用字段和字段参数
1.Object Relational Mapping(ORM) 1.1ORM介绍 ORM概念 对象关系映射(Object Relational Mapping,简称ORM)模式是一种为了解决面向对象 ...
- 十个最常用的JVM 配置参数
1.-Xms:初始堆大小.只要启动,就占用的堆大小. 2.-Xmx:最大堆大小.java.lang.OutOfMemoryError:Java heap这个错误可以通过配置-Xms和-Xmx参数来设置 ...
- 常用邮箱的 IMAP/POP3/SMTP 设置
通过网上查找的资料和自己的总结完成了下面的文章,看完之后相信大家对这三种协议会有更深入的理解.如有错误的地方望指正. POP3 POP3是Post Office Protocol 3的简称,即邮局协议 ...
- 【转】常用邮箱的 IMAP/POP3/SMTP 设置
POP3 POP3是Post Office Protocol 3的简称,即邮局协议的第3个版本,它规定怎样将个人计算机连接到Internet的邮件服务器和下载电子邮件的电子协议.它是因特网电子邮件的第 ...
- 关于MySql链接url参数的设置
jdbc.driverClassName=com.mysql.jdbc.Driverjdbc.url=jdbc:mysql://localhost:3306/database?useUnicode=t ...
- 内核参数SEMMSL SEMMNS SEMOPM SEMMNI参数的设置
内核参数SEMMSL SEMMNS SEMOPM SEMMNI参数的设置 转自:http://www.dbafree.net/?p=92 这四个参数自己一直没搞清楚 今天问了下同事,大概整了一下 ...
随机推荐
- LeetCode404.左叶子之和
题目 法一.广度优先搜索 1 class Solution { 2 public: 3 int sumOfLeftLeaves(TreeNode* root) { 4 if(root == NULL) ...
- Electron入门Demo之桌面应用计算器笔记(二)
码文不易啊,转载请带上本文链接呀,感谢感谢 https://www.cnblogs.com/echoyya/p/14307996.html 在之前总结了一篇自学笔记,通过之前学习到的方法和知识,完成了 ...
- Redis 实战 —— 03. Redis 简单实践 - Web应用
需求 功能: P23 登录 cookie 购物车 cookie 缓存生成的网页 缓存数据库行 分析网页访问记录 高层次角度下的 Web 应用 P23 从高层次的角度来看, Web 应用就是通过 HTT ...
- nmap的理解与利用(初级)
在命令窗口下输入命令等待,可以用回车来查看进度 nmap进行探测之前要把域名通过dns服务器解析为ip地址,我们也可以使用指定的dns服务器进行解析. nmap --dns-servers 主机地址 ...
- Java基础复习4
选择排序(擂台排序): public class demo1 { public static void main(String[] args) { // TODO Auto- ...
- 上海某小公司面试题:synchronized锁原理
synchronized锁是Java面试的过程中比较常考的知识点了,从偏向锁->轻量级锁->重量级锁都可以聊 CAS在这篇没有讲述,因为在上一篇已经写了,有兴趣的同学可以翻翻开 目前已经连 ...
- JVM(四)打破双亲委派和SPI机制
前言: 我们都知道判断两个类是不是同一个,要根据类加载器和全限定名.这是为什么呢?为什么不同的类加载器加载同一个类是不同的呢? 答案就是,不同的类加载器所加载的类在方法区的存储空间是不同的即Insta ...
- H3C、Huawei、Cisco网络设备AAA TACACS认证配置
TACACS技术白皮书 摘要:TACACS是实现AAA功能的一种安全协议,主要是通过TACACS客户端与TACACS服务器通信来实现多种用户的AAA功能. HWTACACS采用TCP协议承载报文,TC ...
- 在HDFS中将文件从源路径移动到目的路径。
import java.text.SimpleDateFormat; import java.util.Scanner; import org.apache.hadoop.fs.FSDataInput ...
- 支持 gRPC 长链接,深度解读 Nacos 2.0 架构设计及新模型
支持 gRPC 长链接,深度解读 Nacos 2.0 架构设计及新模型 原创 杨翊(席翁) 阿里巴巴云原生 2020-12-28