【MQ】RabbitMQ概念

【MQ】RabbitMQ概念

读《RabbitMQ 实战》有感。

生产者确认模式: 通过设置信道模式为 confirm ,修改生产者确认模式,只有在成功将消息发送到队列才会确认该消息发送成功,否则,发送失败。在开启 持久化的情况下,只有将消息持久化到磁盘,才会发送确认给生产者。

可以通过在应用程序内容维护一个信道的消息msg_id 来确认某一条消息时候成功发送到 队列中,一般不需要该操作,除非客户要求。

集群中的队列:在单一节点设置中,所有关于队列的消息都完全存储在该节点上。但是如果在集群中创建队列的话,集群只会在单个节点而不是所有节点上创建完整的队列信息(元数据,状态、内容)。结果是只有队列的所有者知道有关队列的所有信息。所有其他非所有者节点只知道队列的元数据和指向该队列存在的按个节点的指针。

内存节点还是磁盘节点:如果集群只有一个磁盘节点,当磁盘节点崩溃的时候,集群仍然可以保持运行,但是直到该节点恢复前,你无法修改任何东西。包括:创建队列,创建交换器,创建绑定,添加用户,更改权限,添加和删除集群节点。,

这么看,磁盘节点存储的是集群的配置信息,所有的配置文件内容。内存节点只保存元数据,也就是当前的信息数据。

所以,集群应该有两个磁盘节点,保证在一个节点不可用时,能在任何时候保存元数据变更。只有一需要所有的磁盘节点同时在线的操作是 添加和删除集群节点。

对于多个磁盘节点的集群,在添加内存节点的 时候,需要告知内存节点,集群中的所有磁盘节点。(内存节点的元数据都保存在内存中,唯一保存到磁盘的信息是 集群中磁盘节点的地址)

声明并使用镜像队列:(全部都是磁盘节点)version 2.7 之前

声明磁盘节点为主节点,其他节点作为从节点加入集群。当有消息入队的时候,在主节点记录主拷贝信息,在所有的从节点记录从拷贝信息。

当把队列声明为镜像队列之后,有新的节点加入集群,新节点不能拥有之前的拷贝信息。从新的节点加入集群开始,之前的节点维护之前的拷贝信息,新的节点开始维护自己的拷贝信息,此时发生了 集群节点之间的拷贝不一致情况。

此时,开启消费者的情况下,消费者会从所有的拷贝信息中,获取消息完成消费。等到消费者将所有的消息消费完成,集群中的所有节点的状态变成一致的。

在主节点宕机的时候,集群会主动推举一个从拷贝时间最长的从节点 为主节点。

在3.7 的版本看到了 rabbitMQ 集群之间的 队列自动同步。舒服了。

镜像队列新功能: 在队列配置为镜像队列,且配置自动同步时,假如 从节点没有启动,集群收到了 消息,当从节点重启之后,会主动同步消息到从节点上,保证消息的一致性。

rabbitmqctl set_policy policy2 "^" '{"ha-mode":"all","ha-sync-mode":"automatic"}'

RabbitMQ 会始终记录以下四种类型的内部元数据

队列元数据----队列名称和属性(是否可持久化,是否自动删除)
交换器元数据---交换器名称、类型、属性(可持久化等)
绑定元数据---一张简单的表格展示如何将消息路由到队列
vhost元数据---为vhost内的队列、交换机和绑定提供命名空间和安全属性

在单一节点上,RabbitMQ 会将所有的信息存储到内存中,同时将那些标记持久化的队列和交换器(以及他们的绑定)存储到硬盘上,存储到硬盘上可以确保队列和交换器在重启RabbitMQ节点后重新创建。

这么看,内存节点的信息队列和交换器,在重启之后,是不能创建的。所以需要先重启磁盘节点。

遗留问题:

队列应该由 生产者还是消费者 声明?
交换器和绑定?
为应用创建合适的 vhost,避免在迁移时,发生默认名称 冲突的问题?
主节点 和 从节点?
主节点 和 从节点?
镜像集群?
关于 消费者取消通知:主备架构中的消费者取消,重新在备机建立队列。
RabbitMQ 需要关心的重点知识?
持久化、异步、queue、交换器、发送方确认模式、管理、虚拟主机、集群结构和搭建

continue…

0 0 vote
Article Rating
Subscribe
提醒
guest
0 评论
Inline Feedbacks
View all comments