首页 > 试题广场 >

为server端设计一个请求控制模块。

[问答题]
下图所示,server接收调用方发送的请求(request)并转发给handler处理。每个调用方有名称(name)和优先级(weight),所有调用方发送同一种请求,而且有可能短时间内发送大量请求(请求尖峰)。Handler每秒最多能够处理N个请求。现在需要为server设计一个请求控制模块,要求:
a)           调用方weight值越高的请求,平均等待时间越低
b)           减小请求尖峰的冲击
c)           不能导致handler压力过大

推荐
a),可使用优先级队列进行辅助,weight越大的优先级越高。由于所有请求都是同一种请求,所以可以将其统一封装管理。
在Java中可以使用 PriorityQueue<T> 进行处理,队列中存放待执行的请求。该优先级队列的元素需要继承Comparable接口用来实现比较,实现的时候用weight进行比较。

b)为减小尖峰的冲击,可以使用线程池,即运用线程池,将可执行的线程的最大值规定下来,当尖峰来临时,线程池可根据待执行的队列中的任务数量调用线程,当线程池中的所有线程都处于busy状态的时候,剩下的任务在队列中等待。直到有空余线程的时候,再从队列中取出任务进行操作。
该方法也可用于C)问题中,避免handler压力过大,对请求处理的线程数量进行限制,使得handler的处理能力高于最大任务量即可。
编辑于 2015-02-03 20:11:12 回复(1)
weight 定义为处理所需时间,按照段作业优先方式,使得平均等待时间最短
发表于 2014-12-09 19:40:01 回复(0)