【问题标题】:One Big Application vs Multiple Small Applications in Node.jsNode.js 中的一个大应用程序与多个小应用程序
【发布时间】:2017-09-02 08:28:17
【问题描述】:

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

  1. 在 Node.js 上制作的服务器中的 TCP 侦听器
  2. 将接收到的数据放入队列
  3. 验证数据并将其推送到数据库

现在我需要实现很多其他业务逻辑,例如当传感器数据超过预设值时发送短信或电子邮件。检测是否发生了一些不好的事情,比如不同类型的实时处理。

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

  1. TCP 监听器(同上)
  2. 将接收到的数据放入队列(同上)
  3. 验证数据并推送到数据库。 (同上)。如果这个传感器需要某种数据处理,我打算把它放到另一个队列中
  4. 处理此新 QUEUE 的单独申请

所以我期待另外 4 个单独的应用程序和 QUEUE 用于实现特殊的实时数据处理。

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

我是走对了路还是有更好的方法?

【问题讨论】:

    标签: node.js cassandra architecture apache-kafka


    【解决方案1】:

    Nodejs 是单线程模型,在您的情况下,主要工作是处理需要 CPU 周期的消息。因此,如果消息到达率高,则编写单独的 Node.js 应用程序会更好。

    如果你的消息类型很多,每个流程逻辑只需要处理自己感兴趣的消息类型,那么为不同的消息类型创建不同的主题,每个流程只订阅自己感兴趣的主题。它会更快更优雅。

    但是如果你的流程应用程序需要处理所有的消息,你可以使用不同的消费者组来订阅一个主题,而不需要将相同的消息放到另一个队列中。

    无论如何,我认为一个线程做一件事或一个应用做一件事是一个很好的设计。

    【讨论】:

      【解决方案2】:

      您在验证数据 (3.) 之前将数据放入队列 (2.) - 您不想先验证数据,然后在处理它们之前将它们推送到队列(取决于验证的内容)吗?

      否则,这是一个好的场景。如果您还没有,我建议您阅读一些关于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

      【讨论】:

      • 您好,感谢您的建议。我从裸 TCP 数据包中的传感器获取数据(我无法更改它)。我在第一步中进行了基本验证。该 TCP 数据包包含不同的数据。我在队列之后验证个人数据。
      【解决方案3】:

      也许我误解了您的步骤 1-3,但仅执行 1 和 2 就足够了。一旦数据成功提交到 Kafka,您就可以使用 Kafka Connect 将副本发送到 Cassandra 和您的数据库。也许这就是您所说的 #3 的意思,但如果不是,则不需要从您的 nodejs 应用程序直接向数据库单独写入,因为 Kafka 可以做到这一点。

      【讨论】:

      • 您好,感谢您的回复。实际上,我正在从传感器获取裸 TCP 数据包。数据中有很多部分。所以我需要在插入数据库之前对接收到的数据进行一些处理。这就是我在步骤 3 中使用 node.js 的原因。我不确定 Kafka Connect 是否可以实现。
      • 您可以使用nodejs Kafka客户端之一将数据发布到Kafka进行处理。您的其他选择是使用一个 kafka-connect-tcp 连接器或类似 node-red 的东西,它可以接收传入的 tcp 并发送传出的 Kafka。
      【解决方案4】:

      使用订阅单个主题的不同消费者组。因此您需要一个生产者来监听您的请求并将数据放入 kafka 主题中,并将消费者放在不同的消费者组中,它们会做不同的事情。

      【讨论】:

        猜你喜欢
        • 2022-09-27
        • 2016-10-18
        • 1970-01-01
        • 1970-01-01
        • 2012-08-30
        • 2014-10-14
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多