初识kafka

什么是kafka?

官网的解释是,Kafka是一个分布式的流计算的平台。它提供了三个主要的功能:
1、实现了发布和订阅记录流,这个有点类似于消息队列系统或者企业消息传递系统。
2、以容错的方式持久化存储记录流。
3、按照发生时的状态处理记录流。
我么可以看到,它其实是更像是一个用来处理记录流的消息中间件系统。

kafka的应用

目标kafka主要有以下两种应用场景
1、为保障系统和应用之间数据的可靠性的获取构建了实时的数据流管道。
2、构建实时的流应用从而进行转换和响应流数据。
3、处理海量的日志信息,进而分析用户行为的一个日志处理框架,这也就要求了kafka能够满足各种实时在线和批量离线处理应用场合对低延迟和批量吞吐性能的要求(初衷)。

kafka的主要目标

1、使用推送和拉取模型解藕生产者和消费者;
2、为消息传递系统中的消息提供数据持久化,以便支持多个消费者;
3、通过系统优化实现高吞吐量;
4、系统可以随着数据流的增长进行横向扩展;

kakfa有哪些特性

通过前面介绍,kafka初衷是被设计一个既能高吞吐量的处理海量数据,又能批量离线处理消息的系统。那么kafka有哪些设计目标呢?

1.高吞吐量 ,kafka采用普通的硬件支持每秒百万级别的吞吐量,支持批次写入和读取。
2.支持broker间的分区的方式进行存储和消费,又能保证每个partition的顺序读写。
3.同时支持离线数据处理和实时数据处理
4.实现消息的持久化,避免消息的丢失(可以配置删除策略),同时支持离线数据处理和实时数据处理
5.水平扩展,通过分区来实现水平扩展

kafka的结构

了解完kafka的特性和应用,我们再来了解kafka的一些角色和名词解释:
topic:kafka的消息同主题进行分类,你可以将它看成一个数据库的表。
partition:一个topic会被分成若干个分区,它是一个主题在物理上的分组。
producter:负责向消息系统发送消息,发送消息必须指定主题。
consumer:负责从消息系统拉取消息消费,消费消息必须指定主题。
Consumer Group:不同的消费者可以属于同一个消费组;不同的消费组可以订阅同一个topic;同一个topic会把所有的数据都发给不同的Consumer Group,但是同一条消息只会被Consumer Group中的一个consumer消费。
主题topic

topic就像是一个数据库表,它隔离了不同的类型消息,作为生产者可以将同一类型的消息发送到同一个主题下面,而将不同类型发送到不同的主题上。对于topic的创建主要有两种方式:

  1. 手工创建(建议):一般我们建议在往一个主题里写消息前先要提前创建好topic,可通过命令bin/kafka-topics.sh --create --zookeeper localhost:2181/kafka100 --topic topic-test1 --replication-factor 2 --partitions 4。
  2. 服务器自动创建:如果我们在kafka broker中的配置文件server.properties中配置了auto.create.topics.enable参数为true(默认也是true),那么当生产者向一个尚未创建的topic发送消息时,会自动创建一个num.partitions(默认值为1)个分区和default.replication.factor(默认值为1)个副本的对应topic。不过我们一般不建议将auto.create.topics.enable参数设置为true,因为这样创建出来的分区和副本都是1。当然也可以通过配置在$KAFKA_HOME/config/server.properties配置num.partitions来指定新建Topic的默认Partition数量。
分区partition
  1. 在kafka中,主题被分成多个分区,不同的broker负责不同的分区,通过分区,我们就可以实现数据的冗余和伸缩性。同时把主题分成多个分区,生产者生产的消息就会被分摊到不同的分区,而且不同的partition可以实现并行的写入消息,这样不但可以减缓单broker的压力,还可以提高broker的吞吐量。但证因为分区的原因,整个topic无法保证顺序,但是可以保证每个分区中消息的顺序。正因为对于每个分区的写顺序,从而也保证了kafka的高吞吐量。
  2. kafka提供了为每个分区单独配置删除策略:

a. 基于时间配置:log.retention.hours=120 删除五天前的数据。
b. 基于在Partition文件大小:log.segment.bytes=1073741824 超过1G时删除旧数据。


主题分区写入.png
生产者Producter

producter主要负责向broker发送消息,默认情况下,消息会被均衡的分配到不同的分区上去。应用也可以自定义消息键和分区器来将某一类具有相同特性的数据发送到同一个分区上去。当然,producter通过均衡的将消息发送给不同的分区,这样可以保证多个partition可实现并行处理,从而提高producter的吞吐量。

我们下怎么使用自定义起分区器

import kafka.producer.Partitioner;
import kafka.utils.VerifiableProperties;

public class JasonPartitioner implements Partitioner {
  public JasonPartitioner(VerifiableProperties verifiableProperties) {}

  @Override
  public int partition(Object key, int numPartitions) {
      try {
          return Math.abs(key.hash() % numPartitions);
      } catch (Exception e) {
          return Math.abs(key.hashCode() % numPartitions);
      }
  }
}
消费者Consumer

consumer主要负责订阅和消费消息系统中的消息,每个消费者可以订阅一个或多个主题,并会按照消息生产的顺序读取它。消费者主要是通过检查消息的偏移量来尽量避免重复消费消息,这里的偏移量是一种元数据,对于单个分区来说,偏移量都是唯一的,消费者会把每个分区最近消费的偏移量保存在zookeeper或kafka上,这样如果消费者关闭或重启,它的读取状态就不会丢失,依然可以被接管的消费者获取到。

消费者Consumer group

kafka中消费端可以通过消费组来解决负载均衡,也可以通过消费者来实现广播订阅和队列消费的方式。多个消费者可以属于同一个消费组;同一消息不能被同一消费组里的不同消费者同时消费;订阅同一主题的消费组都会获取到主题上的所有分区里的消息。这是Kafka用来实现一个Topic消息的广播(发给所有的Consumer)和单播(发给某一个Consumer)的手段。一个Topic可以对应多个Consumer Group。因此如果需要实现广播,只要每个Consumer都属于独立的Group就可以了。要实现单播只需要让所有的Consumer在同一个Group里。用Consumer Group还可以将Consumer进行自由的分组而不需要多次发送消息到不同的Topic。对于同一个消费组里的某个消费者如果出现失效,则同一消费组里的其它消费者会接管它负责的分区。


消费组消费.png
broker和集群

1.一台独立的kafka服务器称为broker,broker主要的职责是负责接收来自生产者的消息,设置消息的偏移量,处理消息的分区存储并刷新到磁盘保存。同时broker还会接收消费者对分区消息的读取请求进行响应,它负责从磁盘上读取消息并返回给消费者,单个broker的吞吐量可以轻松达到上千个分区以及美妙百万级的消息量。
2.通常broker是以集群进行部署,每个集群中会选举一台broker兼职充当集群控制器的角色(这个是自动选举的)。集群控制器主要是负责将一个主题的分区分配给不同的broker,同时它会采用心跳的方式负责检测broker是否存活。在broker集群中,一个分区可能会被复制给多个broker,通过这样冗余的方式保证了分区的高可用,但是它只会从属于一台broker,这台broker也就称为首领。只有首领里的分区才负责消息的读写,副本的分区不能负责读写。当首领所属的broker失效的话,分区的其它broker会负责接管这个领导权,相关的消费者和生产者都要重新链接到新的首领。


image.png

你可能感兴趣的:(初识kafka)