我想构建一个可以同时从多个端点流式传输数据以进行分析的服务器。
方案: 在我们平台上注册的用户将提供其物联网设备的凭据。 E.g https://stream.example.com/user1& https://stream.example.com/user2
我们的责任是监控设备日志和状态,以生成报告。
问题: 由于每个流都将保持HTTP连接打开,如何创建node.js或ruby应用程序以打开serval HTTP流?
答案 0 :(得分:1)
看看你的情况我也是node.js的根目录 - 保持一个开放的连接在异步框架中运行良好,Ruby似乎不太合适(但后来我对Ruby并不多)。
使用Scramjet这很容易,但请记住,无论如何双方都必须保持开放连接,因此它不是节点应用程序本身。我知道您的情况是您的节点应用程序将主动打开与具有给定凭据的许多设备的连接,然后这些设备将通过http响应一个永无止境的流,有点像Twitter的流API ...然后实现将看起来有点像这样:
new scramjet.MultiStream(devicesList.map(
(device) => request.post(device, credentials)
.pipe(new StringStream())
.split("\r?\n") // or however you'd read your messages
.parse(JSON.parse) // or however you'd parse your data
.assign({deviceId: device.id}) // you'll probably need this
))
.mux(/* optionally an ordering function */)
// above there's a single stream with all the logs from all your devices.
如果这是另一种方式,并且设备正在调用服务器,那么请查看scramjet-http-uristream或scramjet-http-post - 它是一个简单的服务器,只会流式传输所有发布的uri或帖子服务器。
我希望这会有所帮助。 :)
答案 1 :(得分:0)
我觉得CPU可能不是瓶颈,因为大多数时候你的应用程序只处理IO(将网络数据流传输到文件)。但是,您应该考虑带宽,并且当带宽成为瓶颈时,您必须扩展。在这种情况下,传统的反向代理无法提供帮助。您必须执行一些DNS技巧,例如循环DNS,将您的客户端均匀地分派到您的服务器,并让他们直接连接到您的服务器。
我建议不要使用数据库来存储这些日志。纯文本文件就足够了。您可以创建一个crontab作业来定期解析这些文件并在必要时更新数据库。
我建议不要使用Ruby。 Node.js在这种情况下很好,因为它的异步IO,允许你在一个线程中处理数千个这样的连接。