问题一:RabbitMQ中的broker是指什么?cluster又是指什么?答:broker是指一个或多个erlangnode的逻辑分组,且node上运行着RabbitMQ应用程序。cluster是在broker的基础之上,增加了node之间共享元数据的约束。问题二:什么是元数据?元数据分为哪些类型?包括哪些内容?与cluster相关的元数据有哪些?元数据是如何保存的?元数据在cluster中是如何分布的?答:在非cluster模式下,元数据主要分为Queue元数据(queue名字和属性等)、Exchange元数据(exchange名字、类型和属性等)、Binding元数据(存放路由关系的查找表)、Vhost元数据(vhost范围内针对前三者的名字空间约束和安全属性设置)。在cluster模式下,还包括cluster中node位置信息和node关系信息。元数据按照erlangnode的类型确定是仅保存于RAM中,还是同时保存在RAM和disk上。元数据在cluster中是全node分布的。下图所示为queue的元数据在单node和cluster两种模式下的分布图。问题三:RAMnode和disknode的区别?答:RAMnode仅将fabric(即queue、exchange和binding等RabbitMQ基础构件)相关元数据保存到内存中,但disknode会在内存和磁盘中均进行存储。RAMnode上唯一会存储到磁盘上的元数据是cluster中使用的disknode的地址。要求在RabbitMQcluster中至少存在一个disknode。问题四:RabbitMQ上的一个queue中存放的message是否有数量限制?答:可以认为是无限制,因为限制取决于机器的内存,但是消息过多会导致处理效率的下降。问题五:RabbitMQ概念里的channel、exchange和queue这些东东是逻辑概念,还是对应着进程实体?这些东东分别起什么作用?答:queue具有自己的erlang进程;exchange内部实现为保存binding关系的查找表;channel是实际进行路由工作的实体,即负责按照routing_key将message投递给queue。由AMQP协议描述可知,channel是真实TCP连接之上的虚拟连接,所有AMQP命令都是通过channel发送的,且每一个channel有唯一的ID。一个channel只能被单独一个操作系统线程使用,故投递到特定channel上的message是有顺序的。但一个操作系统线程上允许使用多个channel。channel号为0的channel用于处理所有对于当前connection全局有效的帧,而1-65535号channel用于处理和特定channel相关的帧。AMQP协议给出的channel复用模型如下其中每一个channel运行在一个独立的线程上,多线程共享同一个socket。问题六:vhost是什么?起什么作用?答:vhost可以理解为虚拟broker,即mini-RabbitMQse...