介绍一下生产消息的流程

  1. 构建消息,将需要发送的内容打包成一个消息结构
  2. 序列化消息为二进制结构,以在网络中传播
  3. 进行分区选择,计算需要发送到哪个partition,发送消息到该partition对应的Broker

Kafka的ACK的三种机制

生产者的写入策略:

  • acks = 0:生成者在发送消息后不会等待来自服务器的确认,所以生产者是不知道消息是否成功,也就无法去重试。最不可靠但是性能最好
  • acks = 1:生产者在发送消息后会等待主节点的确认,但不会等待所有副本的确认。相对可靠,性能比较高
  • acks = all或-1:只有在主节点和所有副本都确认后,生产者才会确认。保证了消息的可靠性,但是性能最差

生产过程何时会发生QueueFullException以及如何处理

生产者发送消息的速度过快,导致Kafka生产者这一侧缓冲区满了,就会抛出异常

解决:

  • 等待重试:发生QueueFullException异常的时候,可以等待一段时间后再次尝试重新发送消息。在等待的过程中可以调整生产者的发送速度或者增加Kafka消息队列大小等方式来避免发生QueueFullException
  • 增加Kafka的缓冲区大小:修改Kafka的配置文件来增大生产者这一侧的缓冲区
  • 限流控制:限制生产者发送消息的速度

Kafka生产者何时发送出消息

  • 生产者客户端累计的数据大小达到Batch,默认是16KB(框架支持)
  • 生产者客户端缓冲区累计的空闲等待时间间隔,默认是0ms,也就是收到数据就发送

生产者发送消息的模式有几种(Java)

Java的SDK支持三种

  1. 同步发送,性能最差,可靠性最强
  2. 发送即忘:这种模式不需要等待Kafka服务器的响应,可靠性低,但是性能最好
  3. 异步发送不阻塞调用线程:允许调用者注册回调函数处理发送结果或异常,适用于对可靠性有要求也保持高性能的场景