【问题标题】:Scheduling a lot of tasks on back-end, Node.js在后端调度大量任务,Node.js
【发布时间】:2015-11-23 23:13:11
【问题描述】:

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

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

【问题讨论】:

  • 如果商店的开/关时间是提前知道的,为什么每次开或关时都要写入数据库?为什么不能从数据库中获取商店营业时间并进行计算以确定它当前是开放还是关闭?然后,您根本不需要更新数据库,除非计划的商店营业时间发生变化。
  • 完全同意@jfriend00,只有当我被要求在检索时确定此信息时,我才会完全将标志open=bool 设置为true。这实际上取决于您的用例。能不能具体点,这个有什么用?
  • @TomHert 我的例子似乎不是最好的,假设在某个时间点我们应该将这个Store对象从Store转换为可供出租Property,那是什么我想安排。即我会将neo4j节点的标签从Store更改为Property。我为什么要这样做?将PropertyStore 搜索隔离开来。但现在我在想,也许我走错路了,最好在每次搜索中进行索引、过滤时间戳并将尚未过去的视为Stores,将其他视为空Property
  • @jfriend00 看看我的评论。
  • 虽然我不确定如果我将过滤索引节点属性而不是只查看Store 节点,我会失去一些性能。但我认为构建只会更改数百万条目的布尔值的调度系统不值得这种性能提升。

标签: node.js neo4j cron scheduling backend


【解决方案1】:

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

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

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

因此,真正归结为评估您应该在权衡空间的哪个位置进行设置。

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

  1. 您的查询现在是否太慢并且急需改进性能。
  2. 如果您要重组数据库的一部分以使“太慢”的查询更快,您会在查询速度上获得多少性能提升(您必须在性能之前/之后进行测量以分析这一点)。
  3. 为了保持优化,您必须多久更改一次数据库中的对象以及更改多少对象。如果每天只有几个对象发生变化,那么每天运行的优化很容易。但是,如果数以百万计的人一直在变化,那么您可能不想经常写入数据库。
  4. 您的站点/数据库每天是否有很慢的时间(例如目标市场的半夜),您可以负担得起对其进行某种“批量”工作以对其进行优化而不影响正常使用以明显的方式访问数据库?
  5. 您能否设计一个单独的优化应用程序来优化数据库,但这样做的速度很慢,维护速度很慢,不会对数据库的实时使用产生负面影响?

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

关于你原来的问题:

设置数百万个 cron 作业?

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

检查条目是否在固定时间间隔内更改?

这是一种可能性。这取决于您需要数据库的“最新”程度。如果您可以每小时运行某种优化传递,并且您可以管理对数据库的写入,以便它们不会对数据库造成过度压力,从而不会对数据库的实时使用产生不利影响,那么这可能工作。更好的是某种优化通道,您可以在晚上运行数据库,否则您的数据库不会被大量使用。

第三方服务能够调用我的后端以更改特定 时间?

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

【讨论】:

  • 哇,谢谢你这么详细的回答!好点。到第 3 方时,我正在想象一些 PaaS 类的东西,你可以将任务转储到其中,它会负责执行这些任务和扩展。是的,我想我现在会进行“低效”查询并查看性能,如果它不好,那么我可以构建一些工作人员,以固定时间间隔缓慢“清理”数据库以优化......你还有其他的吗?除了按固定时间间隔工作之外,您还有哪些选择?或者这看起来是唯一理智的方法?
【解决方案2】:

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

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

【讨论】:

  • 嗯,主要是我想做调度以有效地清理和更改数据库。它更像是一个真正关闭时间的到期时间,即这个“商店”一劳永逸地关闭,此时我想进行清理 - 断开用户与其链接的聊天,删除聊天本身,将商店节点的标题更改为代表“历史”的东西,即曾经存在的商店。我无法缓存响应,因为正在进行更多过滤 - 包括 geolocarion 名称等
  • 现在我想只为开始时间建立索引并将此签入包含到每个查询中。并对一些后续请求进行清理,而不是安排它们。尽管我仍然需要始终检查 eqch 商店搜索请求中的结束/开始时间。另一种选择是按需关闭它们,这将解决所有问题,但无论如何我只是试图围绕我在这里拥有的所有可能性。
  • 是的,这是一个很好的观点,大部分商店将关闭的时间界限非常明确,因此在安排大量数据的情况下应立即更新。这听起来越来越没效果了。
猜你喜欢
  • 2021-06-29
  • 1970-01-01
  • 1970-01-01
  • 2021-09-01
  • 1970-01-01
  • 2019-01-13
  • 2012-10-06
  • 1970-01-01
  • 2017-02-14
相关资源
最近更新 更多