apache-kafka - 频繁创建新的生产者来生成消息——这会导致 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 版本进行了测试。
解决方案
每个生产者都需要获取您尝试生成的主题的元数据(以确定哪个代理领导哪个分区)。那么您将使用该生产者发送一条记录(我假设)。那么你需要 flush() + close() 它(优雅地,否则可能会发生其他副作用,特别是如果你使用事务和/或“恰好一次”)。
您的情况下的额外开销将是由于:
- 重新建立套接字(我不知道您使用什么进行身份验证,所以我不知道这对您来说有多贵)
- 获取主题的元数据。取决于主题的 bif 程度(根据跨多少个代理的多少个分区),这可能比您发送的有效负载大。
- 组成一个大小为 1 的记录批次,其中包含一条记录。kafka 被设计为在小批量中工作得最好,在这种情况下,将多个小负载聚集在一起可以为您提供更好的压缩。如果您的有效负载很小,您甚至可能希望针对您的情况完全禁用压缩。
- (与 3 相同的原因)许多小请求比单个大请求更昂贵
- (再次与 3 相同的原因)由于压缩增益低(甚至可能是负压缩增益......),您在磁盘上的占用空间更大
推荐阅读
- python - 如何在python中检查2个列表并重新排列顺序
- react-native - 如何在 React Native 中返回上一个抽屉屏幕
- jquery - 如何在 Material-UI 中获取输入的值
- json - HTTPBuilder 将 valuecount、strings、bytes 添加到请求正文中,而另一方无法解析该 JSON
- ios - 有没有办法将 Nativescript 项目编译成 Swift/XCode 项目?
- installation - 使用 wix 安装程序执行命令
- html - 使用 html5
& 标签更改显示为 flex 在 ios webview 中不起作用 - ms-access - Microsoft Access 在新的 PC 版本上提供 ASYNC_NETWORK_IO
- deep-learning - CNN 池化层与自动编码器中的编码器有何不同?
- node.js - 如何使用 mongoosePaginate 对键值数组进行分页?