Kafka最初由Linkedin公司开发的分布式、分区的、多副本的、多订阅者的消息系统。它提供了类似于JMS的特性,但是在设计实现上完全不同,此外它并不是JMS规范的实现。kafka对消息保存是根据Topic进行归类,发送消息者称为Producer;消息接受者称为Consumer;此外kafka集群有多个kafka实例组成,每个实例(server)称为broker。无论是kafka集群,还是producer和consumer都依赖于zookeeper来保证系统可用性集群保存一些meta信息(kafka的0.8版本之后,producer不在依赖zookeeper保存meta信息,而是producer自己保存meta信息)。本文不打算对Apache Kafka的原理和实现进行介绍,而在编程的角度上介绍如何使用Apache Kafka。我们分别介绍如何编写Producer、Consumer以及Partitioner等。
request.required.acks参数来控制消息的可靠性级别,例如,设置为"all"时,需要所有in-sync replicas都确认接收后才认为消息发送成功。retries参数来决定是否重试发送消息。Kafka的Producer通过一系列步骤来确定消息的发送目标,其中分区策略和leader副本的选择是关键步骤,确保了消息能够正确地发送到相应的Broker。同时,通过合理的配置和重试机制,Producer能够保证消息的可靠性和系统的健壮性。
在kafka集群中,每个broker(一个kafka实例称为一个broker)中有多个topic,topic数量可以自己设定。在每个topic中又有多个partition,每个partition为一个分区。kafka的分区有自己的命名的规则,它的命名规则为topic的名称+有序序号,这个序号从0开始依次增加。

在每个partition中有可以分为多个segment file。当生产者往partition中存储数据时,内存中存不下了,就会往segment file里面存储。kafka默认每个segment file的大小是500M,在存储数据时,会先生成一个segment file,当这个segment file到500M之后,再生成第二个segment file 以此类推。每个segment file对应两个文件,分别是以.log结尾的数据文件和以.index结尾的索引文件。
具体来说,Kafka中的每个分区(Partition)由一个或多个Segment组成。每个Segment实际上是磁盘上的一个目录,这个目录下面会包含几个特定的文件:
此外,Segment作为Kafka中数据组织的基本单位,设计成固定大小,这样做可以方便地进行数据的清理和压缩,同时保证性能。当一个Segment文件写满后,Kafka会自动创建一个新的Segment来继续存储数据。旧的Segment文件在满足一定条件(如被消费且达到一定的保留期)后会被删除,释放磁盘空间。

每个segment file也有自己的命名规则,每个名字有20个字符,不够用0填充。每个名字从0开始命名,下一个segment file文件的名字就是上一个segment file中最后一条消息的索引值。在.index文件中,存储的是key-value格式的,key代表在.log中按顺序开始第条消息,value代表该消息的位置偏移。但是在.index中不是对每条消息都做记录,它是每隔一些消息记录一次,避免占用太多内存。即使消息不在index记录中在已有的记录中查找,范围也大大缩小了。
Kafka中的Consumer通过以下步骤来消费数据:
poll()方法时可以设置超时时间(timeout),这样如果没有新消息,消费者会在等待一段时间后返回,并在下次调用poll()时继续尝试获取新消息。综上所述,Kafka的Consumer通过上述流程高效地从Broker拉取并处理数据,这些特性使得Kafka能够在高吞吐量和可扩展性方面表现出色,适合处理大规模数据流的场景。
kafka作为一个消息中间件,是需要定期处理数据的,否则磁盘就爆了。
Kafka通过日志清理机制来删除过期的日志,主要依赖于两个配置参数来实现这一功能:
log.retention.hours参数,可以指定日志文件的保留时间。当日志文件的保存时间超过这个设定值时,这些文件将被删除。delete和compact。delete策略会根据数据的保存时间或日志的最大大小来进行删除。而compact策略则是根据消息中的key来进行删除操作,通常用于特定类型的主题,如__consumer_offsets。此外,在Kafka 0.9.0及更高版本中,日志清理功能默认是开启的(log.cleaner.enable默认为true)。这意味着Kafka会自动运行清理线程来执行定时清理任务。
综上所述,Kafka通过结合保留时间和清理策略的配置,实现了对过期日志的有效管理。这些机制确保了系统资源的合理利用,同时避免了因日志无限增长而导致的潜在问题