1. 一面,电话,耗时42分钟
-
Flink反压问题?
-
Flink中checkpoint与savepoint的区别?
-
kafka中LogManager模块的实现?
-
Kafka中topic partition的leader选举是怎么做的?
-
BIO、NIO、AIO的区别?
-
Netty中的各个模块组成部分?为什么boss group只需要设置为1?
-
为什么不使用JDK自带的NIO,它有一个什么臭名昭著的bug吗?
JDK原生也有一套网络应用程序API,但存在一系列问题:
(1) NIO 的类库和 API 繁杂,使用麻烦。你需要熟练掌握 Selector、ServerSocketChannel、SocketChannel、ByteBuffer 等。
(2) 需要具备其他的额外技能做铺垫。例如熟悉 Java 多线程编程,因为 NIO 编程涉及到 Reactor 模式,你必须对多线程和网路编程非常熟悉,才能编写出高质量的 NIO 程序。
(3) 可靠性能力补齐,开发工作量和难度都非常大。例如客户端面临断连重连、网络闪断、半包读写、失败缓存、网络拥塞和异常码流的处理等等。
(4) NIO 编程的特点是功能开发相对容易,但是可靠性能力补齐工作量和难度都非常大。
(5) JDK NIO 的 Bug。例如臭名昭著的 Epoll Bug,它会导致 Selector 空轮询,最终导致 CPU 100%。
Netty的特点:
(1) 设计优雅,适用于各种传输类型的统一 API 阻塞和非阻塞 Socket;基于灵活且可扩展的事件模型,可以清晰地分离关注点;高度可定制的线程模型 - 单线程,一个或多个线程池;真正的无连接数据报套接字支持(自 3.1 起)。
(2) 使用方便,详细记录的 Javadoc,用户指南和示例;没有其他依赖项,JDK 5(Netty 3.x)或 6(Netty 4.x)就足够了。
(3) 高性能,吞吐量更高,延迟更低;减少资源消耗;最小化不必要的内存复制。
(4) 安全,完整的 SSL/TLS 和 StartTLS 支持。
(5) 社区活跃,不断更新,社区活跃,版本迭代周期短,发现的 Bug 可以被及时修复,同时,更多的新功能会被加入。 -
Netty中的零拷贝是怎么做的?
(1) Netty的接收和发送ByteBuffer采用DIRECT BUFFERS,使用堆外直接内存进行Socket读写,不需要进行字节缓冲区的二次拷贝。如果使用传统的堆内存(HEAP BUFFERS)进行Socket读写,JVM会将堆内存Buffer拷贝一份到直接内存中,然后才写入Socket中。相比于堆外直接内存,消息在发送过程中多了一次缓冲区的内存拷贝。
(2) Netty提供了组合Buffer对象,可以聚合多个ByteBuffer对象,用户可以像操作一个Buffer那样方便的对组合Buffer进行操作,避免了传统通过内存拷贝的方式将几个小Buffer合并成一个大的Buffer。
(3) Netty的文件传输采用了transferTo方法,它可以直接将文件缓冲区的数据发送到目标Channel,避免了传统通过循环write方式导致的内存拷贝问题。
FileChannel.transferTo -
如果Netty线程的处理是非常耗时的IO,应该采用什么方案解决?
-
Full GC的场景,是如何定位问题的?
-
用过哪些锁,Synchronized 和 Lock,底层的实现原理分别是什么?
-
JDK的线程池有用过吗?分别有哪些?
-
Flink中任务的提交也是用per job吗?也是基于Flink 1.9版本吗?
-
Flink中的kerberos认证是怎么做的,HDFS的票据失效问题如何解决?
-
Flink的内存管理是怎么做的?
-
实时接入写入到HDFS这种目的端,怎么保证Exactly-Once?为什么不直接用Flink,Flink中的端到端Exactly-Once不是可以保证吗?
-
Flink监控的指标有哪些?为什么不直接用Flink Web UI自带的?
-
MySQL事务隔离的级别?
-
在线编程题
// Given an array of integers where 1 ≤ a[i] ≤ n (n = size of array), some elements appear twice and others appear once.
// Find all the elements of [1, n] inclusive that do not appear in this array.
// Input:
// [4,3,2,7,8,2,3,1]
// Output:
// [5,6]
import java.util.HashSet;
public class ShowMeBug {
public static void main(String[] args) {
int[] nums = {4,3,2,7,8,2,3,1};
findDisappearedNumbers(nums);
}
public static List<Integer> findDisappearedNumbers(int[] nums) {
int max = nums[0];
Set<Integer> noDuplicate = new HashSet<>();
for(int i=0;i<nums;i++){
noDuplicate.put(nums[i]);
if(nums[i] >= max){
max = nums[i];
}
}
for(int i=1;i<=max;i++){
if(!noDuplicate.contains(i)){
System.out.println(i);
}
}
}
}
}
2. 二面,视频,耗时35分钟
-
netty编解码器的原理,如何避免粘包和拆包?
-
netty网关接收传感器数据,架构是怎么设计的?
一种传感器一种应用协议,对应netty网关的一个端口,netty server使用LVS做负载均衡。 -
讲一下netty的原理,为什么会比较高效?
(1) 高性能之处来自于其I/O模型和线程处理模型
(2) 零拷贝
(3) 内存池
(4) 高性能的序列化框架,protobuf,也是Thrift的压缩二进制编解码框架
(5) 灵活的TCP参数配置能力 -
HBase不同版本的控制,比如各自依赖的common-io的版本都不同,如何解决冲突,shaded技术?
-
查询服务有没有出现过异常、抖动等?网关服务呢?
rest服务使用状态码,尽量不要直接返回500错误,友好的错误提示。 -
线程池是怎么用的?参数的含义?参数配置的经验值?
-
Flink的checkpoint机制?恢复的流程是怎样的?描述一个场景?
-
kerberos认证的流程是怎么样的?klist、kinit、principal等概念?依赖于哪些组件?怎么管理keytab文件?Flink和HBase不是同一个集群的情况?
-
实时计算项目上的技术上的难点?
-
java的泛型的理解?
泛型类型在逻辑上可以看成是多个不同的类型,实际上都是相同的基本类型。
泛型的三种使用方式:泛型类、泛型接口、泛型方法 -
多线程同步的方案?就是问CountDownLatch、CyclicBarrier等的应用场景?
-
Synchronized 和 Lock 之间的区别?try和finally里都有return,到底是return谁的?
-
了解哪些Map?什么叫线程安全?并发写会有什么问题?
-
在遍历一个ArrayList,如果此时向其中add一个数据会发生什么?
使用iterator迭代器遍历,否则会出现ConcurrentModificationException -
知道哪些排序算法?
-
volatile关键字的作用?什么叫指令重排?
-
做过哪些JVM参数调优?
-
Calcite 现在支持的sql类型有哪些?
-
MySQL中的索引类型有哪些?