Fanout

2019年12道RabbitMQ高频面试题你都会了吗?(含答案解析)

狂风中的少年 提交于 2020-04-27 18:57:32
RabbitMQ 面试题 1、什么是 rabbitmq 2、为什么要使用 rabbitmq 3、使用 rabbitmq 的场景 4、如何确保消息正确地发送至 RabbitMQ? 如何确保消息接收方消费了消息? 5.如何避免消息重复投递或重复消费? 6、消息基于什么传输? 7、消息如何分发? 8、消息怎么路由? 9、如何确保消息不丢失? 10、使用 RabbitMQ 有什么好处? 11、RabbitMQ 的集群 12、mq 的缺点 1、什么是 rabbitmq 采用 AMQP 高级消息队列协议的一种消息队列技术,最大的特点就是消费并不需要确保提供方存在,实现了服务之间的高度解耦 2、为什么要使用 rabbitmq (1)在分布式系统下具备异步,削峰,负载均衡等一系列高级功能; (2)拥有持久化的机制,进程消息,队列中的信息也可以保存下来。 (3)实现消费者和生产者之间的解耦。 (4)对于高并发场景下,利用消息队列可以使得同步访问变为串行访问达到一定量的限流,利于数据库的操作。 (5)可以使用消息队列达到异步下单的效果,排队中,后台进行逻辑下单。 3、使用 rabbitmq 的场景 (1)服务间异步通信 (2)顺序消费 (3)定时任务 (4)请求削峰 4、如何确保消息正确地发送至 RabbitMQ? 如何确保消息接收方消费了消息? 发送方确认模式 将信道设置成 confirm 模式

RabbitMQ消息可靠性分析

血红的双手。 提交于 2020-04-27 02:38:20
原文: RabbitMQ消息可靠性分析 - 简书 有很多人问过我这么一类问题:RabbitMQ如何确保消息可靠?很多时候,笔者的回答都是:说来话长的事情何来长话短说。的确,要确保消息可靠不只是单单几句就能够叙述明白的,包括Kafka也是如此。可靠并不是一个绝对的概念,曾经有人也留言说过类似全部磁盘损毁也会导致消息丢失,笔者戏答:还有机房被炸了也会导致消息丢失。可靠性是一个相对的概念,在条件合理的范围内系统所能确保的多少个9的可靠性。一切尽可能的趋于完美而无法企及于完美。 我们可以尽可能的确保RabbitMQ的消息可靠。在详细论述RabbitMQ的消息可靠性之前,我们先来回顾下消息在RabbitMQ中的经由之路。 如图所示,从AMQP协议层面上来说: 消息先从生产者Producer出发到达交换器Exchange; 交换器Exchange根据路由规则将消息转发对应的队列Queue之上; 消息在队列Queue上进行存储; 消费者Consumer订阅队列Queue并进行消费。 我们对于消息可靠性的分析也从这四个阶段来一一探讨。 Phase 1 消息从生产者发出到达交换器Exchange,在这个过程中可以发生各种情况,生产者客户端发送出去之后可以发生网络丢包、网络故障等造成消息丢失。一般情况下如果不采取措施,生产者无法感知消息是否已经正确无误的发送到交换器中

消息队列探秘 – RabbitMQ 消息队列工作原理

こ雲淡風輕ζ 提交于 2020-04-26 17:41:24
1. 历史 RabbitMQ是一个由erlang开发的AMQP(Advanced Message Queue )的开源实现。AMQP 的出现其实也是应了广大人民群众的需求,虽然在同步消息通讯的世界里有很多公开标准(如 COBAR的 IIOP ,或者是 SOAP 等),但是在异步消息处理中却不是这样,只有大企业有一些商业实现(如微软的 MSMQ ,IBM 的 Websphere MQ 等),因此,在 2006 年的 6 月,Cisco 、Redhat、iMatix 等联合制定了 AMQP 的公开标准。 RabbitMQ是由RabbitMQ Technologies Ltd开发并且提供商业支持的。该公司在2010年4月被SpringSource(VMWare的一个部门)收购。在2013年5月被并入Pivotal。其实VMWare,Pivotal和EMC本质上是一家的。不同的是VMWare是独立上市子公司,而Pivotal是整合了EMC的某些资源,现在并没有上市。 RabbitMQ的官网是http://www.rabbitmq.com 2. 应用场景 言归正传。RabbitMQ,或者说AMQP解决了什么问题,或者说它的应用场景是什么? 对于一个大型的软件系统来说,它会有很多的组件或者说模块或者说子系统或者(subsystem or Component or submodule)

RabbitMQ 消息队列入门

跟風遠走 提交于 2020-04-24 01:37:06
文档 入门 主要的内容: one two three four five six seven 前言 中间件 消息队列 异步处理,注册完发短信 应用解耦,订单接口调用扣库存接口,失败了怎么办? 流量削峰,大量请求到达业务接口,这不行! 日志处理,每个业务代码都调用一下写日志的方法吗?结合AOP思想,业务程序为什么要关心写日志的事情? 消息通讯等,ABC处在聊天室里面,一起聊天?foreach吗? 官网有7个入门教程,过了一遍,做个笔记。 正文 HelloWorld 概述 RabbitMQ,是个消息代理人message broker。它 接收 , 存储 , 转发 消息。 几个常用的术语: 生产者Producer,生产发送消息。 消费者Consumer,接收消息。 队列Queue,只受系统内存和硬盘大小限制。存储消息,生产者往队列里面发送,消费者监听读取。 这几个对象可以分布在不同的机器。 使用Client P和C的角色。maven仓库包为 amqp-client 和 slf4j-nop <dependencies> <!-- https://mvnrepository.com/artifact/com.rabbitmq/amqp-client --> <dependency> <groupId>com.rabbitmq</groupId> <artifactId>amqp-client

SpringBoot之RabbitMQ的使用

江枫思渺然 提交于 2020-04-18 08:47:06
一 、RabbitMQ的介绍 RabbitMQ是消息中间件的一种,消息中间件即分布式系统中完成消息的发送和接收的基础软件,消息中间件的工作过程可以用生产者消费者模型来表示.即,生产者不断的向消息队列发送信息,而消费者从消息队列中消费信息.具体过程如下: 从上图可看出,对于消息队列来说,生产者、消息队列、消费者是最重要的三个概念,生产者发消息到消息队列中去,消费者监听指定的消息队列,并且当消息队列收到消息之后,接收消息队列传来的消息,并且给予相应的处理。消息队列常用于分布式系统之间互相信息的传递。 对于RabbitMQ来说,除了这三个基本模块以外,还添加了一个模块,即交换机(Exchange)。它使得生产者和消息队列之间产生了隔离,生产者将消息发送给交换机,而交换机则根据调度策略把相应的消息转发给对应的消息队列。 交换机的主要作用是接收相应的消息并且绑定到指定的队列。交换机有四种类型,分别为Direct、topic、headers、Fanout。 Direct是RabbitMQ默认的交换机模式,也是最简单的模式。即创建消息队列的时候,指定一个BindingKey。当发送者发送消息的时候,指定对应的Key。当Key和消息队列的BindingKey一致的时候,消息将会被发送到该消息队列中。 topic转发信息主要是依据通配符,队列和交换机的绑定主要是依据一种模式(通配符+字符串)

RabbitMq核心概念和术语

倾然丶 夕夏残阳落幕 提交于 2020-04-18 07:34:14
简介 越来越多的消息中间件很容易让人产生混淆,在学习一种消息中间件的时候,最好先了解他的几种抽象概念,方便你理解,明白了这些概念,你学习起来的时候也就得心应手,同时也是使用好RabbitMQ的基础。 核心概念 Producer Message Consumer AMQP Queue Message acknowledgment Message durability Prefetch count Exchange RoutingKey Binding Binding key Exchange Types <!--more--> AMQP Producer Message Consumer 过于简单,我就不介绍了。AMQP,即Advanced Message Queuing Protocol,高级消息队列协议,是应用层协议的一个开放标准,为面向消息的中间件设计。消息中间件主要用于组件之间的解耦,消息的发送者无需知道消息使用者的存在,反之亦然。 AMQP的主要特征是面向消息、队列、路由(包括点对点和发布/订阅)、可靠性、安全。 RabbitMQ是一个开源的AMQP实现,服务器端用Erlang语言编写。用于在分布式系统中存储转发消息 Message acknowledgment message ackonwledgment 即消息回执,消费者在消费完消息后发送一个回执给rabbitmq

RabbitMQ(一):RabbitMQ快速入门

与世无争的帅哥 提交于 2020-04-18 07:33:51
RabbitMQ是目前非常热门的一款消息中间件,不管是互联网大厂还是中小企业都在大量使用。作为一名合格的开发者,有必要对RabbitMQ有所了解,本文是RabbitMQ快速入门文章,主要内容包括RabbitMQ是什么、RabbitMQ核心概念、常用交换器类型、用Docker安装RabbitMQ等。 RabbitMQ简介 以熟悉的电商场景为例,如果商品服务和订单服务是两个不同的微服务,在下单的过程中订单服务需要调用商品服务进行扣库存操作。按照传统的方式,下单过程要等到调用完毕之后才能返回下单成功,如果网络产生波动等原因使得商品服务扣库存延迟或者失败,会带来较差的用户体验,如果在高并发的场景下,这样的处理显然是不合适的,那怎么进行优化呢?这就需要消息队列登场了。 消息队列提供一个异步通信机制,消息的发送者不必一直等待到消息被成功处理才返回,而是立即返回。消息中间件负责处理网络通信,如果网络连接不可用,消息被暂存于队列当中,当网络畅通的时候在将消息转发给相应的应用程序或者服务,当然前提是这些服务订阅了该队列。如果在商品服务和订单服务之间使用消息中间件,既可以提高并发量,又降低服务之间的耦合度。 RabbitMQ就是这样一款我们苦苦追寻的消息队列。RabbitMQ是一个开源的消息代理的队列服务器,用来通过普通协议在完全不同的应用之间共享数据。 RabbitMQ是使用Erlang语言来编写的

Spring Boot (十三): Spring Boot 整合 RabbitMQ

为君一笑 提交于 2020-04-18 01:40:55
1. 前言 RabbitMQ 是一个消息队列,说到消息队列,大家可能多多少少有听过,它主要的功能是用来实现应用服务的异步与解耦,同时也能起到削峰填谷、消息分发的作用。 消息队列在比较主要的一个作用是用来做应用服务的解耦,消息从消息的生产者传递到消息队列,消费者从消息队列中获取消息并进行消费,生产者不需要管是谁在消费消息,消费者也无需关注消息是由谁来生产的。在分布式的系统中,消息队列也会被用在其他地方,比如分布式事务的支持,代表如阿里开源的 RocketMQ 。 当然,我们本篇文章的主角还是 RabbitMQ 。 2. RabbitMQ 介绍 RabbitMQ 是实现 AMQP(高级消息队列协议)的消息中间件的一种,最初起源于金融系统,用于在分布式系统中存储转发消息,在易用性、扩展性、高可用性等方面表现不俗。 RabbitMQ 主要是为了实现系统之间的双向解耦而实现的。当生产者大量产生数据时,消费者无法快速消费,那么需要一个中间层。保存这个数据。 AMQP,即 Advanced Message Queuing Protocol,高级消息队列协议,是应用层协议的一个开放标准,为面向消息的中间件设计。消息中间件主要用于组件之间的解耦,消息的发送者无需知道消息使用者的存在,反之亦然。AMQP 的主要特征是面向消息、队列、路由(包括点对点和发布/订阅)、可靠性、安全。 RabbitMQ

RabbitMQ与.net core(四) 消息的优先级 与 死信队列

痴心易碎 提交于 2020-04-18 00:06:08
1.消息的优先级 假如现在有个需求,我们需要让一些优先级最高的通知推送到客户端,我们可以使用redis的sortedset,也可以使用我们今天要说的rabbit的消息优先级属性 Producer代码 using RabbitMQ.Client; using System; using System.Collections.Generic; using System.Text; using System.Threading; using System.Threading.Tasks; namespace RabbitMQConsole { class Program { static void Main( string [] args) { ConnectionFactory factory = new ConnectionFactory(); factory.HostName = " 39.**.**.** " ; factory.Port = 5672 ; factory.VirtualHost = " / " ; factory.UserName = " root " ; factory.Password = " root " ; var exchange = " change4 " ; var route = " route2 " ; var queue9 = "

RabbitMQ 如何实现对同一个应用的多个节点进行广播

江枫思渺然 提交于 2020-04-12 19:17:40
1.背景 了解过RabbitMQ的Fanout模式,应该知道它原本的Fanout模式就是用来做广播的。但是它的广播有一点区别,来回顾下它的含义:Fanout类型没有路由键的概念,只要队列绑定到了改exchange上面,就会接收到所有的消息。 使用过程一般就是先new 出一个Fanout类型的交换机,然后往这个交换机上绑定多个队列queue,不同的消费者各自监听不同的队列,这就实现了广播效果,因为同一个消息,会分发到所有队列中。 举个例子: 应用A监听了队列A,应用B监听了队列B,Fanout类型交换机同时绑定了队列A和B.假设生产者端发送了一条消息到Fanout类型交换机,交换机就会把消息分发到所有队列,这时应用A和应用B会收到同一条消息,这就是广播。 说了上面一大堆,只是为了强调,对于RabbitMQ的原本Fanout模式,它的设计就是多个消费者必须监听不同的队列,多个消费者之间才会形成广播关系。 那么问题来了,假如在Fanout工作模式下,多个消费者同时监听的是同一个队列,会怎样?实践过的同学应该都知道,这种情况下,这些消费者会形成竞争关系,现象是同一个消息只会被其中一个消费者接收,达不到广播的效果。。 2.需求 假如现在有一个需求,要做到对同一个应用的多个节点进行广播,怎么实现? 注意,这里所说的同一个应用多个节点,通俗点理解就是一个war包,布在多个服务器节点上。