kafka问题记录
kafka如何提高吞吐量
针对生产者来说,生产生并不是消息直接发送到broker上的,而是在生产者有一个缓冲区 RecordAccumulator ,消息临时存放到缓冲区内,缓冲区的默认大小是 64M ,当满足一定的条件,
比如配置的 batch.size ,达到对应的批次大小后,将一次性将缓冲区的数据发送到broker,但是如果长时间达不到批次大小,但是达到了linger.ms 等待时间,也会马上将消息发送给broker。
那么可以配置批次大小提高吞吐量,等待时间可以配置10ms,配置合适的额缓冲区大小,再传输过程中也会有网络传输的消耗,可以使用数据压缩算法提高数据传输性能。
针对消费者如果要提交吞吐量,可以增加topic的分区数,使用同一个消费者组内的多个消费者来协同消费消息,一般让消费者数 等于 分区数。
如果消费者处理数据很快,但是拉取数据少导致的消费的慢,可以调整 max.poll.records 每次拉取的记录数 和 fetch.max.bytes 拉取的最大字节数 ,提交每次拉取获取的数据量。
kafka 如果保证数据可靠性
对于broker 来说,副本数应该设置大于等于2。
对于生产者来说,ack响应级别设置为 -1 ( leader 和isr 队列中所有节点都收到数据到应答)。
数据发送使用同步发送的方式。
kafka 保证幂等性
对于生产者来说,kafka 支持开启幂等性的参数, enable.idempotence 但是此参数仅仅是broker针对同一个 PID,分区id ,offset 的数据。只能保证的是单分区,单会话内部重复。
要保证生产者的幂等性,需要使用生产者事务。生产者事务为每个消息提供了一个trasctionId,并且trasctionId也是持久化到对应的一个topic中的。通过事务消息可以保证跨分区,跨会话的消息在broker上不重复,
但是需要注意的是事务消息在消费端注意设置消费的隔离级别。
针对消费端可以针对消息 做幂等性校验,可以使用redis 或 mysql的唯一索引做唯一性校验。
kakfa 为什么能高效的读写数据?
- kafka 是分布式架构,支持分区扩展,并行数据处理。
- 读数据使用 .index 文件建立稀疏索引,快递定位要消费的数据。
- 顺序写磁盘数据。 生产者发送的数据,broker端写入log文件是通过追加到文件末端进行写入的,写入效率大大提高。
- 页缓存技术,充分利用操作系统的页缓存技术,有写操作的时候写入pageCache ,读取的时候也优先从pageCache读取。
- 零拷贝技术 数据不用经过broker应用层读取,直接写入到磁盘,避免多次拷贝。
页缓存的相关参数: 1. log.flush.interval.messages 强制页缓存刷写到磁盘的条数,默认是 long 的最大值,
2. log.flush.interval.ms 每隔多久,刷数据到磁盘,默认是 null。一般不建议修改,
交给系统自己管理。


