1 Star 0 Fork 31

np / Ebooks

forked from Java精选 / Ebooks 
加入 Gitee
与超过 1200万 开发者一起发现、参与优秀开源项目,私有仓库也完全免费 :)
免费加入
该仓库未声明开源许可证文件(LICENSE),使用请关注具体项目描述及其代码上游依赖。
克隆/下载
2021年消息队列面试题汇总,找工作必看系列.md 7.33 KB
一键复制 编辑 原始数据 按行查看 历史

2021年消息队列面试题汇总,找工作必看系列

全部面试题答案,更新日期:12月30日,直接下载吧!

下载链接:高清500+份面试题资料及电子书,累计 10000+ 页大厂面试题 PDF

消息队列

题1:RabbitMQ 中消息基于什么传输?

由于TCP连接的创建和销毁开销较大,且并发数受系统资源限制,会造成性能瓶颈。

RabbitMQ使用信道的方式来传输数据。

信道是建立在真实的TCP连接内的虚拟连接,且每条TCP连接上的信道数量没有限制。

题2:Kafka分布式的情况下,如何保证消息的顺序消费?

Kafka分布式的单位是partition,同一个partition用一个write ahead log组织,所以可以保证FIFO的顺序。不同partition之间不能保证顺序。但是绝大多数用户都可以通过message key来定义,因为同一个key的message可以保证只发送到同一个partition。

Kafka中发送1条消息的时候,可以指定(topic,partition,key)3个参数。partiton和key是可选的。如果你指定了partition,那就是所有消息发往同1个partition,就是有序的。并且在消费端,Kafka保证,1个partition只能被1个consumer消费。或者你指定key(比如orderid),具有同1个key的所有消息,会发往同1个partition。

题3:Kafka 中如何控制消费的位置?

kafka使用seek(TopicPartition, long)指定新的消费位置。

用于查找服务器保留的最早和最新的offset 的特殊的方法也可用。seekToBeginning(Collection)和seekToEnd(Collection)

题4:Kafka 消费者故障,出现活锁问题如何解决?

出现“活锁”的情况,是它持续的发送心跳,但是没有处理。为了预防消费者在 这种情况下一直持有分区,我们使用max.poll.interval.ms 活跃检测机制。在此基础上,如果调用的poll的频率大于最大间隔,则客户端将主动地离开组,以 便其他消费者接管该分区。发生这种情况时,你会看到offset提交失败(调用commitSync()引发的CommitFailedException)。这是一种安全机制,保障 只有活动成员能够提交 offset。所以要留在组中,你必须持续调用poll。

消费者提供两个配置设置来控制poll循环:

max.poll.interval.ms:增大poll的间隔,可以为消费者提供更多的时间去处理返 回的消息(调用poll(long)返回的消息,通常返回的消息都是一批)。缺点是此值 越大将会延迟组重新平衡。

max.poll.records:此设置限制每次调用poll返回的消息数,这样可以更容易的预测每次poll间隔要处理的最大值。通过调整此值,可以减少poll间隔,减少重新平衡分组。

对于消息处理时间不可预测地的情况,这些选项是不够的。处理这种情况的推荐 方法是将消息处理移到另一个线程中,让消费者继续调用poll。

但是必须注意确 保已提交的offset不超过实际位置。另外,你必须禁用自动提交,并只有在线程 完成处理后才为记录手动提交偏移量(取决于你)。

还要注意,你需要pause暂停分区,不会从poll接收到新消息,让线程处理完之前返回的消息(如果你的处理能力比拉取消息的慢,那创建新线程将导致你机器内存溢出)。

题5:Kafka 消费者如何不自动提交偏移量,由应用提交?

将auto.commit.offset设为false,然后在处理一批消息后commitSync()或者异步提交commitAsync()即:

ConsumerRecords<> records = consumer.poll(); 
for(ConsumerRecord<> record : records){
   try{
       consumer.commitSync();
   }
}

题6:说一说 Kafka 中 ack 的三种机制?

request.required.acks 有三个值 0 1 -1(all)

0:生产者不会等待 broker 的 ack,这个延迟最低但是存储的保证最弱当 server 挂 掉的时候就会丢数据。

1:服务端会等待 ack 值 leader 副本确认接收到消息后发送 ack 但是如果 leader 挂掉后他不确保是否复制完成新 leader 也会导致数据丢失。

-1(all):服务端会等所有的 follower 的副本受到数据后才会受到 leader 发出的 ack,这样数据不会丢失。

题7:Kafka 与传统 MQ 消息队列之间有三个关键区别?

1)Kafka持久化日志,这些日志可以被重复读取和无限期保留。

2)Kafka是一个分布式系统:它以集群的方式运行,可以灵活伸缩,在内部通过复制数据提升容错能力和高可用性。

3)Kafka支持实时的流式处理。

题8:Kafka 判断一个节点是否还活着有那两个条件?

1)节点必须可以维护和ZooKeeper的连接,Zookeeper通过心跳机制检查每个节点的连接;

2)如果节点是个follower,他必须能及时的同步leader的写操作,延时不能太久。

题9:数据传输的事务定义有哪三种?

和 MQTT 的事务定义一样都是3种。

1)最多一次: 消息不会被重复发送,最多被传输一次,但也有可能一次不传输。

2)最少一次: 消息不会被漏发送,最少被传输一次,但也有可能被重复传输。

3)精确的一次(Exactly once): 不会漏传输也不会重复传输,每个消息都传输被一次而且仅仅被传输一次,这是大家所期望的。

题10:Zookeeper 对于 Kafka 的作用是什么?

Zookeeper是一个开放源码的、高性能的协调服务,它用于Kafka的分布式应用。

Zookeeper主要用于在集群中不同节点之间进行通信。

在Kafka中,它被用于提交偏移量,因此如果节点在任何情况下都失败了,它都可以从之前提交的偏移量中获取。

除此之外,它还执行其他活动,如:leader检测、分布式同步、配置管理、识别新节点何时离开或连接、集群、节点实时状态等等。

大厂面试题

大厂面试题

大厂面试题

Java
1
https://gitee.com/huangdx.net/ebooks.git
git@gitee.com:huangdx.net/ebooks.git
huangdx.net
ebooks
Ebooks
master

搜索帮助

53164aa7 5694891 3bd8fe86 5694891