程序代写代做代考 Java Stripe Onsite 重新整理-rate limiter

Stripe Onsite 重新整理-rate limiter
比如 1s 限制 5 个请求, 可以在 1s 的开始就获取全部 5 个请求; 而不是必须等待 200ms 才能获取一个请求.
时间是滑动窗口.
需要自己写测试用例.

写测试用例如何避免 sleep , 比如题目是 1s 限制 5 个请求, 怎么测试能尽快验证超过 1s 的情况 (用 mock, mock 当前系统时间)

第一问: 2秒之内只能发5个request, 怎么limit
第二问: 如果request 里面有customer id, 怎么让这个rate limit是customer specific的 (就是 customer 1 的limit超过了 并不影响 customer 2 的 request)
第三问: 有的request 会比其他的request 更 expensive。那么如果 input 里面还有一个关于 request weight 的信息,怎么改这个function。(比如 request 1 要占两个request的位置,怎么改)
    -这个要自己多加一点test case, 就什么limit是 5 request/2s, 那么一个weight 是6 的request就直接fail之类的。

我写的用的hashmap,记录api call 和 timestamp,每来一个timestamp就看hm里相应api call之前的timestamp,看给定time frame内有没有超过limit数目,如果超过了,就throw exception,如果没有超过就push back new timestamp。我这不一定是最好的解法,做得也比较粗糙,以及对方要求了时间精度,1 second = 1000 milliseconds

**unit test。
Follow up 1:如果需要测试1小时只允许3个request的rate limiter,如何写unit test?
Follow up 2:如果需要支持multithreading,需要考虑哪些因素?

网上查怎么在python里mock一个函数的返回值了。
请问lz写unit test的时候必须使用mock吗?还是可以直接call前面写好的rate limiter建新的instance?
需要mock获得当前时间戳的系统函数

rate limiter的follow up:实现对于每个用户的限流 (例如每个user有一个uid作为标记的话,怎么对于每个user限制2秒钟访问5次)

第一轮:就是写一个函数, 然后限制另一个函数的调用次数。 比如说每个用户在2s内最多调用5次,多于五次就raise exception。然后要写一些testcase.
我是对于每个用户,记录他请求的timestamp, 然后比较长度和时间差

https://news.ycombinator.com/item?id=16941554
https://github.com/google/guava/blob/master/guava/src/com/google/common/util/concurrent/RateLimiter.java