1.为什么性能比较高:
(1)磁盘的顺序读写,磁盘成本低,随机读写性能较低,但是顺序读写
Kafka是顺序写,每一个partition都是一个单独的文件,新来的消息直接往文件末尾递增,已消费的数据不会立刻删除,基于时间或者分区文件大小批量删除
(2)利用了操作系统的页缓存
消息不再被组织成对象,而是成为字节流进行紧密存储
(3)零拷贝
零拷贝不是指没有拷贝,而是指内核态和用户态之间不再相互拷贝
传统的应用:
Kafka:
(4)批量操作
Kafka提供了大量批处理API,可以对数据进行压缩合并,通过更小的数据包以更快的方式进行数据的发送。
2如何保证Kafka消息不丢失
对于Acks(这是一个字符串类型而不是整数类型)的解释:
这个参数用来指定分区中必须要有多少个副本接收到这条消息是接入成功的。Acks的取值有3种类型(注意不是数值越大越可靠,-1是最可靠的,注意1和0的区别):
(1)acks=1。默认值就是1,生产者发送消息之后,只要分区的leader副本成功写入消息,那么它就会收到来自服务端的成功响应。设置为1是消息可靠性和吞吐量之间的折中方案
(2)acks=0。生产者发送消息之后不需要等待任何服务端的响应。其他配置一样的情况下,acks设置为0可以达到最大的吞吐量。
(3)acks=-1 或者acks=all.生产者在发送消息之后,需要等待ISR中的所有副本都成功写入消息之后才能收到来自服务端的成功响应。其他环境配置一样的情况下,acks设置为-1(all)可以达到最高得可靠性
生产者把消息投递到服务端以后,即使消息服务器宕机了,也会记录日志,恢复之后也可以根据日志进行相应的补偿,
消费者不要设置自动提交