RabbitMQ

面试题~ 微服务之间如何独立通讯的 ?

﹥>﹥吖頭↗ 提交于 2020-04-20 12:31:02
微服务通信机制 系统中的各个微服务可被独立部署,各个微服务之间是松耦合的。每个微服务仅关注于完成一件任务并很好地完成该任务。 围绕业务能力组织服务、自动化部署、智能端点、对语言及数据的去集中化控制。 将组件定义为可被独立替换和升级的软件单元。 以业务能力为出发点组织服务的策略。 倡导谁开发,谁运营的开发运维一体化方法。 RESTful HTTP协议是微服务架构中最常用的通讯机制。 每个微服务可以考虑选用最佳工具完成(如不同的编程语言)。 允许不同微服务采用不同的数据持久化技术。 微服务非常重视建立架构及业务相关指标的实时监控和日志机制,必须考虑每个服务的失败容错机制。 注重快速更新,因此系统会随时间不断变化及演进。可替代性模块化设计。 微服务通信方式 : 同步 : dobbo通过 RPC 远程过程调用、springcloud通过 REST接口json调用等。 异步 : 消息队列,如:RabbitMq、ActiveMq、Kafka 等。 消息队列中间件如何选型 1.协议:AMQP、STOMP、MQTT、私有协议等。 2.消息是否需要持久化。 3.吞吐量。 4.高可用支持,是否单点。 5.分布式扩展能力。 6.消息堆积能力和重放能力。 7.开发便捷,易于维护。 8.社区成熟度。 来源: oschina 链接: https://my.oschina.net/u/4324904/blog

分布式消息队列应用场景之异步处理、应用解耦、流量削锋和消息通讯理解分析

你说的曾经没有我的故事 提交于 2020-04-20 11:07:37
摘要:消息队列中间件是分布式系统中重要的组件,主要解决应用耦合,异步消息,流量削锋等问题。实现高性能,高可用,可伸缩和最终一致性架构。是大型分布式系统不可缺少的中间件。 目前在生产环境,使用较多的消息队列有ActiveMQ,RabbitMQ,Kafka等。 消息队列应用场景 以下介绍消息队列在实际应用中常用的使用场景。异步处理,应用解耦,流量削锋和消息通讯四个场景。 1.异步处理 场景说明:用户注册后,需要发注册邮件和注册短信。传统的做法有两种1.串行的方式;2.并行方式。 (1)串行方式:将注册信息持久化后,发送注册邮件,再发送注册短信。三个业务全部完成后,返回给客户端。 (2)并行方式:将注册信息持久化后,发送注册邮件的同时,发送注册短信。三个业务全部完成后,返回给客户端。与串行的差别是,并行的方式可以提高处理的时间。 假设三个业务节点每个使用100毫秒钟,不考虑其他开销,则串行方式的时间是300ms,并行的时间可能是200毫秒。则串行的方式1秒内可处理3次请求,并行方式1秒内可处理5次请求,综上所述,传统的方式系统的性能(并发量,吞吐量,响应时间)会有瓶颈。如何解决这个问题呢? 引入消息队列,将不是必须的业务逻辑,异步处理。如下图所示 按照上图,用户的响应时间相当于是注册信息写入数据库的时间和将消息插入消息队列,也就是105毫秒。注册邮件,发送短信消息写入队列后,直接返回

分布式消息队列应用场景之异步处理、应用解耦、流量削锋和消息通讯理解分析

一笑奈何 提交于 2020-04-20 10:51:35
摘要:消息队列中间件是分布式系统中重要的组件,主要解决应用耦合,异步消息,流量削锋等问题。实现高性能,高可用,可伸缩和最终一致性架构。是大型分布式系统不可缺少的中间件。 目前在生产环境,使用较多的消息队列有ActiveMQ,RabbitMQ,Kafka等。 消息队列应用场景 以下介绍消息队列在实际应用中常用的使用场景。异步处理,应用解耦,流量削锋和消息通讯四个场景。 1.异步处理 场景说明:用户注册后,需要发注册邮件和注册短信。传统的做法有两种1.串行的方式;2.并行方式。 (1)串行方式:将注册信息持久化后,发送注册邮件,再发送注册短信。三个业务全部完成后,返回给客户端。 (2)并行方式:将注册信息持久化后,发送注册邮件的同时,发送注册短信。三个业务全部完成后,返回给客户端。与串行的差别是,并行的方式可以提高处理的时间。 假设三个业务节点每个使用100毫秒钟,不考虑其他开销,则串行方式的时间是300ms,并行的时间可能是200毫秒。则串行的方式1秒内可处理3次请求,并行方式1秒内可处理5次请求,综上所述,传统的方式系统的性能(并发量,吞吐量,响应时间)会有瓶颈。如何解决这个问题呢? 引入消息队列,将不是必须的业务逻辑,异步处理。如下图所示 按照上图,用户的响应时间相当于是注册信息写入数据库的时间和将消息插入消息队列,也就是105毫秒。注册邮件,发送短信消息写入队列后,直接返回

RabbitMQ使用教程(四)如何通过持久化保证消息99.99%不丢失?

帅比萌擦擦* 提交于 2020-04-19 06:20:36
1. 前情回顾 RabbitMQ使用教程(一)RabbitMQ环境安装配置及Hello World示例 RabbitMQ使用教程(二)RabbitMQ用户管理,角色管理及权限设置 RabbitMQ使用教程(三)如何保证消息99.99%被发送成功? 在上一篇博客中,我们讲解了如何通过RabbitMQ的生产者确认机制,保证消息尽可能的成功的发送到RabbitMQ服务器,这只是从源头降低了消息丢失的几率,并没有真正解决之前提到的问题: 如何保证RabbitMQ异常情况(人为重启、异常宕机等)下,队列和消息不丢失? 2. 本篇概要 要解决该问题,就要用到RabbitMQ中 持久化 的概念,所谓持久化,就是RabbitMQ会将内存中的数据(Exchange 交换器,Queue 队列,Message 消息)固化到磁盘,以防异常情况发生时,数据丢失。 其中,RabbitMQ的持久化分为三个部分: 交换器(Exchange)的持久化 队列(Queue)的持久化 消息(Message)的持久化 3. 交换器(Exchange)的持久化 在上篇博客中,我们声明Exchange的代码是这样的: private final static String EXCHANGE_NAME = "normal-confirm-exchange"; // 创建一个Exchange channel

2020最新高并发架构消息队列面试题解析(建议收藏)

冷暖自知 提交于 2020-04-18 19:47:47
面试题: 为什么使用消息队列? 消息队列有什么优点和缺点? Kafka、ActiveMQ、RabbitMQ、RocketMQ 都有什么区别,以及适合哪些场景? 面试官心理分析 其实面试官主要是想看看: 第一,你知不知道你们系统里为什么要用消息队列这个东西? 不少候选人,说自己项目里用了 Redis、MQ,但是其实他并不知道自己为什么要用这个东西。 其实说白了,就是为了用而用,或者是别人设计的架构,他从头到尾都没思考过。 没有对自己的架构问过为什么的人,一定是平时没有思考的人,面试官对这类候选人印象通常很不好 因为面试官担心你进了团队之后只会木头木脑的干呆活儿,不会自己思考。 第二,你既然用了消息队列这个东西,你知不知道用了有什么好处&坏处? 你要是没考虑过这个,那你盲目弄个 MQ 进系统里,后面出了问题你是不是就自己溜了给公司留坑? 你要是没考虑过引入一个技术可能存在的弊端和风险,面试官把这类候选人招进来了,基本可能就是挖坑型选手。 就怕你干 1 年挖一堆坑,自己跳槽了,给公司留下无穷后患。 第三,既然你用了 MQ,可能是某一种 MQ,那么你当时做没做过调研? 你别傻乎乎的自己拍脑袋看个人喜好就瞎用了一个 MQ,比如 Kafka,甚至都从没调研过业界流行的 MQ 到底有哪几种。每一个 MQ 的优点和缺点是什么。 每一个 MQ 没有绝对的好坏,但是就是看用在哪个场景可以扬长避短

RabbitMQ和Kafka到底怎么选?

情到浓时终转凉″ 提交于 2020-04-18 11:34:55
前言 开源社区有好多优秀的队列中间件,比如RabbitMQ和Kafka,每个队列都貌似有其特性,在进行工程选择时,往往眼花缭乱,不知所措。对于RabbitMQ和Kafka,到底应该选哪个? RabbitMQ架构 RabbitMQ是一个分布式系统,这里面有几个抽象概念。 broker:每个节点运行的服务程序,功能为维护该节点的队列的增删以及转发队列操作请求。 master queue:每个队列都分为一个主队列和若干个镜像队列。 mirror queue:镜像队列,作为master queue的备份。在master queue所在节点挂掉之后,系统把mirror queue提升为master queue,负责处理客户端队列操作请求。注意,mirror queue只做镜像,设计目的不是为了承担客户端读写压力。 如上图所示,集群中有两个节点,每个节点上有一个broker,每个broker负责本机上队列的维护,并且borker之间可以互相通信。集群中有两个队列A和B,每个队列都分为master queue和mirror queue(备份)。那么队列上的生产消费怎么实现的呢? 队列消费 如上图有两个consumer消费队列A,这两个consumer连在了集群的不同机器上。RabbitMQ集群中的任何一个节点都拥有集群上所有队列的元信息,所以连接到集群中的任何一个节点都可以

RabbitMQ和Kafka到底怎么选?

孤人 提交于 2020-04-18 11:34:37
前言 开源社区有好多优秀的队列中间件,比如RabbitMQ和Kafka,每个队列都貌似有其特性,在进行工程选择时,往往眼花缭乱,不知所措。对于RabbitMQ和Kafka,到底应该选哪个? RabbitMQ架构 RabbitMQ是一个分布式系统,这里面有几个抽象概念。 broker:每个节点运行的服务程序,功能为维护该节点的队列的增删以及转发队列操作请求。 master queue:每个队列都分为一个主队列和若干个镜像队列。 mirror queue:镜像队列,作为master queue的备份。在master queue所在节点挂掉之后,系统把mirror queue提升为master queue,负责处理客户端队列操作请求。注意,mirror queue只做镜像,设计目的不是为了承担客户端读写压力。 如上图所示,集群中有两个节点,每个节点上有一个broker,每个broker负责本机上队列的维护,并且borker之间可以互相通信。集群中有两个队列A和B,每个队列都分为master queue和mirror queue(备份)。那么队列上的生产消费怎么实现的呢? 队列消费 如上图有两个consumer消费队列A,这两个consumer连在了集群的不同机器上。RabbitMQ集群中的任何一个节点都拥有集群上所有队列的元信息,所以连接到集群中的任何一个节点都可以

Spring Cloud第十二篇 | 消息总线Bus

别等时光非礼了梦想. 提交于 2020-04-18 10:08:05
​ ​本文是Spring Cloud专栏的 第十二篇 文章,了解 前十一篇 文章内容有助于更好的理解本文: Spring Cloud第一篇 | Spring Cloud前言及其常用组件介绍概览 Spring Cloud第二篇 | 使用并认识Eureka注册中心 Spring Cloud第三篇 | 搭建高可用Eureka注册中心 Spring Cloud第四篇 | 客户端负载均衡Ribbon Spring Cloud第五篇 | 服务熔断Hystrix Spring Cloud第六篇 | Hystrix仪表盘监控Hystrix Dashboard Spring Cloud第七篇 | 声明式服务调用Feign Spring Cloud第八篇 | Hystrix集群监控Turbin Spring Cloud第九篇 | 分布式服务跟踪Sleuth Spring Cloud第十篇 | 分布式配置中心Config Spring Cloud第十一篇 | 分布式配置中心高可用 ​ 一、前言 由于在没有使用消息总线的时候,我们如果需要修改某个配置,如果涉及修改的微服务节点比较多,我们需要手动的一个节点一个节点的刷新非常麻烦,在微服务架构的系统中,我们通常会使用轻量级的消息代理来构建一个共用的消息主题让系统中所有微服务实例都连接上来,由于该主题中产生的消息会被所有实例监听和消费,所以我们称它为消息总线

RabbitMQ使用教程(五)如何保证队列里的消息99.99%被消费?

喜你入骨 提交于 2020-04-18 08:47:25
1. 前情回顾 RabbitMQ使用教程(一)RabbitMQ环境安装配置及Hello World示例 RabbitMQ使用教程(二)RabbitMQ用户管理,角色管理及权限设置 RabbitMQ使用教程(三)如何保证消息99.99%被发送成功? RabbitMQ使用教程(四)如何通过持久化保证消息99.99%不丢失? 截止目前,我们能够保证消息成功地被生产者发送到RabbitMQ服务器,也能保证RabbitMQ服务器发生异常(重启,宕机等)后消息不会丢失,也许你认为现在消息应该很安全了吧?其实还不够安全,不信你接着往下看。 2. 本篇概要 其实,还有1种场景需要考虑: 当消费者接收到消息后,还没处理完业务逻辑,消费者挂掉了,那消息也算丢失了? ,比如用户下单,订单中心发送了1个消息到RabbitMQ里的队列,积分中心收到这个消息,准备给这个下单的用户增加20积分,但积分还没增加成功呢,积分中心自己挂掉了,导致数据出现问题。 那么如何解决这种问题呢? 为了保证消息被消费者成功的消费,RabbitMQ提供了 消息确认机制(message acknowledgement) ,本文主要讲解RabbitMQ中,如何使用消息确认机制来保证消息被消费者成功的消费,避免因为消费者突然宕机而引起的消息丢失。 3. 开启显式Ack模式 在第1篇博客 RabbitMQ使用教程(一

一起来学Spring Cloud | 第八章:消息总线(Spring Cloud Bus)

守給你的承諾、 提交于 2020-04-18 08:24:21
上一章节,我们讲解了分布式配置中心spring cloud config,我们把配置项存放在git或者本地,当我们修改配置时,需要重新启动服务才能生效。但是在生产上,一个服务部署了多台机器,重新启动比较麻烦且会短暂影响用户体验。spring cloud生态在发展,肯定有对应的解决之法,接下来将要讲解的Spring Cloud Bus就是为了解决这一难题而存在的。 Spring Cloud Bus(消息总线)通过一个轻量级的消息中间件可以连接分布式系统中的各个节点。使用该总线来广播某些状态的改变(比如配置信息发生变更)或其他管理指令。可以说,消息总线是spring boot应用扩展“道路”上的推进器,而且也把它用来作应用间相互通信的消息管道。 一、项目搭建: 1. 环境准备 本章还是基于上一章来实现的,上一章讲解了git和本地配置两种方式,配置刷新原理都是一样的,这次我们只讲git配置修改后进行刷新。 上一章节内容可以参考: 一起来学Spring Cloud | 第七章:分布式配置中心(Spring Cloud Config) 2. 修改config-client 上一章节springcloud-feign-client模块充当着我们的config-client功能,所以在springcloud-feign-client模块的pom.xml文件中加上依赖spring-cloud