【发布时间】:2017-06-14 05:08:13
【问题描述】:
我想将我的用户限制为 25k/每小时/每天/任何请求。
我的第一个想法是简单地使用 mysql 并在 users 表中有一个列,我将在其中存储请求,并且每次用户发出请求时我都会增加这个计数器。这种方法的问题在于,有时您最终会同时在列中写入,并且您会从 mysql 中遇到死锁,所以这并不是一个真正的好方法,不是吗?
另一种方法是,而不是增加列的计数器,而是在单独的表中插入日志记录,然后在给定的时间跨度内计算这些记录,但这样你可以很容易地得到百万记录表和查询可能太慢了。
使用 RDBMS 时要考虑的另一个方面是,在每次请求时,您都必须从数据库中计算用户配额,这可能需要时间,具体取决于上述任何一种方法。
我的第二个想法,我想使用 redis/memcached 之类的东西(不确定替代方案或其中一个更快)并将请求计数器存储在那里。这足以查询和增加计数器,肯定比 RDBMS 更快,但我还没有尝试过处理大量数据,所以我还不确定它会如何执行。
我的第三个想法,我会将配额数据保存在内存中的映射中,例如map[int]int,其中键是 user_id,值是配额使用情况,我会使用互斥锁保护映射访问.这将是所有解决方案中最快的解决方案,但是如果由于某种原因您的应用程序崩溃,您会丢失与某些用户所做的请求数量相关的所有数据,您会怎么做。一种方法是在崩溃时捕获应用程序并循环遍历地图并更新数据库。这可行吗?
不确定上述任何一种方法是否正确,但我愿意接受建议。
【问题讨论】:
-
既然你在谈论一个 web 应用程序,一个简单且明显更轻量级的解决方案是使用 HAProxy 来执行此操作,它优化了用于保存大量计数器的内存结构,我相信是 @987654321 @.
标签: mysql go redis memcached quota