yulu

设计一个简单好用的代理ip库

前两天领导给出了一个问题,描述如下:
需求:设计一个小系统,该系统会提供给使用者一个ip。
要求:ip的可用性要高

然后就开始考虑如何有效率的实现这个东西了。
Day1:首先根据我的经验我是这样设计的:

1
2
3
4
5
首先要做两个池子A、B,池子A中存放可用的ip,每次从A中按权重从大到小取ip:
1.如果ip不可用,将ip丢入池子B
2.如果ip可用丢回到池子A,并把该ip的权重调大
最后还需要一个任务,这个任务的作用是轮询池子B中的ip看是否在一段时间后可用,如果可用则将其丢回池子A。

很不幸,领导说这个太复杂了…并提示我参照之前做的功能,让我再考虑考虑。

Day2: 根据之前做的一个热门内容推荐的功能设计出这样的逻辑:

1
2
3
4
首先做一个池子C,池子中存放的是很多ip,每个ip初始权重相同,每次从C中按权重大小取出10条ip:
1.若ip不可用,将ip权重减少丢回到池子中
2.若ip可用,将ip权重增加丢回到池子中
需要注意的是增加的权重应该小于减少的权重。

我以为这样挺不错的一个方案,结果又是很不幸…

最后领导给出的解决方案是这样的:
建一个表D,表结构如下:

1
2
3
4
5
6
7
8
9
10
++++++++++++++++++++++++++
+ ip + char +
++++++++++++++++++++++++++
+ next_time + int +
++++++++++++++++++++++++++
+ error_time + int +
++++++++++++++++++++++++++
将 next_time 和 error_time 初始化为0,每次从表中取next_time最小的记录:
1.若ip可用,将ip的next_time稍微增加一些,然后更新该记录。
2.若ip不可用,将ip的error_time = error_time + 1,然后将next_time = error_time * 24(小时)。这只是示例,具体调到多大按需处理。

ok,设计完成。