在高流量环境中使用 kafka producer 时的连接管理

Posted

技术标签:

【中文标题】在高流量环境中使用 kafka producer 时的连接管理【英文标题】:Connection management when using kafka producer in high traffic environment 【发布时间】:2015-07-17 20:23:15 【问题描述】:

我打算在每天超过 10 亿次请求的高流量环境中使用 kafka。每个请求都会连接到 kafka 集群以发送消息。所以每一秒都会有这么多的连接在不断地建立。这可能会导致套接字超时等问题。 生产者正在建立所有非持久连接。因此,在这种情况下,可能会出现套接字超时或端口耗尽问题。

大多数生态系统都在 php 中,所以我必须为 kafka 使用 php 库。现在如何有效地使用 kafka producer 来缓解这种连接争用?

我想到了一个可以提供消息的守护进程,然后它将这些消息批量发送到 kafka 集群。有利的一面是连接数量可能有限。不利的一面是此类服务的响应延迟会阻碍应用程序。我还必须使用一些中间存储来保存消息。

现在我知道有许多非常大容量的应用程序/站点使用 kafka 直接流式传输消息。你们中的任何人都可以指导我如何解决这些问题吗?在这种情况下,持久连接可以提供帮助吗?在如此大容量的环境中使用 kafka-producer 的 php 库本身是一个坏主意吗?

【问题讨论】:

【参考方案1】:

我们正在使用 kafka java 库,并在服务器启动时连接到 kafka。目前,我们每天向 kafka 发送大约 5 亿条消息,并且从未遇到任何问题。

当您创建生产者时,它基本上会创建多个连接......每个分区一个。因此,只要您使用分区,您应该可以将每条消息直接发送到 kafka,而无需将它们缓存在您身边并批量发送。

【讨论】:

感谢您的回复。所以你只使用一个连接对象?您是直接从应用程序内部发送消息还是从单独的后端进程发送消息?如果您在 Web 应用程序中使用 kafka-producer 是应用程序级对象吗?我的意思是已建立的连接数量如何保持有限?当我使用 php 的 kafka lib 时,由于 php 没有共享任何拱门,因此打开的连接数与请求数一样多,jst 受服务器设置的限制。这是一个非常令人担忧的事情。 生产者是否会向连接后创建的新创建的分区发送消息?【参考方案2】:

我们还使用 kafka java 库,就像@apatel 所说的那样,我认为在您的情况下,您可以尝试使用 php 应用程序为您的服务器提供一些 sidecar,sidecar 将在启动时创建 Producer,而 Kafka java 驱动程序将管理多个连接。这是一些关于 Netflix 的 sidecar 应用程序的有趣文章Netflix Prana

【讨论】:

感谢您的建议和链接。但是,我无法连接像 prana 这样的系统如何用作 kafka-producer。你的意思是说实现 kafka-producer 的唯一方法是让它与主应用程序并行运行并让它在后台排队消息?如果是这样,创建一个守护进程会好吗? Prana 只是向您介绍 Sidecar 模式的示例。在这种情况下,您应该开发自己的 sidecar,例如:一些带有嵌入式 http 服务器的小型 Java 应用程序(例如 Undertow),应用程序将在启动时连接到 kafka 并提供 api 来发布消息,例如:/messages/$topic 然后是您的 php 应用程序将发送消息到 /localhost/messages/$topic 当然sidecar应该和你的php应用部署在同一台机器上。

以上是关于在高流量环境中使用 kafka producer 时的连接管理的主要内容,如果未能解决你的问题,请参考以下文章

学习笔记Kafka—— Kafka 开发环境配置及Producer API

学习笔记Kafka—— Kafka 开发环境配置及Producer API

学习笔记Kafka—— Kafka 开发环境配置及Producer API

Kafka Producer NetworkException和超时异常

kafka入门及环境搭建

kafka--linux环境搭建