为什么不在一个 Amazon EC2 实例上 运行 Node.js 和 Neo4j

Why not to run Node.js and Neo4j on one Amazon EC2 instance

我即将在亚马逊上设置服务器架构。我对最佳实践并不熟悉,而且几乎是边学边学。

我的老板告诉我在同一个实例上使用 Node.js 和 Neo4j(图形数据库)运行ning 启动一个 Amazon EC2 实例。两者都应该使用不同数量的可用 CPU。随着应用程序变得越来越大并且需要更多资源,我们将简单地克隆实例。我的老板也没有这方面的经验。

我必须说我对将 Node.js 和 Neo4j 放在一个实例/机器上有一种不好的感觉。我想我会使用 Amazon Linux HVM 发行版,因为他们将其设置为可以很好地与他们的服务配合使用。遗憾的是,Neo4j 官方不支持 yum,而是 apt(Amazon Linux 基于 Ubuntu 并使用 yum 而不是 apt)。因此 Neo4j 建议使用 Debian/Ubuntu 到 运行 他们的数据库。

为什么将 Node.js 和 Neo4j 放在一个实例上不是一个好主意?

我能想到的一个原因是可伸缩性不再像每个服务有两个单独的实例时那样动态运行。

可扩展性可能是主要原因。我认为这里的 "node.js" 是指使用 node.js 编写的应用程序。 node.js 包本身安装在 neo4j 运行.

的同一台机器上没有问题

认为部署 neo4j 的一种好方法是作为服务器,让您的应用程序与该服务器通信。当然,它们可以在同一个虚拟机上,但这会带来一些麻烦:

  • 该 VM 上的 security/firewall 设置必须更复杂,以考虑到两者共存的所有方面。
  • memory/disk 配置需要对两者都足够。如果您的应用程序需要增长,当 neo4j 占用大量内存而没有为您的节点应用程序留出太多内存时会发生什么,反之亦然?

通过将它们分成两个单独的 VM,您可以单独对它们进行性能调整,以确保 运行 的一件事 运行 真的很好。稍后,如果您需要一个 HA 集群,您可以将单个 neo4j VM 变成 HA 集群的前端,并且 node.js 应用程序可以继续使用服务器,就好像什么都没有改变一样。因此,可扩展性有好处。

在安全和网络配置方面,将它们拆分为两个 VM 意味着您必须在第一时间考虑如何正确配置。您不希望任何人都能够连接到您的 neo4j 数据库,您只希望您的应用程序能够做到这一点。

根本问题是计算机 运行 您的数据库和计算机 运行 您的代码有不同的需求。

Node.js 代码:您的代码是无状态的(意味着它本身不包含任何数据)。它的所有状态都存储在数据库中。如果出现问题,您可以重新启动机器,或者将其杀死并制作一台新的相同机器 运行 相同的代码,没有人能够分辨出区别。如果您以后需要更多的可扩展性,您可以将您的代码移动到平台即服务,例如 AWS Elastic Beanstalk 或 Heroku,它们将为您管理这一切。只需将它指向您的数据库即可。

数据库:需要持久耐用。如果您重新启动它,您的整个应用程序将在此期间停止运行。如果它被损坏,您将丢失所有数据。虽然 Neo4j 有一个高可用性包,可以帮助您管理 this/spread 多台计算机上的一些风险,但听起来您不会很快就能做到这一点。设置数据库计算机并且不接触它(更新 node.js 代码)将减少任何事情被搞砸的可能性。当您移植到 High Availability 时,它会使转换更加无缝,因为您不必寻找新的地方来托管您的代码。