kafka基础命令及基础知识

kafka下载

kafka启动

从kafka的根目录启动

bin/kafka-server-start.sh config/server.properties

以守护线程方式启动

bin/kafka-server-start.sh -daemon config/server.properties

kafka使用命令

查看当前topic:

bin/kafka-topics.sh --list --zookeeper localhost:2181

创建topic: --topic topicname(主题名字) --parttitions num(分区数) --replication-factor num(副本数)

bin/kafka-topics.sh --create --zookeeper localhost:2181 --replication-factor 1 --partitions 1 --topic test 

启动一个消费者

在一个新的终端执行下面的命令。

bin/kafka-console-consumer.sh --bootstrap-server localhost:9092 --topic test --from-beginning

启动生产者

bin/kafka-console-producer.sh --broker-list localhost:9092 --topic test

启动后,可以输入内容,然后回车。此时你应该可以在上一个消费者中看到有消息输出

查看 topic 列表

bin/kafka-topics.sh --list --zookeeper localhost:2181

查看描述 topics 信息

bin/kafka-topics.sh --describe --zookeeper localhost:2181 --topic test

kafka常用知识

kafka消息结构

kafka引入一个leader/follower机制,一个topic有n个partition,n个partition都在自身以外的服务器中有多个follower(备份),平时是leader在使用,一旦leader挂掉,follower成为leader接替使用

consumer也有一个consumer group,一条topic的partition中的消息只能被consumer group中的一个拉取消费,若要一条topic被多个消费者同时订阅消费,则需要,把多个消费者放到不同的consumer group中

同一个消费者组里的不同消费者不能同时消费同一个分区的数据,所以消费者组的个数一般少于等于topic中parttiton的个数

kafka之MQ消息不重复

  1. 消费端处理消息的业务逻辑保持幂等性:不过来多少条消息,最后处理结构都是一样的
  2. 保证每条消息都有唯一编号且保证消息处理成功与去重表的日志同时出现:利用一张日志表来记录已经处理成功的消息的ID,如果新到的消息ID已经在日志表中,那么就不再处理这条消息。消息系统实现,也可以业务端实现。

kafka之空消息处理

kafka采用pull的方式获取消息,为了避免一直获取空数据,kafka在消费数据时会穿入一个timeout,如果没有数据可消费,consumer会等一段时间再返回,这段时长是timeout

一个consumer group中多个消费者,一个topic中有多个partition,这就牵扯到partition的分配问题,即确定那个partition由那个consumer消费,kafka两种方式一个RoundRobin(轮训:按照组分的),一个Range(按照topic分的)

kafka之ack–保证消息同步

kafka接受到producer的消息,同步到leader和全部的follower中,才会给producer发送ack(消息发送成功),那么这里就有一个问题,如果其中一个follower挂了就会造成一直不能发送ack怎么办,这时候leader维护了一个动态的ISR,ISR中的follower同步了leader之后,会发送ack,如果有一个follower迟迟不能同步,ISSR就会把这个follower剔除ISR,接下来leader挂掉之后,只会在ISR中选取leader

ack中的参数:acks等于0时,producer不等broker的ack,这个有可能消息丢失,acks等于1时,partition的leader同步后返回ack,如果follower同步之前leader故障,会造成消息丢失(被写入死亡leader但尚未复制将失去了唯一的消息),等于-1时,是ISR中所有的follower同步成功返回ack,极小可能造成数据丢失,有可能造成数据重复(follower同步完成之后,leader没有发送ack之前出故障,换了leader之后,producer会重新发送一遍)

kafka之消息分发

kafka集群链接zookeeper,所以多个端口或多台主机启动kafka连接到同一个zookeeper中,都找zookeeper进行注册,所以producer生产消息时,链接kafka会被自动分配到不同分区(不同主机)
zookeeper帮助kafka构建集群,存储kafka有多少主题,有多少分区,有多少副本,哪个副本是leader,针对topic的增删改查都是直接指向zookeeper

kafka之消费消息有序性

consumer要保存offset(偏移量),便于拉取消息的时候找到读取消息的位置,读取消息
consumer可以保证读取分区的时候是有序的,但是全局上(producer生产消息时,分配到不同分区,onsumer不会按照这个顺序消费–这个需要注意⚠️)

kafka之生产消息存储位置

每个partition对应一个log文件,该log文件存储的是producer生产的数据,producer生产的数据会被不断的追加到该log文件的末端,每条数据有自己的offset,consumer实时记录自己消费到了什么位置

kafka消息推送模式

kafka基于基于发布订阅模式,一对多,kafka的topic推送消息给多个订阅者

  1. 点对点
  2. 拉取加长轮询
    而kafka的consumer端选用拉取加长轮循获取消息

kafka消息存储

kafka存储消息存储在磁盘,默认保留七天

你可能感兴趣的:(JAVA,java,kafka)