偶尔来几道面试题

目录

Apache Dubbo的默认集群容错方案是

Kafka相关问题

JVM内存模型与类加载机制

Mybatis执行SQL调用流程


Apache Dubbo的默认集群容错方案是?

A. Failover Cluster =失败自动切换
B. Failfast Cluster
C. Failsafe Cluster
D. Failback Cluster

Dubbo提供随机、轮询、最少调用优先等多种负载均衡策略,多注册中心支持,自动完成服务注册与发现。
Dubbo提供可视化的管理后台,方便对服务状态进行监控和管理。
Dubbo数据通信默认使用性能优良的netty来实现。
Dubbo默认的容错方案是Failover Cluster---失败自动切换,当出现失败,重试其它服务器。
提供以下其他容错方式:
Failfast Cluster---快速失败,只发起一次调用,失败立即报错。用于非幂等性写操作,比如新增记录
Failsafe Cluster---失败安全,出现异常时,直接忽略。用于写入审计日志等操作。
Failback Cluster---失败自动恢复,后台记录失败请求,定时重发。通常用于消息通知操作。
Forking Cluster----并行调用多服务器,只要一个成功即返回。实时性读操作需求,开销大,可设最大并行数。
Broadcast Cluster---广播逐个调用所有提供者,任意一台报错则报错 。用于通知provider更新缓存日志等本地资源信息。

下面关于Kafka说法错误的是?

A. 消息是按照topic进行划分的,一个topic就是一个queue,一个topic可以有多个消费方,当生产方在某个topic发出一条消息后,所有订阅了这个topic的消费方都可以收到这条消息
B. 所有的消息读写都是在主patition中进行,其他副本分区只会从主分区复制数据
C. kafka为每个topic维护了多个partition分区,能保证一个topic的消息消费有序
D. 消息的发送有三种方式:同步、异步以及oneway,异步为默认方式

偶尔来几道面试题

偶尔来几道面试题

Kafka只保证一个分区内的消息有序,不能保证一个topic的不同分区之间的消息有序。
为了保证较高的处理效率,所有的消息读写都是在主patition中进行,其他副本分区只会从主分区复制数据。
Kafka会在ZK上针对每个Topic维护一个已同步的副本集ISR(in-sync replica)。主分区down了会从中选一个副本作为新主分区。
消息的发送有三种方式:同步、异步以及oneway
同步模式下后台线程中发送消息时同步获取结果,默认同步模式。
异步的模式允许生产者批量发送数据,可以极大的提高性能,但是会增加丢失数据的风险。
oneway模式只发送消息不需要返回发送结果,消息可靠性最低,但是低延迟、高吞吐,适用于对可靠性要求不高的场景。

 JVM内存模型与类加载机制

虚拟机栈 也叫方法栈,是线程私有的,线程在执行每个方法时都会同时创建一个栈帧,用来存储局部变量表、操作栈、动态链接、方法出口等信息。调用方法时执行入栈,方法返回时执行出栈。
本地方法栈 与虚拟机栈类似,也是用来保存线程执行方法时的信息,不同的是,执行java方法使用虚拟机栈,而执行native方法使用本地方法栈。
程序计数器 保存着当前线程所执行的字节码位置,每个线程工作时都有一个独立的计数器。程序计数器为执行java方法服务,执行native方法时,程序计数器为空。线程独占。
是JVM管理的内存中最大的一块,堆被所有线程共享,目的是为了存放对象实例,几乎所有的对象实例都在这里分配。当堆内存没有可用的空间时,会抛出OOM异常。根据对象存活的周期不同,jvm把堆内存进行分代管理,由垃圾回收器来进行对象的回收管理。
方法区 也是各个线程共享的内存区域,又叫非堆区。用于存储已被虚拟机加载的类信息、常量、静态变量、即时编译器编译后的代码等数据,JDK7中的永久代和JDK8中的Metaspace都是方法区的一种实现。线程共享

偶尔来几道面试题
类的加载指的是将编译好的class类文件中的字节码读入到内存中将其放在方法区内并创建对应的Class对象。
类的加载分为加载、链接、初始化,其中链接又包括验证、准备、解析三步。看到图中上半部分深绿色,逐个分析:
1加载是文件到内存的过程。通过类的完全限定名查找此类字节码文件,并利用字节码文件创建一个Class对象
2.1验证是对类文件内容验证。目的在于确保Class文件符合当前虚拟机要求,不会危害虚拟机自身安全。主要包括四种:文件格式验证,元数据验证,字节码验证,符号引用验证。
2.2准备阶段是进行内存分配。为类变量也就是类中由static修饰的变量分配内存,并且设置初始值,这里要注意,初始值是0或者null,而不是代码中设置的具体值,代码中设置的值是在初始化阶段完成的。另外这里也不包含用final修饰的静态变量,因为final在编译的时候就会分配了。
2.3解析主要是解析字段、接口、方法。主要是将常量池中的符号引用替换为直接引用的过程。直接引用就是直接指向目标的指针、相对偏移量等。
3初始化:主要完成静态块执行与静态变量的赋值。这是类加载最后阶段,若被加载类的父类没有初始化,则先对父类进行初始化。
只有对类主动使用时,才会进行初始化,初始化的触发条件:
创建类的实例的时候、访问类的静态方法或静态变量的时候、Class.forName()反射类的时候、或某个子类被初始化的时候。

Mybatis执行SQL调用流程

① SqlSessionFactory
② SqlSession
③ StatementHandler
④ ParameterHandler
⑤ ResultSetHandler
⑥ Executor
⑦TypeHandler

偶尔来几道面试题

在执行sql时,首先会从SqlSessionFactory中创建一个新的SqlSession。
sql语句是通过sqlSession中的Executor来执行,Executor根据SqlSession传递的参数执行query()方法,然后创建一个StatementHandler对象,将必要的参数传递给StatementHandler,由StatementHandler来完成对数据库的查询。
StatementHandler调用ParameterHandler的setParameters方法,把用户传递的参数转换成JDBC Statement所需要的参数, 调用原生JDBC来执行语句。
最后由ResultSetHandler的handleResultSets方法对JDBC返回的ResultSet结果集转换成对象集,并逐级返回结果,完成一次sql语句执行。