定义
Apache Kafka是消息引擎系统,也是一个分布式流处理平台(Distributed Streaming Platform)。Kafka使用Kafka Streams 组件和Kafka Connect组件提供流处理能力
优点及解决哪些痛点
- Kafka 能够有效隔离上下游业务,将上游突增的流量缓存起来,以平滑的方式传导到下游子系统中,避免了流量的不规则冲击(削峰填谷,上下游业务解耦)
- 通过kafka可以实现消息引擎应用、应用程序集成、分布式存储构建,甚至是实时流处理应用的开发与部署
流处理平台
- Apache Storm、Apache Spark Streaming 亦或是 Apache Flink,用于大规模流处理领域
- kafka 也能作为流处理领域,但通常用于中小规模,同时国内鲜少使用kafka作为流处理平台,更多的是作为消息引擎使用。
监控工具
Apache Kafka 没有提供任何监控框架或工具,需要借助第三方开源监控框架监控 Kafka:
- Kafka manager
- Kafka eagle
- JMXTrans + InfluxDB + Grafana
专业术语
-
Broker
-
Topic
-
Producer和Consumer,两者统称kafka客户端 Clients
-
Consumer Group,消费者组,多个消费者实例共同组成的一个组,同时消费多个分区以实现高吞吐
-
Rebalance,重平衡,消费者组内某个消费者实例挂掉后,其他消费者实例自动重新分配订阅主题分区的过程。Rebalance是Kafka消费者端实现高可用的重要手段。
-
Replication,Kafka 定义了两类副本:领导者副本(Leader Replica)和追随者副本(Follower Replica)。 前者对外提供服务,这里的对外指的是与客户端程序进行交互;而后者只是被动地追随领导者副本而已,不能与外界进行交互。
副本的工作机制也很简单:生产者总是向领导者副本写消息;而消费者总是从领导者副本读消息。至于追随者副本,它只做一件事:向领导者副本发送请求,请求领导者把最新生产的消息发给它,这样它能保持与领导者的同步。 -
Partition,Kafka中的分区机制指的是将每个主题划分成多个分区,每个分区是一组有序的消息日志。生产者生产的每条消息只会被发送到一个分区中,也就是说如果向一个双分区的主题发送一条消息,这条消息要么在分区0中,要么在分区1中。如你所见,Kafka的分区编号是从0开始的,如果Topic有100个分区,那么它们的分区号就是从0到99。
刚才提到的副本如何与这里的分区联系在一起呢?
实际上,副本是在分区这个层级定义的。每个分区下可以配置若干个副本,其中只能有1个领导者副本和N-1个追随者副本。生产者向分区写入消息,每条消息在分区中的位置信息由一个叫位移(Offset)的数据来表征。分区位移总是从0开始,假设一个生产者向一个空分区写入了 10 条消息,那么这10条消息的位移依次是 0、1、2、…、9。
-
Offset,消息位移;分区内的消息位置,它是不变的,即一旦消息被成功写入到一个分区上,它的位移值就是固定的了
-
Consumer Offset,消费者位移则是随时变化的,毕竟它是消费者消费进度的指示器。另外每个消费者有着自己的消费者位移。
Kafka Broker持久化数据
Kafka使用消息日志(Log)来保存数据,一个日志就是磁盘上一个只能追加写(Append-only)消息的物理文件。因为只能追加写入,故避免了缓慢的随机I/O操作,改为性能较好的顺序I/O写操作,这也是实现 Kafka 高吞吐量特性的一个重要手段。不过如果你不停地向一个日志写入消息,最终也会耗尽所有的磁盘空间,因此 Kafka 必然要定期地删除消息以回收磁盘。怎么删除呢?简单来说就是通过日志段(Log Segment)机制。在 Kafka 底层,一个日志又近一步细分成多个日志段,消息被追加写到当前最新的日志段中,当写满了一个日志段后,Kafka会自动切分出一个新的日志段,并将老的日志段封存起来。Kafka 在后台还有定时任务会定期地检查老的日志段是否能够被删除,从而实现回收磁盘空间的目的
Kafka两种消费模型
- 点对点(P2P)
在Kafka中实现这种P2P模型的方法就是引入了消费者组(Consumer Group)。所谓的消费者组,指的是多个消费者实例共同组成一个组来消费一组主题。这组主题中的每个分区都只会被组内的一个消费者实例消费,其他消费者实例不能消费它。为什么要引入消费者组呢?主要是为了提升消费者端的吞吐量。多个消费者实例同时消费,加速整个消费端的吞吐量(TPS)
- 发布订阅