返回

Producer生产调优之数据可靠性

后端

前言

经过上一章的介绍,我们从配置参数方面了解到一部分生产调优的方式。当然: 参数需要我们通过实际配置进行适当的调整,这是不可避免的~ 而本章内容我们从数据可靠性下功夫,当然本文内容理论居多,稍微略显复杂,我们可以先通过阅读全面了解,然后在实际使用中逐步的消化。

生产者可靠性生产场景

我们先举几个生产者可能产生数据可靠性问题的场景:

  • 生产者配置了retries 后,由于某些错误导致数据发送失败了,但是错误类型是临时的,生产者重试就会成功。
  • 使用acks 来保证数据可靠性的情况下,出现生产者宕机后重启,或者新创建的topic等情况,有可能导致一些数据被重复发送。
  • transaction 下,由于写入数据的方式不恰当,或者出现数据不一致的情况,可能导致事务提交失败。

数据可靠性保障方式

Kafka生产者的数据可靠性通过retries、acks、transaction 三个方面来保障,针对不同的场景,应该采取不同的策略。retries 主要针对的是因网络等问题引起的临时错误;acks 主要针对的是需要保证数据一定会被写入的情况;transaction 主要针对的是需要写入数据时满足一定的事务条件,才能提交写入请求的情况。

生产者参数说明

生产者重试相关参数

  • retries :控制生产者重试发送消息的次数,该参数对重试的次数进行限定,当失败次数大于等于 retries 时,即认为该消息发送失败。
  • retry.backoff.ms :控制生产者在每次失败后,重新发送消息前的等待时间。

生产者确认相关参数

  • acks :控制生产者等待服务器确认消息已被接收的情况。
  • linger.ms :控制生产者将消息暂存在内存中的时间,如果在linger.ms时间内,没有新的消息发送给生产者,生产者将会把已有的消息发送给服务器。

生产者事务相关参数

  • transactional.id :控制生产者的事务标识,同一个transactional.id下的生产者发送的消息将会被视为一个事务。
  • isolation.level :控制生产者的事务隔离级别。

常见场景下的选择

针对不同的场景,我们可以采取不同的数据可靠性保障策略。

  • 如果要保证数据至少被发送一次,并且可以接受数据重复,则可以设置retries=1 ,同时设置acks=1
  • 如果要保证数据被发送到所有副本,并且可以接受数据延迟,则可以设置acks=all
  • 如果需要保证数据写入满足一定的事务条件,则可以使用transaction

性能与可靠性的权衡

Kafka的可靠性保障机制对系统性能是有影响的。一般情况下,可靠性越高,性能越差。因此,在实际应用中,需要根据业务需求,权衡性能与可靠性。

  • 如果业务对数据可靠性要求不高,则可以适当降低可靠性配置,以提高系统性能。
  • 如果业务对数据可靠性要求很高,则需要提高可靠性配置,以保证数据的可靠性。

结论

通过对Kafka生产者可靠性保障机制的介绍,我们了解到了如何通过配置参数来保障数据可靠性。在实际应用中,需要根据业务需求,权衡性能与可靠性,选择合适的配置参数。