RabbitMQ部署和性能调优

Posted by DeepNightTwo on May 30, 2014

RabbitMQ

简介

RabbitMQ是用Erlang写的一个AMQP的实现。特点是简单好用,快速高效。

简单好用:

  • 有现成的各种语言客户端
  • 文档齐全,而且组织的很好(对previous release的文档也组织的很好)。有Quick Start,按照这个走基本就能用起来了。
  • 配置简单。基本上默认配置就很好了。
  • api也比较简单直接,不拖泥带水。只要知道Queue是什么,都能用的比较顺。
  • 有一个web management,可以很方便的monitor。
  • 可以通过插件扩展。

快速高效:

  • TPS很高。20k/s很轻松(这个也根据消息的大小和一些配置,这里只1k的消息,流量才20m)
  • 可以配置集群,通过增加queue来增加scalability
  • 基本上,千兆网卡是瓶颈。

这里是官方文档 。顺着Get Started看基本就会用了。

更多介绍

如果RabbitMQ的一些基本概念还没看,建议先看看官方文档。

RabbitMQ的几个概念需要首先清晰一下

  • Virtual Host:简称vhost,相当于组的概念。跟http server中的虚拟主机完全不是一个概念。vhost主要是RabbitMQ用来管理权限和exchange,queue,binding的。可以认为不同的vhost在同一个机器上是不可见的。当连接到一个RabbitMQ server的时候,其实是连接到的一个vhost。这个连接(channel)可以访问这个vhost下的exchange,queue。每个vhost都可以单独配置用户,密码。queue名字在不同的vhost上可以重复(从这点上看跟http server中的虚拟主机有点像,主要就是起到隔离作用)。 RabbitMQ自带一个缺省的vhost “/”
  • exchange:可以认为是交换机。RabbitMQ(其实是AMQP)中,publisher是将消息发布到exchange的。exchange起到路由器的概念,根据routingKey,可以将消息路由到不同的queue
  • Queue:存放消息的实体。每个queue都需要绑定到一个或多个exchange,才能收到消息。读取消息的时候,则是直接从queue中读取。
  • Binding:Queue和Exchange的绑定。绑定时需要指定一个routingKey,这个也是exchange在路由消息时候用到的:根据消息的routingKey+binding的routingKey+exchange的路由规则,来对消息进行路由

RabbitMQ文档中的一些总结

  • RabbitMQ有集群。集群中的机器共享metadata(包括vhost,exchange,queue定义,binding定义等),但是每个queue是host在申请创建queue的机器上的,所以集群中的机器再多,也不能增加某一个queue的performance
  • RabbitMQ的集群可以用来做某个Queue的HA
  • RabbitMQ的exchange可以通过插件扩展。我用了random-exchange做消息的load balance
  • 对于单个机器,也可以通过创建多个vhost,多个queue增加性能。对于集群来说,也只能通过增加单个机器的queue的performance来提升整体的performance
  • publisher的confirm和consumer的ack都会对吞吐量造成比较大的影响。这些都是以vhost为粒度的,可以通过增加vhost来增加吞吐量。

一个高吞吐量的RabbitMQ架构

rabbitmq-arch

  • 四台机器构成一个集群,集群每台机器上的exchange,binding,等meta信息都是一样的
  • 为了实现load * balance,创建一个类型为random的exchange,名字叫做sec-ex。它会随机的将消息发送到绑定到它上面的queue上(其实是随机发送到routingKey相同的queue上,只要绑定到时候,r* outingKey相同,那么queue得到消息的几率就是一样的)
  • 在四台机器上创建四个queue,绑定到sec-ex,routingKey相同,确保每个queue得到的消息是平均的
  • 客户端可以随便连接到任何一个rabbitmq来发送消息,消息都会随机发送到其他四个queue中。
  • 在此基础上,可以通过增加vhost,获取更好的性能。