l****r 发帖数: 689 | 1 Implement two methods (web services)
1. getHit(): return last 5 mins hit
2. hitLog(): called every time the page is loaded
Follow up:
Consider how to scale it |
u*****o 发帖数: 1224 | |
l****r 发帖数: 689 | 3
所以挂了。。。发现原来你也是我大西雅图的 哈哈
【在 u*****o 的大作中提到】 : 好难。。。lz好人,谢谢分享,祝福内!
|
s********f 发帖数: 510 | 4 数据结构是一个数组,size 300 (1 sec 1 bucket), 初始化每个bucket都是0.
hitlog: bucket = sec % 300, array[bucket]++
get: return sum of the array
如果需要scale,需要考虑的问题有
1) 数组不能放在单个server上了,需要distributed cache (比如memcache 或者
redis)。
2) 一秒一个bucket是不是导致溢出,可以更精度再小一些,比如10millisec 一个。 |
m********a 发帖数: 128 | 5 how to scale 啊?
【在 l****r 的大作中提到】 : Implement two methods (web services) : 1. getHit(): return last 5 mins hit : 2. hitLog(): called every time the page is loaded : Follow up: : Consider how to scale it
|
l****r 发帖数: 689 | 6
但是你这样不是最近5min的啊 比如301 秒 和 1秒的 会重复计算了
应该用这个数组做shifting吧
【在 s********f 的大作中提到】 : 数据结构是一个数组,size 300 (1 sec 1 bucket), 初始化每个bucket都是0. : hitlog: bucket = sec % 300, array[bucket]++ : get: return sum of the array : 如果需要scale,需要考虑的问题有 : 1) 数组不能放在单个server上了,需要distributed cache (比如memcache 或者 : redis)。 : 2) 一秒一个bucket是不是导致溢出,可以更精度再小一些,比如10millisec 一个。
|
j**********3 发帖数: 3211 | |
l****r 发帖数: 689 | 8
不是
【在 j**********3 的大作中提到】 : 请问是new grad么?谢谢lz
|
y*******g 发帖数: 6599 | 9 这个一般无所谓。
【在 l****r 的大作中提到】 : : 不是
|
s********f 发帖数: 510 | 10 是的,需要有一个清零的job,每秒跑一次把现在的bucket清零。
不过这个很难做到绝对精度的5分钟,总要损失一些(或多或少)。
另外scale大了以后可以用double做counter,每次不是加1而是0.1或者0.01, get的时
候需要scale up。
【在 l****r 的大作中提到】 : : 不是
|
|
|
l****r 发帖数: 689 | 11 我电面的时候就是提出这个方案,有一个backend job,但是被否决了。
:是的,需要有一个清零的job,每秒跑一次把现在的bucket清零。
:不过这个很难做到绝对精度的5分钟,总要损失一些(或多或少)。 |
r*****3 发帖数: 27 | 12 用一个类似双向Queue的结构?
queue存的是(time, count)
每次hit 都看一下queue里面最后一个元素的时间是否一样, 如果一样就count++, 如果
不一样就把(time, 1)压进去
hit的时候可以顺便把超过30min的头部都dequeue...
不知道这样可不可以 scale不清楚 - - |
l****r 发帖数: 689 | 13 这个我也提到了类似的,当时他说,那如果一直没有调用gethit呢,空间就会越来越大
。。。。
最后是用了一个数组来做的,每次都位移。。。
:用一个类似双向Queue的结构?
: |
s********f 发帖数: 510 | 14 不一定需要一个backend job。假设每秒都有hit,那么在incr counter的同时把下一秒
清零就可以了。
如果不能保证每秒都有hit,才需要backend job。
【在 l****r 的大作中提到】 : 我电面的时候就是提出这个方案,有一个backend job,但是被否决了。 : : :是的,需要有一个清零的job,每秒跑一次把现在的bucket清零。 : :不过这个很难做到绝对精度的5分钟,总要损失一些(或多或少)。
|
y**********u 发帖数: 6366 | 15 这个是不是也可以用来做rateLimiter的呢?
interface rateLimiter {
void setQps (int maxQps);
boolean acceptRequest (Request request);
}
【在 s********f 的大作中提到】 : 不一定需要一个backend job。假设每秒都有hit,那么在incr counter的同时把下一秒 : 清零就可以了。 : 如果不能保证每秒都有hit,才需要backend job。
|
l****r 发帖数: 689 | 16 Implement two methods (web services)
1. getHit(): return last 5 mins hit
2. hitLog(): called every time the page is loaded
Follow up:
Consider how to scale it |
u*****o 发帖数: 1224 | |
l****r 发帖数: 689 | 18
所以挂了。。。发现原来你也是我大西雅图的 哈哈
【在 u*****o 的大作中提到】 : 好难。。。lz好人,谢谢分享,祝福内!
|
s********f 发帖数: 510 | 19 数据结构是一个数组,size 300 (1 sec 1 bucket), 初始化每个bucket都是0.
hitlog: bucket = sec % 300, array[bucket]++
get: return sum of the array
如果需要scale,需要考虑的问题有
1) 数组不能放在单个server上了,需要distributed cache (比如memcache 或者
redis)。
2) 一秒一个bucket是不是导致溢出,可以更精度再小一些,比如10millisec 一个。 |
m********a 发帖数: 128 | 20 how to scale 啊?
【在 l****r 的大作中提到】 : Implement two methods (web services) : 1. getHit(): return last 5 mins hit : 2. hitLog(): called every time the page is loaded : Follow up: : Consider how to scale it
|
|
|
l****r 发帖数: 689 | 21
但是你这样不是最近5min的啊 比如301 秒 和 1秒的 会重复计算了
应该用这个数组做shifting吧
【在 s********f 的大作中提到】 : 数据结构是一个数组,size 300 (1 sec 1 bucket), 初始化每个bucket都是0. : hitlog: bucket = sec % 300, array[bucket]++ : get: return sum of the array : 如果需要scale,需要考虑的问题有 : 1) 数组不能放在单个server上了,需要distributed cache (比如memcache 或者 : redis)。 : 2) 一秒一个bucket是不是导致溢出,可以更精度再小一些,比如10millisec 一个。
|
j**********3 发帖数: 3211 | |
l****r 发帖数: 689 | 23
不是
【在 j**********3 的大作中提到】 : 请问是new grad么?谢谢lz
|
y*******g 发帖数: 6599 | 24 这个一般无所谓。
【在 l****r 的大作中提到】 : : 不是
|
s********f 发帖数: 510 | 25 是的,需要有一个清零的job,每秒跑一次把现在的bucket清零。
不过这个很难做到绝对精度的5分钟,总要损失一些(或多或少)。
另外scale大了以后可以用double做counter,每次不是加1而是0.1或者0.01, get的时
候需要scale up。
【在 l****r 的大作中提到】 : : 不是
|
l****r 发帖数: 689 | 26 我电面的时候就是提出这个方案,有一个backend job,但是被否决了。
:是的,需要有一个清零的job,每秒跑一次把现在的bucket清零。
:不过这个很难做到绝对精度的5分钟,总要损失一些(或多或少)。 |
r*****3 发帖数: 27 | 27 用一个类似双向Queue的结构?
queue存的是(time, count)
每次hit 都看一下queue里面最后一个元素的时间是否一样, 如果一样就count++, 如果
不一样就把(time, 1)压进去
hit的时候可以顺便把超过30min的头部都dequeue...
不知道这样可不可以 scale不清楚 - - |
l****r 发帖数: 689 | 28 这个我也提到了类似的,当时他说,那如果一直没有调用gethit呢,空间就会越来越大
。。。。
最后是用了一个数组来做的,每次都位移。。。
:用一个类似双向Queue的结构?
: |
s********f 发帖数: 510 | 29 不一定需要一个backend job。假设每秒都有hit,那么在incr counter的同时把下一秒
清零就可以了。
如果不能保证每秒都有hit,才需要backend job。
【在 l****r 的大作中提到】 : 我电面的时候就是提出这个方案,有一个backend job,但是被否决了。 : : :是的,需要有一个清零的job,每秒跑一次把现在的bucket清零。 : :不过这个很难做到绝对精度的5分钟,总要损失一些(或多或少)。
|
y**********u 发帖数: 6366 | 30 这个是不是也可以用来做rateLimiter的呢?
interface rateLimiter {
void setQps (int maxQps);
boolean acceptRequest (Request request);
}
【在 s********f 的大作中提到】 : 不一定需要一个backend job。假设每秒都有hit,那么在incr counter的同时把下一秒 : 清零就可以了。 : 如果不能保证每秒都有hit,才需要backend job。
|
|
|
s*****B 发帖数: 32 | |