如何使用 Strimzi Kafka Bridge 作为流媒体服务

How to use Strimzi Kafka Bridge as a streaming service

我使用 CNCF 的 Strimzi Kafka Bridge 创建了一个小型 API,它可以使用 HTTP/1.1 协议与 Kafka 服务器进行交互。这对于请求-响应场景来说都很好。但是,我的要求是在收到 Kafka 主题上收到的事件后立即将其流式传输到订阅的客户端(通过 Strimzi 桥),最好是在长期 HTTP 连接上(根据我的理解)。不断地轮询桥接消息并空手而归是对客户端资源的浪费。我希望 Kafka 服务器直接将这些事件流式传输到客户端。

我对 SSE 或 Websockets 或长轮询有点不确定。我对这些方法进行了大量阅读以将数据流式传输到客户端。但是,我无法弄清楚这些更改是在通信层还是在应用程序层或两者。

您是否只是使用传统的 HTTP 通信协议构建 API(不考虑技术)并以某种方式升级它以使用 Websockets,或者应该将 Websockets 的使用嵌入到您的应用程序库中?

如果需要,我可以提供更多信息。 Strimzi Kafka 桥接网站没有提及任何有关 "server side streaming" 的信息,或者我可能误解了该工具的真正用途。

Strimzi Kafka HTTP 桥的意思是 "translator" HTTP 到 Kafka 本机协议,反之亦然。这意味着 HTTP 客户端必须具有与本地 Kafka 客户端相同的行为,因此,在消费者的情况下,进行轮询以获取消息,这就是 Kafka 的本地工作方式。恕我直言,HTTP 1.1 根本不适用于流式传输。 Websockets 是一个完全不同的协议,您当然可以从 HTTP 连接开始升级到它,但 Strimzi 桥不支持它。 实际上,桥中的 AMQP 1.0 协议(作为 POC)可以支持这种情况,因此建立连接并让桥推送该连接而不是从客户端轮询。

@Nick多想,其实可以的"long polling"。 /records 端点上用于获取消息的 GET 在查询字符串上有一个 timeout 参数。它的值用作桥中内部本地 Kafka 轮询的超时。它以某种方式为您提供长轮询行为,因为轮询不会 return 直到有可用记录或超时到期。如果你设置了一个高超时,你可以有你想要避免轮询更多次的行为 opening/closing 更多的 HTTP 连接。 有关 timeout 参数的更多详细信息,请参见此处:

https://strimzi.io/docs/bridge/latest/#_poll