UNIX程式設計藝術之「文字化」

2021-06-17 16:13:53 字數 1863 閱讀 8867

本章的標題表達了作者的主旨:good protocols make good practice。的確,好的協議或檔案格式,會大大提公升使用者的效率。這裡的文字化,包括兩類,一是通訊協議,二是資料檔案(包括配置檔案,日誌檔案等)。下面分別討論這兩種資料的常用格式。

1.資料檔案

配置檔案常用的格式有ini,xml格式,比較推薦的是xml格式的,xml分層的結構和靈活的設計可以很方便的擴充套件並且儲存向下相容。另外一種系統類配置檔案如系統的金鑰等,常使用分隔符進行區分,這一點是因為這類檔案通常是行儲存後,不需要太強的擴充套件性,清晰與精簡是第一位的,此外,也方便使用sed、awk等工具。

日誌檔案一般分為兩種,一種是出錯日誌,另一種是流水日誌。出錯日誌旨在方便使用者快速定位問題,因此格式不需要太拘泥,只要把錯誤碼、錯誤資訊、**行和其它特殊資訊如登陸id等列印清楚即可;流水日誌一方面是資料記錄,更重要功能是進行資料分析和資料提取,而可讀性是次要的,基於這個原則流水日誌的格式推薦dsv風格,使用如豎線、下劃線等進行分隔,方便使用awk進行提取。

2. 通訊協議

文中對文字化的通訊協議十分推崇,的確,對於應用層的協議而言,易用性和可讀性十分重要,以便於使用者進行分析。大家可以想象,如果http協議是二進位制的話,大家的開發效率會大大折扣。而對於具體業務而言,特別是一些高效能和高併發的server而言,二進位制格式的高效和對頻寬的節省優勢就十分明顯了。因此,具體採用什麼格式,還是對通用性、可讀性、效能、擴充套件性的平衡。

下面,總結下我在專案中常用的協議和文字格式。

1. 協議

現在的專案分為三層:接入層、邏輯層和資料層,請求流向是「前台-webserver-logicserver-db」。協議主要採用json格式和二進位制格式,前台和cgi之前是http協議,資料採用json格式,方便前台js解析。 cgi和logicserver之前使用tcp或udp,資料採用二進位制格式,但由於方便擴充套件,二進位制格式中頭部格式固定,資訊體部分用json格式,方便擴充套件。格式如下所示:

2. 配置檔案

配置檔案分兩種,一種是以檔案格式儲存的,另一種是動態調整的通常儲存在cache中。檔案格式儲存的,通常使用xml的格式,方便閱讀與解析;儲存在cache中的配置,可以使用xml或者json,xml的可讀性較好,而json的解析更加方便,有第三方庫直接把json資料解析到乙個json::value的結構中,但可讀性略差了一點。

3. 日誌

日誌格式很重要,在制定日誌格式時,需要考慮使用者的便利性。出錯日誌不必多說,下面主要說下流水日誌。專案中常用的流水有三種流水:支付流水;回滾失敗流水;回檔或補償流水。這三種流水格式要求基本一致,對可讀性要求不高,主要是方便資料提取和統計。如支付流水常用於對賬,回滾失敗流水常用在資料一致性校對,回檔和補償流水多用於資料備份。

以補償流水為例,假設由於某些原因需要給使用者的倉庫補償若干物品,那麼需要記錄的資料如下:

使用者id,倉庫中所有物品對應的補償前的數量,補償後的數量。

這裡記錄流水的原因有兩個:一是如果補償出錯時,可以根據補償前的數量進行資料恢復,二是補償完後用於和使用者進行對帳應付投訴。可以採用下面的格式:

userid    item1_num1|item2_num2    item1_num1|item2_num2|item3_num3

使用者id 補償前倉庫資料(物品1id_物品1數量|物品2id_物品2數量) 補償後倉庫資料(格式同前)

這裡使用的分隔包括空格,豎線和下劃線,使用這種格式,可以很方便的用awk提取或者寫工具逐行處理。

總之,在設計協議或資料檔案時,採用文字格式還是二進位制格式,以及如何制定格式,最終要站在使用者的立場上進行考慮,易用性、擴充套件性、效能,需要綜合考慮,權衡利弊,多設計一些場景,從而可以挖掘更多的需求,也使得格式更方便地滿足更多需求。

《Unix程式設計藝術》

軟體設計的經典書籍,譯者語言功底也是了得 1 unix作業系統發展的歷史,武俠口吻描述的頗有趣味 2 文字化的協議設計方法,應用協議的三元老,學習協議設計的好出處 3 透明性和可顯性,讓活 還是活 讓死 還是死 4 管道之於unix的意義 將大程式劃分成多個行為簡單的子程式,定義好介面。討論了程序執...

UNIX程式設計藝術, 好書

本書寫作了五年之久,作者將unix三十年中未見紙端的艱難勝利的軟體工程智慧型融入文字,使unix家族成為最好最具創新軟體的哲學 設計模式 工具 文化和傳統,raymond將之第一次帶給我們,並向我們展示它們如何影響著當今的 linux和開源運動。通過大量來自頂尖專案的例項,你將學會如何運用這些智慧型...

總結 Unix設計哲學 Unix程式設計藝術》

學習了這句話其實常見,尤其是花過功夫學習英文的朋友.而這個原則可以應用在生活的各個方面.這一原則是歷經多少專案的檢驗結果,而我們正是站在一位巨人的肩膀上直接看到現在的理所當然的基本規則.如何翻譯呢?我覺得字面上是 簡潔,樸實 精神上可以相較於 大智若愚 哲學上則相似於 道 還要清楚的認識到,這些總結...