RabbitMQ最佳实践

保证队列中有尽量少的消息堆积

当队列中堆积过多消息时会给内存带来极大的压力,为了释放内存Rabbit会将消息刷至磁盘,当有大量消息需要刷新至磁盘时,会造成队列的阻塞进而影响系统吞吐量。

当你的rabbit为集群部署时,重启的时候会重新建立索引,并且在集群中同步消息,消息量越多,这个时间也就越久。

所以尽量保证发送至队列的消息能够在一定时间内及时被消费掉。

启用懒惰队列功能

lazy queue会将生产者的消息持久化到磁盘中而不驻留在内存,只有当消息需要被消费时才会重新加载到内存,避免了消息堆积,会尽量避免内存过高导致的问题。

而对于持久化消息所造成的额外工作,这里引用一段朱小厮博客中的一段话:

惰性队列会将接收到的消息直接存入文件系统中,而不管是持久化的或者是非持久化的,这样可以减少了内存的消耗,但是会增加I/O的使用,如果消息是持久化的,那么这样的I/O操作不可避免,惰性队列和持久化消息可谓是“最佳拍档”。注意如果惰性队列中存储的是非持久化的消息,内存的使用率会一直很稳定,但是重启之后消息一样会丢失。

然而当你需要较高的性能--队列中消息较少,或者设置了队列最大长度时应该禁用队列的lazy属性。

设置max-length或者TTL

TTL为消息过期时间,max-length为队列最大长度。对于那些吞吐量优先,允许消息丢失的应用程序最好设置这两个属性避免消息堆积来保证内存正常。

队列数量

rabbit中的队列是单线程的,适当使用多个队列和消费者可以增加吞吐量。但不要设置太多的队列,如果底层节点上的队列与内核一样多,则可以实现最佳吞吐量。

自动删除不使用的队列

客户机连接可能会失败,并可能会留下未使用的资源(队列),而留下许多队列可能会影响性能。自动删除队列有三种方法。

1.可以在队列上设置TTL策略,例如,28天的TTL策略会删除28天未使用的队列。

2.设置了自动删除属性的队列在其最后一个消费者取消或连接关闭(或丢失与服务器的TCP连接)时被删除。

3.独占队列只能被声明他的连接所使用,当声明连接关闭或消失时(例如,由于底层TCP连接丢失),将删除独占队列。

设置优先级队列的优先级上限

rabbit由Erlang开发,每个优先级使用Erlang VM上的一个内部队列,该队列会占用一些资源。在大多数情况下,不超过5个优先级就足够了。

消息的大小与类型

一般来说我们发送给broker的消息都是对象序列化后的json字符串,大小为几百字节,并不需要担心,只是不要用rabbit来传输大文件即可。

消息确认机制

如果不需要确保消息不丢失,把消息确认机制关掉可以提高吞吐量。

如果开启了消息确认,接收到重要消息的消费应用程序在完成对这些消息的任何处理(工作程序崩溃、异常等)之前都不应该确认消息。

发布确认类似于消息确认机制,服务器在收到来自发布者的消息时进行ack。发布确认对性能也有影响。但是如果生产者需要确保消息到达broker,那么它是必需的。

所有未确认的消息必须驻留在服务器的内存中。如果有太多未确认的消息,就会耗尽内存。限制未确认消息的有效方法是设置客户端预取值,即prefetch_count的值(下面会有介绍)。

持久化消息与队列

如果你期望消息不丢失,那么需要将队列声明为durable的,并且发送的消息也要声明为persistent(二者必须同时设置)这样在broke发生故障重启后消息才不会丢失。

Prefetch预取值

prefetch属性用来定义一次可以给消费者发送多少条消息,设置合适的值会使消费者得到有效利用。默认情况下,预取值为无限大,意味着消费者尽可能的接收生产者的消息,预取值限制了消费者在确认消息之前可以接收多少消息。所有预获取的消息都将从队列中删除,并且对其他消费者不可见。举个栗子,假如prefetch_count值设为10且消费者开启acknowledge,获取10个消息后,rabbitmq不再将队列中的消息推送过来,当对消息处理完后(即对消息进行了ack,并且有能力处理更多的消息)再接收来自队列的消息。

预取值过小会降低rabbit的性能;预取值过大时当存在多个消费者,可能会导致某个消费者负载过高,而其他的消费者处于空闲状态。

关于预取值的建议:如果消费者数量不多并处理迅速,可以将预取值设的大一些,保证消费者充分使用。如果消费者数量较多,且处理时间较短,可以将值取的比上个情况下稍小一些。如果消费者较多且处理时间较长,建议将预取值设为1,以便各个消费者“负载均衡”。具体的数目可以在机器上进行测试,然后选取合适的值。总之,尽量不使用系统默认的预取策略。

最后最重要的一点是,预取值只有在手动确认模式下才生效。

HIPE

配置文件开启HIPE后会提高rabbit的吞吐量,但是会大幅度延长rabbit的启动时间,如果系统需要做高可用的话,建议不要开启。

参考:lovisa johanssan --RabbitMQ Best Practice

©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 157,012评论 4 359
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 66,589评论 1 290
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 106,819评论 0 237
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 43,652评论 0 202
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 51,954评论 3 285
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 40,381评论 1 210
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 31,687评论 2 310
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 30,404评论 0 194
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 34,082评论 1 238
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 30,355评论 2 241
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 31,880评论 1 255
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 28,249评论 2 250
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 32,864评论 3 232
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 26,007评论 0 8
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 26,760评论 0 192
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 35,394评论 2 269
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 35,281评论 2 259

推荐阅读更多精彩内容

  • 来源 RabbitMQ是用Erlang实现的一个高并发高可靠AMQP消息队列服务器。支持消息的持久化、事务、拥塞控...
    jiangmo阅读 10,266评论 2 34
  • http://liuxing.info/2017/06/30/Spring%20AMQP%E4%B8%AD%E6%...
    sherlock_6981阅读 15,466评论 2 11
  • RabbitMQ 简介 MQ 消息队列,上承生产者,下接消费者。从生产者侧获取消息,然后将消息转发给消费者。由此可...
    2205阅读 3,420评论 1 11
  • RabbitMQ核心基础概念 Server:又称之为Broker,接受客户端的连接,实现AMQP实体服务。 Con...
    Java大宝宝阅读 3,146评论 0 2
  • 网上rabbitmq的学习日志非常丰富,官网文档也很完美,这里主要记录学习和部署过程中的一些记录。会按以下菜单进行...
    恐龙打酱油阅读 2,503评论 0 4