3.9. 处理大型消息大小


消息的默认批处理大小是 1MB,这是大多数用例中最大吞吐量的最佳选择。假设有足够的磁盘容量,Kafka 可以在较低的吞吐量中容纳较大的批处理。

大型消息大小以四种方式处理:

  1. 生产者消息压缩 将压缩消息写入到日志中。
  2. 基于参考的消息只发送对消息值中存储某些其他系统的数据的引用。
  3. 内联消息传递将消息分成使用相同密钥的块,然后使用 Kafka Streams 等流处理器将消息组合到输出中。
  4. 为处理更大的消息大小而构建的代理和制作者/消费者客户端应用配置。

建议使用基于参考的消息和消息压缩选项,并涵盖了大多数情况。对于其中任何这些选项,必须小心谨慎,以避免引入性能问题。

制作者压缩

对于制作者配置,您可以指定一个 压缩.type,如 Gzip,然后应用到制作者生成的数据批处理。使用代理配置 compression.type=producer,代理会保留所有使用者压缩。每当制作者和主题压缩不匹配时,代理必须在将批处理附加到日志中再次压缩,这会影响代理性能。

压缩还会在消费者上增加生产者和解压缩开销的额外处理开销,但在消息数据压缩时包含更多的数据,因此当消息数据压缩时,吞吐量通常很有用。

将制作者侧压缩与批处理大小的精细调节相结合,以促进最优吞吐量。使用指标有助于衡量所需的平均批处理大小。

基于参考的消息传递

当您不知道消息的大程度时,基于参考的消息传递对于数据复制非常有用。外部数据存储必须快速、持久且高度可用,以便此配置正常工作。数据被写入数据存储,并返回对数据的引用。制作者会发送一条包含对 Kafka 的引用的消息。用户从消息获取引用,并使用它来从数据存储中获取数据。

图 3.4. 基于参考的消息传递流程

基于参考的消息传递流的镜像

当传递消息需要更多行时,端到端延迟会增加。在清理 Kafka 消息时,这个方法的另一个缺陷是不自动清理外部系统数据。混合方法只是将大型消息发送到数据存储并直接处理标准消息。

内联消息传递

内联消息传递比较复杂,但它的开销并不依赖于基于参考的消息等外部系统。

如果消息太大,生产客户端应用程序必须对数据进行序列化和块。然后,生产者会使用 Kafka ByteArraySerializer,或者类似,在发送每个块前再次对每个块进行序列化。消费者跟踪消息和缓冲块,直到它有完整的消息。消耗的客户端应用程序接收块,这些块会在进行反序列化前编译。根据每个块消息集合的第一个或最后一个块偏移,将完整消息传送到消耗的应用程序的其余部分中。对偏移元数据检查成功发送完整消息,以避免在重新平衡期间重复。

图 3.5. 内联消息传递流

内联消息传递流的镜像

内联消息传递因为需要缓冲而具有性能开销,特别是并行处理一系列大型消息时。大量消息的块可能会变得交集,因此如果缓冲区中另一个大消息的块都不完整,则无法始终提交消息块。因此,缓冲通常受到持久性消息块或实施提交逻辑的支持。

配置以处理更大的消息

如果无法避免较大的消息,并避免在消息流的任意点上出现块,您可以提高消息限制。为此,请在主题级别上配置 message.max.bytes,为单个主题设置最大记录批处理大小。如果在代理级别上设置 message.max.bytes,则为所有主题都允许更大的消息。

代理将拒绝任何大于通过 message. max.bytes 设置的消息。producers 的缓冲区大小(max.request.size)和使用者(message.max.bytes)必须能够容纳较大的消息。

Red Hat logoGithubredditYoutubeTwitter

学习

尝试、购买和销售

社区

关于红帽文档

通过我们的产品和服务,以及可以信赖的内容,帮助红帽用户创新并实现他们的目标。 了解我们当前的更新.

让开源更具包容性

红帽致力于替换我们的代码、文档和 Web 属性中存在问题的语言。欲了解更多详情,请参阅红帽博客.

關於紅帽

我们提供强化的解决方案,使企业能够更轻松地跨平台和环境(从核心数据中心到网络边缘)工作。

Theme

© 2026 Red Hat
返回顶部