流程图:
关键字解释:
- Kafka Cluster:由多个Kafka服务组成,每个kafka可以叫做一个broker,其中的一个broker会被选组为控制器(Kafka Controller)。
- Topic:topic顾名思义是主题的意思,我们会将不同的消息类型发往到不同的topic下。
- partition:分区,topic下的一个单位,topic的内部可以划分出多个partition用来分片存储我们的消息数据。用于存储海量数据,和提高并发能力。
bin/kafka‐topics.sh ‐‐create ‐‐zookeeper 127.0.0.1:2181 ‐‐replication‐factor 3 ‐‐partitions 2 ‐‐topic my‐replicated‐topic
我们现在在kafka集群中创建一个名为my‐replicated‐topic的主题,其中有2个分区,3个副本。
- 我们可以查询topic的情况,名为my‐replicated‐topic的topic下确实出现了两个partition分区分别我0和1
- Replicas:表示但前的partition有三个副本,分别为位于broker0,broker1,broker2上。
- Leader:表示当前的分区partition0的主节点为于broker1这个机器上。
- Isr:表示当前存货的broker。如果我们现在将kafka集群中的broker1服务给关闭掉。那么只Isr就只有两个值为0,2。
在多副本的情况下,只有Leader主的partition才提供读写的请求,followers从分区只负责同步数据,不提供读写,除非在leader挂掉进行重新选举之后才能提供读写能力。
produce生产者
生产者发送消息message到我们的topic主题当中去,同事也能指定发送到哪一个partition中。发送的具体方式根据自己的业务去进行判断。
Consumer消费者
consumer group消费组:一个消费组下可以有多个消费者,当消费组接收到消息message后,这条消息会由我们消费组中的一个消费者来进行消费。所以项目中如果由多个微服务需要监听这个消息执行业务的时候,我们一般会创建两个消费组来监听这个topic,从而分别执行自己的业务逻辑,一个消费组中可以有多个消费者用来提高我们微服务的消费能力。
消费者顺序问题
最简单的方式就是每个topic下只创建一个partition来进行接收消息,然后消费组中只创建一个消费者进行消费消息,那么他肯定就是有序的了,但是我们的消费的并发能力就会下降很多。
发送端 消息的持久化机制acks 及优化
ProducerConfig.ACKS_CONFIG acks等级
- acks = 0 表示produce发送完消息后不需要等待broker确认消息的回复,就可以继续发送下一条消息,这种是性能最高的。会出现丢失消息的情况。
- acks = 1默认值 表示produce发送完消息后leader已经将消息持久化到本地log文件,但是从节点未同步完成。网络抖动会出现丢失消息情况
- acks = 0或all 表示主从节点已经将message持久化到本地log文件中,可以最大的保证消息的不丢失,但是会丢失性能。
ProducerConfig.RETRY_BACKOFF_MS_CONFIG 重复发送的时间间隔 默认值为100ms
- 消息的重试机制,在发送失败后消息会重新进行发送,所以我们一般要做好消费的幂等性。
ProducerConfig.BUFFER_MEMORY_CONFIG 本地的缓冲区默认小大是32M
- 配置了本地缓冲区,消息会先到达本地缓冲区,从而发送端提高性能
ProducerConfig.BATCH_SIZE_CONFIG 批量发送大小 默认值为16kb 设置值为0表示立即发送
ProducerConfig.LINGER_MS_CONFIG 批量发送间隔 默认值为0 可以设置为10ms
- 我们可以设置批量发送的大小为32kb,当消息的大小到达32kb时就会批量发送这些消息,或者在消息大小没有到达32kb时,时间过了10ms这些消息也会批量被发送出去。主要是为了提高性能。
发送消息的模式中也有两种
- 同步发送:等待消息发送成功返回发送结果 producer.send(producerRecord).get();
- 异步回调发送 producer.send(producerRecord, new Callback() { }
- 同步阻塞主要就是因为.get()方法,send()方式本身就是异步发送的。
发送端 及优化
一个消费组中可以有多个消费者,但是该条message消息只会被其中的一个消费者进行消费。消费端会记录partition中的消费偏移量offset。用于知道消费到具体哪个位置。
当一个新的消费者启动时,是没有记录当前消费的偏移量offset的,但他只会去消费启动之后发送到该主题下的消息。
consumer也会不断的向broker发送心跳去保证自己的可用性,如果一直感知不到consumer的心跳就会被踢出该消费组。
consumer不仅可以根据offset来进行消费消息,也可以配置根据时间段来poll消费消息。
consumer在每次poll完消息后进行消费,在所有消息消费完成后会需要提交偏移量offset,我们也能配置同步提交或者是异步提交。