我們有一項將某些數據寫入文件的服務。每個請求新文件。例如:Java Spring異步性能
GET http://service.somecompany.com/save/{data}
此請求將創建新文件/var/files/{random-name}.txt
。
服務使用@Async構建,以避免客戶端在文件寫入時等待。請參閱代碼示例:
@Controller
public class SomeController {
@Autowired
private SomeService someService;
@RequestMapping(value = "/save/{data}", method = RequestMethod.GET)
public @ResponseBody
String add(@PathVariable("data") String data) {
someService.saveData(data);
return "Ok!";
}
}
SomeService實現:
@Service
public class SomeServiceImpl implements SomeService {
@Async
public Future<Boolean> saveData(String data) {
// file saving with BufferedWriter ...
return new AsyncResult<Boolean>(successful);
}
}
目前每個請求將創建新的線程。但是,如果我將發送100 000個數據保存請求 - 它們將創建最大可用線程數。這將會寫入數據太慢。 也許更好,以限制線程數:
<task:annotation-driven executor="taskExecutor" />
<bean id="taskExecutor"
class="org.springframework.scheduling.concurrent.ThreadPoolExecutorFactoryBean">
<property name="corePoolSize" value="100" />
<property name="maxPoolSize" value="250" />
<property name="keepAliveSeconds" value="60" />
</bean>
但如果限制 - 選擇哪種尺寸?或者,也許這是真的不同地提高性能?你怎麼看?
感謝您的回答。 (這是kaqqao答案下的評論副本)。使用線程的動機不在進行一些計算。動機是避免客戶等待。這很關鍵。預計的負載也是每秒100-200個請求。數據大小平均爲1 KB。 SSD幾乎不會..因此,線程數量之外的任何東西都不會保留.. – 2014-11-22 17:46:32
無論您的池是否有1個線程或200個,用戶都不會等待,因爲您正在調用異步方法。作業將被放入隊列中,等待一個線程執行它。寫入200個文件所花費的時間可能會比一個線程少100個,因爲您不會有更多的上下文切換,並且寫入將是順序的而不是併發的。我不明白你最後兩句話。 – 2014-11-22 17:56:22
對不起,我的英語不好。並感謝您的幫助。我將嘗試用一個線程進行投票。 – 2014-11-22 18:36:19