RabbitMQ中的内存节点与磁盘节点

每个RabbitMQ 节点只有两种类型,要么是内存节点,要么是磁盘节点

内存节点

内存节点将所有的队列、交换器、绑定、用户、权限和vhost的元数据定义都仅存储在内存中.

显而易见,内存节点拥有更出色的性能

磁盘节点

磁盘节点则将元数据存储在磁盘中,重启之后,队列数据仍然存在。但是速度远远落后于内存节点。

单节点系统只允许磁盘类型的节点;否则,每次你重启RabbitMQ之后,所有关于系统的配置信息都会丢失。

如何抉择

当在集群中声明队列、交换器或者绑定的时候,这些操作会直到所有集群节点都成功提交元数据变更后才返回。对于内存节点来说,这意味着将变更写入内存;而对于磁盘节点来说,这意味着昂贵的磁盘写入操作,直到完成之后,节点才能说:“完事儿了!”假设你有五个节点的集群,并且所有节点都是磁盘节点,则你必须得等待所有这五个节点将元数据写入磁盘后,队列声明操作才能返回。

不过在集群中,你可以选择配置部分节点为内存节点。为什么会想要选择将元数据仅存储在内存中?因为它使得像队列和交换器声明之类的操作更加快速。

RabbitMQ只要求在集群中至少有一个磁盘节点。所有其他节点可以是内存节点。记住,当节点加入或者离开集群时,它们必须要将该变更通知到至少一个磁盘节点。

假如集群中只有一个磁盘节点,不巧的是它有刚好崩溃了。集群仍然可以保持运行,分发消息,但是你无法做任何更改,包括 创建队列、 创建交换器、 创建绑定、 添加用户、 更改权限、 添加或删除集群节点。

为了应对这种情况,我们通用的做法是“双活”。 至少设置两个磁盘节点,保证在任何时候都可以保存元数据的变更。除非你的所有磁盘节点都挂了。

当内存节点重启后,它们会连接到预先配置的磁盘节点,下载当前集群元数据拷贝。所以当添加内存节点时,确保告知其所有的磁盘节点(内存节点唯一存储到磁盘的元数据信息是集群中磁盘节点的地址)。只要内存节点可以找到至少一个磁盘节点,那么它就能在重启后重新加入集群。