一、Kafka
1、Kafka可以脱离Zookeeper单独使用吗?为什么?
kafka 不能脱离 zookeeper 单独使用,因为 kafka 使用 zookeeper 管理和协调 kafka 的节点服务器。
2、kafka 有几种数据保留的策略?
3、kafka 同时设置了 7 天和 10G 清除数据,到第五天的时候消息达到了 10G,这个时候 kafka 将如何处理?
kafka 会执行数据清除工作,时间和大小不论那个满足条件,都会清空数据。
4、什么情况会导致 kafka 运行变慢?
5、使用 kafka 集群需要注意什么?
(1)集群的数量不是越多越好,最好不要超过 7 个,因为节点越多,消息复制需要的时间就越长,整个群组的吞吐量就越低。
(2)集群数量最好是单数,因为超过一半故障集群就不能用了,设置为单数容错率更高。
二、Zookeeper
1、zookeeper 是什么?
zookeeper 是一个分布式的,开放源码的分布式应用程序协调服务,是 google chubby 的开源实现,是 hadoop 和 hbase 的重要组件。它是一个为分布式应用提供一致性服务的软件,提供的功能包括:配置维护、域名服务、分布式同步、组服务等。
2、zookeeper 都有哪些功能?
(1)集群管理:监控节点存活状态、运行请求等。
(2)主节点选举:主节点挂掉了之后可以从备用的节点开始新一轮选主,主节点选举说的就是这个选举的过程,使用 zookeeper 可以协助完成这个过程。
(3)分布式锁:zookeeper 提供两种锁:独占锁、共享锁。独占锁即一次只能有一个线程使用资源,共享锁是读锁共享,读写互斥,即可以有多线线程同时读同一个资源,如果要使用写锁也只能有一个线程使用。
(4)命名服务:在分布式系统中,通过使用命名服务,客户端应用能够根据指定名字来获取资源或服务的地址,提供者等信息。
3、zookeeper 有几种部署模式?
单机部署:一台集群上运行;
集群部署:多台集群运行;
伪集群部署:一台集群启动多个 zookeeper 实例运行。
4、zookeeper 怎么保证主从节点的状态同步?
zookeeper 的核心是原子广播,这个机制保证了各个 server 之间的同步。实现这个机制的协议叫做 zab 协议。 zab 协议有两种模式,分别是恢复模式(选主)和广播模式(同步)。当服务启动或者在领导者崩溃后,zab 就进入了恢复模式,当领导者被选举出来,且大多数 server 完成了和 leader 的状态同步以后,恢复模式就结束了。状态同步保证了 leader 和 server 具有相同的系统状态。
5、集群中为什么要有主节点?
在分布式环境中,有些业务逻辑只需要集群中的某一台机器进行执行,其他的机器可以共享这个结果,这样可以大大减少重复计算,提高性能,所以就需要主节点。
6、集群中有 3 台服务器,其中一个节点宕机,这个时候 zookeeper 还可以使用吗?
可以继续使用,单数服务器只要没超过一半的服务器宕机就可以继续使用。
7、说一下 zookeeper 的通知机制?
客户端会对某个 znode 建立一个 watcher 事件,当该 znode 发生变化时,这些客户端会收到 zookeeper 的通知,然后客户端可以根据 znode 变化来做出业务上的改变。
三、Netty
1、Netty是什么?
Netty是 一个异步事件驱动的网络应用程序框架,用于快速开发可维护的高性能协议服务器和客户端。Netty是基于NIO的,封装了JDK的NIO,使用起来更加方法灵活。
2、Netty特点是什么?
(1)高并发
(2)传输快:Netty的传输依赖于零拷贝特性,尽量减少不必要的内存拷贝,实现了更高效率的传输。
(3)封装好:Netty封装了NIO操作的很多细节,提供了易于使用调用接口。
3、Netty的应用场景有哪些
(1)可构建高性能、低延时的各种Java中间件,例如MQ、分布式服务框架、ESB消息总线等
(2)作为基础通信框架提供高性能、低延时的通信服务,例如阿里分布式服务框架Dubbo,默认使用Netty作为基础通信组件
四、消息队列
1、什么是消息队列
可以把消息队列理解为一个使用队列来通信的组件,简称MQ(Message Queue)。本质是个转发器,包含发消息、存消息、消费消息的过程。
当前业界比较流行的开源消息中间件包括:RabbitMQ、RocketMQ、Kafka。
2、消息队列有哪些使用场景(为什么使用消息队列)
3、消息队列如何解决消息丢失问题?
(1)生产者不丢消息
①采用同步方式发送,send消息方法返回成功状态,就表示消息正常到达了存储端Broker。
②如果send消息异常或者返回非成功状态,可以重试。
③可以使用事务消息
(2)存储端不丢消息
同步刷盘:生产者消息发过来时,只有持久化到磁盘,RocketMQ的存储端Broker才返回一个成功的ACK响应——保证消息不丢失,但是影响了性能。
异步刷盘:只要消息写入PageCache缓存,就返回一个成功的ACK响应——提高了MQ的性能,但是如果这时候机器断电了,就会丢失消息。
(3)消费阶段不丢消息
消费者执行完业务逻辑,再反馈会Broker说消费成功,这样才可以保证消费阶段不丢消息。
4、消息队列如何保证消息的顺序性
(1)有序性
消息的有序性,就是指可以按照消息的发送顺序来消费。
(2)举例说明如何保证消息的顺序性
假设生产者先后产生了两条消息,分别是下单消息(M1),付款消息(M2),M1比M2先产生,如何保证M1比M2先被消费呢。
①将M1、M2发送到同一个Server上,当M1发送完收到ack后,M2再发送。
②将M1和M2发往同一个消费者,且发送M1后,等到消费端ACK成功后,才发送M2即可。
5、消息队列有可能发生重复消费,如何避免,如何做到幂等?
(1)可能发生重复消费
①生产端为了保证消息的可靠性,它可能往MQ服务器重复发送消息,直到拿到成功的ACK。
②消费端消费消息一般是这个流程:拉取消息、业务逻辑处理、提交消费位移。假设业务逻辑处理完,事务提交了,但是需要更新消费位移时,消费者却挂了,这时候另一个消费者就会拉到重复消息了。
(2)幂等处理重复消息
①幂等:幂等表示一次和多次请求某一个资源应该具有同样的副作用,或者说,多次请求所产生的影响与一次请求执行的影响效果相同。
②处理
方法一:创建一个本地表,带唯一业务标记的,利用主键或者唯一性索引,每次处理业务时先校验一下。
方法二:用Redis缓存下业务标记,每次查看是否处理过了。
6、如何处理消息队列的消息积压问题
(1)消息积压
生产者的生产速度,大于消费者的消费速度。
(2)处理
①先排查是否有bug产生
②如果不是bug,我们可以优化一下消费的逻辑
③解决bug并临时紧急扩容
7、消息队列技术选型,Kafka还是RocketMQ,还是RabbitMQ
8、如何保证数据一致性,事务消息如何实现
(1)一条普通的MQ消息从产生到被消费的大概流程
(2)保证数据一致性——使用事务消息
①生产者产生消息,发送一条半事务消息到MQ服务器
②MQ收到消息后,将消息持久化到存储系统,这条消息的状态是待发送状态。
③MQ服务器返回ACK确认到生产者,此时MQ不会触发消息推送事件
④生产者执行本地事务
⑤如果本地事务执行成功,即commit执行结果到MQ服务器;如果执行失败,发送rollback。
⑥如果是正常的commit,MQ服务器更新消息状态为可发送;如果是rollback,即删除消息。
⑦如果消息状态更新为可发送,则MQ服务器会push消息给消费者。消费者消费完就回ACK。
⑧如果MQ服务器长时间没有收到生产者的commit或者rollback,它会反查生产者,然后根据查询到的结果执行最终状态。