决战圣地玛丽乔亚Day10--kafka学习

概念上

kafka和RocketMQ的结构很类似。除了Broker、Producer、Consumer、Topic。多了一个分区的概念 Partition。对于NameServer的概念,kafka用的是zookeeper来保存信息。包括Broker和Topic的元数据信息。

分区:topic

topic的拆分,一个topic可以拆成指定个数的partition。然后kafka根据策略把分区分布在不同的Broker上。Producer发送某个topic的消息时就可以选择该Topic的某一个分区进行消息发送.

kafka在创建Topic可以指定多个分区,在此基础上再利用选择策略来保证高吞吐量。

然后通过分区的主从副本模式来保证高可用。主副本负责数据读写,主从副本之间的数据会进行同步,主副本挂掉了会重新选举一个新的主。

 

生产者发消息:

1.首先向broker请求获取topic的元数据信息,所有的broker都有缓存消息。

2.消息序列化--->分区器选择一个分区发送消息。

对于同一个topic的同一个分区的消息,会在缓冲区经历批次等待过程,最后通过压缩处理对消息进行批量发送

连接错误,可以通过再次建立连接来解决,“无主(noleader)” 错误则可 以通过重新为分区选举首领来解决。 KafkaProduce可以被配置成自动重试,如果在多次重试后仍无能解决问题,应用程序会收到一个重试异常。另一类错误无出通过重试解决 ,比如 序列化消息失败、缓存区已满,对于这类错误, KafkaProduce不会进行任何重试,直接抛出异常。

消息持久化过程:

不同于RocketMQ的所有MessageQueue的消息记录在一起,kafka采用每个分区一个文件记录的方式。

每个分区都有一个分区目录,放着日志log文件和索引index文件。

日志文件是具体内容,索引文件是找到log文件中的具体位置。  日志文件的大小可以根据log.segment.bytes进行配置。

这些日志文件和索引文件会不断被清理,依赖于topic的保留时长(log.retention.ms)和保留字节大小(log.retention.bytes)决定

 

消费者消费消息:

一个分区只会给一个消费者进行消费,因为消费者每次读都会保存最后一个消息的offset到Topic,下次根据最新的偏移量进行消息读取。

如果不同的Consumer去读同一个分区,会导致偏移量被覆盖,重复进行消息的消费。

 

高性能和高可用:

高性能:

1.批量+压缩:批量发送+压缩算法

2.顺序读写:提高磁盘写入速度

3.零拷贝技术:

kafka默认使用sendfile技术来实现消息的读取和写入,sendfile相对于mmap不仅可以减少拷贝次数,还可以减少上下文切换的次数。

4.索引文件

 

高可靠

1.1.acks参互

2.不完全首领选举

3.最小同步副本

4.同步异步刷盘

 

posted @   NobodyHero  阅读(26)  评论(0编辑  收藏  举报
相关博文:
阅读排行:
· 25岁的心里话
· 基于 Docker 搭建 FRP 内网穿透开源项目(很简单哒)
· 闲置电脑爆改个人服务器(超详细) #公网映射 #Vmware虚拟网络编辑器
· 一起来玩mcp_server_sqlite,让AI帮你做增删改查!!
· 零经验选手,Compose 一天开发一款小游戏!
点击右上角即可分享
微信分享提示