首页 > 解决方案 > 频繁创建新的生产者来生成消息——这会导致 Kafka 代理的内存使用率高吗?

问题描述

我正在使用 Amazon AWS Lambda 函数向 Kafka 集群生成消息。由于我无法控制 Lambda 函数的启动/调用频率,并且我无法在调用之间共享对象 - 我必须为每次调用创建一个新的 Kafka 生产者并在调用完成后对其进行清理。每个生产者也设置为相同的“client.id”。

我注意到在部署 lambda 函数后,代理的堆大小迅速增加 - 这最终导致了 GC 问题和代理问题。这种增长很可能与 Lambda 生产者有关。

我知道建议重用单个生产者实例进行消息生产。但在这种情况下(使用 AWS Lambda)这是不可能的。

我的问题是,是否有可能大量的生产者创建/清理会导致代理的内存泄漏?

具有 5 个代理的 Kafka 集群 - 版本 1.0.1。Kafka 客户端库使用 0.11.0.03、1.0.1 和 2.3.0 版本进行了测试。

标签: apache-kafka

解决方案


每个生产者都需要获取您尝试生成的主题的元数据(以确定哪个代理领导哪个分区)。那么您将使用该生产者发送一条记录(我假设)。那么你需要 flush() + close() 它(优雅地,否则可能会发生其他副作用,特别是如果你使用事务和/或“恰好一次”)。

您的情况下的额外开销将是由于:

  1. 重新建立套接字(我不知道您使用什么进行身份验证,所以我不知道这对您来说有多贵)
  2. 获取主题的元数据。取决于主题的 bif 程度(根据跨多少个代理的多少个分区),这可能比您发送的有效负载大。
  3. 组成一个大小为 1 的记录批次,其中包含一条记录。kafka 被设计为在小批量中工作得最好,在这种情况下,将多个小负载聚集在一起可以为您提供更好的压缩。如果您的有效负载很小,您甚至可能希望针对您的情况完全禁用压缩。
  4. (与 3 相同的原因)许多小请求比单个大请求更昂贵
  5. (再次与 3 相同的原因)由于压缩增益低(甚至可能是负压缩增益......),您在磁盘上的占用空间更大

推荐阅读