【发布时间】: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