Kafka 为什么牛? 为什么这么火?有什么优势呢?
作为面试官,聊到Kafka时,我第一个问题会问为什么选择使用Kafka呢,在技术选型时处于哪些方面的考虑呢,
这时希望听到面试者说出kakfa的优势以及与业务需求场景的契合度
1、高吞吐量:
单机情况下每秒能轻松处理几十到百万级消息并发量,集群情况下可达千万级
别消息吞吐量;即使存储了TB级别的数据量,也能保持稳定的并发量、吞吐量。
2、高性能:
单节点可以连接上千客户端(生产者、消费者),并且能保证零停机、零数据丢失
,在一些比较严格的场合,不能容忍数据丢失,那么Kafka可以提供保证数据零丢失这样的特性支持
零停机
:
零停机怎么理解呢? 比如用10台机器搭建了Kafka集群,这10台机器一年中总有几个小时宕机时间,而对于Kafka集群而言,允许机器宕机,就是说在7*24H的情况下,集群允许单个节点或若干节点宕机,不影响整个集群对外提供服务
3、持久化数据存储:
我们通常使用的DB都是关系型数据库,都是将数据持久化到磁盘中,数据的访问在对磁盘进行读写,我们都知道对磁盘进行IO比较慢,那么如何让读写速度加快呢,就产生了redis等产品,redis访问数据快是因为将数据都存储到内存去了;
对于Kafka这样的消息系统或消息中间件来说,它反其道而行之,客户端(生产者)发过来的消息, 我偏偏存到磁盘上去,存到磁盘的好处是:保证数据持久化
,不至于在机器突然宕机时造成数据丢失,如果遇到最恐怖的情况,服务器被人偷走了, 磁盘也丢了,
Kafka还支持对数据进行备份,存储副本
,来保证零数据丢失,除非连副本机器也偷走了,那没办法了哈哈,
那么Kafka刷盘持久化机制 怎么还能实现每秒几百万的并发这样的高性能呢?
kafka里面主要是实现了几个技术
1、零拷贝
- 涉及到用户态和内核态的转换,后面我们详细讲解
2、顺序读写
- 性能最高的磁盘就是这种顺序读写,
SSD一般四五百兆每秒,那么100M可以存储多少条消息呢,红楼梦整本转成文字才两兆多,所以单机处理百万级消息问题不大
3、利用Linux的页缓存
- 使用内核态(操作系统管理的这块内存)
4、分布式系统、易于横向扩展:
生产者、消费者、broker,都可以搭建集群,动态进行横向扩展(无需停机,热扩展就可以),横向扩展就大大提升了我们系统的处理能力
5、可靠性:
Kafka是分布式
、分区
(一个topic数据分成不同分区放在不同服务器)、复制
(分区的副本)、容错
(允许服务器宕机,因为有副本可以继续对外提供服务)的
6、客户端维护状态:
消息队列实际上对每一个消息都有一个编号,通过编号来保证消息的有序性,消费者消费第几条消息由他本身来管理,
早些版本实在zk上维护offset(偏移量)
,在zk上记录这个数据就很不合适,zk每个节点能放的数据最大也就1M,zk主要是用来做服务注册与发现的一个协调服务,对高并发的一个偏移量的读写就不是它的强项, 所以后面的高版本里不在zk保存消息的偏移量了,直接在客户端保存 ,
当消息消费失败时,还能进行自动平衡
,消费者rebalance很重要,后面我们重点讲
7、支持online(在线)和 offline(离线)场景
8、支持多种客户端语言
,Kafka支持常见的Java、.NET、PHP、Python、erlang等多种语言