在nodejs中定期检查?
Posted
技术标签:
【中文标题】在nodejs中定期检查?【英文标题】:Regular time checks in nodejs? 【发布时间】:2020-10-22 08:29:43 【问题描述】:我有一个带有 mongodb 数据库的不和谐机器人。
他有一个调节命令,在这种情况下是一个静音命令。每次主持人将成员静音时,该成员都会在数据库中收到一个«静音»角色和静音值,该值等于当前 UNIX 时间 + 静音时间的秒数。然后,在我启动应用程序的主文件中,我创建了计时器(setInterval ()
),它每分钟查询一次数据库并检查当前时间是否比数据库中的时间长。如果是这样,参与者就会从静音角色中移除,并且值会被重置。
问题:这是一个好习惯吗?你怎么能做得更好? (我不考虑在发出惩罚后启动setTimeout ()
计时器的选项,因为在这种情况下,当应用程序重新启动时,参与者永远不会被取消静音)
谢谢!
【问题讨论】:
【参考方案1】:可能的解决方案:
-
对每个静音使用 setTimeout()。
专业版:
最佳时机。每次使用都会在最佳时间取消静音,延迟几乎为零。 只有在某人被静音时才使用数据库。缺点:
如果您的应用程序崩溃,所有超时都消失了。您可以通过添加一个启动例程来解决此问题,该例程取消所有旧静音并为每个仍然静音的用户添加新的超时。 此外,许多静音用户可能会造成大量超时并消耗更多 资源。-
使用 setInterval()
专业版:
将数据库操作减少到每个时间间隔 1 个。 即使在应用重新启动后也能正常工作。缺点:
即使没有人被静音,也会进行数据库检查。 用户取消静音会有延迟。结论:
您的情况没有对错之分。我建议采用解决方案 2,因为它更具可扩展性。
【讨论】:
【参考方案2】:我认为 setTimeout 是这里最简单的方法。 如果你想让它重新启动安全,你应该在启动时添加一个调用,它将检查你的 mongoDb 中的所有静音用户,并使用保存在 mongo 中的时间戳调用 setTimeout。这样您就可以确定没有人会被静音。
如果用户还在数据库中但时间已经过期,也可以调用setImmediate或者直接调用清空函数。
【讨论】:
以上是关于在nodejs中定期检查?的主要内容,如果未能解决你的问题,请参考以下文章
使用 Shell 脚本定期检查 MySQL 服务是否正常运行