Kafka

学习:
PrintWriter类与PrintStream类的方法是对应的。有一个不同之外需提请读者注意,就是当前者的自动清空缓冲区的功能被使能时(构造函数中autoFlush置为true),仅当println()方法被调用时才自动清缓冲区,而不是像PrintStream一样遇到一个换行符就清缓冲。
后者可自定义编码格式,前者为系统编码格式

Zookeeper 在 Kafka 中的作用知道吗?
Broker 注册 : 每个 Broker 就会将自己的 IP 地址和端口等信息记录到该节点中去
Topic 注册 :
同一个 Topic 的消息会被分成多个分区并将其分布在多个 Broker 上,这些分区信息及与 Broker 的对应关系也都是由 Zookeeper 在维护。比如我 创建了一个名字为 my-topic 的主题并且它有两个分区,对应到 zookeeper 中会创建这 些文件夹:/brokers/topics/my-topic/Partitions/0、/brokers/topics/my- topic/Partitions/1
负载均衡 :当 Consumer 消费的时候, Zookeeper 可以根据当前的 Partition 数量以及 Consumer 数量来实现动态负载均衡。

  • Kafka 中 Partition(分区)是真正保存消息的地方,每次添加消息到 Partition(分区) 的时候都会采用尾加法,如上图所示。 Kafka 只能为我 们保证 Partition(分区) 中的消息有序。
    Kafka 中发送 1 条消息的时候,可以指定 topic, partition, key,data(数据) 4 个参数。 如果你发送消息的时候指定了 Partition 的话,所有消息都会被发送到指定的 Partition。并 且,同一个 key 的消息可以保证只发送到同一个 partition,这个我们可以采用表/对象的 id 来作为 key 。

Kafka 如何保证消息的消费顺序?
第1种:(全局消费顺序:比如3个直播间同时发消息,全局顺序就是保证直播间1先发的消息那么一定先到)实现方式:1个Topic(主题)只创建1个Partition(分区),这样生产者的所有数据都发送到了一个Partition(分区),保证了消息的消费顺序。

第2种(局部消费顺序:比如3个直播间同时发消息,局部顺序就是直播间1先发,直播间2后发,但是可能直播间2的消息先到,这个顺序是不保证的。但是直播间1先发了“消息1”,再发了“消息2”,这个顺序是能保证的,也就是在直播间内是有序的,但是直播间之间的消息顺序不能保证。)实现方式:生产者在发送消息的时候指定要发送到哪个Partition(分区)(1个)。

但是绝大多数用户都可以通过message key来定义,因为同一个key的message可以保证只发送到同一个partition,比如说key是user id,table row id等等,所以同一个user或者同一个record的消息永远只会发送到同一个partition上,保证了同一个user或record的顺序。当然,如果你有key skewness 就有些麻烦,需要特殊处理

Kafka 如何保证消息不丢失?
当消费者拉取到了分区的某个消息之后,消费者会自动提交了 offset。自动提交的话会有 一个问题,试想一下,当消费者刚拿到这个消息准备进行真正消费的时候,突然挂掉了,消息 实际上并没有被消费,但是 offset 却被自动提交了。
解决办法也比较粗暴,我们手动关闭自动提交 offset,每次在真正消费完消息之后再自己 手动提交 offset 。 但是,细心的朋友一定会发现,这样会带来消息被重新消费的问题。比如 你刚刚消费完消息之后,还没提交 offset,结果自己挂掉了,那么这个消息理论上就会被消费 两次。

Kafka 判断一个节点是否还活着有那两个条件?
基于这样的背景下,我认为解决重复消费消息问题的方法有几个。

  1. 提高消费端的处理性能避免触发Balance,比如可以用异步的方式来处理消息,缩短单个消息消费的市场。或者还可以调整消息处理的超时时间。还可以减少一次性从Broker上拉取数据的条数。
  2. 可以针对消息生成md5然后保存到mysql或者redis里面,在处理消息之前先去mysql或者redis里面判断是否已经消费过。这个方案其实就是利用幂等性的思想。

Kafka 高效文件存储设计特点是什么?
Kafka 把 topic 中一个 parition 大文件分成多个小文件段,通过多个小文件段,就容易定 期清除或删除已经消费完文件,减少磁盘占用。
⚫ 通过索引信息可以快速定位 message 和确定 response 的最大大小。
⚫ 通过 index 元数据全部映射到 memory,可以避免 segment file 的 IO 磁盘操作。
⚫ 通过索引文件稀疏存储,可以大幅降低 index 文件元数据占用空间大小。

kafka 维护消费状态跟踪的方法有什么?
broker 端的维护消息被消费的记录:一个消息被分发到 consumer 后 broker 就马上进行标记或者等待 customer 的通知后进行标记。这样也可以在消息在消费后 立马就删除以减少空间占用。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值