kafka
文章平均质量分 62
拾荒路上的开拓者
可能出错的地方,一定会出错
展开
-
Kafka LEO & HW原理
LEOLast And Offset,日志末端偏移量,记录了该副本对象底层日志文件中下一条消息的位移值;举一个例子,若LEO = 10,那么表示在该副本日志上已经保存了10条消息,位移范围是[0, 9]。HWHigh Watermark,高水印值,任何一个副本对象的HW值一定不大于其LEO值,而小于或等于HW值的所有消息被认为是“已提交的”或“已备份的”。HW指向的是实实在在的消息,而LEO总是指向下一条待写入消息,也就是说LEO指向的位置上是没有消息的,例如HW值是7,这表示当8条消息(位原创 2022-03-03 21:49:43 · 399 阅读 · 0 评论 -
Kafka消费者Consume常用参数
下面先来个消费者Demo:import java.util.Arrays;import java.util.Properties;import java.util.concurrent.ExecutorService;import java.util.concurrent.Executors;import org.apache.kafka.clients.consumer.ConsumerRecord;import org.apache.kafka.clients.consumer.Con原创 2022-02-26 11:26:21 · 2676 阅读 · 0 评论 -
Kafka生产者Producer常用参数
下面先来个Producer生产者的Demo案例:import org.apache.kafka.clients.producer.Callback;import org.apache.kafka.clients.producer.KafkaProducer;import org.apache.kafka.clients.producer.ProducerRecord;import org.apache.kafka.clients.producer.RecordMetadata;public原创 2022-02-26 11:02:58 · 2678 阅读 · 0 评论 -
查看kafka topic的消息offset范围
查看各个patition消息的最大Offsetbin/kafka-run-class.sh kafka.tools.GetOffsetShell --topic topic_name --time -1 --broker-list host1:9092,host2:9092,host3:9092查看各个partition消息的最小Offsetbin/kafka-run-class.sh kafka.tools.GetOffsetShell --topic topict_name --time原创 2021-01-26 09:43:19 · 2398 阅读 · 1 评论 -
Kafka高性能之零拷贝机制
所谓的零拷贝是指将数据直接从磁盘文件复制到网卡,而不需要经由应用之手。零拷贝大大提高了应用程序的性能,减少了内核和用户模式之间的上下文切换。对Linux操作系统而言,零拷贝技术依赖于底层的sendfile()方法实现,对于Java语言,FileChannel.transferTo()方法的底层实现就是sendfile()方法。单纯从概念上理解“零拷贝”比较抽象,这里简单地介绍一下它。考虑这样一种常用的情形:你需要将静态内容(类似图片、文件)展示给用户。这个情形就意味着需要先将静态内容从磁盘中复制出来放到原创 2021-01-16 10:37:49 · 315 阅读 · 0 评论 -
Kafka高性能之页缓存(page cache)使用
页缓存是操作系统实现的一种主要的磁盘缓存,以此用来减少对磁盘I/O的操作。具体来说,就是把磁盘中的数据缓存到内存中,把对磁盘的访问变为对内存的访问。为了弥补性能上的差异 ,现代操作系统越来越多地将内存作为磁盘缓存,甚至会将所有可用的内存用途磁盘缓存,这样当内存回收时也几乎没有性能损失,所有对于磁盘的读写也将经由统一的缓存。当一个进程准备读取磁盘上的文件内容时,操作系统会先查看待读取的数据所在的页(page)是否在页缓存(page cache)中,如果存在(命中)则直接返回数据,从而避免了对物理磁盘I/O原创 2021-01-10 21:48:40 · 4412 阅读 · 0 评论 -
Kafka高性能之顺序读写
Kafka依赖于文件系统(更底层地来说即磁盘)来存储和缓存消息,对于各种存储介质如下图所示,层级越高代表速度越快。在传统的消息中间件RabbitMQ中,就使用了内存作为默认的存储介质,而磁盘作为备选介质,以此实现高吞吐和低延迟的特性。有关测试结果表明,一个由6块7200r/min的RAID-5阵列组成的磁盘簇的线性(顺序)写入速度可以达到600MS/s,而随机写入速度只有100KB/s,两者性能相关6000倍。操作系统可以针对线性读写做深层次的优化,比如预读(read-ahead,提前将一个比较大的原创 2021-01-10 21:18:19 · 1072 阅读 · 0 评论 -
Kafka高性能之日志索引
在《Kafka日志文件目录布局》中提到Kafka中每个日志分段文件对应了两个索引文件——xxx.index(偏移量索引文件用来建立消息偏移量到物理地址之间的映射关系)和xxx.timeindex(用于根据指定的时间戳来查找对应的偏移量信息)。Kafka中的索引文件以稀疏索引(sparse index)的方式构造消息的索引,每当写入一定量(由broker端参数log.index.interval.bytes指定,默认值为4096,即4KB)的消息时,偏移量索引文件和时间戳索引文件分别增加一个偏移量索引项和原创 2021-01-10 20:33:53 · 222 阅读 · 0 评论 -
Kafka高性能之日志文件目录布局
Kafka中的消息是以主题为基本单位进行,各个主题在逻辑上相互独立,每个主题又可以分为一个或多个分区。每条消息在发送的时候会根据分区规则被追加到指定的分区中,分区中的每条消息都会被分配唯一的序列号,即偏移量(Offset),如下图如果分区规则设置得合理,消息可以均匀地分布到不同的分区中,从而可以实现水平扩展。在不考虑多副本的情况, 一个分区对应一个日志(Log),为防止Log过大,Kafka引入了日志分段(LogSegment)的概念,将Log切分为多个LogSegment,相当于一个巨型文件被平均原创 2021-01-09 22:41:50 · 679 阅读 · 0 评论 -
Java简单实现Kafka生产者与消费者
<dependency> <groupId>org.apache.kafka</groupId> <artifactId>kafka-clients</artifactId> <version>1.0.0</version></dependency>1、生产者示例代码public class ProducerFastStart { public static fin.原创 2020-12-27 12:33:02 · 494 阅读 · 1 评论 -
Kafka消费者多线程实现
Kafka的生产者KafkaProducer是线程安全的,然而消费者KafkaConsumer却是非线程安全的。KafkaConsumer定义了一个acquire()方法,用来检测当前是否只有一个线程在操作,若有其它线程正在操作会抛出ConcurrentModifycationException异常:java.util.ConcurrentModifycationException: K...原创 2020-02-07 10:29:36 · 4934 阅读 · 1 评论 -
Kafka消费者与消费组
消费者(Consumer)负责订阅Kafka中的主题(Topic),并且从订阅的主题上拉取消息。与其它一些消息中间件不同的是:在Kafka的消费理念中还有一层消费组(Consumer Group)的概念,每个消费都有一个对应的消费组。当消息发布到主题后,只会被投递给订阅它的每个消费组中的一个消费者。如上图所示,某个主题共有4个分区(Partition):P0、P1、P2、P3。有两个消费组...原创 2020-01-23 11:31:20 · 1258 阅读 · 1 评论 -
Kafka生产者架构原理分析
Kafka发送消费称为生产者,在生产者将消息发送出去之前,需要经历拦截器(Interceptor)、序列化器(Serializer)和分区器(Partitioner)等一系列的作用,随后才真正进入发送消息发送流程。本文梳理了Kafka的生产者客户端的整体架构,如下:整个生产者客户端由两个线程协调运行,这两个线程分别为主线程和Sender线程(发送线程)。在主线程中由KafkaProduce...原创 2020-01-23 10:30:36 · 969 阅读 · 2 评论 -
Kafka自定义分区器
Kafka通过生产者KafkaProducer的send()方法将消息发送到broker中,但在发送过程中需要经过拦截器(Interceptor)、序列化器(Serializer)和分区器(Partitioner)的一系列作用之后才能被真正地发往broker。消息在经过序列化后需要确定它发往的分区,如果消息ProducerRecord中指定了partition字段,那么就不需要分区器的作用,因为p...原创 2020-01-22 15:45:35 · 531 阅读 · 0 评论 -
kafka自定义序列化器
在Kafka的生产者与消费者API中,生产者需要用序列化器(Serializer)把对象转换成字节数组才能通过网络发送给kafka,同时消费者也需要用反序列化器(Deserializer)把从Kafka中收到的字节数组转换转换成相应的对象。为使开发者方便地使用序列化器,Kafka自身已经封装了一个序列化器org.apache.kafka.common.serialization.StringSer...原创 2020-01-22 14:52:59 · 766 阅读 · 0 评论 -
常见的kafka面试题及答案
1、请说明什么是Apache Kafka?Apache Kafka是由Apache开发的一种发布订阅消息系统,它是一个分布式的、分区的和重复的日志服务。2、请说明什么是传统的消息传递方法?传统的消息传递方法包括两种:排队:在队列中,一组用户可以从服务器中读取消息,每条消息都发送给其中一个人 发布-订阅:在这个模型中,消息被广播给所有的用户3、请说明Kafka相对传统技术有什么优...原创 2020-01-11 23:36:14 · 455 阅读 · 0 评论