rabbitmq集群

如何保证消息队列的高可用?

若如初见. 提交于 2020-02-06 19:23:09
面试题 如何保证消息队列的高可用? 面试官心理分析 如果有人问到你 MQ 的知识, 高可用是必问的 。 上一讲 提到,MQ 会导致 系统可用性降低 。所以只要你用了 MQ,接下来问的一些要点肯定就是围绕着 MQ 的那些缺点怎么来解决了。 要是你傻乎乎的就干用了一个 MQ,各种问题从来没考虑过,那你就杯具了,面试官对你的感觉就是,只会简单使用一些技术,没任何思考,马上对你的印象就不太好了。这样的同学招进来要是做个 20k 薪资以内的普通小弟还凑合,要是做薪资 20k+ 的高工,那就惨了,让你设计个系统,里面肯定一堆坑,出了事故公司受损失,团队一起背锅。 面试题剖析 这个问题这么问是很好的,因为不能问你 Kafka 的高可用性怎么保证?ActiveMQ 的高可用性怎么保证?一个面试官要是这么问就显得很没水平,人家可能用的就是 RabbitMQ,没用过 Kafka,你上来问人家 Kafka 干什么?这不是摆明了刁难人么。 所以有水平的面试官,问的是 MQ 的高可用性怎么保证?这样就是你用过哪个 MQ,你就说说你对那个 MQ 的高可用性的理解。 RabbitMQ 的高可用性 RabbitMQ 是比较有代表性的,因为是 基于主从 (非分布式)做高可用性的,我们就以 RabbitMQ 为例子讲解第一种 MQ 的高可用性怎么实现。 RabbitMQ 有三种模式:单机模式、普通集群模式

RabbitMQ 如何保证消息不丢失?

假如想象 提交于 2020-02-04 01:52:32
RabbitMQ一般情况很少丢失,但是不能排除意外,为了保证我们自己系统高可用,我们必须作出更好完善措施,保证系统的稳定性。 下面来介绍下,如何保证消息的绝对不丢失的问题,下面分享的绝对干货,都是在知名互联网产品的产线中使用。 1.消息持久化 2.ACK确认机制 3.设置集群镜像模式 4.消息补偿机制 第一种:消息持久化 RabbitMQ 的消息默认存放在内存上面,如果不特别声明设置,消息不会持久化保存到硬盘上面的,如果节点重启或者意外crash掉,消息就会丢失。 所以就要对消息进行持久化处理。如何持久化,下面具体说明下: 要想做到消息持久化,必须满足以下三个条件,缺一不可。 1) Exchange 设置持久化 2)Queue 设置持久化 3)Message持久化发送:发送消息设置发送模式deliveryMode=2,代表持久化消息 第二种:ACK确认机制 多个消费者同时收取消息,比如消息接收到一半的时候,一个消费者死掉了(逻辑复杂时间太长,超时了或者消费被停机或者网络断开链接),如何保证消息不丢? 这个使用就要使用Message acknowledgment 机制,就是消费端消费完成要通知服务端,服务端才把消息从内存删除。 这样就解决了,及时一个消费者出了问题,没有同步消息给服务端,还有其他的消费端去消费,保证了消息不丢的case。 第三种:设置集群镜像模式

搭建高可用的rabbitmq集群

萝らか妹 提交于 2020-02-01 15:05:52
一、搭建集群各节点 准备五个节点,分别为: 192.168.154.150 192.168.154.151 192.168.154.152 192.168.154.153 192.168.154.155 这里为方便操作,只准备了前三个节点. rabbitmq集群镜像模式构建 1) 停止各节点服务 rabbitmqctl stop 2) 文件同步 选择76、77、78任意一个节点为Master(这里选择76为Master),也就是说我们需要把76的Cookie文件同步到77、78节点上,进入76的/var/lib/rabbitmq目录下,把/var/lib/rabbitmq/.erlang.cookie文件的权限修改为777.然后把.erlang.cookie文件远程复制到其它各个节点.最后把所有cookie文件的权限还原为400即可. scp .erlang.cookie 192.168.154.151:/var/lib/rabbitmq/ 说明:scp 是 linux 系统下基于 ssh 登陆进行安全的远程文件拷贝命令 3) 集群节点启动 rabbitmq-server -detached lsof -i:5672 4) slave节点加入集群中 77节点 rabbitmqctl stop_app rabbitmqctl join_cluster [--ram] dongge02

1、RabbitMQ简介

蓝咒 提交于 2020-02-01 06:03:15
RabbitMQ是实现了高级消息队列协议(AMQP)的开源消息代理软件(亦称面向消息的中间件)。RabbitMQ服务器是用Erlang语言编写的,而集群和故障转移是构建在开放电信平台(OTP)框架上的。所有主要的编程语言均有与代理接口通讯的客户端库。 Erlang(爱浪)特点: 并发性:Erlang支持超大量级的并发进程,并且不需要操作系统具有并发机制; 分布式:一个分布式Erlang系统是多个Erlang节点组成的网络; 健壮性:Erlang具有多种基本的错误检测能力,它们能够用于构建容错系统; 可伸缩性; 教程: RabbitMQ实战指南.pdf 消息丢失 如果应用系统对可靠性要求很高,吞吐量不是很care,那么可以从以下几个方面入手: 1、交换器、队列、消息持久化; 2、消费者设置autoAck=false,手动确认; 3、RabbitMQ的镜像队列机制,Master-Slave高可用,集群都挂掉的可能性比单机挂掉的概率要小很多,几乎不用考虑,理由:RabbitMQ 并不会为每条消息都进行同步存盘(调用内核的 fsync方法)的处理,可能仅仅保存到操作系统缓存之中而不是物理磁盘之中。如果在这段时间内RabbitMQ 服务节点发生了岩机、重启等异常情况,消息保存还没来得及落盘,那么这些消息将会丢失; 4、生产者确认:事务机制、发送方确认机制

RabbitMQ入门介绍以及安装使用

点点圈 提交于 2020-01-30 00:14:28
一、RabbitMQ初识 RabbitMQ是一个实现了高级消息队列协议(AMQP的消息代理(也叫消息中间件),它接受并转发消息。它可以帮你处理一些逻辑的事务,从而进行解耦,比如用户注册落库之后,还需要发送邮件验证、需要发送新人红包等等事情,就可以交给中间件去做。也可以把它当成一个邮局:当你想邮寄信件的时候,你会把信件放在投递箱中,并确信邮递员最终会将信件送到收件人的手里。在这个例子中,RabbitMQ就相当与投递箱、邮局和邮递员。 1.1 AMQP协议 AMQP,即Advanced Message Queuing Protocol,一个提供统一消息服务的应用层标准高级消息队列协议,是应用层协议的一个开放标准,为面向消息的中间件设计。基于此协议的客户端与消息中间件可传递消息,并不受客户端/中间件产品、不同的开发语言等条件的限制。 1.2 典型应用场景 跨系统的异步通信 ,异步、解耦、削峰。 应用内的同步变成异步 秒杀:自己发送给自己 基于Pub/Sub模型实现的事件驱动 ,摒弃ELT(比如全量 同步商户数据); 摒弃API(比如定时增量获取用户、获取产品,变成增量广播)。 利用RabbitMQ实现事务的最终一致性 1.3 RabbitMQ的特性 RabbitMQ使用Erlang语言编写,使用Mnesia数据库存储消息。 可靠性(Reliability) RabbitMQ

RabbitMQ的特点以及搭建

☆樱花仙子☆ 提交于 2020-01-29 08:38:18
一、消息队列中间件简介 消息队列中间件是分布式系统中重要的组件,主要解决应用耦合,异步消息,流量削锋等问题实现高性能,高可用,可伸缩和最终一致性[架构] 使用较多的消息队列有ActiveMQ,RabbitMQ,ZeroMQ,Kafka,MetaMQ,RocketMQ 二、消息队列在实际应用中常用的使用场景 异步处理,应用解耦,流量削锋和消息通讯四个场景 三、什么是RabbitMQ RabbitMQ 是一个由 Erlang 语言开发的 AMQP 的开源实现。 AMQP :Advanced Message Queue,高级消息队列协议。它是应用层协议的一个开放 标准,为面向消息的中间件设计,基于此协议的客户端与消息中间件可传递消息,并不受产品、开发语言等条件的限制。 RabbitMQ 最初起源于金融系统,用于在分布式系统中存储转发消息,在易用性、扩展性、高可用性等方面表现不俗。 四、RabbitMQ的特点 1.可靠性(Reliability) RabbitMQ 使用一些机制来保证可靠性,如持久化、传输确认、发布确认。 2.灵活的路由(Flexible Routing) 在消息进入队列之前,通过 Exchange 来路由消息的。对于典型的路由功能,RabbitMQ已经提供了一些内置的 Exchange 来实现。针对更复杂的路由功能,可以将多个Exchange 绑定在一起

RabbitMQ系列(六)你不知道的RabbitMQ集群架构全解

寵の児 提交于 2020-01-27 17:23:06
前言 本文将系统的介绍一下RabbitMQ集群架构的特点、异常处理、搭建和使用中要注意的一些细节。 知识点 一、为什么使用集群? 二、集群的特点 三、集群异常处理 四、集群节点类型 五、集群搭建方法 六、镜像队列 一、为什么使用集群? 内建集群作为RabbitMQ最优秀的功能之一,它的作用有两个: 允许消费者和生产者在Rabbit节点崩溃的情况下继续运行; 通过增加节点来扩展Rabbit处理更多的消息,承载更多的业务量; 二、集群的特点 RabbitMQ的集群是由多个节点组成的,但我们发现不是每个节点都有所有队列的完全拷贝。 RabbitMQ节点不完全拷贝特性 为什么默认情况下RabbitMQ不将所有队列内容和状态复制到所有节点? 有两个原因: 存储空间——如果每个节点都拥有所有队列的完全拷贝,这样新增节点不但没有新增存储空间,反而增加了更多的冗余数据。 性能——如果消息的发布需安全拷贝到每一个集群节点,那么新增节点对网络和磁盘负载都会有增加,这样违背了建立集群的初衷,新增节点并没有提升处理消息的能力,最多是保持和单节点相同的性能甚至是更糟。 所以其他非所有者节点只知道队列的元数据,和指向该队列节点的指针。 三、集群异常处理 根据节点不无安全拷贝的特性,当集群节点崩溃时,该节点队列和关联的绑定就都丢失了,附加在该队列的消费者丢失了其订阅的信息,那么怎么处理这个问题呢?

Centos7安装RabbitMQ

时光怂恿深爱的人放手 提交于 2020-01-26 21:19:03
一、安装Erlang环境 1、安装 erlang 依赖环境 [root@localhost ~]# yum install -y gcc glibc-devel make ncurses-devel openssl-devel xmlto 2、安装 epel-release [root@localhost ~]# yum install -y epel-release 3、安装 erlang [root@localhost ~]# yum install -y erlang 4、测试 erlang [root@localhost ~]# erl PS:输入 halt(). 退出 erlang 命令行模式 二、安装 RabbitMQ 1、下载 rabbitmq 官网各版本下载地址:http://www.rabbitmq.com/releases/rabbitmq-server/ 这里选择最新的版本v3.6.15,复制下载链接,用 wget 下载 [root@localhost ~]# wget http://www.rabbitmq.com/releases/rabbitmq-server/v3.6.15/rabbitmq-server-3.6.15-1.el7.noarch.rpm 2、安装下载好的 rabbitmq [root@localhost ~]# yum install

Springboot 1.5.x 集成基于Centos7的RabbitMQ集群安装及配置

六月ゝ 毕业季﹏ 提交于 2020-01-25 01:19:27
RabbitMQ简介 RabbitMQ是实现了高级消息队列协议(AMQP)的开源消息代理软件(亦称面向消息的中间件)。 RabbitMQ是一套开源(MPL)的消息队列服务软件,是由LShift提供的一个Advanced Message Queuing Protocol(AMQP)的开源实现,由以高性能、健壮以及可伸缩性出名的Erlang写成。 选择RabbitMQ 市面上有很多MQ可以选择,如:ActiveMQ、ZeroMQ、Apache Qpid及RocketMQ,为什么要选择RabbitMQ呢? 1. 除了Qpid,RabbitMQ是唯一一个实现了AMQP标准的消息服务器; 2. 可靠性,RabbitMQ的持久化支持,保证了消息的稳定性; 3. 高并发,RabbitMQ使用了Erlang开发语言,Erlang是为电话交换机开发的语言,天生自带高并发光环和高可用特性; 4. 集群部署简单,正是应为Erlang使得RabbitMQ集群部署变的超级简单; 5. 社区活跃度高,从网上资料来看,RabbitMQ也是首选 工作机制 1. 消息模型 生产者、消费者和代理 生产者(producer):消息的创建者,负责创建和推送数据到消息服务器; 消费者(consumer):消息的接收方,用于处理数据和确认消息; 代理(proxy):就是RabbitMQ本身,用于扮演“快递”的角色

RabbitMQ核心组件及应用场景

雨燕双飞 提交于 2020-01-24 01:54:03
一、适用场景 1.解耦 2.最终一致性 3.广播 4.错峰与流控(秒杀业务用于流量削峰场景) 秒杀场景 二、核心组件,关键点(交换器、队列、绑定) AMPQ消息路由必要三部分:交换器、队列、绑定。 Java核心组件:ConnectionFactory、Connection、Channel、Delivery、DeliverCallback、CancelCallback 队列 1. 建立连接 ConnectionFactory factory = new ConnectionFactory(); factory.setHost("127.0.0.1"); factory.setPort(5672); factory.setUsername("admin"); factory.setPassword("admin"); Connection connection = factory.newConnection(); Channel channel = connection.createChannel(); 2. 声明队列 如果在同一条信道上订阅了另一个队列,那就不能再声明队列,必须先取消订阅。 Queue.DeclareOk queueDeclare(String queue, boolean durable, boolean exclusive, boolean autoDelete,