【问题标题】:Regular time checks in nodejs?在nodejs中定期检查?
【发布时间】:2020-10-22 08:29:43
【问题描述】:

我有一个带有 mongodb 数据库的不和谐机器人。 他有一个调节命令,在这种情况下是一个静音命令。每次主持人将成员静音时,该成员都会在数据库中收到一个«静音»角色和静音值,该值等于当前 UNIX 时间 + 静音时间的秒数。然后,在我启动应用程序的主文件中,我创建了计时器(setInterval ()),它每分钟查询一次数据库并检查当前时间是否比数据库中的时间长。如果是这样,参与者就会从静音角色中移除,并且值会被重置。

问题:这是一个好习惯吗?你怎么能做得更好? (我不考虑在发出惩罚后启动setTimeout ()计时器的选项,因为在这种情况下,当应用程序重新启动时,参与者永远不会被取消静音)

谢谢!

【问题讨论】:

    标签: node.js mongodb mongoose


    【解决方案1】:

    可能的解决方案:

    1. 对每个静音使用 setTimeout()。

    专业版:

    • 最佳时机。每次使用都会在最佳时间取消静音,延迟几乎为零。
    • 只有在某人被静音时才使用数据库。

    缺点:

    • 如果您的应用程序崩溃,所有超时都消失了。您可以通过添加一个启动例程来解决此问题,该例程取消所有旧静音并为每个仍然静音的用户添加新的超时。
    • 此外,许多静音用户可能会造成大量超时并消耗更多 资源。
    1. 使用 setInterval()

    专业版:

    • 将数据库操作减少到每个时间间隔 1 个。
    • 即使在应用重新启动后也能正常工作。

    缺点:

    • 即使没有人被静音,也会进行数据库检查。
    • 用户取消静音会有延迟。

    结论:

    您的情况没有对错之分。我建议采用解决方案 2,因为它更具可扩展性。

    【讨论】:

      【解决方案2】:

      我认为 setTimeout 是这里最简单的方法。 如果你想让它重新启动安全,你应该在启动时添加一个调用,它将检查你的 mongoDb 中的所有静音用户,并使用保存在 mongo 中的时间戳调用 setTimeout。这样您就可以确定没有人会被静音。

      如果用户还在数据库中但时间已经过期,也可以调用setImmediate或者直接调用清空函数。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2021-08-05
        • 1970-01-01
        • 2017-09-19
        • 2011-09-28
        • 2017-05-15
        • 2020-07-28
        • 2020-09-30
        相关资源
        最近更新 更多