对不起,如果我的问题很傻。
我正在使用ArrayBlockingQueue。
private ArrayBlockingQueue<RequestParameters> processorQueue;
private int sizeOfQueue = 3000;
在这里,我的生产者是单独的线程,消费者是单独的线程。
两者都在“单一生产者-消费者线程”模型中运行。
现在,我正在运行我的Java App,它向我的Servlet发出请求。生产者将请求放入队列。
使用者对请求进行拍照并开始处理,其中涉及数据库操作。(大约需要1秒才能完成任务)
在这里,“我的生产者”正在非常迅速地收到请求,它填充了Queue,并等待消费者开始处理并在Queue中腾出空间。
我的问题是
我应该使用哪种最佳的BlockingQueue Impl,以便获得最佳的性能。
当“队列大小”为“满”时会发生什么,我的意思是无论生产者正在等待队列获取Vaccant,Servlet都将获取请求。那所有传入的请求呢?这些请求会去哪儿?那些要求是
是否存储在JVM内存中,并在不阻塞的情况下提供给生产者线程?
谢谢。
最佳答案
尽管正确的解决方案将取决于您的应用程序要求的可行性,但以下操作可能会有所帮助:
当Q已满而不是无限期地阻塞时,请使用timeout
进行阻塞,以便Servlet将在固定配置的时间内返回响应。如果是timeout
,则servlet可能会抛出服务器繁忙的自定义错误消息或相关的HTTP-CODE
。
由于您的使用者速度慢而生产者速度很快,因此您不妨考虑增加使用者线程,以减少对Servlet调用者的阻塞体验。
另外,接受所有请求(即存储到无限制的Q中)也不是一个好的解决方案,因为(由于请求大小而定)由于消费者Q缓慢,在一段时间内可能会消耗大量内存。