一个大应用程序与Node.js中的多个小应用程序

时间:2017-09-02 08:28:17

标签: node.js cassandra architecture apache-kafka

我是软件开发的新手。目前我正在做一个项目,该项目从安装在不同位置的传感器收集实时数据。每个传感器每分钟都会向服务器发送数据。将来我希望每分钟有100k传感器向服务器发送数据。目前我正在做以下事情。

  1. 在Node.js上制作的服务器中的TCP侦听器
  2. 将收到的数据放入队列
  3. 验证数据并将其推送到数据库
  4. 现在我需要实现很多其他业务逻辑,例如当传感器数据超过预设值时发送短信或电子邮件。检测是否发生了不良事件,如不同类型的实时处理。

    我正在考虑为不同类型的数据处理编写单独的Node.js应用程序,如下所示。

    1. TCP Listner(与上面相同)
    2. 将收到的数据放入队列(与上面相同)
    3. 验证数据并推送到数据库。 (与上述相同)。如果此传感器需要某种数据处理,我打算将它放到另一个队列
    4. 单独申请处理此新QUEUE
    5. 所以我期待另外4个单独的应用程序和QUEUE来实现特殊的实时数据处理。

      • 队列:Apache Kafka
      • 数据库:Cassandra

      我是以正确的方式前进还是有更好的方法?

4 个答案:

答案 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-rdkafkahttps://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主题的生产者和不同消费者群体中的消费者,这会做不同的事情。