1. 简单流程概述

Android和kafka通信 kafka同步发送消息_数据

 

  A. 流程描述

    a. producer先从zookeeper的"/brokers/.../state"节点找到该partition的leader
    b. producer将消息发送给该leader
    c. leader将消息写入到本地的log
    d. follower从leader拉取消息,写入本地的log后向leader发送ack
    e. leader收到ISR中的replica的ack后,增加HW(high watermark,最后commit的offset)并向producer发送ACK。

 

2. 消息发送的方式

  Kafka的Producer发送消息采用的是异步发送的方式,且在新版的Kafka ApI中只有异步的发送方式。

  但是可以通过异步发送的API达到同步的效果。

3. Kafka发送消息的具体流程

  

Android和kafka通信 kafka同步发送消息_回调函数_02

 

  在消息发送过程中,涉及到两个线程,以及一个线程共享变量-RecordAccumulator.

  两个线程:

    一是主线程,负责将消息进行封装和加工发送给消息中间件(RecordAccumulator)

    二是send线程,负责从消息中间件中拉取数据发送到主题(Topic)的对应分区(Partition)

  A. 流程描述

    main线程

      a. 生产将要发送的数据封装成ProducerRecord对象,目的是发送到消息中间件

      b. 中间要经过拦截器列表、序列化器和分区器将消息发送到消息中间件

      c. RecordAccumulator中有多个队列,与topic的分区相对应。消息发送时直接发送到分区对应的RecordAccumulator队列中

    sender线程

      d. 当RecordAccumulator中攒够一批数据后,即达到指定量的数据之后,Sender线程将这一批数据拉取并发送给Topic。

          控制参数:batch.size=>只有数据积累到batch.size之后,sender才会发送数据。

      e. 同时,如果RecordAccumulator中队列迟迟到不到指定量的数据时,会等到一定时长时发送。

          控制参数:linger.ms=>如果数据迟迟未达到batch.size,sender等待linger.time之后就会发送数据


 

 

 4. Kafka的重试机制

  

Android和kafka通信 kafka同步发送消息_回调函数_03

 

  消息的重试的实现需要在API的send方法中完成回调函数,回调函数会在producer收到ack时调用。

  回调函数为异步调用,相当于另一个线程去实现。

  该方法有两个参数,分别是RecordMetadata和Exception。

  如果Exception为空,说明消息发送成功,如果Exception不为空,说明消息发送失败。

  在回调函数中除了记录日之外,基本不能实现其他有意义的事情。

消息发送失败会自动重试,不需要我们在回调函数中手动重试。

   A. 流程描述

    a. sender线程发送数据到Kafka Server,当Kafka处理数据结束后,会判断数据是否写入成功。

    b. 如果数据处理成功,则返回给Producer相关RecordMetadata和Exception,此时Exception为空

    c. 如果数据处理失败,则再次判定是否可以进行重发消息。

    d. 如果消息可以重试,则再次放入到RecordAcumulater,进行消息的重发。

    e. 如果消息不可进行重试,则将消息返回给Producer相关的RecordMetadata和Exception,此时Exception不为空。