kafka中文教程

原创
半兽人 发表于: 2015-01-01   最后更新时间: 2021-04-21 17:39:42  

本网翻译整理Apache kafka,提供Apache kafka完整学习文档。


布 & 订阅
数据流,如消息传递系统

高效并实时

数据安全地在分布式集群中复制存储

kafka

kafka是用于构建实时数据管道和流应用程序。具有横向扩展,容错,wicked fast(变态快)等优点,并已在成千上万家公司运行。

简单说明什么是kafka

Apache kafka是消息中间件的一种,我发现很多人不知道消息中间件是什么,在开始学习之前,我这边就先简单的解释一下什么是消息中间件,只是粗略的讲解,目前kafka已经可以做更多的事情。

举个例子,生产者消费者,生产者生产鸡蛋,消费者消费鸡蛋,生产者生产一个鸡蛋,消费者就消费一个鸡蛋,假设消费者消费鸡蛋的时候噎住了(系统宕机了),生产者还在生产鸡蛋,那新生产的鸡蛋就丢失了。再比如生产者很强劲(大交易量的情况),生产者1秒钟生产100个鸡蛋,消费者1秒钟只能吃50个鸡蛋,那要不了一会,消费者就吃不消了(消息堵塞,最终导致系统超时),消费者拒绝再吃了,”鸡蛋“又丢失了,这个时候我们放个篮子在它们中间,生产出来的鸡蛋都放到篮子里,消费者去篮子里拿鸡蛋,这样鸡蛋就不会丢失了,都在篮子里,而这个篮子就是”kafka“。

鸡蛋其实就是“数据流”,系统之间的交互都是通过“数据流”来传输的(就是tcp、https什么的),也称为报文,也叫“消息”。

消息队列满了,其实就是篮子满了,”鸡蛋“ 放不下了,那赶紧多放几个篮子,其实就是kafka的扩容。

各位现在知道kafka是干什么的了吧,它就是那个"篮子"。

kafka名词解释

后面大家会看到一些关于kafka的名词,比如topic、producer、consumer、broker,我这边来简单说明一下。

  • producer:生产者,就是它来生产“鸡蛋”的。
  • consumer:消费者,生出的“鸡蛋”它来消费。
  • topic:你把它理解为标签,生产者每生产出来一个鸡蛋就贴上一个标签(topic),消费者可不是谁生产的“鸡蛋”都吃的,这样不同的生产者生产出来的“鸡蛋”,消费者就可以选择性的“吃”了。
  • broker:就是篮子了。

大家一定要学会抽象的去思考,上面只是属于业务的角度,如果从技术角度,topic标签实际就是队列,生产者把所有“鸡蛋(消息)”都放到对应的队列里了,消费者到指定的队列里取。

征集

如果你也想分享一些文章,例子。欢迎入群交流:14085484

注意:本群只与文章贡献者进行交流,不回答任何技术咨询,技术问答请到网站上提问,谢谢。

微信公众号

微信公众号,我会定期分享一些实用的操作源码。
screenshot

怎么样才算真正的学会kafka

最近面试发现,很多人用过kafka,但是没人了解原理,我们可是很注重原理的(PS:要不然怎么知道你真的会呢)。

  • kafka节点之间如何复制备份的?
  • kafka消息是否会丢失?为什么?
  • kafka最合理的配置是什么?
  • kafka的leader选举机制是什么?
  • kafka对硬件的配置有什么要求?
  • kafka的消息保证有几种方式?
  • kafka为什么会丢消息?

......你是否都答得上来?(欢迎大家补充!)

这些问题在下面的文章中都可以找到答案,kafka之所以有这么火热,建议各位一定要看一下。

如何学习kafka

还是那句话,学习任何技术,跟学骑自行车一样,不要一开始只关注它的具体细节是什么。先学着怎么骑,骑着骑着就了解大致的原理,这个时候在去看它的原理,会很轻松。

如果你在学习的过程中遇到什么问题,直接评论或者在kafka问题专区中提问。

章节与kafka官网对应一致

第一章:kafka入门
第二章:客户端API
第三章:kafka的配置
第四章:kafka如何设计的
第五章:kafka的实现
第六章:kafka的常用操作,如扩容,删除和增加topic
第七章:kafka硬件和操作系统
第八章:kafka监控
第九章:kafka安全
第十章:kafka连接器
第十一章:kafka 流
第十二章:kafka源码
第十三章:实战笔记(kafka命令大全

我们的内容会根据官网的更新,而定期更新。



您需要解锁本帖隐藏内容请: 点击这里
本帖隐藏的内容


上一条: 到头了!
下一条: Apache Kafka下载

  • 请问大佬kafka可以创建大量的topic吗,topic的数量是否有限制,创建topic的代价是什么。

    kafak消费者拉取数据时是否可以带条件,比如只拉取一周内符合name=zhangsan的数据

    博主你好,java想获取kafka收到消息的那个时间戳,我是用kafkaTemplate发送的,用哪个API,或者哪个对象里面有这个时间戳?

    • 发送的结果是一个RecordMetadata,它指定了消息发送的分区,分配的offset和消息的时间戳。如果topic使用的是CreateTime,则使用用户提供的时间戳或发送的时间(如果用户没有指定指定消息的时间戳)如果topic使用的是LogAppendTime,则追加消息时,时间戳是broker的本地时间。
      参见 timestamp - topic/partition中记录的时间戳。

        博主您好,我想请教一个问题,我这边想要consumer重启之后(groupId不变),直接将offset设置成最新。然后使用了seekToEnd方法,但是我看注释说seekToEnd()是惰性的,只有等到调用poll()方法时才会去查询offset???然后执行中就报错

        [Consumer clientId=consumer-1034-1, groupId=1034] Offset commit failed on partition test-0 at offset 15: The coordinator is not aware of this member.
        
        • 不知道这个成员。
          你到问题专区,把完整代码贴一下吧。
          另外,group组设置一样的,每次拉起来就从上次的消费的位置开始,为啥要每次手动设置呢。

            博主您好,我最近使用kafka遇到一个问题,就是我消费kafka的消息存储到数据库,但是因为插入数据库的过程比较慢,但是消费消息又快,导致jvm内存溢出的情况,我应该怎么去控制消费的速度,或者您建议一下解决方案,谢谢。

            大佬请教两个问题:一,consumer.poll 拉取kafka中消息(外层while(true))经常前几次拉不到数据,这是什么原因(kafka中一直有数据的),网络还是kafkaz机制的原因??? 二,consumer.poll topic有三个分片,只有一个消费者,每次拉取时候,是随机从分片上拉取数据的,6中可能;这是什么原因呢, 打扰了,谢谢!!!

            • 1、跟订报纸一样,当你从订阅报纸的那一刻,后续的报纸才会发送给你(之前的不会给你)。
              2、一个消费者会轮询着3个分区来拉取消息。
              3、如果还有疑问,去问题专区提问吧,你的提问还有争议,可以在准确的描述你的场景。

                哥, 最近我在 部署一个kafka服务环境, 当然选择的是最新版本, 2.6.0, 两套环境, linux环境中一直没问题, 后来部署给测试用的环境是window, 刚启动的时候运行的挺好的, 隔一天就出问题了, zookeeper 没有停止, kafka服务停止了, 是不是window环境中不适合部署kafka ?
                我看了下日志:

                [2020-11-04 08:13:39,832] ERROR Failed to clean up log for __consumer_offsets-23 in dir D:\KafkaServer\kafka_2.12-2.6.0\kafka-logs due to IOException (kafka.server.LogDirFailureChannel)
                java.nio.file.FileSystemException: D:\KafkaServer\kafka_2.12-2.6.0\kafka-logs\__consumer_offsets-23\00000000000000000000.timeindex.cleaned -> D:\KafkaServer\kafka_2.12-2.6.0\kafka-logs\__consumer_offsets-23\00000000000000000000.timeindex.swap: 另一个程序正在使用此文件,进程无法访问。
                    at sun.nio.fs.WindowsException.translateToIOException(WindowsException.java:86)
                    at sun.nio.fs.WindowsException.rethrowAsIOException(WindowsException.java:97)
                    at sun.nio.fs.WindowsFileCopy.move(WindowsFileCopy.java:387)
                

                看着异常是移动的时候, 因文件被锁了, 为啥它自己会锁自己的文件呢? 是内部问题还是我的配置会有问题呢?

                • Windows我没部署过额,
                  这个是你重新启动kafka报的吧(kafka进程还在),你先到kafka日志里,看看是否有什么异常导致kafka异常的。

                    大佬,您好,我现在是刚接触到kafka,想请教您一个问题:我用java代码从kafka中消费数据,有时候消费得到有时候消费不到,kafka里面是有数据的,而且消费到的数据offset是一直在一个位置附近,比如:offset值在871-921,再一次访问,返回的offset值为876-926;offset值在0-870,926后面的数据都访问不到,这种问题可能是什么原因呢?是我java代码里面要指定偏移量offset,并每次把偏移量上交,他才会往后读取数据嘛

                    大佬,你好,我有一个场景是kafka建立固定数量的topic,预计20个左右。但我们想通过一个topic不同分区来接收不同业务场景的数据,这样就会造成一个可预计的结果,不同的分区之间数据就会产生明显的数据倾斜,这样的分区数据倾斜,会影响到kafka集群的稳定性吗?

                    • 之前有这么考虑,业务场景会让topic数量按照N次方增加,就担心tpoic数量增加太多,会影响集群性能。官方也是建议使用大topic来解决过多topic问题。

                        大佬,你好,我有三个kafka消费者服务节点,配置是同一个消费者组,监听的是相同的topic,这种情况请问消费数据的时候是三个节点轮流消费还是始终只有一个节点消费

                        • 不是轮流,在正常情况下是固定的。

                          跟topic的分区数有关。

                          比如,你的topic有3个分区,那么你的3个消费者每人会固定消费其中1个分区的消息。
                          如果你的topic有2个分区,那么你其中一个消费者永远也拿不到消息,直到有其他的消费者故障了。

                            • 我试了下,远程服务用的storm整合的kafka,我本地不启动服务的情况下是可以正常消费数据的,但是我本地启动服务的话在我本地的服务基本就全部消费了,远程服务就消费不到了,除非我本地服务停掉。我的疑问是我本地的服务怎么抢到消费的呢?

                                • 还有个问题就是我批量消费kafka数据的时候,是设置的业务处理完之后再手动提交的。如果业务操作处理失败了,而我不想让它影响其他数据的消费,所以这把数据的offset记录到mysql,然后提交offset,定时任务去mysql获取失败的offset重新消费。请问我可以设置失败的时候不提交(也就是不持久化),然后跳过这条提交下一条数据,后续再重新消费这条,可以这样操作么

                                    • 换个消费者组名是可以,但是我不知道是什么导致在使用相同的消费者组监听相同的topic而且远程服务没有宕机的情况下本地消费者抢到数据进行消费的(手动捂脸),虽然这种情况理论上不应该存在

                                      • 最近问答 更多
                                        最近动态 更多