[转帖]RabbitMQ高可用性

rabbitmq,高可用性 · 浏览次数 : 0

小编点评

**RabbitMQ 消息应答机制** **概述** RabbitMQ 支持消息应答机制,允许消费者在处理消息的过程中发送应答消息通知 RabbitMQ。当消费者挂掉时,RabbitMQ 会将分发给其他消费者处理。 **机制** 1. 消费者发送一个应答消息给 RabbitMQ,表明该消息已接收并处理完毕。 2. RabbitMQ 删除应答消息并从内存中删除。 3. 如果消费者再次接收到该消息,它将再次发送应答消息给 RabbitMQ。 4. RabbitMQ 将该消息交付给另一个消费者处理。 **优点** * 确保消息不会丢失。 * 允许消费者处理多个消息。 * 提高集群的可靠性和吞吐量。 **缺点** * 消费者需要发送应答消息。 * 如果消费者挂掉,消息可能会丢失。 **集群模式** * RabbitMQ 支持三种集群模式:cluster、federation 和 shovel。 * **集群**模式:集群由多个节点组成,每个节点运行相同的 RabbitMQ 版本。 * **联盟**模式:联盟允许单台服务器上的交换机或队列接收发布到另一台服务器上的交换机或队列的消息。 * **shovel**模式:shovel 与联盟类似,但它比联盟提供更多控制。

正文

RabbitMQ消息应答

执行一个任务可能需要花费几秒钟,你可能会担心如果一个消费者在执行任务过程中挂掉了。一旦RabbitMQ将消息分发给了消费者,就会从内存中删除。在这种情况下,如果正在执行任务的消费者宕机,会丢失正在处理的消息和分发给这个消费者但尚未处理的消息。

但是,我们不想丢失任何任务,如果有一个消费者挂掉了,那么我们应该将分发给它的任务交付给另一个消费者去处理。

为了确保消息不会丢失,RabbitMQ支持消息应答。消费者发送一个消息应答,告诉RabbitMQ这个消息已经接收并且处理完毕了。RabbitMQ就可以删除它了。

如果一个消费者挂掉却没有发送应答,RabbitMQ会理解为这个消息没有处理完全,然后交给另一个消费者去重新处理。这样,你就可以确认即使消费者偶尔挂掉也不会丢失任何消息了。

RabbitMQ集群方案

设计集群的目的:

  1. 允许消费者和生产者在RabbitMQ节点崩溃的情况下继续运行
  2. 通过增加更多的节点来扩展消息通信的吞吐量

RabbitMQ可以通过三种方法来部署分布式集群系统,分别是:cluster(集群),federation(联盟),shovel

集群通过连接多个机器组成单个逻辑中间服务器。机器之间通信要借助于Erlang的消息传输,要求集群中所有节点必须有相同的Erlang cookie;节点之间的网络必须是可靠的,且运行相同版本的RabbitMQ和Erlang。
虚拟主机、交换机、用户信息和权限会自动镜像到集群中各个节点。队列可能位于单个节点或镜像到多个节点。连接到任意节点的客户端能够看到集群中所有队列,即使该队列不位于连接节点上。通常可以使用集群来提高可靠性和吞吐量,前提是在分布同一个区域内的机器,不支持网络分段。

联盟允许单台服务器上的交换机或队列接收发布到另一台服务器上交换机或队列的消息,可以是单独机器或集群。服务器之间通过AMQP协议通信,因此两个联盟交换机或联盟队列要求设置相应的用户权限。
联盟交换机之间由单向点对点链接关联,默认消息只会由联盟链接转发一次,但允许有更复杂的路由拓扑来提高转发次数。消息也可以不进行转发;如果消息到达联盟交换机之后不会路由到队列,那么它再也不会被转发。
联盟队列类似于单向点对点连接,消息会在联盟队列之间转发任意次,直到被消费者接受。
通常使用联盟来连接internet上的中间服务器,用作订阅分发消息或工作队列。

shovel连接方式与联盟的连接方式类似,但它工作在更低层次。shovel接受队列上的消息,转发到另一台服务器上的交换机。
shovel和联盟类似,但它比联盟提供更多控制。

联盟/shovel vs 集群:

1)前者中间服务器逻辑分离,后者组成一个逻辑中间服务器;
2)前者可以运行不同版本RabbitMQ和Erlang,后者要求RabbitMQ和Erlang的版本保持一致;
3)前者可以分布在WAN上,采用AMQP协议通信,要求设置权限,后者必须分布在LAN上,结合Erlang内部节点通信,要求有相同的Erlang cookie;
4)前者的拓扑结构可自行设计,链接可以单向或双向,后者要求节点之间必须保持双向链接;
5)前者遵循CAP理论的可用性和分区容错性,后者遵循CAP理论的一致性和可用性(可选择一致性和分布容错性);
6)前者服务器中的交换机可以选择联盟或本地,后者孤注一掷;
7)前者客户端只能看到所连接服务器上的队列,后者客户端可以看到所有节点的队列。

在容灾与可用性方面,RabbitMQ提供了可持久化的队列。能够在队列服务崩溃的时候,将未处理的消息持久化到磁盘上。为了避免因为发送消息到写入消息之间的延迟导致信息丢失,RabbitMQ引入了Publisher Confirm机制以确保消息被真正地写入到磁盘中。它对Cluster的支持提供了Active/Passive与Active/Active两种模式。例如,在Active/Passive模式下,一旦一个节点失败,Passive节点就会马上被激活,并迅速替代失败的Active节点,承担起消息传递的职责。

这里写图片描述

MQ选择文档

这里写图片描述

参考

http://blog.csdn.net/oMaverick1/article/details/51331004
http://blog.csdn.net/hilyoo/article/details/7704280
http://blog.csdn.net/a491857321/article/details/50670238
http://blog.csdn.net/woogeyu/article/details/51119101
http://blog.csdn.net/cool_sti/article/details/38613917

文章知识点与官方知识档案匹配,可进一步学习相关知识
云原生入门技能树首页概览9032 人正在系统学习中

与[转帖]RabbitMQ高可用性相似的内容:

[转帖]RabbitMQ高可用性

RabbitMQ消息应答 执行一个任务可能需要花费几秒钟,你可能会担心如果一个消费者在执行任务过程中挂掉了。一旦RabbitMQ将消息分发给了消费者,就会从内存中删除。在这种情况下,如果正在执行任务的消费者宕机,会丢失正在处理的消息和分发给这个消费者但尚未处理的消息。 但是,我们不想丢失任何任务,如

[转帖]RabbitMQ服务优化,修改最大连接数

https://www.cnblogs.com/hoyeong/p/16242202.html RabbitMQ的优化RabbitMQ的连接数是压垮消息队列的一个重要的指标。所以在平时使用OpenStack平台的过程中,如果大量的用户同时创建虚拟机,会导致云平台创建报错,其实就是消息队列服务的崩溃。

[转帖]RabbitMQ性能优化

https://www.cnblogs.com/zhengchunyuan/p/9253728.html 修改rabbitmq.config文件 rabbitmq.config文件时rabbitmq的配置文件,他遵守Erlang配置文件定义。 rabbitmq.config文件位置: Unix $R

[转帖]RabbitMQ的Vhost,Exchange,Queue原理分析

RabbitMQ的Vhost,Exchange,Queue原理分析https://www.cnblogs.com/zhengchunyuan/p/9253725.html Vhost分析 RabbitMQ的Vhost主要是用来划分不同业务模块。不同业务模块之间没有信息交互。 Vhost之间相互完全隔

[转帖]RabbitMQ 的重要概念(术语)

Message 消息指的是 RabbitMQ 的队列中保存的数据。 Producer 消息的生产者,即 message publisher(sender),是指负责创建和发送消息的程序。 Vhost RabbitMQ 的虚拟主机,一个 broker 里可以开设多个 vhost,用作不同用户的权限分离

[转帖]RabbitMQ基础概念详细介绍

https://www.jianshu.com/p/e55e971aebd8 AMQP简介 AMQP,即 Advanced Message Queuing Protocol,高级消息队列协议,是应用层协议的一个开放标准,为面向消息的中间件设计。消息中间件主要用于组件之间的解耦和通讯。 AMQP的主要

[转帖]RabbitMQ 死信队列

https://blog.csdn.net/lamp_yang_3533/article/details/111463928 死信交换机 DLX(Dead-Letter-Exchange)可以称之为死信交换机,也称之为死信邮箱。 当消息在一个正常的业务队列中变成死信(dead message)之后,

[转帖]RabbitMQ 如何保证交换机中的消息不丢失

我们知道,生产者会先将消息发送给交换机,但是如果交换机此时没有匹配到相关的队列时,交换机中的消息就会出现丢失的问题。 那么,如何保证交换机中的消息不丢失呢? mandatory 参数 当 basicPublish 方法的 mandatory 参数设为 true 时,如果交换器无法匹配到绑定的队列,那

[转帖]RabbitMQ:Exchange的Fanout类型的介绍和使用

https://blog.csdn.net/weixin_45492007/article/details/106095591 1.声明 当前的内容用于本人学习和使用Fanout类型的Exchange,主要理解其主要作用 2.Fanout Exchange的官方介绍 扇出交换机将消息路由到与其绑定的

[转帖]RabbitMQ 消费者回执和发布确认

为了保证数据安全,消费者和生产者的回执(ack)都是非常重要的。 由于我们无法保证消息都能像我们期望的那样,正常到达另一端或者被 Consumer 消费成功。因此,publisher 和 consumer 都需要一种机制,来确保消息投递成功了和消息消费成功了。 在 AMQP 0-9-1 中,消费者处