背景:證券系統需極致低延遲行情接入分發,支持 Level-1/Level-2 多源。Level-1 由行情小站定時覆寫 DBF 文件 (上海 show2003.dbf、深圳 sjshq.dbf),目標:文件更新後最快時間讀取入內存、轉對象、轉類型。共 6 項優化,本文介紹前兩項。
內存硬盤極大提升讀寫速度,完美契合場景:
Windows 下對比多款軟件 (參考《12 RAM Disk Software Benchmarked...》) 選擇 Bond Disc (官網)。實測讀取速度提升有限 (文件僅 1-2MB,NIO 已很快),但意義在於:
傳統輪詢 (如 10ms/次) 平均延遲 5ms,效率低。JNotify 基於 OS API (JNI) 監聽目錄變更,發現文件修改即時回調。
public void addWatcher(String folder, String file) throws Exception {
int mask = JNotify.FILE_MODIFIED; // 僅關心修改
boolean watchSubtree = false;
watchId = JNotify.addWatch(folder, mask, watchSubtree, new JNotifyListener() {
public void fileModified(int wd, String root, String name) {
if (!file.equalsIgnoreCase(name)) return; // 過濾非目標文件
readHangqingFile(folder + File.separator + file);
}
public void fileRenamed(int wd, String root, String oldN, String newN) {}
public void fileDeleted(int wd, String root, String name) {}
public void fileCreated(int wd, String root, String name) {}
});
}
部署注意:除 JAR 外需放置 .dll/.so 本地庫,Eclipse 需配置 Native library location,運行時用 -Djava.library.path 指定。
測試:通知延遲 <1ms (受限於文件修改時間精度),遠優於輪詢。
待續…… (下篇講 NIO 讀取與緩存複用)