2017-06-22 78 views
1

我們有一個應用程序,我們解析excel(大約100k),並在excel中的每一行我們將調用4個不同的REST調用[在不同的域]和返回的輸出存儲在REDIS實例中用於進一步處理REST調用減慢Spring啓動應用程序 - 性能改進

1)如果有100k條記錄,我們將使用100k * 4個並行REST API調用(並行50個線程),並且一條記錄需要30秒來完成整個過程。這似乎減慢了我們的流程,因此我們可以使用其他可選框架(在Java相關技術中會有所幫助)來加速此過程。 2)由於REDIS是單線程,因此我們要按順序插入數據,因此在這個過程中需要更多時間,是否有一種方法可以將並行數據從REDIS中取出或者有其他選擇。

回答

1

這真的很有趣的事情,只是在我腦海中彈出一個解決方案就是這樣。

  • 使用隊列(例如Apache的ActiveQ)
  • 過程excel文件,並把單獨的消息隊列
  • 收件向上其他服務(一個或多個),用於處理從該隊列中的消息。

通過這樣做,你的主要服務將是放心,這將只是讀取Excel文件,並把消息隊列,可以用頭把隊列前辨別信息,這將幫助,如果您正打算寫不同的服務針對它們將從隊列中消耗的不同類型的消息。

0

您可以使用@Asynchttps://spring.io/guides/gs/async-method/),或者您可以使用執行程序同時執行多個進程。下面是我如何與執行者做的:

ExecutorService executor = Executors.newFixedThreadPool(nThreads); 
List<FutureTask<Integer>> workersList = new ArrayList<FutureTask<Integer>>(); 

然後提交您的新主題執行人:

for (int i = 0; i < nRecords; i++) { 
    Worker worker = new Worker(args); 
     workersList.add(worker); 
     } 
pool.shutdown(); // Disable new tasks from being submitted 
while (!executor.isTerminated()) { 
       } 
for (int i = 0; i < nRecords; i++) { 
     System.out.println(workersList.get(i).get()); 
    } 

你的工作線程應該實現可調用:

public class Worker implements Callable<Integer> (String[] args)