簡體   English   中英

設計:具有高吞吐量的Java應用程序

[英]Design : A Java Application with high throughput

我有一個場景,其中

  1. 必須讀取具有\\ n分隔的特定格式的巨大輸入文件,它具有近2000萬條記錄。
  2. 必須通過以特定格式將每個記錄發送到服務器來讀取和處理每個記錄。

=====================

我正在考慮如何設計它。
-讀取文件(nio)
-讀取文件的線程可以將這些塊保留在JMS隊列中。
-創建代表n個服務器的n個線程(數據將發送到該服務器)。 然后,並行運行的n個線程可以一次拾取一個塊。通過向服務器發送請求來執行該塊。

您能建議上述方法是否還行,還是看到任何缺陷:)。 同樣,如果您可以提出更好的方法/技術來做到這一點,那將是很好的。



謝謝!

更新 :我編寫了一個程序來讀取具有20m條記錄的文件,並使用Apache Commons IO(文件迭代器)讀取了文件(每次10行)。 並在1.2秒內讀取了文件。 這有多好? 我應該考慮去nio嗎? (當我確實放了一條日志打印塊時,花了將近26秒!)

2000萬條記錄實際上並不是很多,所以首先我將嘗試正常處理它,您可能會發現性能不錯。

之后,您將需要進行測量。

您需要按順序從磁盤讀取數據,以便在那里有良好的速度,因此該磁盤必須是單線程的。

您不希望磁盤讀取等待網絡或網絡等待磁盤讀取,因此將讀取的數據放入隊列是個好主意。 您可能希望將塊大小大於一行,但要獲得最佳性能。 測量不同塊大小下的性能以查看。

您可能會發現網絡發送比讀取磁盤快。 如果是這樣,那么您就完成了;如果沒有,那么您可以啟動更多從隊列中讀取的線程,並對其進行測試。

因此,您的調整因素是:

  • 塊大小
  • 線程數。

確保在各種組合的相當數量的數據上衡量性能,以找到最適合您的情況的組合。

我相信您可以批處理記錄,而不是一次發送一個。 考慮到服務器需要處理的數據量,您可以避免不必要的網絡躍點。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM