初始Kafka

一、Topic && Partition

1、Topic就像一个消息队列,生产者可以向其写入消息,消费者可以从中读取消息,一个Topic支持多个生产者
       或消费者同时订阅它,所以其扩展性很好。Topic又可以由一个或多个Partition(分区)组成
  2、其中每个Partition中的消息是有序的,但相互之间的顺序就不能保证了,若Topic有多个Partition,生产者的
       消息可以指定(下图就是一个指定的分区其)或者由系统根据算法分配到指定分区,若你需要所有消息都是有序的,
       那么你最好只用一个分区。另外Partition支持消息位移读取,消息位移有消费者自身管理。
 3、不同消费者对同一分区的消息读取互不干扰,消费者可以通过设置消息位移(offset)来控制自己想要获取的数据,
       比如可以从头读取,最新读取数据,重读读取等功能。
 4、Kafka中的内部数据单元叫Payload(消息),Payload以Topic来分类,使用的时候使用命令行的方式配置一个Topic,
      且指定Partition的个数。
 5、一个Partition对应一个单独的日志,且是有序的,其内部表现为多个Segment文件,Payload不断的追加到最后一个
      segment的末尾。
 6、每个segment内的Payload都有offset的概念,所以,Consumer可以随意的读取任意时刻的消息。
 7、partition分布在多个broker上,且会有多个副本,为了容灾,partition相互之间不保证Payload的顺序。

二、Payload

1、Payload对于Kafka来说只是一个字节数组,并不关心数据的实际格式
2、每个Payload都有一个可选的metadata,称作key,key同样只是一个字节数组
3、Payload被写入到Partition的时候,key控制分派的过程,默认是使用hash取摸,如果不存在key,则使用轮询Partition
      的策略
4、为了更加高效,Payload以批量提交的方式写入Kafka,这些批量的Payload都有相同的Topic和Partition,它是吞吐
     和延迟的权衡

三、Producer && Consumer

1、Producer创建Payload,一般不需要关注Payload会被写入到哪一个Partition中,如果需要自行控制,可以根据key和
       自定义的Partitioner来完成
 2、Consumer订阅一个或者多个topic,Consumer自己维护Payload的offset,Partition内部的每一个Payload具有
      唯一的offset(注意区分Payload的offset与Consumer自己维护Payload的offset)
 3、Consumer以Consumer group来工作,一个group内的Consumer一起协作消费一个Topic
 4、Consumer group保证Topic内的一个Partition只会被group内的一个Consumer消费,所以,Partition一定会被有序的消费
 5、 group内的Consumer出现故障,消费者内的其他消费者会接管它的分区

四、Kafka可以确保

1、消息的添加是有序的,生产者越早向订阅的Topic发送消息,会更早的被添加到Topic中,当然它们可能被分配到不同的分区
  2、消费者在消费Topic分区中的消息是有序的
  3、对于有N个复制节点的Topic,系统可以最多容忍N-1个节点发生故障,而不丢失任何提交给该Topic的消息丢失

五、Kafka的优势

传统的消息系统有两个模型:消息队列和发布/订阅
 1、消息队列系统
      1)表现形式:一组消费者从消息队列中获取消息,消息会被推送给组中的某一个消费者
      2)优势:水平扩展,可以将消息数据分开处理
      3)劣势:消息队列不是多用户的,当一条消息记录被一个进程读取后,消息便会丢失
2、发布/订阅系统
      1)表现形式:消息会广播发送给所有消费者
      2)优势:可以多进程共享消息
      3)劣势:每个消费者都会获取所有消息,无法通过添加消费进程提高处理效率
3、Kafka优势
      1)Kafka通过Topic的方式达到消息队列的功能
      2)Kafka通过消费者组达到发布/订阅的功能

六、Kafka的基本配置($KAFKA_HOME/config/server.properties)

1、broker配置

在这里插入图片描述

2、topic配置

在这里插入图片描述