我是软件开发的新手。目前我正在做一个项目,该项目从安装在不同位置的传感器收集实时数据。每个传感器每分钟都会向服务器发送数据。将来我希望每分钟有100k传感器向服务器发送数据。目前我正在做以下事情。
现在我需要实现很多其他业务逻辑,例如当传感器数据超过预设值时发送短信或电子邮件。检测是否发生了不良事件,如不同类型的实时处理。
我正在考虑为不同类型的数据处理编写单独的Node.js应用程序,如下所示。
所以我期待另外4个单独的应用程序和QUEUE来实现特殊的实时数据处理。
我是以正确的方式前进还是有更好的方法?
答案 0 :(得分:2)
Nodejs是单线程模型,在你的情况下,大多数工作是需要cpu周期的处理消息。因此,如果消息到达率很高,则编写单独的Node.js应用程序会更好。
如果您的消息有许多类型,并且每个流程逻辑只需要处理自己感兴趣的消息类型,那么为不同的消息类型创建不同的主题,并且每个流程仅订阅其感兴趣的主题。它会更快更优雅。
但是如果您的流程应用程序需要处理所有消息,您可以使用不同的使用者组来订阅一个主题,而不需要将相同的消息放到其他队列中。
无论如何,我认为一个线程做一件事或一个应用做一件事是一个很好的设计。
答案 1 :(得分:1)
在验证数据之前将数据放入队列(2.)(3) - 你不想先验证数据,然后在处理之前将它们推送到队列(取决于验证的内容)?
否则,这是一个好的方案。如果你还没有,我建议你阅读kafka streams及其概念的一些介绍,这是kafka本地进行流处理的方式(目前只在java中实现,但似乎有一个非官方的nodejs端口正在进行here)
在不谈kafka流的情况下,您也可以直接从传感器发送到kafka,而不是拥有服务器(这样您就不必担心复制,分发,如果您的服务器崩溃会发生什么......) nodejs中的kakfa生产者和消费者(https://github.com/Blizzard/node-rdkafka和https://github.com/SOHU-Co/kafka-node是两个好客户)和几乎所有语言。如果数据完全不相关,所有传感器都可以将数据发送到同一主题或不同主题。
依赖相同的kafka队列进行多个处理申请的好处是,每个处理都是独立的:你不会通过修改另一个来破坏一个,你可以分别进化它们等等。
您还可以使用kafka connect从已验证的数据主题中读取并直接写入cassandra - 您只需要做一些conf,这里不需要java
答案 2 :(得分:0)
也许我误解了你的步骤1-3,但它应该足以只做1和2.一旦数据成功提交到Kafka,你可以使用Kafka Connect将副本发送到Cassandra和你的数据库。也许这就是#3的意思,但如果没有,则不需要从nodejs应用程序直接写入数据库,因为Kafka可以这样做。
答案 3 :(得分:0)
使用订阅单个主题的不同消费者群体。因此,您需要一个监听您的请求并将数据放入kafka主题的生产者和不同消费者群体中的消费者,这会做不同的事情。