国产日韩欧美一区二区三区三州_亚洲少妇熟女av_久久久久亚洲av国产精品_波多野结衣网站一区二区_亚洲欧美色片在线91_国产亚洲精品精品国产优播av_日本一区二区三区波多野结衣 _久久国产av不卡

?

一種高并發(fā)環(huán)境下交易日志連續(xù)輸出的機(jī)制

2014-10-29 20:12:35王建東張興堯佟志臣夏智
電子技術(shù)與軟件工程 2014年16期

王建東++張興堯++佟志臣++夏智

摘 要

本文提出了一種在高并發(fā)環(huán)境下交易日志連續(xù)輸出的機(jī)制。該方法能夠接受日志的并發(fā)無序提交,根據(jù)日志中交易的交易主鍵將日志進(jìn)行邏輯劃分,使得同一筆交易日志高度內(nèi)聚,保證了日志的連續(xù)輸出,大大提高了日志的可讀性和友好性,減少甚至避免了日志分析中對日志的額外處理。

【關(guān)鍵詞】交易日志 高并發(fā) 連續(xù)輸出

交易日志對現(xiàn)代交易系統(tǒng)具有極其重要的意義,其作用主要有三個:問題排查、交易信息歸檔、交易分析與挖掘。交易日志完整記錄了每筆交易的具體執(zhí)行路徑。通過人工查看日志,可以精確把握一筆交易成功、失敗以及其他異常信息。目前,聯(lián)機(jī)交易系統(tǒng)在高并發(fā)環(huán)境下,日志的輸出通常是不連續(xù)的。一筆交易的日志中無規(guī)律地穿插著其他交易的日志信息,這樣在日志查閱、問題排查時非常不便,需要在現(xiàn)有日志基礎(chǔ)上進(jìn)一步將一筆交易從眾多交易日志中隔離或抽取出來才能得到有效的日志信息。

1 系統(tǒng)原理

本文提出一種處理機(jī)制,在日志被輸出到目標(biāo)日志文件之前,在內(nèi)存緩沖區(qū)中對日志進(jìn)行分揀,并按照一定的策略或在一定的時機(jī)輸出日志,使得每筆交易日志高度內(nèi)聚,即使在高并發(fā)環(huán)境下亦不存在穿插的現(xiàn)象,同時保證單筆交易日志內(nèi)部有序。

工作原理如圖1所示。

按照標(biāo)號,1)首先接收交易系統(tǒng)日志提交,2)將日志做持久化處理,3)然后將日志交由日志處理模塊進(jìn)行實時分揀,4)并按照一定的輸出策略進(jìn)行日志輸出,5)最后記錄日志快照。對于意外斷電或系統(tǒng)崩潰的情況,緩沖區(qū)內(nèi)的日志因沒能及時輸出而丟失。下次啟動時,分別讀取持久化日志和日志快照,經(jīng)日志恢復(fù)模塊處理后交給日志處理模塊,然后強(qiáng)制輸出此部分日志,清空持久化日志和日志快照,此后便可重新接受新日志的提交,此時系統(tǒng)恢復(fù)到正常的工作狀態(tài)。

2 實施方案

由于本方法需要在內(nèi)存緩沖區(qū)內(nèi)對每條日志進(jìn)行分揀,日志在被輸出到目標(biāo)文件之前是存放在內(nèi)存中的。而對于一個應(yīng)用來說,分配的內(nèi)存大小是有限的。為了防止因日志條目不斷增長造成占用的內(nèi)存無限增加,日志系統(tǒng)設(shè)定一個參數(shù):超時時間timeout。超時時間控制一筆交易的輸出時機(jī),當(dāng)當(dāng)前時間與交易上次提交時間lasttime的間隔大于超時時間時,此交易的日志被立即輸出。

對于一筆交易,其都有一個確定的交易主鍵tkey。對于一條交易日志,都有一個tkey與其關(guān)聯(lián)。若任何兩條交易日志的tkey相同,則認(rèn)為它們同屬一筆交易,應(yīng)被連續(xù)輸出。

以下對各個模塊詳細(xì)闡述。

2.1 日志提交

當(dāng)交易系統(tǒng)需要記錄日志時,交易系統(tǒng)向日志系統(tǒng)同時提交tkey和與tkey相關(guān)的日志信息。具體分兩類提交:

(1)類提交:同時提交tkey和日志正文msg。

(2)類提交:同時提交tkey和結(jié)束標(biāo)志finish。

若日志并非一筆交易的最后一條日志,則按交易流程將日志逐條進(jìn)行a類提交,此步向日志系統(tǒng)提交日志正文msg。若一條日志是交易的最后一條日志,則對這條日志進(jìn)行a類提交后,同時進(jìn)行b類提交。此時的b類提交不含日志正文,而是日志結(jié)束標(biāo)志finish。b類提交出現(xiàn)在交易的出口處,通知日志系統(tǒng)一筆交易已結(jié)束。一筆交易可能因交易成功、交易失敗、系統(tǒng)異常等有多個交易出口,這些出口均需設(shè)置b類提交。當(dāng)系統(tǒng)發(fā)生了嚴(yán)重錯誤時,b類提交可能無法正常完成,此時由超時時間控制日志的輸出。

2.2 日志持久化

為了防止意外斷電或系統(tǒng)崩潰等原因?qū)е聝?nèi)存中的日志丟失,日志系統(tǒng)在接收到交易系統(tǒng)的日志提交后,首先將日志實時地、無序地寫入磁盤,確切的說,寫入到持久化日志文件。日志系統(tǒng)維護(hù)一個持久化日志文件,日志以行存放,每行包含tkey和msg。持久化日志文件設(shè)定文件大小,采用循環(huán)覆蓋(rotate)的方式,具體文件大小可以根據(jù)交易系統(tǒng)情況而定。另外,對于日志實時性要求很高的情況,可以通過此文件查看在緩存中尚未及時輸出的日志。

2.3 日志處理

日志系統(tǒng)內(nèi)部維護(hù)一個自定義的數(shù)據(jù)結(jié)構(gòu)Ldata,保存tkey、lasttime和一個有序鏈表Llist。Llist的每一個節(jié)點存放一條日志正文。同時維護(hù)一個哈希表Lmap,Lmap以tkey為key,以Ldata為value,是交易在內(nèi)存中的清單。

日志處理模塊主要負(fù)責(zé)接收日志提交和日志輸出。當(dāng)接收到交易系統(tǒng)的提交的日志時,日志處理模塊進(jìn)行判斷。若是a類提交,則在Lmap中根據(jù)tkey查找對應(yīng)的Ldata,查找失敗則根據(jù)tkey創(chuàng)建Ldata并添加到Lmap中,表明這是一筆新的交易,此時Ldata中的lasttime為當(dāng)前時間,Llist中保存著這筆交易的第一條日志;查找成功則更新Ldata的lasttime為當(dāng)前時間,并將日志正文添加到Llist中;若是b類提交,則按照提交順序依次輸出Llist中的日志,將tkey從Lmap中移除,并在快照文件中記錄相應(yīng)的tkey。

另外,對日志輸出進(jìn)行超時控制,必要時強(qiáng)制輸出交易日志。具體來講,遍歷Lmap,按tkey逐個取Ldata。判斷當(dāng)前時間與lasttime的差值,若差值大于timeout,則表明超時發(fā)生,立即輸出,否則取下一個Ldata。日志輸出后,將其對應(yīng)的tkey從Lmap中移除,并在快照文件中記錄。

2.4 日志快照

日志快照模塊維護(hù)一個日志快照文件,記錄已順利輸出的交易的tkey。日志快照文件類似于NOSQL數(shù)據(jù)庫Cassandra中的Commitlog,記錄哪些交易已經(jīng)從內(nèi)存中輸出到了目標(biāo)文件。日志快照文件采用循環(huán)覆蓋的方式,限定文件大小或記錄數(shù),具體根據(jù)交易系統(tǒng)情況而定。

2.5 日志恢復(fù)

對于突發(fā)斷電、系統(tǒng)崩潰的情況,內(nèi)存中未及時輸出的日志會全部丟失,此步用于恢復(fù)丟失的日志信息。

具體步驟如下:

(1)讀取持久化日志文件,逐條取出對應(yīng)的tkey和msg并進(jìn)行a類提交;

(2)讀取日志快照文件,逐個取tkey,若tkey在Lmap中,則說明此tkey對應(yīng)的日志已輸出,將此tkey從Lmap中移除,否則輸出日志后移除。

(3)清空持久化日志文件和日志快照文件,為下一次使用做準(zhǔn)備。

在日志恢復(fù)過程中,日志系統(tǒng)不接收交易系統(tǒng)的任何日志提交。在日志恢復(fù)完成后,日志系統(tǒng)重新回到正常的工作狀態(tài)。

3 關(guān)鍵參數(shù)

此方案實施過程中,有幾個重要的參數(shù),如超時時間、持久化日志文件大小、日志快照文件大小或記錄數(shù)等。超時時間控制著日志輸出的時機(jī),直接影響著日志系統(tǒng)的性能。而持久化日志文件大小和日志快照文件大小、記錄數(shù)決定著日志系統(tǒng)的完整性。文件大小設(shè)定過大,則日志恢復(fù)過程可能漫長;文件過小,可能無法完全恢復(fù)丟失的日志。

4 結(jié)束語

本文實現(xiàn)了一種高并發(fā)環(huán)境下交易日志的連續(xù)有序輸出的方法,大大提高日志的可讀性、友好性,一方面改善了人工排查問題時的日志環(huán)境,減少排查時間。另一方面,簡化甚至消除了日志二次處理的工作。

參考文獻(xiàn)

[1]嚴(yán)蔚敏,吳偉民編著.數(shù)據(jù)結(jié)構(gòu)(C語言版)[M].北京:清華大學(xué)出版社,2010.

[2]Log4j. http://logging.apache.org/log4j/1.2/manual.html,2002.

[3]郭鵬著.Cassandra實戰(zhàn)[M].北京:機(jī)械工業(yè)出版社,2011.

作者單位

中國銀聯(lián)股份有限公司 上海市 201201endprint

摘 要

本文提出了一種在高并發(fā)環(huán)境下交易日志連續(xù)輸出的機(jī)制。該方法能夠接受日志的并發(fā)無序提交,根據(jù)日志中交易的交易主鍵將日志進(jìn)行邏輯劃分,使得同一筆交易日志高度內(nèi)聚,保證了日志的連續(xù)輸出,大大提高了日志的可讀性和友好性,減少甚至避免了日志分析中對日志的額外處理。

【關(guān)鍵詞】交易日志 高并發(fā) 連續(xù)輸出

交易日志對現(xiàn)代交易系統(tǒng)具有極其重要的意義,其作用主要有三個:問題排查、交易信息歸檔、交易分析與挖掘。交易日志完整記錄了每筆交易的具體執(zhí)行路徑。通過人工查看日志,可以精確把握一筆交易成功、失敗以及其他異常信息。目前,聯(lián)機(jī)交易系統(tǒng)在高并發(fā)環(huán)境下,日志的輸出通常是不連續(xù)的。一筆交易的日志中無規(guī)律地穿插著其他交易的日志信息,這樣在日志查閱、問題排查時非常不便,需要在現(xiàn)有日志基礎(chǔ)上進(jìn)一步將一筆交易從眾多交易日志中隔離或抽取出來才能得到有效的日志信息。

1 系統(tǒng)原理

本文提出一種處理機(jī)制,在日志被輸出到目標(biāo)日志文件之前,在內(nèi)存緩沖區(qū)中對日志進(jìn)行分揀,并按照一定的策略或在一定的時機(jī)輸出日志,使得每筆交易日志高度內(nèi)聚,即使在高并發(fā)環(huán)境下亦不存在穿插的現(xiàn)象,同時保證單筆交易日志內(nèi)部有序。

工作原理如圖1所示。

按照標(biāo)號,1)首先接收交易系統(tǒng)日志提交,2)將日志做持久化處理,3)然后將日志交由日志處理模塊進(jìn)行實時分揀,4)并按照一定的輸出策略進(jìn)行日志輸出,5)最后記錄日志快照。對于意外斷電或系統(tǒng)崩潰的情況,緩沖區(qū)內(nèi)的日志因沒能及時輸出而丟失。下次啟動時,分別讀取持久化日志和日志快照,經(jīng)日志恢復(fù)模塊處理后交給日志處理模塊,然后強(qiáng)制輸出此部分日志,清空持久化日志和日志快照,此后便可重新接受新日志的提交,此時系統(tǒng)恢復(fù)到正常的工作狀態(tài)。

2 實施方案

由于本方法需要在內(nèi)存緩沖區(qū)內(nèi)對每條日志進(jìn)行分揀,日志在被輸出到目標(biāo)文件之前是存放在內(nèi)存中的。而對于一個應(yīng)用來說,分配的內(nèi)存大小是有限的。為了防止因日志條目不斷增長造成占用的內(nèi)存無限增加,日志系統(tǒng)設(shè)定一個參數(shù):超時時間timeout。超時時間控制一筆交易的輸出時機(jī),當(dāng)當(dāng)前時間與交易上次提交時間lasttime的間隔大于超時時間時,此交易的日志被立即輸出。

對于一筆交易,其都有一個確定的交易主鍵tkey。對于一條交易日志,都有一個tkey與其關(guān)聯(lián)。若任何兩條交易日志的tkey相同,則認(rèn)為它們同屬一筆交易,應(yīng)被連續(xù)輸出。

以下對各個模塊詳細(xì)闡述。

2.1 日志提交

當(dāng)交易系統(tǒng)需要記錄日志時,交易系統(tǒng)向日志系統(tǒng)同時提交tkey和與tkey相關(guān)的日志信息。具體分兩類提交:

(1)類提交:同時提交tkey和日志正文msg。

(2)類提交:同時提交tkey和結(jié)束標(biāo)志finish。

若日志并非一筆交易的最后一條日志,則按交易流程將日志逐條進(jìn)行a類提交,此步向日志系統(tǒng)提交日志正文msg。若一條日志是交易的最后一條日志,則對這條日志進(jìn)行a類提交后,同時進(jìn)行b類提交。此時的b類提交不含日志正文,而是日志結(jié)束標(biāo)志finish。b類提交出現(xiàn)在交易的出口處,通知日志系統(tǒng)一筆交易已結(jié)束。一筆交易可能因交易成功、交易失敗、系統(tǒng)異常等有多個交易出口,這些出口均需設(shè)置b類提交。當(dāng)系統(tǒng)發(fā)生了嚴(yán)重錯誤時,b類提交可能無法正常完成,此時由超時時間控制日志的輸出。

2.2 日志持久化

為了防止意外斷電或系統(tǒng)崩潰等原因?qū)е聝?nèi)存中的日志丟失,日志系統(tǒng)在接收到交易系統(tǒng)的日志提交后,首先將日志實時地、無序地寫入磁盤,確切的說,寫入到持久化日志文件。日志系統(tǒng)維護(hù)一個持久化日志文件,日志以行存放,每行包含tkey和msg。持久化日志文件設(shè)定文件大小,采用循環(huán)覆蓋(rotate)的方式,具體文件大小可以根據(jù)交易系統(tǒng)情況而定。另外,對于日志實時性要求很高的情況,可以通過此文件查看在緩存中尚未及時輸出的日志。

2.3 日志處理

日志系統(tǒng)內(nèi)部維護(hù)一個自定義的數(shù)據(jù)結(jié)構(gòu)Ldata,保存tkey、lasttime和一個有序鏈表Llist。Llist的每一個節(jié)點存放一條日志正文。同時維護(hù)一個哈希表Lmap,Lmap以tkey為key,以Ldata為value,是交易在內(nèi)存中的清單。

日志處理模塊主要負(fù)責(zé)接收日志提交和日志輸出。當(dāng)接收到交易系統(tǒng)的提交的日志時,日志處理模塊進(jìn)行判斷。若是a類提交,則在Lmap中根據(jù)tkey查找對應(yīng)的Ldata,查找失敗則根據(jù)tkey創(chuàng)建Ldata并添加到Lmap中,表明這是一筆新的交易,此時Ldata中的lasttime為當(dāng)前時間,Llist中保存著這筆交易的第一條日志;查找成功則更新Ldata的lasttime為當(dāng)前時間,并將日志正文添加到Llist中;若是b類提交,則按照提交順序依次輸出Llist中的日志,將tkey從Lmap中移除,并在快照文件中記錄相應(yīng)的tkey。

另外,對日志輸出進(jìn)行超時控制,必要時強(qiáng)制輸出交易日志。具體來講,遍歷Lmap,按tkey逐個取Ldata。判斷當(dāng)前時間與lasttime的差值,若差值大于timeout,則表明超時發(fā)生,立即輸出,否則取下一個Ldata。日志輸出后,將其對應(yīng)的tkey從Lmap中移除,并在快照文件中記錄。

2.4 日志快照

日志快照模塊維護(hù)一個日志快照文件,記錄已順利輸出的交易的tkey。日志快照文件類似于NOSQL數(shù)據(jù)庫Cassandra中的Commitlog,記錄哪些交易已經(jīng)從內(nèi)存中輸出到了目標(biāo)文件。日志快照文件采用循環(huán)覆蓋的方式,限定文件大小或記錄數(shù),具體根據(jù)交易系統(tǒng)情況而定。

2.5 日志恢復(fù)

對于突發(fā)斷電、系統(tǒng)崩潰的情況,內(nèi)存中未及時輸出的日志會全部丟失,此步用于恢復(fù)丟失的日志信息。

具體步驟如下:

(1)讀取持久化日志文件,逐條取出對應(yīng)的tkey和msg并進(jìn)行a類提交;

(2)讀取日志快照文件,逐個取tkey,若tkey在Lmap中,則說明此tkey對應(yīng)的日志已輸出,將此tkey從Lmap中移除,否則輸出日志后移除。

(3)清空持久化日志文件和日志快照文件,為下一次使用做準(zhǔn)備。

在日志恢復(fù)過程中,日志系統(tǒng)不接收交易系統(tǒng)的任何日志提交。在日志恢復(fù)完成后,日志系統(tǒng)重新回到正常的工作狀態(tài)。

3 關(guān)鍵參數(shù)

此方案實施過程中,有幾個重要的參數(shù),如超時時間、持久化日志文件大小、日志快照文件大小或記錄數(shù)等。超時時間控制著日志輸出的時機(jī),直接影響著日志系統(tǒng)的性能。而持久化日志文件大小和日志快照文件大小、記錄數(shù)決定著日志系統(tǒng)的完整性。文件大小設(shè)定過大,則日志恢復(fù)過程可能漫長;文件過小,可能無法完全恢復(fù)丟失的日志。

4 結(jié)束語

本文實現(xiàn)了一種高并發(fā)環(huán)境下交易日志的連續(xù)有序輸出的方法,大大提高日志的可讀性、友好性,一方面改善了人工排查問題時的日志環(huán)境,減少排查時間。另一方面,簡化甚至消除了日志二次處理的工作。

參考文獻(xiàn)

[1]嚴(yán)蔚敏,吳偉民編著.數(shù)據(jù)結(jié)構(gòu)(C語言版)[M].北京:清華大學(xué)出版社,2010.

[2]Log4j. http://logging.apache.org/log4j/1.2/manual.html,2002.

[3]郭鵬著.Cassandra實戰(zhàn)[M].北京:機(jī)械工業(yè)出版社,2011.

作者單位

中國銀聯(lián)股份有限公司 上海市 201201endprint

摘 要

本文提出了一種在高并發(fā)環(huán)境下交易日志連續(xù)輸出的機(jī)制。該方法能夠接受日志的并發(fā)無序提交,根據(jù)日志中交易的交易主鍵將日志進(jìn)行邏輯劃分,使得同一筆交易日志高度內(nèi)聚,保證了日志的連續(xù)輸出,大大提高了日志的可讀性和友好性,減少甚至避免了日志分析中對日志的額外處理。

【關(guān)鍵詞】交易日志 高并發(fā) 連續(xù)輸出

交易日志對現(xiàn)代交易系統(tǒng)具有極其重要的意義,其作用主要有三個:問題排查、交易信息歸檔、交易分析與挖掘。交易日志完整記錄了每筆交易的具體執(zhí)行路徑。通過人工查看日志,可以精確把握一筆交易成功、失敗以及其他異常信息。目前,聯(lián)機(jī)交易系統(tǒng)在高并發(fā)環(huán)境下,日志的輸出通常是不連續(xù)的。一筆交易的日志中無規(guī)律地穿插著其他交易的日志信息,這樣在日志查閱、問題排查時非常不便,需要在現(xiàn)有日志基礎(chǔ)上進(jìn)一步將一筆交易從眾多交易日志中隔離或抽取出來才能得到有效的日志信息。

1 系統(tǒng)原理

本文提出一種處理機(jī)制,在日志被輸出到目標(biāo)日志文件之前,在內(nèi)存緩沖區(qū)中對日志進(jìn)行分揀,并按照一定的策略或在一定的時機(jī)輸出日志,使得每筆交易日志高度內(nèi)聚,即使在高并發(fā)環(huán)境下亦不存在穿插的現(xiàn)象,同時保證單筆交易日志內(nèi)部有序。

工作原理如圖1所示。

按照標(biāo)號,1)首先接收交易系統(tǒng)日志提交,2)將日志做持久化處理,3)然后將日志交由日志處理模塊進(jìn)行實時分揀,4)并按照一定的輸出策略進(jìn)行日志輸出,5)最后記錄日志快照。對于意外斷電或系統(tǒng)崩潰的情況,緩沖區(qū)內(nèi)的日志因沒能及時輸出而丟失。下次啟動時,分別讀取持久化日志和日志快照,經(jīng)日志恢復(fù)模塊處理后交給日志處理模塊,然后強(qiáng)制輸出此部分日志,清空持久化日志和日志快照,此后便可重新接受新日志的提交,此時系統(tǒng)恢復(fù)到正常的工作狀態(tài)。

2 實施方案

由于本方法需要在內(nèi)存緩沖區(qū)內(nèi)對每條日志進(jìn)行分揀,日志在被輸出到目標(biāo)文件之前是存放在內(nèi)存中的。而對于一個應(yīng)用來說,分配的內(nèi)存大小是有限的。為了防止因日志條目不斷增長造成占用的內(nèi)存無限增加,日志系統(tǒng)設(shè)定一個參數(shù):超時時間timeout。超時時間控制一筆交易的輸出時機(jī),當(dāng)當(dāng)前時間與交易上次提交時間lasttime的間隔大于超時時間時,此交易的日志被立即輸出。

對于一筆交易,其都有一個確定的交易主鍵tkey。對于一條交易日志,都有一個tkey與其關(guān)聯(lián)。若任何兩條交易日志的tkey相同,則認(rèn)為它們同屬一筆交易,應(yīng)被連續(xù)輸出。

以下對各個模塊詳細(xì)闡述。

2.1 日志提交

當(dāng)交易系統(tǒng)需要記錄日志時,交易系統(tǒng)向日志系統(tǒng)同時提交tkey和與tkey相關(guān)的日志信息。具體分兩類提交:

(1)類提交:同時提交tkey和日志正文msg。

(2)類提交:同時提交tkey和結(jié)束標(biāo)志finish。

若日志并非一筆交易的最后一條日志,則按交易流程將日志逐條進(jìn)行a類提交,此步向日志系統(tǒng)提交日志正文msg。若一條日志是交易的最后一條日志,則對這條日志進(jìn)行a類提交后,同時進(jìn)行b類提交。此時的b類提交不含日志正文,而是日志結(jié)束標(biāo)志finish。b類提交出現(xiàn)在交易的出口處,通知日志系統(tǒng)一筆交易已結(jié)束。一筆交易可能因交易成功、交易失敗、系統(tǒng)異常等有多個交易出口,這些出口均需設(shè)置b類提交。當(dāng)系統(tǒng)發(fā)生了嚴(yán)重錯誤時,b類提交可能無法正常完成,此時由超時時間控制日志的輸出。

2.2 日志持久化

為了防止意外斷電或系統(tǒng)崩潰等原因?qū)е聝?nèi)存中的日志丟失,日志系統(tǒng)在接收到交易系統(tǒng)的日志提交后,首先將日志實時地、無序地寫入磁盤,確切的說,寫入到持久化日志文件。日志系統(tǒng)維護(hù)一個持久化日志文件,日志以行存放,每行包含tkey和msg。持久化日志文件設(shè)定文件大小,采用循環(huán)覆蓋(rotate)的方式,具體文件大小可以根據(jù)交易系統(tǒng)情況而定。另外,對于日志實時性要求很高的情況,可以通過此文件查看在緩存中尚未及時輸出的日志。

2.3 日志處理

日志系統(tǒng)內(nèi)部維護(hù)一個自定義的數(shù)據(jù)結(jié)構(gòu)Ldata,保存tkey、lasttime和一個有序鏈表Llist。Llist的每一個節(jié)點存放一條日志正文。同時維護(hù)一個哈希表Lmap,Lmap以tkey為key,以Ldata為value,是交易在內(nèi)存中的清單。

日志處理模塊主要負(fù)責(zé)接收日志提交和日志輸出。當(dāng)接收到交易系統(tǒng)的提交的日志時,日志處理模塊進(jìn)行判斷。若是a類提交,則在Lmap中根據(jù)tkey查找對應(yīng)的Ldata,查找失敗則根據(jù)tkey創(chuàng)建Ldata并添加到Lmap中,表明這是一筆新的交易,此時Ldata中的lasttime為當(dāng)前時間,Llist中保存著這筆交易的第一條日志;查找成功則更新Ldata的lasttime為當(dāng)前時間,并將日志正文添加到Llist中;若是b類提交,則按照提交順序依次輸出Llist中的日志,將tkey從Lmap中移除,并在快照文件中記錄相應(yīng)的tkey。

另外,對日志輸出進(jìn)行超時控制,必要時強(qiáng)制輸出交易日志。具體來講,遍歷Lmap,按tkey逐個取Ldata。判斷當(dāng)前時間與lasttime的差值,若差值大于timeout,則表明超時發(fā)生,立即輸出,否則取下一個Ldata。日志輸出后,將其對應(yīng)的tkey從Lmap中移除,并在快照文件中記錄。

2.4 日志快照

日志快照模塊維護(hù)一個日志快照文件,記錄已順利輸出的交易的tkey。日志快照文件類似于NOSQL數(shù)據(jù)庫Cassandra中的Commitlog,記錄哪些交易已經(jīng)從內(nèi)存中輸出到了目標(biāo)文件。日志快照文件采用循環(huán)覆蓋的方式,限定文件大小或記錄數(shù),具體根據(jù)交易系統(tǒng)情況而定。

2.5 日志恢復(fù)

對于突發(fā)斷電、系統(tǒng)崩潰的情況,內(nèi)存中未及時輸出的日志會全部丟失,此步用于恢復(fù)丟失的日志信息。

具體步驟如下:

(1)讀取持久化日志文件,逐條取出對應(yīng)的tkey和msg并進(jìn)行a類提交;

(2)讀取日志快照文件,逐個取tkey,若tkey在Lmap中,則說明此tkey對應(yīng)的日志已輸出,將此tkey從Lmap中移除,否則輸出日志后移除。

(3)清空持久化日志文件和日志快照文件,為下一次使用做準(zhǔn)備。

在日志恢復(fù)過程中,日志系統(tǒng)不接收交易系統(tǒng)的任何日志提交。在日志恢復(fù)完成后,日志系統(tǒng)重新回到正常的工作狀態(tài)。

3 關(guān)鍵參數(shù)

此方案實施過程中,有幾個重要的參數(shù),如超時時間、持久化日志文件大小、日志快照文件大小或記錄數(shù)等。超時時間控制著日志輸出的時機(jī),直接影響著日志系統(tǒng)的性能。而持久化日志文件大小和日志快照文件大小、記錄數(shù)決定著日志系統(tǒng)的完整性。文件大小設(shè)定過大,則日志恢復(fù)過程可能漫長;文件過小,可能無法完全恢復(fù)丟失的日志。

4 結(jié)束語

本文實現(xiàn)了一種高并發(fā)環(huán)境下交易日志的連續(xù)有序輸出的方法,大大提高日志的可讀性、友好性,一方面改善了人工排查問題時的日志環(huán)境,減少排查時間。另一方面,簡化甚至消除了日志二次處理的工作。

參考文獻(xiàn)

[1]嚴(yán)蔚敏,吳偉民編著.數(shù)據(jù)結(jié)構(gòu)(C語言版)[M].北京:清華大學(xué)出版社,2010.

[2]Log4j. http://logging.apache.org/log4j/1.2/manual.html,2002.

[3]郭鵬著.Cassandra實戰(zhàn)[M].北京:機(jī)械工業(yè)出版社,2011.

作者單位

中國銀聯(lián)股份有限公司 上海市 201201endprint

广南县| 温泉县| 卢湾区| 兴山县| 准格尔旗| 卢龙县| 榕江县| 漠河县| 西平县| 康保县| 朝阳市| 富阳市| 泉州市| 贵州省| 栾城县| 公主岭市| 绵阳市| 马尔康县| 巴青县| 高陵县| 延边| 徐水县| 车险| 富蕴县| 江安县| 汉寿县| 平邑县| 广德县| 鹿泉市| 东莞市| 石狮市| 阿克| 盈江县| 枣庄市| 壤塘县| 密云县| 军事| 明光市| 灯塔市| 榆林市| 墨玉县|