这可能吗?生产者 batch.size * max.request.size > 经纪人 max.message.bytes
Is this possible? producer batch.size * max.request.size > broker max.message.bytes
平均邮件大小较小,但大小不一。
- 平均邮件大小:1KBytes
- 1MBytes 任意速率的消息收入。 / 因此,生产者的 max.request.size = 1MBytes
- 经纪人的max.message.bytes = 2MBytes
我的问题。
- 为避免产生尺寸错误,用户必须设置 batch.size LTE 2?
- 或者生产者库自动决定批量大小以避免错误? (即使用户设置大batch.size)
谢谢。
下面是相关配置的定义
生产者配置
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.
出现此查询是因为批处理有多种可用设置。让我试着把它们说清楚:
卡夫卡设置:message.max.bytes
和fetch.max.bytes
Kafka broker 限制了可以生成的消息的最大大小(如果消息是批量发布的,则批次中消息的总大小)由集群范围的 属性 message.max.bytes
(默认为 1 MB)。尝试发送大于此大小的消息的生产者将从代理收到错误消息,并且该消息将不会被接受。与在代理上指定的所有字节大小一样,此配置处理压缩的消息大小,这意味着生产者可以发送比未压缩的此值大得多的消息,前提是他们将其压缩到配置的 message.max.bytes
大小。
注意:此设置可以被特定主题覆盖(但名称为 max.message.bytes
)。
在 Kafka 代理上配置的最大消息大小 message.max.bytes
必须与消费者客户端上的集群范围 属性 fetch.max.bytes
(默认为 1 MB)相协调。它配置尝试获取请求的消息的最大字节数。如果这个值小于message.max.bytes
,那么consumer遇到更大的消息会取不到这些消息,导致consumer卡住无法继续的情况。
配置设置 replica.fetch.max.bytes
(默认为 1MB)决定了代理上每个分区所需的粗略内存量。
生产者设置:max.request.size
此设置控制生产者发送的生产请求的大小。它限制了可以发送的最大消息的大小和生产者可以在一个请求中发送的消息数。例如,默认最大请求大小为 1 MB,您可以发送的最大消息为 1MB,或者生产者可以将 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,我们指示生产者等待几毫秒以在将其发送到代理之前向批处理中添加其他消息,即使发送线程可用也是如此。这增加了延迟,但也增加了吞吐量(因为我们一次发送更多消息,每条消息的开销更少)。
平均邮件大小较小,但大小不一。
- 平均邮件大小:1KBytes
- 1MBytes 任意速率的消息收入。 / 因此,生产者的 max.request.size = 1MBytes
- 经纪人的max.message.bytes = 2MBytes
我的问题。
- 为避免产生尺寸错误,用户必须设置 batch.size LTE 2?
- 或者生产者库自动决定批量大小以避免错误? (即使用户设置大batch.size)
谢谢。
下面是相关配置的定义
生产者配置
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.
出现此查询是因为批处理有多种可用设置。让我试着把它们说清楚:
卡夫卡设置:message.max.bytes
和fetch.max.bytes
Kafka broker 限制了可以生成的消息的最大大小(如果消息是批量发布的,则批次中消息的总大小)由集群范围的 属性 message.max.bytes
(默认为 1 MB)。尝试发送大于此大小的消息的生产者将从代理收到错误消息,并且该消息将不会被接受。与在代理上指定的所有字节大小一样,此配置处理压缩的消息大小,这意味着生产者可以发送比未压缩的此值大得多的消息,前提是他们将其压缩到配置的 message.max.bytes
大小。
注意:此设置可以被特定主题覆盖(但名称为 max.message.bytes
)。
在 Kafka 代理上配置的最大消息大小 message.max.bytes
必须与消费者客户端上的集群范围 属性 fetch.max.bytes
(默认为 1 MB)相协调。它配置尝试获取请求的消息的最大字节数。如果这个值小于message.max.bytes
,那么consumer遇到更大的消息会取不到这些消息,导致consumer卡住无法继续的情况。
配置设置 replica.fetch.max.bytes
(默认为 1MB)决定了代理上每个分区所需的粗略内存量。
生产者设置:max.request.size
此设置控制生产者发送的生产请求的大小。它限制了可以发送的最大消息的大小和生产者可以在一个请求中发送的消息数。例如,默认最大请求大小为 1 MB,您可以发送的最大消息为 1MB,或者生产者可以将 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,我们指示生产者等待几毫秒以在将其发送到代理之前向批处理中添加其他消息,即使发送线程可用也是如此。这增加了延迟,但也增加了吞吐量(因为我们一次发送更多消息,每条消息的开销更少)。