【问题标题】:Sending Apache Kafka data on web page在网页上发送 Apache Kafka 数据
【发布时间】:2019-01-12 18:31:34
【问题描述】:

我正在构建一个实时能源监控系统,其中的数据来自传感器。每一秒都会有新的数据。使用的数据将被聚合以呈现为图表。我研究了具有大量数据的实时流处理,它引导我使用 Apache Kafka。

现在我的网络应用正在使用 Express js。我正在使用kafka-node 库。现在,我以生产者的身份通过命令行手动插入新数据。在我的服务器代码中,我设置了一个 consumer 来监听 Topic1

服务器代码:

var express = require('express');
var app = express();
var http = require('http').Server(app);
var bodyParser = require('body-parser');
var urlencodedParser = bodyParser.urlencoded({ extended: false });

var server = app.listen(3001, ()=>{
  console.log("app started on port 3001");
});

var io = require('socket.io').listen(server);


var kafka = require('kafka-node');

let Consumer = kafka.Consumer,
    client = new kafka.Client(),
    consumer = new Consumer(client,
      [
        {topic: 'Topic1', partition: 0}
      ],
      {
        autoCommit: false
      }
  );

app.use(express.static('public'));

consumer.on('message', (message) => {
  console.log(message.value);
  callSockets(io, message.value);
});

function callSockets(io, message){
  io.sockets.emit('update', message);
}

客户端代码:

<script type="text/javascript">
  var socket = io('http://localhost:3001');

  socket.on('connect', ()=>{
    console.log("connected");
  })

  socket.on('update', (data) =>{
    console.log(data);
  })
</script>

我正在使用 socket.io 来发出在 Kafka 中使用的消息。有没有其他方法可以将 Kafka 数据发送到客户端?在我看来,在这里使用 socket.io 并不太优雅。我是否以正确的方式接近它?欢迎任何建议!

谢谢。

【问题讨论】:

  • 您可以使用 Kafka Connect 将主题数据发送到数据库,然后在其上公开一个聚合 REST API...这样,您就不会在客户端加入/过滤/聚合数据-边。
  • @cricket_007 我关心的是如何将数据从 kafka 实时发送到 Web 视图(客户端)。使用 REST API 会是实时的吗?那不是在执行 HTTP 请求,客户端必须手动输入才能获取新数据吗?
  • 如果您查看 DataDog 等服务或 Grafana 或 Kibana 等软件,那么这些服务通过 HTTP 至少每 5 秒拉一次(我相信),并且可以执行 min、max、sum、avg 函数在那些更大的时间窗口。我认为您的 Socket.io 客户端无法同时处理大量涌入的 Kafka 消息。您需要一些缓冲区,无论是 Redis 还是其他数据库。这是我的主要观点。至于web-application工具,可以看Server-sent Events (SSE)
  • @cricket_007 在我的场景中缓冲区会做什么?抱歉,如果没有一些解释,我很难想象。
  • hii,有没有关于这个话题的解决方案

标签: node.js express socket.io apache-kafka


【解决方案1】:

在没有具体说明您的解决方案的情况下,我认为您正在做正确的事情,为客户端创建专用 API 以从中读取数据。客户端需要能够从某个地方接收更新。唯一“更快”的方法是允许客户端直接从 Kafka 中提取,这将大大增加风险,因为 Kafka 并非旨在公开访问。

因此,与在需要更多代码的 C# 或 Java 中执行相同操作相比,使用 node.js 的解决方案实际上相当优雅。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2019-11-21
    • 1970-01-01
    • 2011-05-07
    • 2018-04-18
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多