目前,我有一个复杂的生产NodeJS服务器,只需按一下按钮,它就可以通过Sendgrid向用户发送电子邮件。然后,使用 Docker 和 Convox 将此服务器部署到称为"生产"的不同生产环境中,并在"暂存"级别进行测试。
我想通过使用cron
NPM 包自动向用户发送电子邮件的功能。此 cron 作业每天在指定时间自动向客户发送电子邮件。我面临的一个问题是暂存环境 Node 环境与生产环境完全相同(都称为"生产")。一种可能的解决方案是,我将 Docker/Convox 配置更改为具有用于"暂存"的单独节点环境,以防止 cron 作业在那里运行。
然而,这让我想到 - 部署与 Node 服务器中的进程紧密耦合的功能的 cron-job 服务的最佳实践是什么?
cron 服务应该在同一节点服务器上运行吗?对此提出的一个担忧是,它可能会创建一个更"整体"的实例,并且碎片更少。
cron 服务应该在单独的 EC2 NodeJS 或 AWS Lambda 上运行吗?
我正在尝试找出构建 cron 服务部署的最佳方法,以便它具有可扩展性和可扩展性。将来,我希望添加更多具有类似功能级别的cron服务。
cron 服务应该在同一台 Node 服务器上运行吗?
如果 cron 服务不需要访问现有节点.js服务器中的任何实时状态,那么您可以自由地将其包含在现有服务器中,也可以将其分解为自己的进程,更类似于微服务架构,您可以在其中分解不必耦合的东西。 这只是一个设计选择,取决于一堆不同的东西。
这实际上是在保持部署和管理简单(一个服务器进程进行部署和管理)与分离出不需要耦合并且可以独立运行/管理/编码/测试的内容之间的权衡。
通常,您会根据复杂性做出此权衡决策。 如果电子邮件代码相当微不足道,并且对内存或CPU使用率的影响不大,那么创建另一台服务器进行管理实际上没有特别的优势,就像您不会考虑从服务器中分解其他小东西一样。 但是,如果有真正的理由单独管理它,或者您可以通过将其内存和 CPU 使用率从主服务器进程中取出来更轻松地扩展,那么请务必将其分解为自己的服务器。
我给你举几个例子来说明极端情况。
假设您的服务器中有 20 行代码,每天为您执行一次维护操作(假设是日志文件管理)。 它们大约需要 10 秒才能运行,而且一点也不复杂。 你会把它分解成另一个节点.js服务器吗? 可能不是因为分解它没有主要好处,但现在有另一个进程要运行和管理,这增加了复杂性。
现在想象一下,您有一个在晚上的某个时间启动的流程,该流程抓取了 100 家相关公司的整个网站,从他们的网站收集信息。 由于这些站点的大小,它可以运行数小时,并且可能会使用相当数量的CPU,内存,带宽和数据库周期来存储它找到的内容。 这里有真正的规模和管理原因,可以将其放在自己的单独流程中,在该流程中可以单独管理和扩展,并且运行它不会影响其他服务器有效完成其工作的能力。
cron 服务应该在单独的 EC2 NodeJS 或 AWS Lambda 上运行吗?
这实际上取决于您的规模和管理需求。 请参阅上述示例。
关于你的另一个话题...
一种可能的解决方案是,我将 Docker/Convox 配置更改为具有用于"暂存"的单独节点环境,以防止 cron 作业在那里运行。
这似乎是一个与您的问题其余部分完全不同的问题。 似乎有一个指示暂存的单独环境变量会很有用。 这样,只关心生产和开发之间差异的代码可以只查看一个现有的环境变量(并且您不必更改任何已经这样做的代码)。 但是,想要了解暂存和生产之间区别的代码可以检查新变量。