《2022年Java面试宝典.docx》由会员分享,可在线阅读,更多相关《2022年Java面试宝典.docx(26页珍藏版)》请在淘文阁 - 分享文档赚钱的网站上搜索。
1、2022年Java面试宝典(一)一、基础篇1、Java静态变量和成员变量的区别。【仅供参考】public class Demo /* 静态变量:又称类变量,static修饰* /public static String STATIC_VARIABLE = 静态变量;/* 实例变量:又称成员变量,没有static修饰* /public String INSTANCE_VARIABLE =实例变量;成员变量存在于堆内存中。静态变量存在于方法区中。成员变量与对象共存亡,随着对象创建而存在,随着对象被回收而释放。静态 变量与类共存亡,随着类的加载而存在,随着类的消失而消失。成员变量所属于对象,所以也称
2、为实例变量。静态变量所属于类,所以也称为 类变量。成员变量只能被对象所调用。静态变量可以被对象调用,也可以被类名调用。2、new String (dabin)会创建几个对象?【仅供参考】使用这种方式会创建两个字符串对象(前提是字符串常量池中没有dabin这 个字符串对象)。dabin属于字符串字面量,因此编译时期会在字符串常量池中创建一个字符 串对象,指向这个dabin字符串字面量;使用new的方式会在堆中创建一个字符串对象。什么是字符串常量池?字符串常量池(String Pool)保存着所有字符串字面量,这些字面量在编译时 期就确定。字符串常量池位于堆内存中,专门用来存储字符串常量。在创建字
3、 符串时,JVM首先会检查字符串常量池,如果该字符串已经存在池中,则返回 其引用,如果不存在,则创建此字符串并放入池中,并返回其引用。【仅供参考】Executors 为 Executor, ExecutorService, ScheduledExecutorService, ThreadFactory 和 Callable类提供了一些工具方法。Executors可以用于方便的创建线程池7、Java线程数过多会造成什么异常?【仅供参考】(1)线程的生命周期开销非常高(2)消耗过多的CPU资源如果可运行的线程数量多于可用处理器的数量,那么有线程将会被闲置。大量 空闲的线程会占用许多内存,给垃圾回收
4、器带来压力,而且大量的线程在竞争 CPU资源时还将产生其他性能的开销。(3)降低稳定性JVM在可创建线程的数量上存在一个限制,这个限制值将随着平台的不同而不 同,并且承受着多个因素制约,包括JVM的启动参数、Thread构造函数中请 求栈的大小,以及底层操作系统对线程的限制等。如果破坏了这些限制,那么 可能抛出Ou t Of Memory Er ror异常。8、线程和进程的区别?【仅供参考】一个程序下至少有一个进程,一个进程下至少有一个线程,一个进程下也可以 有多个线程来增加程序的执行速度。9、多线程同步有哪几种方法?【仅供参考】Synchronized关键字,Lock锁实现,分布式锁等。10
5、、Java反射API有几类?【仅供参考】反射API用来生成JVM中的类、接口或则对象的信息。(DClass类:反射的核心类,可以获取类的属性,方法等信息。(2)Field类:Java. lang. reflec包中的类,表示类的成员变量,可以用来获 取和设置类之中的属性值。(3)Method类:Java. lang, reflec包中的类,表示类的方法,它可以用来获取 类中的方法信息或者执行方法。(4)Constructor类:Java. lang, reflec包中的类,表示类的构造方法。11、反射机制所需的类包?【仅供参考】反射机制所需的类主要有java, lang包中的Class类和ja
6、va. lang, reflect包 中的 Constructor 类、Field 类、Method 类和 Parameter 类。Class 类是一个 比较特殊的类,它是反射机制的基础,Class类的对象表示正在运行的Java程 序中的类或接口,也就是任何一个类被加载时,即将类的.class文件(字节码 文件)读入内存的同时,都自动为之创建一个java. lang. Class对象。Class 类没有公共构造方法,其对象是JVM在加载类时通过调用类加载器中的 defineClass ()方法创建的,因此不能显式地创建一个Class对象。通过这个 Class对象,才可以获得该对象的其他信息。1
7、2、java反射的作用是什么?【仅供参考】反射机制是在运行时,对于任意一个类,都能够知道这个类的所有属性和方 法;对于任意个对象,都能够调用它的任意一个方法。在java中,只要给定类 的名字,就可以通过反射机制来获得类的所有信息。这种动态获取的信息以及 动态调用对象的方法的功能称为java语言的反射机制。13、什么是装饰器模式?【仅供参考】装饰器模式是指动态地给一个对象增加一些额外的功能,同时又不改变其结 构。优点:装饰类和被装饰类可以独立发展,不会相互耦合,装饰模式是继承的一 个替代模式,装饰模式可以动态扩展一个实现类的功能。装饰器模式的关键:装饰器中使用了被装饰的对象。比如,创建一个对象“
8、laowang”,给对象添加不同的装饰,穿上夹克、戴上帽 子,这个执行过程就是装饰者模式,实现代码如下。14、除了单例模式,你在生产环境中还用过什么设计模式?【仅供参考】这需要根据你的经验来回答。一般情况下,你可以说依赖注入,工厂模式,装 饰模式或者观察者模式,随意选择你使用过的一种即可。不过你要准备回答接 下的基于你选择的模式的问题。15、什么是观察者模式?【仅供参考】观察者模式是定义对象间的一种一对多依赖关系,使得每当一个对象状态发生 改变时,其相关依赖对象皆得到通知并被自动更新。观察者模式又叫做发布- 订阅(Pub 1 ish/Subscribe)模式、模型-视图(Model/View)
9、模式、源-监听 器(Source/Listener)模式或从属者(Dependents)模式。优点: 观察者模式可以实现表示层和数据逻辑层的分离,并定义了稳定的消息更新传 递机制,抽象了更新接口,使得可以有各种各样不同的表示层作为具体观察者 角色;观察者模式在观察目标和观察者之间建立一个抽象的耦合; 观察者模式支持广播通信;观察者模式符合开闭原则(对拓展开放,对修改关闭)的要求。缺点:如果一个观察目标对象有很多直接和间接的观察者的话,将所有的观察者都通 知到会花费很多时间;如果在观察者和观察R标之间有循环依赖的话,观察R标会触发它们之间进行 循环调用,可能导致系统崩溃;观察者模式没有相应的机制
10、让观察者知道所观察的目标对象是怎么发生变化 的,而仅仅只是知道观察目标发生了变化。在观察者模式中有如下角色:Subject:抽象主题(抽象被观察者),抽象主题角色把所有观察者对象保存在 一个集合里,每个主题都可以有任意数量的观察者,抽象主题提供一个接口, 可以增加和删除观察者对象;ConcreteSubject:具体主题(具体被观察者),该角色将有关状态存入具体观 察者对象,在具体主题的内部状态发生改变时,给所有注册过的观察者发送通 知;Observer:抽象观察者,是观察者者的抽象类,它定义了一个更新接口,使得 在得到主题更改通知时更新自己;ConcrereObserver:具体观察者,实现
11、抽象观察者定义的更新接口,以便在得 到主题更改通知时更新自身的状态。16、Java中什么叫单例设计模式?请用Java写出线程安全的单例模式【仅供参考】单例模式重点在于在整个系统上共享一些创建时较耗资源的对象。整个应用中 只维护一个特定类实例,它被所有组件共同使用。Java. lang. Runtime是单例 模式的经典例子。从Java5开始你可以使用枚举(enum)来实现线程安全的单 例。17、什么是里氏替换原则?【仅供参考】1、开闭原则(Open Close Principle)开闭原则就是说对扩展开放,对修改关闭。在程序需要进行拓展的时候, 不能去修改原有的代码,实现一个热插拔的效果。所以
12、一句话概括就是:为了 使程序的扩展性好,易于维护和升级。想要达到这样的效果,我们需要使用接 口和抽象类,后面的具体设计中我们会提到这点。2、里氏代换原则(Liskov Substitution Principle)里氏代换原则(Liskov Substitution Principle LSP)面向对象设计的基本 原则之一。里氏代换原则中说,任何基类可以出现的地方,子类一定可以出 现。LSP是继承复用的基石,只有当衍生类可以替换掉基类,软件单位的功能 不受到影响时,基类才能真正被复用,而衍生类也能够在基类的基础上增加新 的行为。里氏代换原则是对“开-闭”原则的补充。实现“开-闭”原则的关键 步
13、骤就是抽象化。而基类与子类的继承关系就是抽象化的具体实现,所以里氏 代换原则是对实现抽象化的具体步骤的规范。一一From Baidu百科3、依赖倒转原则(Dependence Inversion Principle)这个是开闭原则的基础,具体内容:真对接口编程,依赖于抽象而不依赖 于具体。4、接口隔离原则(Interface Segregation Principle)这个原则的意思是:使用多个隔离的接口,比使用单个接口要好。还是一 个降低类之间的耦合度的意思,从这儿我们看出,其实设计模式就是一个软件 的设计思想,从大型软件架构出发,为了升级和维护方便。所以上文中多次出 现:降低依赖,降低耦合
14、。5、迪米特法则(最少知道原则)(Demeter Principle)为什么叫最少知道原则,就是说:一个实体应当尽量少的与其他实体之间 发生相互作用,使得系统功能模块相对独立。6、合成复用原则(Composite Reuse Principle)原则是尽量使用合成/聚合的方式,而不是使用继承18、举例说明什么情况下会更倾向于使用抽象类而不是接口?【仅供参考】接口和抽象类都遵循”面向接口而不是实现编码”设计原则,它可以增加代码 的灵活性,可以适应不断变化的需求。下面有几个点可以帮助你回答这个问 题:在Java中,你只能继承一个类,但可以实现多个接口。所以一旦你继承 了一个类,你就失去了继承其他类
15、的机会了。接口通常被用来表示附属描述或行为如:Runnablen Clonable Serial izable 等等,因此当你使用抽象类来表示行为时,你的类就不能同时是Runnable和Clonable(注: 这里的意思是指如果把Runnable等实现为抽象类的情况),因为在Java中你 不能继承两个类,但当你使用接口时,你的类就可以同时拥有多个不同的行 为。在一些对时间要求比较高的应用中,倾向于使用抽象类,它会比接口稍快一点。如果希望把一系列行为都规范在类继承层次内,并且可以更好地 在同一个地方进行编码,那么抽象类是一个更好的选择。有时,接口和抽象类 可以一起使用,接口中定义函数,而在抽象类
16、中定义默认的实现。19、说一下类装载的执行过程?【仅供参考】类装载分为以下5个步骤:加载:根据查找路径找到相应的class文件然后导入;检查:检查加载的class文件的正确性;准备:给类中的静态变量分配内存空间;解析:虚拟机将常量池中的符号引用替换成直接引用的过程。符号引用就理解 为一个标示,而在直接引用直接指向内存中的地址;初始化:对静态变量和静态代码块执行初始化工作。20、说一下JVM有哪些垃圾回收算法?【仅供参考】标记-清除算法:标记无用对象,然后进行清除回收。缺点:效率不高,无法清 除垃圾碎片。标记-整理算法:标记无用对象,让所有存活的对象都向一端移动,然后直接清 除掉端边界以外的内存
17、。复制算法:按照容量划分二个大小相等的内存区域,当一块用完的时候将活着 的对象复制到另一块上,然后再把已使用的内存空间一次清理掉。缺点:内存 使用率不高,只有原来的一半。分代算法:根据对象存活周期的不同将内存划分为几块,一般是新生代和老年 代,新生代基本采用复制算法,老年代采用标记整理算法。三 、 Java Web/Spring/Spring MVC/Hibernate/MyBatis/SpringBoot/Spring Cloud1、http响应码301和302代表的是什么?有什么区别? 【仅供参考】301:永久重定向。302:暂时重定向。它们的区别是,301对搜索引擎优化(SE0)更加有利
18、;302有被提示为网络拦 截的风险。2、说一下JS0NP实现原理?【仅供参考】jsonp: JSON with Padding,它是利用script标签的src连接可以访问不同 源的特性,加载远程返回的“JS函数”来执行的。3、解释一下什么是aop?【仅供参考】aop是面向切面编程,通过预编译方式和运行期动态代理实现程序功能的统一 维护的一种技术。简单来说就是统一处理某一 “切面”(类)的问题的编程思想,比如统一处理 日志、异常等。4、spring常用的注入方式有哪些?【仅供参考】setter属性注入构造方法注入 注解方式注入5、说一下spring的事务隔离?【仅供参考】spring有五大隔离
19、级别,默认值为IS0LAT10N_DEFAULT (使用数据库的设 置),其他四个隔离级别和数据库的隔离级别一致:ISOLATION_DEFAULT:用底层数据库的设置隔离级别,数据库设置的是什么我就 用什么;ISOLATIONREADUNCOMMITTED:未提交读,最低隔离级别、事务未提交前,就可 被其他事务读取(会出现幻读、脏读、不可重复读); 1SOLAT1ONREADCOMM1TTED:提交读,一个事务提交后才能被其他事务读取到(会造成幻读、不可重复读),SQL server的默认级别;I SOL AT IONREPE AT ABLERE AD :可重复读,保证多次读取同一个数据时,
20、其值都和 事务开始时候的内容是一致,禁止读取到别的事务未提交的数据(会造成幻 读),MySQL的默认级别;ISOLATION_SERIALIZABLE:序列化,代价最高最可靠的隔离级别,该隔离级别 能防止脏读、不可重复读、幻读。脏读:表示一个事务能够读取另一个事务中还未提交的数据。比如,某个 事务尝试插入记录A,此时该事务还未提交,然后另一个事务尝试读取到了记 录Ao不可重复读:是指在一个事务内,多次读同一数据。幻读:指同一个事务内多次查询返回的结果集不一样。比如同一个事务A 第一次查询时候有n条记录,但是第二次同等条件下查询却有n+1条记录, 这就好像产生了幻觉。发生幻读的原因也是另外一个事
21、务新增或者删除或者修 改了第一个事务结果集里面的数据,同一个记录的数据内容被修改了,所有数 据行的记录就变多或者变少了。6、spring中的bean是线程安全的吗?【仅供参考】spring中的bean默认是单例模式,spring框架并没有对单例bean进行多 线程的封装处理。实际上大部分时候spring bean无状态的(比如dao类),所有某种程度上来 说bean也是安全的,但如果bean有状态的话(比如view model对象),那 就要开发者自己去保证线程安全了,最简单的就是改变bean的作用域,把 “singleton”变更为 prototype,这样请求 bean 相当于 new B
22、ean() T, 所以就可以保证线程安全了。有状态就是有数据存储功能。无状态就是不会保存数据。7、处理器映射器HandlerMapping作用?【仅供参考】根据请求的url查找HandlerHandlerMapping负责根据用户请求找到Handler即处理器,springmvc提供了 不同的映射器实现不同的映射方式,例如:配置文件方式,实现接口方式,注 解方式等。8、spring支持几种bean的作用域?【仅供参考】spring支持5种作用域,如下:singleton: spring ioc容器中只存在一个bean实例,bean以单例模式存 在,是系统默认值;prototype:每次从容器调
23、用bean时都会创建一个新的示例,既每次 getBean()相当于执行new Bean ()操作; Web环境下的作用域:request:每次http请求都会创建一个bean;session:同一个 http session 共享一个 bean 实例;global-session:用于portlet容器,因为每个portlet有单独的session, globalsession 提供一个全局性的 http session。注意:使用prototype作用域需要慎重的思考,因为频繁创建和销毁 bean会带来很大的性能开销。9、Spring Boot中的监视器是什么?【仅供参考】Spring bo
24、ot actuator是spring启动框架中的重要功能之一。Spring boot监 视器可帮助您访问生产环境中正在运行的应用程序的当前状态。有几个指标必须在生产环境中进行检查和监控。即使一些外部应用程序可能正 在使用这些服务来向相关人员触发警报消息。监视器模块公开了一组可直接作 为HTTP URL访问的REST端点来检查状态。10、什么是 spring boot?【仅供参考】spring boot是为spring服务的,是用来简化新spring应用的初始搭建以 及开发过程的。11、spring boot配置文件有哪几种类型?它们有什么区别?【仅供参考】配置文件有.properties格式和
25、.yml格式,它们主要的区别是书法风格不 同。.properties配置如下:spring. RabbitMQ. port=5672.yml配置如下:spring:RabbitMQ:port: 5672yml格式不支持PropertySource注解导入。12、如何在Spring Boot中添加通用的JS代码?【仅供参考】在源文件夹下,创建一个名为static的文件夹。然后,你可以把你的静态的 内容放在这里面。例如,myapp. js 的路径是 resourcesstaticjsmyapp. js13、开启Spring Boot特性有哪几种方式?【仅供参考】1)继承 spring-boot-s
26、tarter-parent 项目2)导入 spring-boot-dependencies 项目依赖14、你能否举一个以Readonly为事务管理的例子?【仅供参考】当你从数据库读取内容的时候,你想把事物中的用户描述或者是其它描述设置 为只读模式,以便于Hebernate不需要再次检查实体的变化。这是非常高效 的。15、Spring Boot、Spring MVC 和 Spring 有什么区别?【仅供参考】Spring:Spring最重要的特征是依赖注入。所有SpringModules不是依赖注入就是I0C控制反转。当我们恰当的使用DI或者是I0C的时候,我们可以开发松耦合应用。松耦合 应用的
27、单元测试可以很容易的进行。Spring MVC:Spring MVC提供了一种分离式的方法来开发Web应用。通过运用像DispatcherServelet, MoudlAndView 和 ViewResolver 等一些简单的概念,开 发Web应用将会变的非常简单。SpringBoot:Spring和SpringMVC的问题在于需要配置大量的参数。Spring Boot通过一个自动配置和启动的项来目解决这个问题。为了更快的构 建产品就绪应用程序,Spring Boot提供了一些非功能性特征。16、spring boot有哪些方式可以实现热部署?【仅供参考】使用devtools启动热部署,添加d
28、evtools库,在配置文件中把spring.dev too Is. restart, enabled 设置为 true;使用Intellij Idea编辑器,勾上自动编译或手动重新编译。17、Spring Boot支持哪些日志框架?推荐和默认的日志框架是哪个?【仅供参考】Spring Boot 支持 Java Util Logging, Log4j2, Lockback 作为日志框架,如 果你使用Starters启动器,Spring Boot将使用Logback作为默认日志框 架.18、MyBatis如何编写一个自定义插件?【仅供参考】自定义插件实现原理MyBatis 自定义插件针对 MyB
29、atis 四大对象(Executor StatementHandlerParamo terHand 1 er ResultSctHandler)进行拦截:Executor:拦截内部执行器,它负责调用StatementHandler操作数据库,并 把结果集通过ResultSetHandler进行自动映射,另外它还处理了二级缓存的 操作;StatementHandler:拦截SQL语法构建的处理,它是MyBatis直接和数据库 执行SQL脚本的对象,另外它也实现了 MyBatis的一级缓存;ParameterHand 1 er:拦截参数的处理;ResultSetHandler:拦截结果集的处理。自
30、定义插件实现关键MyBatis插件要实现Interceptor接口,接口包含的方法,如下:public interfaceinterceptorObject intercept(Invocation invocation)throws Throwable;Object plugin(Object target);voidsetProperties(Properties properties);)setProperties方法是在MyBatis进行配置插件的时候可以配置自定义相关属 性,即:接口实现对象的参数配置;plugin方法是插件用于封装目标对象的,通过该方法我们可以返回目标对象本 身,也
31、可以返回一个它的代理,可以决定是否要进行拦截进而决定要返回一个 什么样的目标对象,官方提供了示例:return Plugin, wrap (target, this); intercept方法就是要进行拦截的时候要执行的方法。自定义插件实现示例官方插件实现:Intercepts(Signature(type = Executor, class, method= query”, args = MappcdStatemcnt. class, Object, class, RowBounds.class, Resultllandler. class)publicclassTestIntercepto
32、rimplementsTnterceptor3、String类可以继承吗? 【仅供参考】不行。String类使用final修饰,无法被继承。4、如何实现对象克隆?【仅供参考】实现Cloneable接口并重写Object类中的clone()方法。实现Serializable接口,通过对象的序列化和反序列化实现克隆,可以实现 真正的深度克隆。5、String是Java基本数据类型吗?【仅供参考】不是。Java中的基本数据类型只有8个:byte、short、int、long、float double char a boolean;除了基本类型(primitive type),剩下的都是引用 类型(r
33、eference type)。基本数据类型:数据直接存储在栈上引用数据类型区别:数据存储在堆上,栈上只存储引用地址6、String s = xyz”和 String s = new String (xyz”)区别?【仅供参考】两个语句都会先去字符串常量池中检查是否已经存在“xyz”,如果有则直接 使用,如果没有则会在常量池中创建“xyz”对象。另外,String s = new String(xyz)还会通过 new String()在堆里创建一 个内容与xyz相同的对象实例。所以前者其实理解为被后者的所包含。7、那为什么String要设计成不可变的?【仅供参考】主要有以下几点原因:线程安全。
34、同一个字符串实例可以被多个线程共享,因为字符串不可变,本身 就是线程安全的。支持hash映射和缓存。因为String的hash值经常会使用到,比如作为Map 的键,不可变的特性使得hash值也不会变,不需要重新计算。出于安全考虑。网络地址URL、文件路径path、密码通常情况下都是以String 类型保存,假若String不是固定不变的,将会引起各种安全隐患。比如将密码 用String的类型保存,那么它将一直留在内存中,直到垃圾收集器把它清除。public Object intercept(Invocation invocation)throws Throwable Object target
35、 = invocation Method method = invocation Object args = invocation / do something Object result = invocation / do something return result;Object target = invocation Method method = invocation Object args = invocation / do something Object result = invocation / do something return result;getTargetO ;
36、被代理对象 gelMethodO ; /代理方法 getArgsO ; 方法参数方法拦截前执行代码块 proceed ();.方法拦截后执行代码块public Object plugin(Object target) return Plugin, wrap(target, this);) 19、为什么要使用hibernate?【仅供参考】hibernate是对jdbc的封装,大大简化了数据访问层的繁琐的重复性代码。hibernate是一个优秀的ORM实现,很多程度上简化了 DAO层的编码功能。 可以很方便的进行数据库的移植工作。提供了缓存机制,是程序执行更改的高效。20、MyBatis有几种分
37、页方式?【仅供参考】分页方式:逻辑分页和物理分页。逻辑分页:使用MyBatis自带的RowBounds进行分页,它是一次性查询 很多数据,然后在数据中再进行检索。物理分页:自己手写SQL分页或使用分页插件PageHelper,去数据库查 询指定条数的分页数据的形式。四、Redi s/Rabb i tMQ/Kafka/Zookeeper1、要保证消息持久化成功的条件有哪些?【仅供参考】声明队列必须设置持久化durable设置为true.消息推送投递模式必须设置持久化,deliveryMode设置为2 (持久)。消息已经到达持久化交换器。消息已经到达持久化队列。以上四个条件都满足才能保证消息持久化
38、成功。2、RabbitMQ的使用场景有哪些?【仅供参考】抢购活动,削峰填谷,防止系统崩塌。延迟信息处理,比如10分钟之后给下单未付款的用户发送邮件提醒。解耦系统,对于新增的功能可以单独写模块扩展,比如用户确认评价之后,新 增了给用户返积分的功能,这个时候不用在业务代码里添加新增积分的功能, 只需要把新增积分的接口订阅确认评价的消息队列即可,后面再添加任何功能 只需要订阅对应的消息队列即可。3、RabbitMQ中vhost的作用是什么?【仅供参考】vhost:每个RabbitMQ都能创建很多vhost,我们称之为虚拟主机,每个虚拟 主机其实都是mini版的RabbitMQ,它拥有自己的队列,交换
39、器和绑定,拥有 自己的权限机制。4、RabbitMQ集群有什么用?【仅供参考】集群主要有以下两个用途:高可用:某个服务器出现问题,整个RabbitMQ还可以继续使用; 高容量:集群可以承载更多的消息量。5、RabbitMQ有哪些重要的组件?【仅供参考】ConnectionFactory (连接管理器):应用程序与Rabbit之间建立连接的管理 器,程序代码中使用。Channel (信道):消息推送使用的通道。Exchange (交换器):用于接受、分配消息。Queue (队列):用于存储生产者的消息。RoutingKcy (路由键):用于把生成者的数据分配到交换器上。BindingKey (绑
40、定键):用于把交换器的消息绑定到队列上。6、RabbitMQ怎么实现延迟消息队列?【仅供参考】延迟队列的实现有两种方式:通过消息过期后进入死信交换器,再由交换器转发到延迟消费队列,实现延迟 功能;使用 RabbitMQ-delayed-message-exchange 插件实现延迟功能。7、什么情况下一个broker会从isr中踢出去?【仅供参考】leader会维护一个与其基本保持同步的Replica列表,该列表称为TSR(in- sync Replica),每个Partition都会有一个ISR,而且是由leader动态维 护,如果一个follower比一个leader落后太多,或者超过一定
41、时间未发起数 据复制请求,则leader将其重ISR中移除。8、当你使用kafka-topics. sh创建(删除)了一个topic之后,Kafka背后会执 行什么逻辑?【仅供参考】1)会在zookeeper中的/brokers/topics节点下创建一个新的topic节点, 如:/brokers/topics/first2)触发Controller的监听程序3)kafka Controller 负责 topic 的创建工作,并更新 metadata cache9、Kafka消息重复消费和消息丢包的解决办法?【仅供参考】消费者(offset手动提交,业务逻辑成功处理后,提交offset) 保证
42、不重复消费:落表(主键或者唯一索引的方式,避免重复数据) 业务逻辑处理(选择唯一主键存储到Redis或者mongdb中,先查询是否存在, 若存在则不处理;若不存在,先插入Redis或Mongdb,再进行业务逻辑处理) 自主维护offset判断不存在才插入值 采用kafka分区策略第一种分区策略:给定了分区号,直接将数据发送到指定的分区里面去 第二种分区策略:没有给定分区号,给定数据的key值,通过key取上 hashCode进行分区第三种分区策略:既没有给定分区号,也没有给定key值,直接轮循进行分区 第四种分区策略:自定义分区详细配置:Flume 1. 9. 0 User Guide - A
43、pache FlumeKafka如何体现消息有序性的每个分区内,每条消息都有一个。ffset,故只 能保证分区内有序。如果为了保证topic整个有序,那么将partition调整为 1.10、kafka的高可用机制是什么?【仅供参考】这个问题比较系统,答出kafka的系统特点,leader和follower的关系, 消息读写的顺序即可。11、kafka可以脱离zookeeper单独使用吗?为什么?【仅供参考】kafka不能脱离zookeeper单独使用,因为kafka使用zookeeper管理和协 调kafka的节点服务器。12、kafka有几种数据保留的策略?【仅供参考】kafka有两种数据
44、保存策略:按照过期时间保留和按照存储的消息大小保留。13、Kafka消息数据积压,消费能力不足怎么处理?【仅供参考】1)可以考虑增加Topic的分区数,并且同时提升消费组的消费者数量,消费者 数二分区数。(两者缺一不可)2)如果是下游的数据处理不及时:提高每批次拉取的数量。批次拉取数据过少 (拉取数据/处理时间生产速度),使处理的数据小于生产的数据,也会造成数 据积压。14、集群中为什么要有主节点?【仅供参考】在分布式环境中,有些业务逻辑只需要集群中的某一台机器进行执行,其他的 机器可以共享这个结果,这样可以大大减少重复计算,提高性能,所以就需要 主节点。15、kafka分布式(不是单机)的情
45、况下,如何保证消息的顺序消费?【仅供参考】Kafka 分布式的单位是 partition,同一个 partition 用一个 write ahead log 组织,所以可以保证FIFO的顺序。不同partition之间不能保证顺序。但是绝 大多数用户都可以通过message key来定义,因为同一个key的Message可以 保证只发送到同一个partitionoKafka中发送1条消息的时候,可以指定(topic, partition, key) 3个参数。 partiton和key是可选的。如果你指定了 partition,那就是所有消息发往同 1个partition,就是有序的。并且在消
46、费端,Kafka保证,1个partition只能被1个consumer消费。或者你指定key (比如order id),具有同1个key的所有消息,会发往同1个 partitiono16、集群中有3台服务器,其中一个节点宕机,这个时候zookeeper还可以 使用吗?【仅供参考】可以继续使用,单数服务器只要没超过一半的服务器宕机就可以继续使用。17、Redis如何做内存优化?【仅供参考】尽量使用Redis的散列表,把相关的信息放到散列表里面存储,而不是把每个 字段单独存储,这样可以有效的减少内存使用。比如将Web系统的用户对象, 应该放到散列表里面再整体存储到Redis,而不是把用户的姓名、年
47、龄、密 码、邮箱等字段分别设置key进行存储。18、Redis为什么是单线程的?【仅供参考】因为epu不是Redis的瓶颈,Redis的瓶颈最有可能是机器内存或者网络带 宽。既然单线程容易实现,而且epu又不会成为瓶颈,那就顺理成章地采用单 线程的方案了。关于Redis的性能,官方网站也有,普通笔记本轻松处理每秒几十万的请求。 而且单线程并不代表就慢nginx和nodejs也都是高性能单线程的代表。19、Redis持久化有几种方式?【仅供参考】Redis的持久化有两种方式,或者说有两种策略:RDB (Rcdis Database):指定的时间间隔能对你的数据进行快照存储。AOF (Append Only File):每一个收到的写命令都通过write函数追加到文件 中。20、Redis支持的数据类型有哪些?【仅供参考】Redis支持的数据类型:string (字符串)、list (列表)、hash (字典)、set (集合)、zset (有序集合)。五、MySQL1、如何做MySQL的性能优化?【仅供参考】为搜索字段创建索引。避免使用select *,列出需要查询的字段。垂直分割分表。选择正确的存储引擎。2、为什么要有多线程复制策略?【仅供参考】因为单线程复制的能力全面低于多线程复制,对于更新压力较大的主库,备库 可能是一直追不上主库的,带来的现象就是备库
限制150内