Kafka中的topic和partition

阅读数:104 评论数:0

跳转到新版页面

分类

python/Java

正文

一、概述

broker 一台kafka服务器就是一个broker
topic

topic是一个存储消息的逻辑概念,可以认为是一个消息集合。物理上来说,不同的Topic的消息是分开存储的,每个topic可以有多个生产者向它发送消息,也可以有多个消费者去消费其中的消息。

为了提高topic的负载能力,topic被划分为多个partition。生产者会把同一个topic中的消息分散发到不同的partition中。

partition

不同partition包含的消息是不同的,同一partitin中消息是有序的(offset)。

 

offset

每个消息在被添加到partition时,都会分配一个offset,它是消息在此partition中唯一编号 ,Kafka通过offset保证消息在分区内的顺序,offset的顺序不跨分区,即Kafka中保证在同一个分区内的消息是有序的。

所以消费者要想定位一条消息需要三个信息:Topic,Partition,Offsets。

consumer group

topic中的一条消息,只能被同一个group中的一个consumer消费

zookeeper

保存中每个topic中每个partition中对应每个consumer group消费的offset

producer

producer发送消息以不同的partition中

consumer

consumer接受数据的时候是按照group来接受,kafka确保每个partition只能同一个group中的一个consumer消费,如果想要重复消费,那么需要其他的组来消费。

二、topic vs partition

      topic是一个逻辑概念,partition是一个物理概念。

1、partition

      partition是一个有序的消息队列,每个partition都对应一个commit log。

(1)为什么kafka的topic下要设置partition分区

      kafka一般不会删除消息,一管这些消息有没有被消费。默认保留最近一周的日志消息。kafka的性能与保留的消息数据量大小没有关系,因为数据是保存在磁盘上的。

      kafka分的考量为以下两点

1

消息日志文件会受到所在机器的文件系统大小的限制,分区之后,理论上一个topic可以处理任意数量的消息数据。

2

为了提高并行度。

(2)单播消费

      让所有消费者处在同一个消费组里,消费组中的多个消费者只有一个可以消费到Partition分区中的消息。类似queue模式,一条消息只能被某一个消费者消费。

(3)多播消费

      多播只要保证这些消费者属于不同的消费组即可。多播消费其实是一条消息能被多个消费者消费的模式,类似publish-subscribe模式

三、kafka的顺序消费

      对于kafka来说,从整体架构上来讲,一般上是不支持顺序消费的。生产者可以选择不同的partition分区发送消息,消费者组可以消费不同partition分区的数据,这样就无法保证顺序性

    解决方法:

1

topic下只设置一个partition分区,在创建一个消费者组,里边一个消费者去消费

缺点是效率低下,不符合kafka高效率的初衷。

2

脱离kafka来实现消息顺序




相关推荐

consumer是非线程安全的,它不能在多线程中使用,所以在shutdownHook线程中不能使用consumer的close方法。如果你没有在程序退出前很好关闭consumer,最明显的行为主

afka在有新消费者加入或者撤出时,会触发rebalance操作,在subscribe订阅主题的时候,我们可以编写回掉函数,在触发rebalance操作之前和之后,提交相应偏移量和获取偏移量。<

一、概述 springboot中有两种方式使用kafka时,直接使用kafka-client连接kafka服务;另一种是使用spring-kafka框架来连接kafka。 1、版本兼容 使用时要注意版

很多应用程序使用Log4j记录日志,如何使用Kafka实时的收集与存储这些Log4j产生的日志呢?一种方案是使用其他组件(比如Flume,或者自己开发程序)实时监控这些日志文件,然后发送至Kaf