
可靠的数据传递
|
93
•
acks=1 意味着首领在收到消息并把它写入到分区数据文件(不一定同步到磁盘上)时
会返回确认或错误响应。在这个模式下,如果发生正常的首领选举,生产者会在选举时
收到一个 LeaderNotAvailableException 异常,如果生产者能恰当地处理这个错误(参
考
6.4.2
节),它会重试发送消息,最终消息会安全到达新的首领那里。不过在这个模式
下仍然有可能丢失数据,比如消息已经成功写入首领,但在消息被复制到跟随者副本之
前首领发生崩溃。
•
acks=all 意味着首领在返回确认或错误响应之前,会等待所有同步副本都收到消息。如
果和 min.insync.replicas 参数结合起来,就可以决定在返回确认前至少有多少个副本
能够收到消息。这是最保险的做法——生产者会一直重试直到消息被成功提交。不过这
也是最慢的做法,生产者在继续发送其他消息之前需要等待所有副本都收到当前的消息。
可以通过使用异步模式和更大的批次来加快速度,但这样做通常会降低吞吐量。
6.4.2
配置生产者的重试参数
生产者需要处理的错误包括两部分:一部分是生产者可以自动处理的错误,还有一部分是
需要开发者手动处理的错误。
如果
broker
返回的错误可以通过
重试
来解决,那么生产者会自动处理这些错误。生产者向
broker
发送消息时,
broker
可以返回一个成功响应码或者一个错误响应码。错误响应码可以
分为两种,一种是在重试之后可以解决的,还有一种是无法通过重试解决的。例如,如果
broker
返回的是 LEADER_NOT_AVAILABLE ...