在后端安排很多任务,Node.js

Scheduling a lot of tasks on back-end, Node.js

假设我有一个数据库(Neo4j 特定于 Node.js 后端),其中包含有营业时间和营业时间的商店(数百万家)。而且我需要在适当的时间将每个数据库存储条目更新为打开或关闭。那么 best/usual 以稳定和可扩展的方式构建这样一个系统的做法是什么?

设置数百万个 cron 作业?
检查以固定时间间隔更改的条目?
第三方服务可以在特定时间调用我的后端进行更改吗?

您要问的是如何权衡向数据库(可能有数百万个对象)写入信息,以便在进行未来查询时加快性能。这是一个古老的权衡,没有适用于所有情况的固定答案。这里的一切都是权衡。

一方面,应该不惜一切代价避免数百万次数据库写入,因为这是您可以对数据库服务器执行的最昂贵的操作。

另一方面,必须执行大量非常低效的查询也很少达到最优化的位置。

所以,这真的归结为评估权衡 space 你应该设置东西的地方。

在确定权衡的方向时,您会问自己这些问题:

  1. 您的查询是否现在太慢了,急需提高性能。
  2. 如果您要重组部分数据库以使 "too slow" 查询更快,您在查询速度方面的性能提升有多大(您必须测量 before/after 性能以分析这个)。
  3. 为了保持优化,您必须更改数据库中的对象的频率和数量。如果每天只有几个对象发生变化,那么很容易优化到每天 运行。但是,如果数百万人一直在变化,那么您可能不想经常写入数据库。
  4. 您的 site/database 是否每天都有一段非常缓慢的时间(例如目标市场的半夜),您是否可以负担得起对它进行某种 "batch" 工作以进行优化它不会以明显的方式影响数据库的正常使用?
  5. 您能否设计一个单独的优化应用程序来优化数据库,但以缓慢且稳定的速度进行,以免对数据库的实时使用产生负面影响?

因此,决定重构数据库以提高查询性能的程度是对这些不同因素的持续权衡。您可能只能通过设计一些测试并进行一系列测量来找到理想的权衡点。请记住,过早优化(在证明您有值得解决的问题之前进行优化)几乎是在浪费代码编写和测试时间,而这些时间本可以更好地用于更有价值的任务。但是,解决您通过测试证明的问题是经过衡量的并且是真实的,可以非常有效地利用资源。

关于你原来的问题:

Setting millions of cron jobs?

没有。这不会是一个性能良好的解决方案。

Checking for entries to change in fixed time intervals?

这是一种可能。这取决于 "current" 您需要数据库的方式。如果您可以 运行 每小时进行某种优化,并且您可以管理对数据库的写入,这样它们就不会对数据库造成过度压力,这样数据库的实时使用就不会受到不利影响,那么这可以工作。更好的是某种优化传递,你可以在晚上 运行 当你的数据库使用不多时。

Third party service able to call my backend for changes on specific time?

我不确定您所说的第三方服务到底是什么意思。无论您在做什么,您可能都不希望数据库优化代码 运行ning 在用作应用程序服务器的主 node.js 进程中。它应该是一个单独的 app/process,可以使用来自主 node.js 服务器的单独 CPU。

如果没有一些额外的信息,很难想出一个好的解决方案——这与 neo4J、nodeJS 或其他任何东西都没有关系。为什么数据库以需要如此密集更新的方式表示 open/closed?为什么不让每家商店以声明的方式保持营业时间,即周一至周五上午 9 点至下午 5 点?可以添加例外。 (有趣的是,就在几年前,这是一个关于 SO 的有趣问题:Efficiently determining if a business is open or not based on store hours)由于大多数商店在一小时或半小时的边界内开门和关门,您提出的解决方案将有一个没有写入的数据库 activity除了每小时几秒钟,当数据库的大部分需要更新时。

考虑以更有效的方式进行预计算。或者按需计算任何给定的商店并缓存答案。