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 这四个参数自己一直没搞清楚 今天问了下同事,大概整了一下 ...
随机推荐
- RWCTF2020 DBaaSadge 复现
数据库题目 2020RWCTF DBaaSadge WP 这是一个很有意思的题目,难到让我绝望,跟着大佬smity的思路跑一下,求大佬抱抱. https://mp.weixin.qq.com/s/jv ...
- CyNix-lxd提权
0x01 信息收集 nmap -p- -T5 192.168.43.155扫描开放端口 nmap -sV -p 80,6688 -A 192.168.43.155 -oA cynix扫描指定端口 go ...
- k8s中教你快速写一条yaml文件
一条yaml中有很多字段,如果去背这些字段,其实也能背过,但是去写一条yaml,也往往浪费很多的时间,也会出错,其实我们可以用一条命令就能快速来写一段自定义的yaml,工作中去修改相应的yaml也得心 ...
- 负载均衡和故障转换(Failover)的连接RAC方法
TAF:Transparent Application Failover,透明的应用切换,即在切换的过程中,用户感知不到.可以实现会话的切换(无法实现事务的切换,即没有提交的事务会回滚),即在不断开连 ...
- WMIC 查看bios配置信息
如何查看我们的主板上的BIOS信息呢?有办法,不用安装任何软件,只需要windows自带的命令提示符就行,哈哈 WMIC BIOS LIST FULL /FORMAT:VALUE 如果第一次使用wmi ...
- 使用modify修改内表
modify修改内表,有这样一种方式,MODIFY TABLE itab FROM wa [TRANSPORTING ..]. 然后这里的内表itab是有条件的,这个itab必须要有table key ...
- 【vulnhub】靶机-【DC系列】DC9(附靶机)
出品|MS08067实验室(www.ms08067.com) 本文作者:大方子(Ms08067实验室核心成员) 主机信息 Kali:192.168.56.113 DC9:192.168.56.112 ...
- c 越界 数组越界
int main(int argc, char* argv[]){ int i = 0; int arr[3] = {0}; for(; i<=3; i++){ arr[i] = 0; prin ...
- HDU1814和平委员会
题目大意: 有n对的人,编号从1-2*n,m对的人之间互相不喜欢,每对人中必徐选1个人加入和平委员会,求字典序最小的解 -------------------------------- 2-SAT问题 ...
- SpringMVC听课笔记(四:映射请求参数 & 请求头)
1.请求参数 @RequestParam 来映射请求参数 http://localhost:8080/springmvc-1/springmvc/testRequestParam?username ...