從 .Net 服務中,一些指標正在以每日周期聚合和重繪 。如果服務關閉/重新啟動,在最壞的情況下,丟失的資料可能從幾分鐘到一整天不等。
如果我經常記錄,如果不能防止損失最小化,比如說每小時而不是每天,記錄的行數將從每天三位數的百萬行增加到至少兩位數的十億行。在服務關閉/重新啟動之前嘗試重繪 并不能防止服務突然關閉/重新啟動的損失。
哪種型別的 C# 編程結構或事件處理有助于減少記錄頻率并將損失降至盡可能低的百分比?
(我希望這個問題足夠具體/重點。如果你認為不是,想在評論中討論。)
uj5u.com熱心網友回復:
如果您確定服務是正常關閉的,而不是快速關閉的方式,那么在 .net Web 應用程式中,您可以附加一些可以保存資料的內容,如果需要的話,可以將其附加到應用程式停止處理程式中。此類功能需要訪問當前日志狀態,因此日志服務需要了解其當前記錄的資料狀態。
// if IApplicationLifetime wont work, try IHostApplicationLifetime
public class Startup
{
public void Configure(IApplicationBuilder app, IApplicationLifetime applicationLifetime)
{
applicationLifetime.ApplicationStopping.Register(OnShutdown);
// Additional configurations, etc...
}
private void OnShutdown()
{
//this code is called when the application stops
}
}
如果問題在于過多的資料庫呼叫,這會迫使您批量處理日志條目,那么我會首先更頻繁地將日志記錄到本地檔案,然后讓后臺服務定期掃描并將此檔案的背景關系批量上傳到資料庫. 同樣,這將需要標記已上傳的條目,并且在某些情況下,當進行了 db 呼叫但應用程式在將檔案的背景關系標記為已上傳之前崩潰時,則下次將進行重復上傳。這可以通過將檔案中的最后一個日志條目與最后上傳的條目進行比較、在資料庫中存盤一些標記來避免,這些標記與日志上傳保存在同一事務中,或者通過檢查上傳日志的時間戳與本地存盤中的日志。
uj5u.com熱心網友回復:
- 每小時保存當前聚合值,然后從前一小時洗掉之前的聚合值
- 保存一天一次的聚合值并洗掉最后一小時的值
縮小資料范圍或使用相鄰時間重復資料洗掉可能會有所幫助。
例子,
- 如果最新資料點在前一個資料點的 0.01% 以內并且在過去 500 毫秒內,則丟棄最新資料點
- 為每個資料點保留觀察到的日期時間和結束日期時間,它測量第一次看到值的時間,然后從該日期時間到結束日期時間觀察到的所有點都在第一次觀察到的值的 0.1% 之內。這也可以超時,并且不會讓超過 30 秒的資料進入一個樣本。
這些都取決于您的業務用戶是否同意容差、事件數量的損失、采樣頻率等。
轉載請註明出處,本文鏈接:https://www.uj5u.com/ruanti/349160.html
上一篇:如果沒有等待最后一個MoveNextAsync()任務,IAsyncEnumerator<T>.DisposeAsync()是否應該拋出?
