我在基于 Java Spring 的网站中有一个搜索输入字段,用户可以在其中搜索网站内容。我想将用户输入的查询异步保存到我的 MySQL 数据库中以实现自动完成功能。我知道我可以在 Spring 中使用 @Async 注释来指定池大小:
<task:annotation-driven executor="executor" />
<task:executor id="executor" pool-size="100"/>
问题:
- 对于每分钟搜索量超过 10,000 次的高流量网站来说,这是一个好的解决方案吗?考虑获得池耗尽异常的可能性?
- 有更好的解决方案吗?
最佳答案
看看ThreadPoolTaskExecutor .当池中的所有线程都忙时,您的作业将排队等待,直到有线程可用。最大队列容量和线程数可以通过 queueCapacity
/maxPoolSize
属性进行调整(queueCapacity
默认为 INTEGER.MAX_VALUE)。
您必须担心的一件事是内存耗尽。如果您将队列容量设置得太高,并且您的作业运行时间太长,所有作业都会堆积在队列中,耗尽内存。
还要考虑拒绝服务。黑客可以通过填满所有队列来执行攻击(因此拒绝运行真正用户的作业)
所以我会说是的,这是一个很好的方法,因为您的 Controller 不必等到作业完成,但是请考虑每个排队的作业占用多少内存,您有多少内存空间,需要多长时间它会运行等等。
好的方法就是最好地猜测一些值,并设置一个好的线程池/队列监控/统计数据并随着时间的推移进行调整。
关于java - Spring @Async 保存搜索,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/17226108/