/p_sponge

带缓冲的ThreadPoolExecutor

Primary LanguageJava

pq-sponge

带缓冲的ThreadPoolExecutor

1、需求介绍

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

2、使用介绍

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

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

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

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

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

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

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

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

关键参数可调整。

功能虽小,但用途还是比较广的,理论上任何使用ThreadPoolExecutor的地方,都可以用它来替代。

参考:https://github.com/netcomm/sponge