java - Spring @Async 保存搜索

标签 java multithreading spring search

我在基于 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/

相关文章:

java - JBAS014613 : Operation ("deploy") failed - address: ([ ("deployment" => "test.war")])

java - 使用扫描仪和方法从文件中读取

multithreading - C#算法股票交易

java - 为什么 Spring MVC 应用程序不显示?

java - 图像分辨率 vs 屏幕分辨率 vs 相机分辨率

java - 如何正确使用NIO选择器?

java - 了解生成线程的类上的线程和同步

java - 来自多个线程的数组的非锁定交互(在 Java 中)

java - 基于 Java 的 Spring 配置中属性的模式匹配

java - 我需要哪个jar来使用Spring AOP AspectJ Annotation?