如果我使用数千个 setTimeouts 会发生什么?
P粉811349112
P粉811349112 2023-09-10 15:08:09
0
1
584

有一个通过node.js在服务器端的网站,每次刷新页面时它都会生成一个新代码,我想检测自上次代码生成以来是否已经过了24小时,问题是我要做我需要弄清楚 24 小时是否已经过去,如果我在用户的 IP 上使用 setTimeout() ,则会出现两个问题,第一个问题是他们可以轻松更改其 ip 并获取新代码,甚至重新启动路由器并分配新的代码ip,因为某些路由器带有动态 ip,第二个问题是考虑到每天甚至每小时都会有数千名用户使用如此数量的 setTimeouts 访问网站,服务器将因单独为 setTimeouts 分配的内存量而过载。我已经阅读了 setTimeouts 的工作原理,它们在 JavaScript 编译器中分配一些空间以在指定时间运行,因此我的堆或内存肯定会因此而过载,是否有更好的方法来确定 24 小时是否已经过去或不是不使用 setTimeout() 吗?

我尝试查找相同的问题,但找不到任何解决此问题的方法,我想到使用数据库来解决此问题,但会出现另一个问题,因为我需要循环整个数据库检查当前时间是否为 24比文档创建时间高出几个小时,这样的循环要么需要几天时间才能完成,并且如果 API 出现故障(我定期重新启动它以更新内容),则会失败

我正在尝试找到一种解决方案,该解决方案不会使用 setTimeouts 破坏我的服务器,并且如果 API 因任何原因发生故障也不会失败,并且可以选择能够确定用户是否在欺骗 ips

P粉811349112
P粉811349112

全部回复(1)
P粉356361722

要解决您的问题,您可以结合使用服务器端存储和时间戳。这是一种可能的方法:

  1. 生成新代码时,将其与时间戳一起存储在数据库或 Redis 等持久存储解决方案中。

  2. 当用户访问网站时,从存储中检索最后生成的代码及其时间戳。

  3. 将当前时间戳与存储的时间戳进行比较,以确定自上次代码生成以来是否已过去 24 小时。您可以使用 JavaScript 中的 Date 对象来处理时间戳。

  4. 如果超过 24 小时,则生成新代码并更新数据库中存储的代码和时间戳。

通过使用这种方法,您可以避免大量的 setTimeout 调用,并且还无需为每个用户循环访问整个数据库。相反,您只需要对每次用户访问的时间戳进行简单的比较。

关于用户欺骗 IP 的问题,完全防止 IP 欺骗具有挑战性,因为用户可以使用各种技术来更改其 IP 地址。但是,您可以实施额外的安全措施来最大程度地减少 IP 欺骗的影响:

  1. 实施用户身份验证:要求用户创建帐户并登录才能访问网站。这样,即使他们更改了 IP,他们仍然需要有效的凭据来生成新代码。

  2. 实施速率限制:限制特定时间范围内每个用户的代码生成请求数量。这有助于防止滥用并减少 IP 欺骗的影响。

  3. 监控可疑活动:实施日志记录和监控机制来检测可能表明 IP 欺骗尝试的异常模式或行为。您可以设置警报或触发器,以便在检测到可疑活动时通知您。

虽然这些措施不能完全消除 IP 欺骗的可能性,但它们可以使用户更难滥用系统并减少此类尝试的影响。

热门教程
更多>
最新下载
更多>
网站特效
网站源码
网站素材
前端模板