1. 什么是kafka?
kafka是分布式发布-订阅消息系统,LinkedIn公司开发的,之后称为apache的一部分。kafka是一个分布式、可划分,冗余备份的持久性日志服务,主要用于
处理流失数据
2. 为什么用kafka,为什么要使用消息队列
缓冲和削峰:上游数据突发,下游扛不住。或者下游数据没有足够的机器来保证冗余
解耦和扩展性: 针对数据编程即可获取扩展能力
冗余: 可以采用一对多的方式,一个生产者发布消息,被多个topic订阅。
健壮性: 消息队列可以堆积请求。
异步通信: 可以不立即处理消息,堆积在那里,等用户想处理的时候在处理。3. ISR、AR、ISR的伸缩
ISR:IN-SYNC REPLIACAS 副本队列同步
AR: Assigned Replicas 所有副本 AR=ISR+OSR
OSR: Outof-Sync Replicas4. kafka中的broker是干什么的?
broker是消息的代理,Producers往Broker里面的指定topic写数据,Consumer从Brokers里面拉取指定的Topic消息
5. kakfa follwer如何与leader同步数据
kafka复制采用ISR的方式同步数据
6. kafka为什么快?
Cache FileSystem Cache PageCache缓存 顺序写入,顺序写入大多数情况比随机写入内存块
Zero-copy 零拷贝技术减少拷贝次数 。Batching of messages 批量量处理。合并小的请求,然后以流的方式进行交互,直顶网络上限7. kafka producer 优化打入速度
增加线程 提高 batch.size
增加更多 produce 实例
增加partition 数
设置 acks=-1 如果延迟增到:可以增到num.replica.fetchers调解
kafka消息发送有两种方式 :同步(sync)和异步(async)。默认是异步,通过producer.type设置。kafka通过配置request.required.acks熟悉来确认消息的生产
- 0 表示不进行消息接受是否成功确认
- 1表示当leader接受成功时确认
- -1表示leader和Follower都接收成功时的确认
ack=0 不和kafka集群确认成功,可能丢失
akc=1 同步模式下,只有leader确认接收成功后但挂掉了,副本没有同步,数据可能丢失
1.同步模式下 数据丢失解决方案:
producer.type=sync 加锁
request.required.acks=-1 双方都需要确认
2.异步模式下:
当buffer满了数据还没有发送,如果设置的时立即清理,数据丢失风险很大,设置为阻塞模式
block.on.buffer.full=true
3.kafka在选举新节点的时候,如果默认允许未被同步的节点被选为主节点,数据会丢失,因此设置按需设置false unclean.leader.election.enable = false
[^]: 具体操作方案 kafka限速=>开启重试机制=>将acks修改成all,表示至少成功发送一次。也就是所有处于ISR的分区都确认接收到消息9.kafka如何解决消息重复的问题
``` 生产者端:enable.idempotence=true 开启精准一次性。也就是幂等性。开启后,kafka首先会让producer自动将 acks=-1,再将producer端的retry次数设置为Long.MaxValue,再在集群上对每条消息进行标记去重! 消费者端: 消费端用offset的方式来进行消费数据,所以如果在offset提交过程中出现了问题,就会造成数据重复消费的问题。
1. 手动维护offset
2.加大参数kafka.consumer.session.timeout 避免被错误关闭
3. 加大消费能力
4. 在下游对数据进行去重
```