1. Kafka入门(消息写入磁盘)
topic有多个分区(分片),分配在多个broker中,分区之间有副本
不同消费者有不同的位移,每个分区最后读取的消息偏移量保存在Zookeeper 或Kafka上,读取状态不会丢失。
定义:点对点模型和发布订阅模型
作用: 削峰填谷,Kafka是消息引擎系统,也是分布式流处理平台
客户端服务端:生产者和消费者统称为客户端(Clients),Kafka 的服务器端由被称为 Broker 的服务进程构成,即一个 Kafka 集群由多个 Broker 组成
高可用(booker,副本),可伸缩(分区)
2. 客户端
分区(每个分区的消息是有顺序的)
- 作用(可伸缩,可放到多个机器上,高吞吐,负载均衡)
- 策略(轮询,随机,按消息键保序)
如何保证消息顺序(单个分区或基于某个值按照消息键保存,实现单个分区内的顺序)
2.1 压缩( Producer 端压缩、Broker 端保持、Consumer 端解压缩)
有时Broker 会解压缩解压缩(因为消息体格式不一样,主要是为了兼容老版本的消费者程序),
2.2 无消息丢失
生产者有副本(ISR,设置最大延时,重试,副本数等),发消息对回执做处理,producer的ack机制
消费者不要自动提交位移
Kafka 只对“已提交”(当 Kafka 的若干个 Broker 成功地接收到一条消息并写入到日志文件后,且 Producer 接到 Broker 的应答)的消息做有限度(消息保存在 N 个 Kafka Broker 上,那么这个前提条件就是这 N 个 Broker 中至少有 1 个存活)的持久化保证。
- 不用producer.send(msg),而要使用 producer.send(msg, callback),要使用带有回调方法的API,我们可以根据回调函数得知消息是否发送成功,如果发送失败了我们要进行异常处理,比如存储到其他介质来保证消息不丢
- 维持先消费消息(阅读),再更新位移(书签)的顺序
- 如果是多线程异步处理消费消息,Consumer 程序不要开启自动提交位移,而是要应用程序手动提交位移
如果有些消息我们是可以容忍丢失的,我只希望kafka以最快的速度接收消息
- 0,producer不等待broker的ack,这一操作提供了一个最低的延迟,broker一接收到还没有写入磁盘就已经返回,当broker故障时有可能丢失数据。
- 1,producer等待broker的ack,partition的leader落盘成功后返回ack,如果在follower同步成功之前leader故障,那么将会丢失数据。
- -1,(all):producer等待broker的ack,partition的leader和follower全部落盘成功后才返回ack。但是如果在follower同步完成后,broker发送ack之前,leader发生故障,那么会造成数据重复。
retries=MAX(重试)
unclean.leader.election.enable = false(follower replica落后太多的不能竞选)
replication.factor ÿ