2016-10-03 21 views
2

我遇到了必須記錄隊列中最後1000個事件的情況。 通過減少昂貴的文件操作來處理這個問題的最佳解決方案是什麼? 目前我們完全用所有隊列條目重寫文件。記錄最近1000次事件的文件操作的最佳方式

在下面提到的兩個解決方案中,哪一個好?或者有沒有其他的選擇來加速日誌記錄?

  1. 使固定的日誌消息大小和使用文件指針做讀/寫操作。
  2. 創建多個文件,並在請求到來時,再從最後文件中讀取1000個事件
+0

文件名必須保持不變嗎?如果你註冊了2000年的活動,可以嗎? – NathanOliver

+0

關於文件名沒有限制。只有當用戶請求我們必須提供最近的1000個事件日誌。當應用程序重新啓動時,我們正在存儲1000個用於重新加載的事件。 –

+0

如果日誌文件變大,會影響嗎?如果現在,只需從終端尾部-1000

回答

2

有幾方面的考慮這裏,這不能全部同時進行了優化。其中有:

  1. 該方法的發射日誌消息

    的延遲和吞吐量
  2. IO操作

  3. 讀數的日誌消息的等待時間的總數

可能沒有「最好的辦法」。您需要找到適合您要求的工作點。


例如,奧利弗·內森在評論中基本上建議使發射過程中寫入一些aux文件,一旦滿有其重命名auxlog

這個想法對於發射器具有非常低的延遲特性,並且基本上是IO操作的最佳總數。相反,(至少取決於實施情況),讀者有無限的延遲。假設記錄器發出1700條消息,然後無限期地停止記錄。日誌讀取器訪問最後的700條消息時間沒有限制。

所以,這個想法在某些設置中可能會非常出色,但在其他設置中它可能被認爲是不夠的。


做它(具有不同的工作點)的另一種方法,是使發光過程中的消息再次寫入到一些aux。當aux的消息數量超過某個數字(可能少於1000)或已經過了一定時間時,它應該將aux重命名爲temp目錄中的某個臨時命名文件。

同時,後臺進程可以定期掃描tmp目錄。當它看到有文件,它應該閱讀:

  • log文件(這是從外部觀察到的唯一的文件)

  • tmp發現修改時間排序的文件

它應保留最近的1000條消息(最多),將它們寫入某個tmp_log文件,將其重命名爲log,然後擦除它在tmp中讀取的文件。

這對於發射器和閱讀器都有合理的延遲,但是更多的IO訪問總數。因人而異。

+0

感謝您的詳細解答。這非常有幫助。 –

+0

不客氣。祝一切順利。 –