Allchin 2012-11-05
由于项目中需要使用ArrayBlockingQueue方式的ThreadPoolExecutor,设置的有界队列上限为1000,由于java默认在线程数超过maximumPoolSize时会抛弃超过上限的请求,所以在某些压力较大情况下会出现丢弃较多请求的情况。所以如果能先把超过上限的请求序列化到某种存储介质上,然后按照先进先出一批批的提供给后面的工作线程,做一个类似“阀门”装置,那就比较好了。
目前这个组件已经开发完毕,目前开源地址是https://github.com/netcomm/sponge,它的基本介绍如下:
#使用方式跟普通的ThreadPoolExecutor没有任何差别,开发人员没有任何感觉。
#正常情况下请求都走内存,只有在超过阀值后,请求才会进行持久化,一旦持久化的请求都被消费后,重新进入内存模式。这极大的保证了性能和缓冲的平衡。
#在突发极大并发请求下,保证系统的稳定性为第一目标。
#能自动缓冲超过某个阀值的任务请求。
#缓冲持久化的方式灵活,可根据使用场景进行选择,如基于文件(系统吞吐量巨大)、数据库(系统吞吐量大)、redis(系统吞吐量巨大)、…。
#任务的请求处理顺序默认先进先出模式。
#实现原理简单,代码量少。
#默认实现基于文件的缓冲持久化模式。
#关键参数可调整。
功能虽小,但用途还是比较广的,理论上任何使用ThreadPoolExecutor的地方,都可以用它来替代。欢迎大家在实际项目中使用,有任何问题都请联系我或提交到github上。