带持久化缓冲的ThreadPoolExecutor

Allchin 2012-11-05

由于项目中需要使用ArrayBlockingQueue方式的ThreadPoolExecutor,设置的有界队列上限为1000,由于java默认在线程数超过maximumPoolSize时会抛弃超过上限的请求,所以在某些压力较大情况下会出现丢弃较多请求的情况。所以如果能先把超过上限的请求序列化到某种存储介质上,然后按照先进先出一批批的提供给后面的工作线程,做一个类似“阀门”装置,那就比较好了。

目前这个组件已经开发完毕,目前开源地址是https://github.com/netcomm/sponge,它的基本介绍如下:

#使用方式跟普通的ThreadPoolExecutor没有任何差别,开发人员没有任何感觉。

#正常情况下请求都走内存,只有在超过阀值后,请求才会进行持久化,一旦持久化的请求都被消费后,重新进入内存模式。这极大的保证了性能和缓冲的平衡。

#在突发极大并发请求下,保证系统的稳定性为第一目标。

#能自动缓冲超过某个阀值的任务请求。

#缓冲持久化的方式灵活,可根据使用场景进行选择,如基于文件(系统吞吐量巨大)、数据库(系统吞吐量大)、redis(系统吞吐量巨大)、…。

#任务的请求处理顺序默认先进先出模式。

#实现原理简单,代码量少。

#默认实现基于文件的缓冲持久化模式。

#关键参数可调整。

功能虽小,但用途还是比较广的,理论上任何使用ThreadPoolExecutor的地方,都可以用它来替代。欢迎大家在实际项目中使用,有任何问题都请联系我或提交到github上。

相关推荐