以现代方式将数据传输到基于Web的(Angular )前端

31moq8wy  于 2022-10-07  发布在  Apache
关注(0)|答案(1)|浏览(145)

TLDR:我想设置一个带有节点后端的Angular 应用程序,它实时显示数据,数据流的来源是Kafka流,其数据存储在Postgres数据库中。

我对一些主题是新手,但我有信心让它上线并运行起来,但很可能不是以一种“最佳实践”的方式。我很难弄清楚什么是一种现代而高效的方法。理想情况下,我正在寻找一份关于如何以最佳实践方式处理这一问题的高级别概述。

我目前有一个python-kafka使用者,它监听一个流并将数据存储在一个postgres数据库中。将这些数据实时提供给多个客户端的好方法是什么?我是使用WebSockets还是使用http来传输数据库中的数据?我是不是应该放弃python,在NodeJS中创建一个消费者,将其直接转发给客户端,从而选择性地跳过数据库?

2w2cym1i

2w2cym1i1#

是的,你需要使用WebSockets来进行一系列更新。Kafka在这方面没有帮助,不过,你需要找到一些解决方案来将Kafka与WebSocket客户端结合起来。

例如socket.io...

// Listen for Kafka
consumer.on('message', ({ value, }) => {
    // Parse the JSON value into an object
    const { payload, } = JSON.parse(value)

    console.log('nnemitting from kafka:', payload)

    // Emit the message through all connected sockets
    io.emit("kafka-event", payload)

请记住,上面的代码只能在一个客户端上运行。新套接字不会启动新的消费者,因此只能看到内部Kafka消费者的当前偏移量的更新。如果您启动了多个Kafka消费者(或多个Node后端),那么您可能只会在每个套接字事件中看到Kafka分区的一个子集被消耗...

否则,这个问题对Kafka来说并不是独一无二的。您可以编写一个循环(例如setTimeout() / setInterval())来查询某个HTTP API(而不是直接查询数据库)中的所有记录和/或上次轮询后的新记录。
或者,根据您的用例,查询整个数据库表/集合+添加一些刷新按钮以准确捕获删除(除非您有一个WebSocket来发送单个删除事件,并且可以用这些事件更新DOM)。
目前有一个python-kafka使用者,监听一个流并将数据存储在postgres数据库中。

虽然这可能会奏效,但Kafka Connect的规模可能会更大。

或者,Kafka Streams支持KV queries,因此不需要外部Postgres数据库,具体取决于您的查询模式。
因此可以选择跳过数据库?

如果您不关心历史事件的保留,那么您不需要任何数据库。只有在建立了消费者套接字之后,您才能在UI中获得事件,然后丢失刷新的所有历史记录。

额外-Kafka的前端。类似的答案--你需要一个带有Kafka生产者客户端的后端服务,因为没有原生的HTTP接口。

相关问题