Kafka概述
Apache Kafka由Scala和Java编写,基于生产者和消费者模型作为开源的分布式发布订阅消息系统。它提供了类似于JMS的特性,但设计上又有很大区别,它不是JMS规范的实现,如Kafka允许多个消费者主动拉取数据,而在JMS中只有点对点模式消费者才会主动拉取数据。
Kafka对消息保存时根据topic进行归类,发送消息者称为producer,消息接收者称为consumer。Kafka集群由多个Kafka实例组成,每个实例称为broker。并且Kafka集群基于zookeeper保存一些meta信息,来保证系统的高可用性。
生产者可以直接把数据传递给broker,broker通过zookeeper进行leader和follower的选举管理;消费者可以通过zookeeper保存读取的位置offset以及读取的topic的分区信息。这样做有以下几个好处:
1.生产者和消费者的负载解耦
2.消费者可以按照自己的“能力”拉取数据
3.消费者可以自定义消费数量
Kafka与传统消息系统相比,有以下不同:
1.Kafka是分布式的,易于水平扩展
2.同时为发布和订阅提供高吞吐量
3.支持多订阅者,当失败时能自动对消费者进行rebalance
4.将消息持久化到磁盘,因此可用于批量消费,例如ETL以及实时应用程序
Kafka中的重要概念
broker
Kafka集群中的实例进程,负责数据存储。在Kafka集群中每个broker都有一个唯一的brokerId。通过broker来接受producer和consumer的请求,并把消息持久化到磁盘。每个Kafka集群中会选举出一个broker来担任Controller,负责处理分区的leader选举,协调分区迁移等工作
topic
Kafka根据topic对消息进行归类(逻辑划分),发布到Kafka集群的每条消息都需要指定一个topic。落到磁盘上对应的是partition目录,partition目录中有多个segement组合(后缀为index、log的文件)。一个topic对应一个或多个partition,一个partition对应多个segment组合
producer
向broker发送消息的生产者。负责数据生产和数据分发。生产者代码可以集成到任务系统中。
数据分发策略默认为defaultPartition Utils.abs(key.hashCode)%numPartitions
consumer
从broker读取消息的消费者【实际上consumer是通过与zookeeper通信获取broker地址进行消息消费】
ConsumerGroup
数据消费者组,ConsumerGroup(以下简称CG)可以有多个。可以把多个consumer线程划分为一个组,组里面所有成员共同消费一个topic的数据(