在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中定期检查?的主要内容,如果未能解决你的问题,请参考以下文章

如何定期执行 android 位置检查?

在 NodeJS 中检查查询结果?

Nodejs + reactjs + jwt 检查

使用 Shell 脚本定期检查 MySQL 服务是否正常运行

使用 Shell 脚本定期检查 MySQL 服务是否正常运行

使用 Shell 脚本定期检查 MySQL 服务是否正常运行