【问题标题】:Is using pm2 with node.js in cluster mode safe在集群模式下使用 pm2 和 node.js 是安全的
【发布时间】:2017-10-08 09:53:01
【问题描述】:

所以 pm2 是一个进程管理器,它允许我在同一台服务器上启动我的应用程序的多个实例。它的工作原理是对所有实例的请求进行负载平衡。
所以我认为这是对 Node.js 环境的某种形式的假多线程。然后我想到了以下场景:

如果我的 Node.js 应用实例连接到 MongoDB 和实例会怎样 0 正在执行查找请求,同时实例 1 正在 实际上插入到同一个集合中?


MongoDB 不是单线程的,它有一个线程池。这是否意味着可能存在冲突,或者线程安全现在与 MongoDB 中某种形式的互斥锁相关?
这只是一个示例案例。 pm2有没有可能导致这样的问题?

【问题讨论】:

    标签: javascript node.js multithreading mongodb pm2


    【解决方案1】:

    来自MongoDB's docs,支持并发控制。

    并发控制允许多个应用程序同时运行而不会导致数据不一致或冲突

    如果你需要更新多个文档,你可以使用它的 $isolated 操作符

    使用 $isolated 运算符,一旦写入操作修改了第一个文档,影响多个文档的写入操作可以防止其他进程交错。这样可以确保在写入操作完成或出错之前没有客户端看到更改。

    请注意,$isolated 不适用于分片集群,但我假设您只使用一个 MongoDB 数据库实例。

    【讨论】:

    • 谢谢凯恩。这基本上回答了我的大部分问题。但是您知道 pm2 是否会导致一般问题?
    • 我没用过pm2所以不知道有没有具体问题。通常,如果 nodejs 保持任何瞬态状态,请确保您的负载均衡器不会将相同的用户/会话的请求传递给不同的 nodejs 实例。如果所有 nodejs 请求都是无状态的(所有内容都保存到 DB),那么我认为没有任何问题
    【解决方案2】:

    我在所有节点应用程序中都使用 PM2。就集群模式而言,它尽可能安全(至少根据我的经验)。不过,在 PM2 中有一些注意事项需要注意。

    1. 注意您的配置文件。无论您将使用什么格式(JSON YAML 等),您都需要了解每个设置的后果。例如使用最大核心数等。

    2. 我强烈建议不要使用 watch 参数。它似乎减慢了系统的速度,而且我在分配内存时遇到了麻烦。

    3. 使用 PM2 Monit 监控服务器上正在发生的事情,这样您就可以掌控一切。

    4. 如果您正在处理需要复杂集群的强大生产,那么建议您考虑一下其他成本高昂的选项。在一个大型、多样化和大量使用的集群系统中,我不会将整个集群操作交给一个系统。

    但是安全吗?就我的经验而言,是的。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2016-03-03
      • 1970-01-01
      • 2020-04-26
      • 1970-01-01
      • 2021-07-29
      • 2019-10-02
      • 2022-01-23
      • 2018-01-17
      相关资源
      最近更新 更多