14全面了解Kafka的使用与特性

每个人都是自己命运的主宰。

——斯蒂尔斯

引言

(图片来源:https://medium.com/)

上一小节说了消息队列的使用,那么面试官也会顺着MQ话题展开讨论,所以先来一节关于Kafka的基础知识,

2020年,Kafka 依旧炙手可热,一线大公司即使不用Kafka,但是自研产品也都是基于Kafka,或者完全借鉴Kafka设计思想,理论上来说,如果你还没熟练掌握一个MQ框架,Kafka绝对是不错的选择。

关于历史,如果你感兴趣了解一下,至少知道是哪个公司开源的,Kafka最初于2011年在 LinkedIn 开发,自那时起经历了很多改进,后来捐献给Apache基金,如今发展成为一个完整的平台,采用Scala和Java开发的开源流处理软件。

Kafka 是我工作多年使用最多的消息中间件 ,特点是拥有巨大吞吐量(数百万/秒),作为当下最流行的分布式,可水平扩展,可容错的“消息系统”。

1.面试官:可以简述下Kafka架构中比较重要的关键字吗?比如Partition,Broker,你都是怎么理解的?

问题分析:

Kafka基础知识考察,因为Kafka出色的性能,在集群结构上也有所不同,一些新的概念设计名字初学者可能搞不懂,构建一个 Kafka cluster 首先需要理解 topics, producers, consumers, and brokers 的概念。

我:

关于Kafka我做了一些深入了解,它的设计思路还是很值得借鉴的,这其中有6个比较关键的名字概念,弄懂这几个概念才能更好地了解Kafka的工作机制。

  • Producer
    消息的生产方,如支付系统确认用户已经支付,支付系统要通知订单系统和物流系统,支付系统就是生产者。

  • Consumer
    消费的接收方,Producer 的案例中,物流系统就是消费方,前两个都比较简单,我就不多说了。

  • Topic
    每条发布到MQ集群的消息都有一个类别,这个类别被称为topic,可以理解成一类消息的名字。所有的消息都已topic作为单位进行归类。

  • Partition
    Kafka 物理上分区的概念,每个 Topic 会分散在一个或多个 Partition。一个 Topic 的数据太大了,就分成小片,Kafka 为分区引入多副本模型,副本之间采用“一个leader多follower”的设计,通过多副本实现故障自动转移,保证可用性。

  • Broker:
    可以理解成一个服务器的节点,集群包含一个或多个服务器,这种服务器被称为 broker。对应用来说,生产者把消费发出去了,就不管了。消费者慢条斯理地按照自己的速率来消费。这段时间可能有大量消息产生,消费者压力还是在一定范围内。做生产者和消费者之间解耦的就是一个缓存服务broker。

  • Kafka Cluster

    集群就是 Broker 的集合,多个 Broker 组成一个高可用集群。

Producer 与 Consumer的关系

topic 和 Partition 的关系

一个 topic 可以分别存储到多个 Partition,每个 Partition 有序的。

到这里面试官并没有打断我… 我就继续了。

那我们为什么要选择 Kafka 呢?

这里不再列举同类产品都具有的功能,直接总结干货,Kafka 特有的功能:

  1. 相比同类中间件 RabbitMQ or ActiveMQ,Kafka 支持批量拉取消息,大大增加了Kafka的消息吞吐量。

  2. 支持多种发送场景:

    1.发送并忘记。

    2.同步发送 。

    3.异步发送+回调函数。

    3种方式虽然在时间上有所差别,但并不是说时间越快的越好,具体使用哪种方式要看具体的业务场景,比如业务要求消息必须是按顺序发送,可以使用第2种同步发送,并且只能在一个partation上。如果业务只关心消息的吞吐量,容许少量消息发送失败,也不关注消息的发送顺序,那么可以使用发送并忘记的方式。如果业务需要知道消息发送是否成功,并且对消息的顺序不关心,那么可以用异步+回调的方式来发送消息

  3. 分布式可高可扩展。Kafka 集群可以透明的扩展,增加新的服务器进集群。

只说了 Kafka 的优势,那别的同类产品就不好了吗?当然不是,存在即真理,每个产品能生存下来,一定有它自己的优势,比如 RabbitMQ,在吞吐量方面稍逊于 Kafka ,但是他们的出发点不一样,RabbitMQ 支持对消息的可靠的传递,支持事务,不支持批量的操作,技术选型中,选择最适合你的,你最了解熟悉的。

分布式 高性能 持久性和扩展性
支持多分区 高吞吐量 数据可持久化
支持多副本 低延迟 容错性高
支持多订阅者 高并发 支持水平在线扩展
基于ZooKeeper调度 时间复杂度为O(1) 消息分发自动平衡

言多必失,说了一堆 Kafka 相比其他产品有多好多快,终于成功给自己挖了一个坑。(?),顺着我的思路展开了问

2.面试官:那为什么Kafka的吞吐量远高于其他同类中间件?

问题分析:

多年经验总结,面试中最吃亏的就是你把你不熟悉的东西写在简历上,还有就是你知道结果,不知其原理,源码没看过,好歹也要知道用了巧妙的设计。

我:

Kafka 是一个高吞吐量分布式消息系统,并且提供了持久化。其高性能的有两个重要特点:

  1. 利用了磁盘连续读写性能远远高于随机读写的特点,内部采用消息的批量处理,zero-copy机制,数据的存储和获取是本地磁盘顺序批量操作,具有O(1)的复杂度,消息处理的效率很高。

  2. 并发,将一个topic拆分多个partition, kafka读写的单位是partition,因此,将一个topic拆分为多个partition可以提高吞吐量。但是,这里有个前提,就是不同partition需要位于不同的磁盘(可以在同一个机器)。如果多个partition位于同一个磁盘,那么意味着有多个进程同时对一个磁盘的多个文件进行读写,使得操作系统会对磁盘读写进行频繁调度,也就是破坏了磁盘读写的连续性。
    在linkedlin的测试中,每台机器就加载了6个磁盘,并且不做raid,就是为了充分利用多磁盘并发读写,又保证每个磁盘连续读写的特性。

    同一个topic会被分散到多个分片上,并行处理。

深入分析

与其说深入分析不如说是实战,我在2000人的微信群里很多初学者反应,整体给我讲Redis,MQ,理论知识学了一大堆了,面试题也基本会答了,可是我还是不知道怎么写,没有机会实践,到底怎么用呀?我入职了会不会试用期过不了?

处于对各个阶段读者对关怀,王炸我写了个Demo,看完再不会?那就多看几遍。

Kafka 消息的生产与消费模型Demo

伪代码:使用KafKa客户端发送一条消息

public class MqProducer {private final Logger LOG = LoggerFactory.getLogger(MqProducer.class);@Resourceprivate Producer payProducer;public void sendPayMsg(String msg) {try {LOG.debug("send msg:{}", msg);payProducer.send(msg);//发送出去一条消息。} catch (MQException e) {LOG.error("mq消息异常 message:{}", msg, e);}}
}

长什么样子?

即payProducer.send(msg)里的msg的值:

{"businessType":1,"cityId":10,"ctime":1567426767077,"dataKey":20190902,"logType":1,"phone":"13212341234","uid":12345678,"userType":1,"uuid":"32EA02C86D78863"}

无论消息长短,都可以看作一个json串,用 key-value的形式传递信息。

伪代码:接收一条消息

public class DemoConsumer {/*** 注意:服务端对单ip创建相同主题相同队列的消费者实例数有限制,超过100个拒绝创建.* */private static IConsumerProcessor consumer;public static void main(String[] args) throws Exception {Properties properties = new Properties();properties.setProperty(ConsumerConstants.SubscribeGroup, "dache.risk.log.queue.v2");// 创建topic对应的consumer对象(注意每次build调用会产生一个新的实例)consumer = KafkaClient.buildConsumerFactory(properties, "topic.xxx.xxx");// 调用recvMessageWithParallel设置listenerconsumer.recvMessageWithParallel(String.class, new IMessageListener() {@Overridepublic ConsumeStatus recvMessage(Message message, MessagetContext context) {//TODO:业务侧的消费逻辑代码try {System.out.println("message=[" + message.getBody() + "]  partition=" + message.getParttion());} catch (Exception e) {e.printStackTrace();}return ConsumeStatus.CONSUME_SUCCESS;}});}
}

附录:消息管理工具

如果你们刚刚搭建起Kafka集群,还没有完备的页面管理系统,你不妨了解一下这几款开源工具,给领导展示一下解决问题的能力。

为了简化开发者和服务工程师维护 Kafka 集群的工作,基于页面的管理工具必不可少。

常用 Kafka 开源管理工具:

  1. Kafka Manager :由 yahoo 团队开发。使用可参考:https://github.com/yahoo/kafka-manager


2. Kafka Lens:开源项目,允许开发人员在通过代理传递消息时查看消息,也可以按分区过滤消息。

参考:https://github.com/kafka-lens/kafka-lens

图片来源:Kafka Lens

  1. Kafka Monitor :测试和监视Kafka集群,而不需要对应用程序进行任何更改。
    使用参考:https://github.com/linkedin/kafka-monitor

总结

Kafka架构关键字:

  1. Producer
  2. Consumer
  3. Topic
  4. Partition
  5. Broker
  6. Kafka Cluster

每一个关键词都值得你深入研究,让面试官看到你的亮点吧。

Kafka的性能为何如此优秀:一句话总结:得益于架构采用分布式并行处理,利用磁盘顺序IO批处理。

参考资料

  1. Kafka官网
  2. Thorough Introduction to Apache Kafka
  3. 如果你想系统了解下Kafka,可以推荐一本书《深入理解Kafka:核心设计与实践原理》,微信读书就可以免费阅读。

面试精讲之面试考点及大厂真题 - 分布式专栏 14 全面了解Kafka的使用与特性相关推荐

  1. 面试精讲之面试考点及大厂真题 - 分布式专栏 01 开篇词:我是怎样带你通过大厂面试

    01 开篇词:我是怎样带你通过大厂面试 自信和希望是青年的特权. --大仲马 学习编程是一场修行,要经历从 0 到 1,普通人从自己的错误中学习,聪明人从别人的错误中学习. 授人以鱼不如授人以鱼杆儿, ...

  2. 面试精讲之面试考点及大厂真题 - 分布式专栏 07 说一说什么是正向代理,反向代理

    07 说一说什么是正向代理,反向代理 世界上最快乐的事,莫过于为理想而奋斗. --苏格拉底 引言 05小节面完了RPC相关的一系列问题,面试官确定我对分布式架构的理论知识和服务间通讯框架(RPC) 确 ...

  3. 面试精讲之面试考点及大厂真题 - 分布式专栏 17 ElasticSearch解决大数据量检索难题

    17 ElasticSearch解决大数据量检索难题 理想的书籍是智慧的钥匙. --列夫·托尔斯泰 引言 如果你的项目里有超过千万上亿级别的数据,且数据日增量较大需要高性能检索时,如订单数据,你该怎么 ...

  4. 面试精讲之面试考点及大厂真题 - 分布式专栏 03 阿里华为资深HR面试套路全揭晓

    03 阿里华为资深HR面试套路全揭晓 HR 面试套路大全 如果你技术面试过了,进入最后一轮 HR 谈薪资,先别高兴太早,千万不要轻视 HR.BAT 大公司,HR 有一票否决权,即使你技术 OK,领导也 ...

  5. 面试精讲之面试考点及大厂真题 - 分布式专栏 23 分布式系统下分布式锁的实现

    23 分布式系统下分布式锁的实现 困难只能吓倒懦夫懒汉,而胜利永远属于敢于等科学高峰的人. --茅以升 引言 锁是开发过程中十分常见的工具,你一定不陌生,悲观锁,乐观锁,排它锁,公平锁,非公平锁等等, ...

  6. 面试精讲之面试考点及大厂真题 - 分布式专栏 13项目中为什么要使用消息队列

    13项目中为什么要使用消息队列 学习从来无捷径,循序渐进登高峰. -- 高永祚 引言 上个章节把Redis夺命连环问掰扯完,面试还没有结束,消息队列同样是面试中必问的,分布式构建三把斧:缓存+异步+数 ...

  7. 面试精讲之面试考点及大厂真题 - 分布式专栏 21 限流不能乱用-系统限流最佳实践

    21 限流不能乱用-系统限流最佳实践 没有引发任何行动的思想都不是思想,而是梦想. -- 马丁 引言 19.20小节讲了系统中的降级熔断设计和对 Hystrix 组件的功能了解,关于限流降级还有一个比 ...

  8. 面试精讲之面试考点及大厂真题 - 分布式专栏 18 谈谈怎么理解幂等,接口如何保证幂等

    18谈谈怎么理解幂等,接口如何保证幂等 时间像海绵里的水,只要你愿意挤,总还是有的. --鲁迅 引言 稳定性设计第一篇:这一小节开始讲设计系统稳定性保证的相关设计,谁都不想自己负责的系统三天两头就出故 ...

  9. 面试精讲之面试考点及大厂真题 - 分布式专栏 16 数据库如何做分库分表,读写分离

    16 数据库如何做分库分表,读写分离 宝剑锋从磨砺出,梅花香自苦寒来. --佚名 引言 2016年第一次接触分布式微服务项目后,我在简历上写了我使用了微服务.分库分表技术,那么问题来了,面试官说接下来 ...

最新文章

  1. 《C语言程序设计:问题与求解方法》——3.9节常见编程错误
  2. angular1.0 $http jsonp callback
  3. OSChina 周四乱弹 —— 澳门首家货车上线啦
  4. resize函数缩小图片的尺寸 车辆检测
  5. React中的路由react-router
  6. StringBuilder与String互转
  7. android生成预处理文件,FFmpeg:Android利用Filter进行音频数据预处理
  8. Java之控制反转和依赖注入
  9. POJ3695(矩形切割中等题)
  10. 又一起.NET程序挂死, 用 Windbg 抽丝剥茧式的真实案例分析
  11. Redis定时任务,
  12. CMD命令提示符大全
  13. adb ps shell 查看进程_adb shell查看进程方法
  14. TI C6000 TMS320C6678 DSP+ Zynq-7045的PS + PL异构多核案例开发手册(4)
  15. gif怎么转换html,gif转视频的教程:怎么把gif转换成mp4、avi、wmv
  16. 开发分布式WebIm--1(设想)
  17. 微信提取公积金要先查征信?
  18. python nonlocal 的应用
  19. 云计算ACP实验实操心得
  20. python输入某年某月某日判断这是第几天_Python编程实现输入某年某月某日计算出这一天是该年第几天的方法...

热门文章

  1. SEO之Google--PageRank优化剖析(三)
  2. 怎样在 Ubuntu 13.04 Raring Ringtail , 12.10, 12.04 中安装和设置 Samba 实现网上邻居共享...
  3. 如何写一个Jquery 的Plugin插件
  4. Linux下ACE、xml解析库开发环境搭建
  5. SELinux入门:了解和配置SELinux
  6. 【今日CS 视觉论文速览】19 Dec 2018
  7. 使用for循环嵌套实现乘法口诀表
  8. 断开式 DataGridView控件 winform
  9. requests-session类对象-0223
  10. jquery-事件绑定