1. 为什么要用kafka?
    1.流量削峰:在秒杀或抢购活动中,一般会因为流量暴增,应用因处理不过来而挂掉,此时一般会引入消息队列,这样流量会先进入消息队列,我们的应用再根据自己的实际处理能力来消费这些消息,从而达到缓解流量暴增对系统构成的压力。
    2.应用解耦:在系统交互时,有时我们很难一次性就设计出非常完善的接口,可能会随着业务发展,这些交互接口也会不断的变迁,如果我们的系统较多,系统间交互也较多,维护起来可能就是噩梦,这是可能就需要考虑引入一种基于数据的接口层(消息队列),这样各个系统可以独立的扩展或修改自己的处理过程,只要保证他们准守实现设计的数据格式约束。解耦的同时也提高了系统的稳定性(某个组件失效不会影响其他部分正常运行)和扩展性(可以横向扩展系统以增加处理消息的能力)。
    3.异步处理:有时候我们的业务逻辑可能涉及到很多步骤,而且这些步骤可能上下关联性不是很强,如果我们串行执行时,总耗时=每个步骤耗时之和,如果我们让每个步骤并行处理,总耗时< 每个步骤耗时之和,在这里我们就可以引入消息队列,将每个处理步骤发送到消息队列,并且针对每个处理步骤都有对应的线程去监听,这样就能达到串行执行异步化转为并行执行,从而提高系统的的吞吐量。
    4.冗余存储:消息队列一般会把消息存储起来,只有消费完成后,才把消息删除,这样就防止了某些时候因为处理异常,而导致数据丢失的问题。
  2. 如何确保kafka数据不丢?
    1.生产者的数据不丢失
    kafka的ack机制:在kafka发送数据的时候,每次发送消息都会有一个确认反馈机制,确保消息正常的能够被收到,其中状态有0,1,-1。
    如果是同步模式:
    ack设置为0,风险很大,一般不建议设置为0。即使设置为1,也会随着leader宕机丢失数据。所以如果要严格保证生产端数据不丢失,可设置为-1。
    如果是异步模式:
    也会考虑ack的状态,除此之外,异步模式下的有个buffer,通过buffer来进行控制数据的发送,有两个值来进行控制,时间阈值与消息的数量阈值,如果buffer满了数据还没有发送出去,有个选项是配置是否立即清空buffer。可以设置为-1,永久阻塞,也就数据不再生产。异步模式下,即使设置为-1。也可能因为程序员的不科学操作,操作数据丢失,比如kill -9,但这是特别的例外情况。
    2.消费者的数据不丢失
    通过offset commit 来保证数据的不丢失,kafka自己记录了每次消费的offset数值,下次继续消费的时候,会接着上次的offset进行消费。
    而offset的信息在kafka0.8版本之前保存在zookeeper中,在0.8版本之后保存到topic中,即使消费者在运行过程中挂掉了,再次启动的时候会找到offset的值,找到之前消费消息的位置,接着消费,由于 offset 的信息写入的时候并不是每条消息消费完成后都写入的,所以这种情况有可能会造成重复消费,但是不会丢失消息。
  3. 那些情景会造成消息漏消费?
    先提交offset,后消费,有可能造成数据的重复
  4. 设置多少个topic合适?
    通常情况有多少日志类型,设置多少个topic
  5. kafka中的ISR,AR又代表什么?
    ISR:与leader同步的follower集合
    AR:分区的所有副本
  6. kafka分区的策略?
    kafka分区分配策略:Rang和RoundRobin
    Rang:默认分区策略,先分区按顺序排序,消费组按字母排序,然后分区总数除以消费者线程数总数,得到每个消费者消费多少分区,如果除不尽增加一个分区
    例如,我们有10个分区,两个消费组(c1,c2),3个消费组线程,10/3=3而且除不尽
    C1-0 将消费 0, 1, 2, 3 分区
    C2-0 将消费 4, 5, 6 分区
    C2-1 将消费 7, 8, 9 分区
    RoundRobin:先所有主题分区组成TopicAndPartition列表,再对TopicAndPartition列表进行hashCode排序,最后按照轮询的方式发送给每一个消费线程。
  7. Kafka消息数据积压,Kafka消费能力不足怎么处理?
    1.如果是kafka消费能力不足,则可以考虑增加topic数,并且提高消费组的消费者
    2.如果是下游的数据处理不及时,提高每次拉取的数量。批次拉取的数据过少,使处理的数据少于生产的数据,造成数据的积压。
  8. Kafka中的数据是有序的吗?
    单分区内有序;多分区,分区与分区间无序;