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