You*_* Ko 5 apache-kafka kafka-producer-api
平均消息大小很小,但大小各不相同。
我的问题。
谢谢。
出现此查询是因为批处理有多种可用设置。让我尝试把它们说清楚:
卡夫卡设置:message.max.bytes和fetch.max.bytes
Kafka代理限制可以生成的消息的最大大小(批量消息的总大小,如果消息是批量发布的),由集群范围的属性配置message.max.bytes(默认为1 MB)。尝试发送大于此消息的生产者将从代理返回错误,并且该消息将不会被接受。与代理上指定的所有字节大小一样,此配置处理压缩消息大小,这意味着生产者可以发送比未压缩的该值大得多的消息,只要他们将其压缩到配置的大小以下message.max.bytes。
注意:此设置可以被特定主题(但带有 name max.message.bytes)覆盖。
Kafka 代理上配置的最大消息大小message.max.bytes必须与消费者客户端上的集群范围属性fetch.max.bytes(默认为 1 MB)相协调。它配置尝试为请求获取的消息的最大字节数。如果这个值小于message.max.bytes,那么消费者遇到较大消息时将无法获取这些消息,从而导致消费者卡住而无法继续进行的情况。
配置设置replica.fetch.max.bytes(默认为 1MB)决定了代理上每个分区所需的粗略内存量。
制作人设定:max.request.size
此设置控制生产者发送的生产请求的大小。它限制了可以发送的最大消息的大小以及生产者可以在一个请求中发送的消息数量。例如,默认最大请求大小为 1 MB,则您可以发送的最大消息为 1 MB,或者生产者可以将 1000 条大小为 1k 的消息批处理到一个请求中。
此外,代理对其接受的最大消息的大小有自己的限制message.max.bytes)。通常最好让这些配置匹配,这样生产者就不会尝试发送被代理拒绝的大小的消息。
请注意,message.max.bytes(经纪人级别)和max.requrest.size(生产者级别)对批次中请求的最大大小设置了上限,但是batch.size(应低于前两个) 和是实际控制批次大小的linger.ms设置。
制作人设置:batch.size和linger.ms
当多个记录被发送到同一个分区时,生产者会将它们一起批处理。该参数batch.size控制每个批次将使用的最大内存量(以字节为单位)(而不是消息数!)。如果批次已满,则必须发送该批次中的所有消息。这有助于提高客户端和服务器的吞吐量。
小批量会使批处理不太常见,并且可能会降低吞吐量。非常大的大小可能会更浪费内存,因为我们总是会分配指定批量大小的缓冲区以应对其他消息。
(linger.ms默认为 0)设置控制发送当前批次之前等待其他消息的时间量。
默认情况下,一旦有发送者线程可用于发送消息,生产者就会立即发送消息,即使批次中只有一条消息(请注意,仅batch.size指定批次大小的最大限制)。通过将 linger.ms 设置为大于 0,我们指示生产者等待几毫秒以将其他消息添加到批次中,然后再将其发送到代理,即使发送者线程可用也是如此。这会增加延迟,但也会增加吞吐量(因为我们一次发送更多消息,每条消息的开销更少)。
以下是相关配置的定义
生产者配置
batch.size:生产者将尝试对记录进行批处理,直到达到batch.size,然后再发送到kafka(假设batch.size配置为优先于linger.ms)。默认 - 16384字节
max.request.size:请求的最大大小(以字节为单位)。此设置将限制生产者在单个请求中发送的记录批次数量,以避免发送巨大的请求。这实际上也是最大记录批量大小的上限。默认 - 1048576 字节
经纪商配置
message.max.bytes:Kafka允许的最大记录批量大小。默认 - 1000012 字节
replica.fetch.max.bytes:这将允许代理中的副本在集群内发送消息并确保消息被正确复制。
回答您的问题
为了避免生产者发送错误,您不需要将批量大小设置为 2MB,因为这会延迟小尺寸消息的传输。您可以根据平均消息大小以及您想要批处理的数量来保留batch.size
如果不指定批量大小,则采用默认值 16384 字节
所以基本上你必须配置生产者'max.request.size'>=2MB和代理'message.max.bytes'和'replica.fetch.max.bytes'>=2MB。
| 归档时间: |
|
| 查看次数: |
12916 次 |
| 最近记录: |