来自《kafka权威指南》第3章
- client.id
该参数可以是任意的字符串,服务器会用它来识别消息的来源,还可以用在日志和配额指标里。 - max.in.flight.requests.per.connection
该参数指定了生产者在收到服务器晌应之前可以发送多少个消息。它的值越高,就会占用越多的内存,不过也会提升吞吐量。 把它设为1可以保证消息是按照发送的顺序写入服器的,即使发生了重试。 - timeout.ms、request.timeout.ms和
request.timeout.ms指定了生产者在发送数据时等待服务器返回响应的时间,metadata. fetch. timeout. ms 指定了生产者在获取元数据(比如目标分区的leader是谁)时等待服务器返回响应的时间。如果等待响应超时,那么生产者要么重试发送数据,要么返回一个错误(抛出异常或执行回调)。
timeout.ms指定了broker等待同步副本返回消息确认的时间,与acks 的配置相匹配一一如果在指定时间内没有收到同步副本的确认,那么 broker 会返回一个错误 - max.block.ms
该参数指定了在调用 send()方法或使用 partitionsFor() 方法获取元数据时生产者的 阻塞时间。当生产者的发送缓冲区已满,或者没有可用的元数据时,这些方法就会阻塞。在阻塞时间达到max.block.ms 时,生产者会抛出超时异常。
11 . max.request.size
该参数用于控制生产者发送的请求大小。它可以指能发送的单个消息的最大值,也可以指单个请求里所有消息总的大小。例如,假设这个值为1MB ,那么可以发送的单个最大消息为 1MB ,或者生产者可以在单个请求里发送一个批次,该批次包含了 1000 个消息,每个消息大小为1KB 。另外, broker 对可接收的消息最大值也有自己的限制(message. max. bytes ),所以两边的配置最好可以匹配,避免生产者发送的消息被 broker 拒绝. - receive.buffer bytes 和send.buffer.bytes
这两个参数分别指定了 TCP socket 接收和发送数据包的缓冲区大小. 如果它们被设为-1,就使用操作系统的默认值。如果生产者或消费者与 broker 处于不同的数据中心,那么可以适当增大这些值,因为跨数据中心的网络一般都有比较高的延迟和比较低的带宽。
顺序保证
Kafka 可以保证同一个分区里的消息是有序的。也就是说,如果生产者按照
一定的顺序发送消息, broker 就会按照这个顺序把它们写入分区,消费者
也会按照同样的顺序读取它们。在某些情况下,顺序是非常重要的。例如,往
个账户存入 100 元再取出来,这个与先取钱再存钱是截然不同的!不过,
有些场景对顺序不是很敏感。
如果把retries 设为非零整数,同时把max.in.flight.requests.per.connection
设为比1大的数,那么,如果第一个批次消息写入失败,而第二个批次写入
成功, broker 会重试写入第一个批次。如果此时第一个批次也写入成功,那
么两个批次的顺序就反过来了。
一般来说,如果某些场景要求消息是有序的,那么消息是否写入成功也是
很关键的,所以不建议把retries设为0 。可以把max.in.flight.requests.per.connection 设为1 ,这样在生产者尝试发送第一批消息时,就不会有其他的消息发送给 broker 。不过这样会严重影响生产者的吞吐量 ,所以只有在对消息的顺序有严格要求的情况下才能这么做。