该文已加入笔主的开源项目——JavaGuide(一份涵盖大部分Java程序员所须要掌握的核心知识的文档类项目),地址: https://github.com/Snailclimb/JavaGuide 。以为不错的话,记得点个Star。
下面这些问题都是一线大厂的真实面试问题,不管是对你面试仍是说拓宽知识面都颇有帮助。以前发过一篇8 张图读懂大型网站技术架构 能够做为不太了解大型网站系统技术架构朋友的入门文章。html
<!-- MarkdownTOC -->git
<!-- /MarkdownTOC -->面试
如今大公司都在用而且将来的趋势都是 Spring Cloud,而阿里开源的 Spring Cloud Alibaba 也是 Spring Cloud 规范的实现 。spring
咱们一般把 Spring Cloud 理解为一系列开源组件的集合,可是 Spring Cloud并非等同于 Spring Cloud Netflix 的 Ribbon、Feign、Eureka(中止更新)、Hystrix 这一套组件,而是抽象了一套通用的开发模式。它的目的是经过抽象出这套通用的模式,让开发者更快更好地开发业务。可是这套开发模式运行时的实际载体,仍是依赖于 RPC、网关、服务发现、配置管理、限流熔断、分布式链路跟踪等组件的具体实现。数据库
Spring Cloud Alibaba 是官方认证的新一套 Spring Cloud 规范的实现,Spring Cloud Alibaba 是一套国产开源产品集合,后续还会有中文 reference 和一些原理分析文章,因此,这对于国内的开发者是很是棒的一件事。阿里的这一举动势必会推进国内微服务技术的发展,由于在没有 Spring Cloud Alibaba 以前,咱们的第一选择是 Spring Cloud Netflix,可是它们的文档都是英文的,出问题后排查也比较困难, 在国内并非有特别多的人精通。Spring Cloud Alibaba 由阿里开源组件和阿里云产品组件两部分组成,其致力于提供微服务一站式解决方案,方便开发者经过 Spring Cloud 编程模型轻松开发微服务应用。apache
另外,Apache Dubbo Ecosystem 是围绕 Apache Dubbo 打造的微服务生态,是通过生产验证的微服务的最佳实践组合。在阿里巴巴的微服务解决方案中,Dubbo、Nacos 和 Sentinel,以及后续将开源的微服务组件,都是 Dubbo EcoSystem 的一部分。阿里后续也会将 Dubbo EcoSystem 集成到 Spring Cloud 的生态中。编程
具体能够看公众号-阿里巴巴中间件的这篇文章:独家解读:Dubbo Ecosystem - 从微服务框架到微服务生态后端
Dubbo 与 Spring Cloud 并非竞争关系,Dubbo 做为成熟的 RPC 框架,其易用性、扩展性和健壮性已获得业界的承认。将来 Dubbo 将会做为 Spring Cloud Alibaba 的 RPC 组件,并与 Spring Cloud 原生的 Feign 以及 RestTemplate 进行无缝整合,实现“零”成本迁移。
在阿里巴巴的微服务解决方案中,Dubbo、Nacos 和 Sentinel,以及后续将开源的微服务组件,都是 Dubbo EcoSystem 的一部分。咱们后续也会将 Dubbo EcoSystem 集成到 Spring Cloud 的生态中。
性能测试指经过自动化的测试工具模拟多种正常、峰值以及异常负载条件来对系统的各项性能指标进行测试。性能测试是总称,一般细分为:
后端程序员或者测试日常比较经常使用的测试工具是 JMeter(官网:https://jmeter.apache.org/)。Apache JMeter 是一款基于Java的压力测试工具(100%纯Java应用程序),旨在加载测试功能行为和测量性能。它最初被设计用于 Web 应用测试但后来扩展到其余测试领域。
这个时候就要考虑扩容了。《亿级流量网站架构核心技术》这本书上面介绍到咱们能够考虑下面几步来解决这个问题:
对于系统设计,理想的状况下应支持线性扩容和弹性扩容,即在系统瓶颈时,只须要增长机器就能够解决系统瓶颈,如下降延迟提高吞吐量,从而实现扩容需求。
若是你想扩容,则支持水平/垂直伸缩是前提。在进行拆分时,必定要清楚知道本身的目的是什么,拆分后带来的问题如何解决,拆分后若是没有获得任何收益就不要为了
拆而拆,即不要过分拆分,要适合本身的业务。
当MySQL单表记录数过大时,数据库的CRUD性能会明显降低,一些常见的优化措施以下:
下面补充一下数据库分片的两种常见方案:
《大型网站技术架构》第四章和第七章均有提到消息队列对应用性能及扩展性的提高。
如上图,在不使用消息队列服务器的时候,用户的请求数据直接写入数据库,在高并发的状况下数据库压力剧增,使得响应速度变慢。可是在使用消息队列以后,用户的请求数据发送给消息队列以后当即 返回,再由消息队列的消费者进程从消息队列中获取数据,异步写入数据库。因为消息队列服务器处理速度快于数据库(消息队列也比数据库有更好的伸缩性),所以响应速度获得大幅改善。
经过以上分析咱们能够得出消息队列具备很好的削峰做用的功能——即经过异步处理,将短期高并发产生的事务消息存储在消息队列中,从而削平高峰期的并发事务。 举例:在电子商务一些秒杀、促销活动中,合理使用消息队列能够有效抵御促销活动刚开始大量订单涌入对系统的冲击。以下图所示:
由于用户请求数据写入消息队列以后就当即返回给用户了,可是请求数据在后续的业务校验、写数据库等操做中可能失败。所以使用消息队列进行异步处理以后,须要适当修改业务流程进行配合,好比用户在提交订单以后,订单数据写入消息队列,不能当即返回用户订单提交成功,须要在消息队列的订单消费者进程真正处理完该订单以后,甚至出库后,再经过电子邮件或短信通知用户订单成功,以避免交易纠纷。这就相似咱们平时手机订火车票和电影票。
咱们知道模块分布式部署之后聚合方式一般有两种:1.分布式消息队列和2.分布式服务。
先来简单说一下分布式服务:
目前使用比较多的用来构建SOA(Service Oriented Architecture面向服务体系结构)的分布式服务框架是阿里巴巴开源的Dubbo.若是想深刻了解Dubbo的能够看我写的关于Dubbo的这一篇文章:《高性能优秀的服务框架-dubbo介绍》:http://www.javashuo.com/article/p-elojngof-dp.html
再来谈咱们的分布式消息队列:
咱们知道若是模块之间不存在直接调用,那么新增模块或者修改模块就对其余模块影响较小,这样系统的可扩展性无疑更好一些。
咱们最多见的事件驱动架构相似生产者消费者模式,在大型网站中一般用利用消息队列实现事件驱动结构。以下图所示:
消息队列使利用发布-订阅模式工做,消息发送者(生产者)发布消息,一个或多个消息接受者(消费者)订阅消息。 从上图能够看到消息发送者(生产者)和消息接受者(消费者)之间没有直接耦合,消息发送者将消息发送至分布式消息队列即结束对消息的处理,消息接受者从分布式消息队列获取该消息后进行后续处理,并不须要知道该消息从何而来。对新增业务,只要对该类消息感兴趣,便可订阅该消息,对原有系统和业务没有任何影响,从而实现网站业务的可扩展性设计。
消息接受者对消息进行过滤、处理、包装后,构形成一个新的消息类型,将消息继续发送出去,等待其余消息接受者订阅该消息。所以基于事件(消息对象)驱动的业务架构能够是一系列流程。
另外为了不消息队列服务器宕机形成消息丢失,会将成功发送到消息队列的消息存储在消息生产者服务器上,等消息真正被消费者服务器处理后才删除消息。在消息队列服务器宕机后,生产者服务器会选择分布式消息队列服务器集群中的其余服务器发布消息。
备注: 不要认为消息队列只能利用发布-订阅模式工做,只不过在解耦这个特定业务环境下是使用发布-订阅模式的,好比在咱们的ActiveMQ消息队列中还有点对点工做模式,具体的会在后面的文章给你们详细介绍,这一篇文章主要仍是让你们对消息队列有一个更透彻的了解。
这个问题通常会在上一个问题问完以后,紧接着被问到。“使用消息队列会带来什么问题?”这个问题要引发重视,通常咱们都会考虑使用消息队列会带来的好处而忽略它带来的问题!
在理论计算机科学中,CAP定理(CAP theorem),又被称做布鲁尔定理(Brewer's theorem),它指出对于一个分布式计算系统来讲,不可能同时知足如下三点:
CAP仅适用于原子读写的NOSQL场景中,并不适合数据库系统。如今的分布式系统具备更多特性好比扩展性、可用性等等,在进行系统设计和开发时,咱们不该该仅仅局限在CAP问题上。
注意:不是所谓的3选2(不要被网上大多数文章误导了):
大部分人解释这必定律时,经常简单的表述为:“一致性、可用性、分区容忍性三者你只能同时达到其中两个,不可能同时达到”。实际上这是一个很是具备误导性质的说法,并且在CAP理论诞生12年以后,CAP之父也在2012年重写了以前的论文。
当发生网络分区的时候,若是咱们要继续服务,那么强一致性和可用性只能2选1。也就是说当网络分区以后P是前提,决定了P以后才有C和A的选择。也就是说分区容错性(Partition tolerance)咱们是必需要实现的。
我在网上找了不少文章想看一下有没有文章提到这个不是所谓的3选2,用百度半天没找到了一篇,用谷歌搜索找到一篇比较不错的,若是想深刻学习一下CAP就看这篇文章把,我这里就很少BB了:《分布式系统之CAP理论》 : http://www.cnblogs.com/hxsyl/p/4381980.html
BASE 是 Basically Available(基本可用) 、Soft-state(软状态) 和 Eventually Consistent(最终一致性) 三个短语的缩写。BASE理论是对CAP中一致性和可用性权衡的结果,其来源于对大规模互联网系统分布式实践的总结,是基于CAP定理逐步演化而来的,它大大下降了咱们对系统的要求。
BASE理论的核心思想: 即便没法作到强一致性,但每一个应用均可以根据自身业务特色,采用适当的方式来使系统达到最终一致性。也就是牺牲数据的一致性来知足系统的高可用性,系统中一部分数据不可用或者不一致时,仍须要保持系统总体“主要可用”。
BASE理论三要素:
专一Java知识和面试技能分享!我已经整理好了一份Java 学习必备的书籍+视频+文档汇总,内容比较多,你能够在公众号后台回复关键“1”,我会免费无套路把这些都给你。