人人15年测试题


下图所示,server接收调用方发送的请求(request)并转发给handler处理。每个调用方有名称(name)和优先级(weight),所有调用方发送同一种请求,而且有可能短时间内发送大量请求(请求尖峰)。Handler每秒最多能够处理N个请求。现在需要为server设计一个请求控制模块,要求:

a)调用方weight值越高的请求,平均等待时间越低

b)减小请求尖峰的冲击

c)不能导致handler压力过大

 

a)可使用优先级队列进行辅助,weight越大的优先级越高。由于所有请求都是同一种请求,所以可以将其统一封装管理。

在Java中可以使用 PriorityQueue 进行处理,队列中存放待执行的请求。该优先级队列的元素需要继承Comparable接口用来实现比较,实现的时候用weight进行比较。

b)为减小尖峰的冲击,可以使用线程池,即运用线程池,将可执行的线程的最大值规定下来,当尖峰来临时,线程池可根据待执行的队列中的任务数量调用线程,当线程池中的所有线程都处于busy状态的时候,剩下的任务在队列中等待。直到有空余线程的时候,再从队列中取出任务进行操作。

该方法也可用于

c)问题中,避免handler压力过大,对请求处理的线程数量进行限制,使得handler的处理能力高于最大任务量即可。

 

Jumping from failure to failure with undiminished enthusiasm is the big secret to success.
原文地址:https://www.cnblogs.com/chongerlishan/p/6571428.html