RabbitMQ:多租户模式(虚拟主机和隔离)。

每一个RabbitMQ服务器都能创建虚拟消息服务器,我们称之为虚拟主机(vhost)。每一个vhost本质上是一个mini版的RabbitMQ服务器,拥有自己的队列、交换器和绑定......更重要的是,他拥有自己的权限限制。这使得你能够安全的使用一个RabbitMQ服务器来服务众多应用程序,而不用担心你的Sudoku(数独)应用可能会删除狗狗防丢跟踪器正在使用的队列。vhost之于Rabbit就像虚拟机之于物理服务器一样:他们通过在各个实例间提供逻辑上分离,允许你为不同应用程序安全保密的运行数据。这很有用,他既能将同一个Rabbit的众多客户区分开来,又可以避免队列和交换器的命令冲突。否则你可能不得不运行多个Rabbit,并忍受随之而来头疼的管理问题。相反,你可以只运行一个Rabbit,然后按需启动或关闭vhost。
vhost是AMQP概念的基础,你必须在连接时进行指定。由于RabbitMQ包含了开箱即用的默认vhost:"/",因此使用起来非常简单。如果你不需要多个vhost的话,那么就使用默认的吧。通过使用缺省的guest用户名和密码guest就可以访问默认vhost。为安全起见,你应该更改他。AMQP的一个有趣的地方在于他并没有指定权限控制是在vhost级别还是在服务器端级别实现。这留给了服务器的开发者去决定。在RabbitMQ的例子中,权限控制是以vhost为单位的。
当你在Rabbit里创建一个用户时,用户通常会被指派给至少一个vhost,并且只能访问被指派vhost内的队列、交换器和绑定。当你在设计消息通信架构时,记住vhost之间是绝对隔离的。你无法将vhost banana_tree上的交换器绑定到vhost oak_tree中的队列上。事实上,这既保证了安全性,又确保了可移植性。假设你为重要的银行应用设计了支票兑现层,并使用了自己的vhost。最初,你可能把这个vhost同其他vhost一起运行在同一个Rabbit上。直到有一天客户们开始兑换数以百万计的支票——对你来说是好事,但是对Rabbit服务器来说可就惨了。支票兑换需要运行在轻负载的Rabbit服务器上。如果支票兑现层使用的是默认vhost的话,则你不得不担心命名冲突(队列和交换器)。不过既然他有自己的vhost,你就能安全的迁移到新的Rabbit服务器上,然后马上开始处理新的负载而不会有任何名命冲突。因此,我们强烈推荐仔细甄别基础架构(譬如Web日志)中的通用功能群组,并为他们分别分配各自的vhost。同时,请记住,当你在RabbitMQ集群上创建vhost时,整个集群上都会创建该vhost。vhost不仅消除了为基础架构中的每一层运行一个RabbitMQ服务器的需要,同样也避免了为每一层创建不同集群。
我们讨论了vhost带来的所有巨大益处,那么如何创建他们呢?vhost和权限控制非常独特,他们是AMQP中唯一无法通过AMQP协议创建的基元(不同于队列、交换器和绑定)。对于RabbitMQ来说,你需要通过RabbitMQ的安装路径下./sbin/目录中的rabbitmqctl工具来创建。通过简单地运行rabbitmqctl add_vhost[vhost_name]就可以创建一个vhost。其中[vhost_name]就是你想要创建的vhost。删除vhost同样简单:rabbitmqctl delete_vhost[vhost_name]。一旦vhost创建成功之后,你就可以连接上去并开始添加队列和交换器了。如果你想要知道特定Rabbit服务器上运行着哪些vhost时,运行rabbitmqctl list_vhosts即可。之后你就会看见如下所示的内容:

$ ./sbin/rabbitmqctl list_vhosts
Listing vhosts ...
/
oak
sycamore
...done.

注意:通常情况下,你将在服务器上直接运行rabbitmqctl来管理自己的RabbitMQ节点。不过,你也可以通过指定-n rabbit@[server_name]选项来管理远程RabbitMQ节点。@符号将节点标识符(rabbit@[server_name])分成两部分:左边的是Erlang应用名称,在这里永远都是rabbit。右边是服务器主机名或者IP地址。你需要确保运行Rabbit节点的服务器和运行rabbitmqctl的工作站安装了相同的Erlang cookie。

到目前为止,通过vhost你保障了队列和交换器的安全。

你可能感兴趣的:(RabbitMQ)