賈宇清,燕衛(wèi)東,張 磊
(中國(guó)民航信息網(wǎng)絡(luò)股份有限公司研發(fā)中心,北京 100029)
近年來(lái),民航電子商務(wù)發(fā)展迅速,各種基于互聯(lián)網(wǎng)的航空公司電子商務(wù)直銷網(wǎng)站和代理人在線銷售平臺(tái)蓬勃發(fā)展,成為中國(guó)民航信息發(fā)布和機(jī)票銷售的重要方式。但是,新興的互聯(lián)網(wǎng)銷售對(duì)在大型主機(jī)上運(yùn)營(yíng)的中國(guó)民航實(shí)時(shí)交易系統(tǒng)帶來(lái)了新的挑戰(zhàn),隨著互聯(lián)網(wǎng)信息查詢的增加,查詢和訂票比例不斷提升,傳統(tǒng)主機(jī)系統(tǒng)處理的交易量不斷增長(zhǎng),主機(jī)面臨的壓力日益突出。因采用可行的方式將主機(jī)系統(tǒng)核心數(shù)據(jù)實(shí)時(shí)同步到開(kāi)放平臺(tái)供互聯(lián)網(wǎng)訪問(wèn),以緩解主機(jī)的處理壓力[1-3],滿足互聯(lián)網(wǎng)應(yīng)用的要求,降低系統(tǒng)綜合處理成本費(fèi)非常必要。
為了能夠在不影響民航實(shí)時(shí)交易系統(tǒng)正常運(yùn)行的前提下,實(shí)現(xiàn)數(shù)據(jù)的實(shí)時(shí)同步,本文在民航實(shí)時(shí)交易系統(tǒng)中引入數(shù)據(jù)同步新機(jī)制,并通過(guò)改進(jìn)實(shí)時(shí)文件的訪問(wèn)方式解決實(shí)時(shí)系統(tǒng)處理與數(shù)據(jù)同步對(duì)系統(tǒng)資源的共同占用問(wèn)題,在大規(guī)模并發(fā)處理環(huán)境下實(shí)現(xiàn)實(shí)時(shí)數(shù)據(jù)同步。
原有的數(shù)據(jù)同步方法主要是在應(yīng)用程序中通過(guò)消息隊(duì)列(message queue)的機(jī)制進(jìn)行數(shù)據(jù)采集和數(shù)據(jù)傳輸。這種數(shù)據(jù)同步方法受到應(yīng)用程序、系統(tǒng)交易并發(fā)和消息機(jī)制本身的影響,在應(yīng)用程序異常終止、系統(tǒng)并發(fā)交易量大和消息機(jī)制本身出現(xiàn)問(wèn)題時(shí),存在無(wú)法支持在大并發(fā)交易量下的數(shù)據(jù)同步、數(shù)據(jù)同步準(zhǔn)確率低、系統(tǒng)資源占用大等問(wèn)題。如圖1所示。
消息隊(duì)列的索引文件使用的是主機(jī)系統(tǒng)內(nèi)一種可恢復(fù)的數(shù)據(jù)文件。此類文件只有在數(shù)據(jù)更新被提交后,才能將變更數(shù)據(jù)寫入物理文件,并釋放鎖控制。這樣一來(lái),當(dāng)有大量的數(shù)據(jù)更新事務(wù)時(shí),都會(huì)因?yàn)闊o(wú)法獲得消息隊(duì)列的索引文件而等待。
圖1 傳統(tǒng)數(shù)據(jù)同步模式Fig.1 Procedure in message queue
另外,原有的數(shù)據(jù)同步方法中,一個(gè)交易事務(wù)在將消息數(shù)據(jù)存入消息隊(duì)列時(shí),會(huì)把消息數(shù)據(jù)的全部?jī)?nèi)容都寫入到消息隊(duì)列中。對(duì)于內(nèi)容太多的消息數(shù)據(jù),還可能將其分割成若干個(gè)小報(bào)文。這一系列封裝數(shù)據(jù),寫入消息隊(duì)列的過(guò)程會(huì)增加數(shù)據(jù)同步時(shí)的系統(tǒng)資源開(kāi)銷,延長(zhǎng)交易事務(wù)占用索引文件的時(shí)間,進(jìn)一步降低消息隊(duì)列索引文件的利用效率。
因此,針對(duì)原有消息隊(duì)列機(jī)制中出現(xiàn)的上述問(wèn)題,新的數(shù)據(jù)同步機(jī)制采用了文件記錄索引與文件記錄內(nèi)容分離及使用不可恢復(fù)(non-recoverable freespace)的索引文件等方法提升數(shù)據(jù)同步的效率。
TFCT(TIP file change transfer)數(shù)據(jù)同步機(jī)制由數(shù)據(jù)索引系統(tǒng)和數(shù)據(jù)輸入輸出系統(tǒng)構(gòu)成,包括數(shù)據(jù)輸入模塊、數(shù)據(jù)輸出模塊、數(shù)據(jù)索引模塊,如圖2所示。
如圖3所示,數(shù)據(jù)輸入模塊嵌入在一個(gè)指定數(shù)據(jù)內(nèi)容更新的事務(wù)中,通常是一個(gè)底層的通用數(shù)據(jù)更新程序。該通用數(shù)據(jù)更新程序?qū)iT用于某種主機(jī)數(shù)據(jù)文件的讀寫操作,可以實(shí)時(shí)跟蹤記錄主機(jī)系統(tǒng)數(shù)據(jù)文件的變更,并將發(fā)生變更的數(shù)據(jù)內(nèi)容的全部或部分寫入TFCT的數(shù)據(jù)隊(duì)列中。應(yīng)用程序在調(diào)用TFCT的數(shù)據(jù)輸入模塊之后,會(huì)得到其返回的一個(gè)狀態(tài)值,標(biāo)識(shí)數(shù)據(jù)存儲(chǔ)是否成功。如果存儲(chǔ)操作不成功,應(yīng)用程序可啟用既定的方案中止事務(wù)的處理或繼續(xù)后續(xù)的任務(wù)。一旦數(shù)據(jù)被成功寫入到TFCT的隊(duì)列中,也釋放了對(duì)隊(duì)列索引文件的鎖控制,應(yīng)用程序就會(huì)默認(rèn)數(shù)據(jù)已經(jīng)準(zhǔn)備好并且一定能夠被發(fā)送到目標(biāo)系統(tǒng),轉(zhuǎn)而開(kāi)始處理后續(xù)的事務(wù)內(nèi)容。由于TFCT中使用的是不可恢復(fù)的索引文件,一旦釋放了隊(duì)列索引文件的控制權(quán),則方便了其他的事務(wù)繼續(xù)操作存儲(chǔ)數(shù)據(jù)到TFCT的數(shù)據(jù)隊(duì)列中,關(guān)于這一特點(diǎn)后面會(huì)有詳細(xì)描述。
圖3 TFCT數(shù)據(jù)同步機(jī)制Fig.3 Procedure in TFCT
而且TFCT中的數(shù)據(jù)也支持基于文件記錄索引的數(shù)據(jù)同步。主機(jī)系統(tǒng)中的數(shù)據(jù)文件被進(jìn)一步分割成若干個(gè)記錄(record),應(yīng)用數(shù)據(jù)都存儲(chǔ)在這些記錄中?;旧?份數(shù)據(jù)至少占用1個(gè)記錄,有的大型數(shù)據(jù)結(jié)構(gòu)會(huì)占用多個(gè)記錄,這些記錄之間相互鏈接,形成一個(gè)記錄鏈。TFCT所支持的基于文件記錄索引的數(shù)據(jù)同步,即在TFCT的數(shù)據(jù)隊(duì)列中,只存儲(chǔ)該數(shù)據(jù)所在記錄鏈的第1個(gè)記錄的索引。所以只要掌握了這個(gè)記錄索引,就能夠在需要的時(shí)候讀取記錄鏈中的所有數(shù)據(jù)。關(guān)于這個(gè)特點(diǎn),在后面也有詳細(xì)的描述。
如圖4所示,數(shù)據(jù)輸出模塊中常駐內(nèi)存的后臺(tái)掃描程序會(huì)周期性地掃描TFCT數(shù)據(jù)索引模塊中所有的數(shù)據(jù)隊(duì)列,并調(diào)度子進(jìn)程來(lái)處理數(shù)據(jù)隊(duì)列中的排隊(duì)數(shù)據(jù)。為了避免與數(shù)據(jù)輸入模塊發(fā)生資源爭(zhēng)奪,只有在獲取了索引表控制權(quán)的前提下,處理數(shù)據(jù)的子進(jìn)程才能順利處理排隊(duì)數(shù)據(jù)。而由于TFCT中的數(shù)據(jù)隊(duì)列使用的是不可恢復(fù)的索引文件,因此,數(shù)據(jù)輸出模塊中調(diào)度的子進(jìn)程才有可能盡早獲取對(duì)隊(duì)列索引文件的控制權(quán),提高對(duì)數(shù)據(jù)隊(duì)列的使用效率,縮短數(shù)據(jù)在TFCT隊(duì)列中的等待時(shí)間。
數(shù)據(jù)索引模塊維護(hù)TFCT內(nèi)的所有數(shù)據(jù)隊(duì)列、隊(duì)列索引表等數(shù)據(jù)庫(kù)結(jié)構(gòu),并實(shí)時(shí)監(jiān)控各個(gè)數(shù)據(jù)隊(duì)列中的容量使用。如圖5所示,TFCT內(nèi)部的數(shù)據(jù)庫(kù)結(jié)構(gòu)中有4層表結(jié)構(gòu)。第1層是應(yīng)用接入表(N0),該表屬于內(nèi)存數(shù)據(jù)結(jié)構(gòu),用于快速接入訪問(wèn);第2層是隊(duì)列表示表(N3),該表用于存儲(chǔ)數(shù)據(jù)隊(duì)列的靜態(tài)描述信息,如隊(duì)列長(zhǎng)度、容量、起始地址等;前面兩層的數(shù)據(jù)內(nèi)容基本保持穩(wěn)定,除非增加或刪除隊(duì)列,否則在數(shù)據(jù)處理過(guò)程中,其很少發(fā)生變化,即很少發(fā)生寫操作。頻繁發(fā)生修改的則是后面第3層和第4層。第3層就是隊(duì)列索引表(N4),該表為不可恢復(fù)的數(shù)據(jù)文件,可以快速訪問(wèn),為后面第4層的數(shù)據(jù)表(Q4)提供索引支持。
具體來(lái)說(shuō),隊(duì)列索引表使用主機(jī)系統(tǒng)中一種稱為不可恢復(fù)的數(shù)據(jù)文件作為載體,該文件具有寫立即生效的特點(diǎn),即執(zhí)行寫操作之后,沒(méi)有磁盤緩存,無(wú)需額外的數(shù)據(jù)提交操作即可完成數(shù)據(jù)文件內(nèi)的內(nèi)容變更,可供輸入輸出模塊快速的訪問(wèn)和釋放索引文件,實(shí)現(xiàn)數(shù)據(jù)的快速處理。
總之,實(shí)時(shí)交易系統(tǒng)數(shù)據(jù)同步機(jī)制TFCT,采用存儲(chǔ)轉(zhuǎn)發(fā)的方法,充分利用主機(jī)系統(tǒng)提供的不可恢復(fù)數(shù)據(jù)文件的高效特性,提供存儲(chǔ)記錄文件索引或者數(shù)據(jù)記錄完整內(nèi)容兩種數(shù)據(jù)形式,分離數(shù)據(jù)記錄的存儲(chǔ)與單獨(dú)讀取文件內(nèi)容的方式,將改變后的數(shù)據(jù)記錄內(nèi)容傳輸給開(kāi)放系統(tǒng)。它將數(shù)據(jù)的發(fā)送過(guò)程從交易事務(wù)中分離出來(lái),獨(dú)立于主機(jī)系統(tǒng)中的交易事務(wù)進(jìn)行數(shù)據(jù)同步,不依賴于傳統(tǒng)的消息隊(duì)列模式。由于只在數(shù)據(jù)同步時(shí)鎖定TFCT隊(duì)列的索引文件,并不會(huì)等到事務(wù)結(jié)束,大大提高了TFCT中數(shù)據(jù)隊(duì)列的訪問(wèn)效率。同時(shí)支持將文件索引記錄和文件內(nèi)容的傳輸分開(kāi),對(duì)在實(shí)時(shí)交易系統(tǒng)中運(yùn)行具有較強(qiáng)的適應(yīng)性,可滿足大規(guī)模并發(fā)下的數(shù)據(jù)同步要求。本文從將文件記錄索引和文件內(nèi)容同步分離、應(yīng)用不可恢復(fù)索引文件下的處理兩項(xiàng)創(chuàng)新處理方面對(duì)該機(jī)制進(jìn)行說(shuō)明。
1.2.1 不可恢復(fù)索引文件控制下的處理方法
由于使用了存儲(chǔ)轉(zhuǎn)發(fā)的模式實(shí)現(xiàn)實(shí)時(shí)數(shù)據(jù)同步,數(shù)據(jù)隊(duì)列處于先入先出的狀態(tài),而且需在寫入數(shù)據(jù)的同時(shí)輸出其他數(shù)據(jù),必然需在索引文件的引導(dǎo)下同時(shí)完成快速的數(shù)據(jù)輸入輸出訪問(wèn)。因此,索引文件的讀寫操作是整個(gè)系統(tǒng)中最頻繁的,其控制權(quán)成為眾多交易事務(wù)競(jìng)相爭(zhēng)奪的核心資源。
如圖6所示,原有的消息隊(duì)列的索引文件工作模式是線性的。交易事務(wù)一旦獲得索引文件控制權(quán),別的需要此索引表的事務(wù)只能排隊(duì)等待。直到當(dāng)前控制索引表的事務(wù)結(jié)束所有操作,完成了數(shù)據(jù)提交,釋放了索引表的控制權(quán)之后,排隊(duì)中的其他事務(wù)才有可能鎖定消息隊(duì)列的索引文件,實(shí)現(xiàn)數(shù)據(jù)訪問(wèn)。
這是因?yàn)樵械哪J较?,消息?duì)列及其索引文件都是使用具有可恢復(fù)屬性的物理文件,在寫入操作完成之后,還需額外的數(shù)據(jù)提交操作,才能將數(shù)據(jù)真正寫入到索引文件中。而主機(jī)系統(tǒng)內(nèi)的交易事務(wù)出于事務(wù)完整性的要求,在交易事務(wù)正式提交所有數(shù)據(jù)修改之前,消息隊(duì)列的索引文件和數(shù)據(jù)文件都是被其獨(dú)占的。如果交易事務(wù)回滾,那么消息隊(duì)列的狀態(tài)可以恢復(fù)到前一個(gè)修改成功點(diǎn)(recovery success point)。雖然也可以在完成消息隊(duì)列的寫入操作之后,立即提交數(shù)據(jù)修改,創(chuàng)建一個(gè)修改成功點(diǎn)。但是,此舉卻完全破壞了整個(gè)事務(wù)的數(shù)據(jù)一致性,導(dǎo)致事務(wù)處理一旦需要回滾,無(wú)法恢復(fù)到理想的初始狀態(tài)。
如圖7所示,在TFCT數(shù)據(jù)同步機(jī)制中,使用不可恢復(fù)的數(shù)據(jù)文件來(lái)構(gòu)造TFCT中各種數(shù)據(jù)隊(duì)列的索引文件,而數(shù)據(jù)隊(duì)列本身依然基于可恢復(fù)的數(shù)據(jù)文件。在發(fā)生主機(jī)數(shù)據(jù)變更時(shí),索引文件和數(shù)據(jù)隊(duì)列同時(shí)被更新。索引文件標(biāo)識(shí)出數(shù)據(jù)隊(duì)列的長(zhǎng)度變化以及隊(duì)尾指針的相對(duì)位置;而數(shù)據(jù)隊(duì)列則應(yīng)為即將寫入的數(shù)據(jù)準(zhǔn)備一片空白區(qū)域。此時(shí),在主機(jī)當(dāng)前事務(wù)正式提交所有的數(shù)據(jù)變更,創(chuàng)建一個(gè)修改成功點(diǎn)之前,數(shù)據(jù)依然沒(méi)有被寫入到數(shù)據(jù)文件中。但是,由于索引文件具有的不可恢復(fù)的文件結(jié)構(gòu),在寫入當(dāng)時(shí)索引文件就已經(jīng)發(fā)生了變更,而無(wú)需等待正式的數(shù)據(jù)提交。實(shí)際上當(dāng)前事務(wù)對(duì)索引文件的占用時(shí)間僅僅只有更新時(shí)短暫的一段,很快就釋放了對(duì)索引文件的鎖控制,因而其他事務(wù)就能快速控制索引文件,開(kāi)始新的數(shù)據(jù)更新。如此,多個(gè)事務(wù)之間就能夠快速移交對(duì)索引文件的控制,提高了索引文件的利用率,分享同一個(gè)索引文件的事務(wù)也由原來(lái)的串行執(zhí)行變成了現(xiàn)在的并行執(zhí)行,極大地提升了系統(tǒng)整體的執(zhí)行效率。
經(jīng)過(guò)對(duì)TFCT中這種索引結(jié)構(gòu)的分析,看起來(lái)很多時(shí)候索引文件和數(shù)據(jù)文件是不一致的,例如,事務(wù)A鎖定并更新索引文件之后,標(biāo)識(shí)數(shù)據(jù)文件中的第n個(gè)數(shù)據(jù)區(qū)域?yàn)槭聞?wù)A的數(shù)據(jù)同步所用,后來(lái)的事務(wù)B則只能使用第n+1個(gè)數(shù)據(jù)區(qū)域。而此時(shí),事務(wù)A可能還沒(méi)有結(jié)束,第n個(gè)數(shù)據(jù)區(qū)域內(nèi)依然是空白的,索引文件中的指示與數(shù)據(jù)文件中真實(shí)寫入的內(nèi)容是不一致的。但是,這種不一致是可控的、低風(fēng)險(xiǎn)的。至少后續(xù)的事務(wù)B、C等主機(jī)系統(tǒng)內(nèi)的其他交易可以正常執(zhí)行下去,而不用等待事務(wù)A的結(jié)束。這就是為什么不可恢復(fù)的索引文件能夠大幅提升數(shù)據(jù)同步的效率[4-5]。
至于事務(wù)A的數(shù)據(jù)是否能夠被正常處理、有幾種情況需要考慮?當(dāng)數(shù)據(jù)輸出模塊中的處理程序找到了第n個(gè)數(shù)據(jù)區(qū)域的時(shí)候,如果發(fā)現(xiàn)了這種不一致,不會(huì)立即處理這里的數(shù)據(jù),會(huì)等待一段時(shí)間(時(shí)間長(zhǎng)短由參數(shù)設(shè)置)。事務(wù)A的同步數(shù)據(jù)最終寫入了第n個(gè)數(shù)據(jù)區(qū)域,那么數(shù)據(jù)處理程序會(huì)按照應(yīng)用的設(shè)定將其發(fā)送到開(kāi)放系統(tǒng);如果事務(wù)A因?yàn)樘幚硎《貪L,數(shù)據(jù)最終都沒(méi)有能夠成功寫入數(shù)據(jù)文件,則TFCT會(huì)把這個(gè)空記錄作為一個(gè)錯(cuò)誤數(shù)據(jù)而刪除掉。然而,無(wú)論事務(wù)A的數(shù)據(jù)成功處理與否,都不會(huì)影響其他事務(wù)數(shù)據(jù)的處理。
1.2.2 支持基于文件記錄索引的數(shù)據(jù)同步
主機(jī)系統(tǒng)中的數(shù)據(jù)文件通常都被分割為成千上萬(wàn)個(gè)記錄,應(yīng)用數(shù)據(jù)都存儲(chǔ)在這些記錄中。基本上1份數(shù)據(jù)至少占用1個(gè)記錄,有的大型數(shù)據(jù)結(jié)構(gòu)會(huì)占用多個(gè)記錄,這些記錄之間相互鏈接,形成1個(gè)記錄鏈。每個(gè)記錄都有1個(gè)記錄索引,即這個(gè)記錄在數(shù)據(jù)文件中的相對(duì)位置地址。記錄鏈的索引通常就是記錄鏈中第1個(gè)記錄的索引。在進(jìn)行數(shù)據(jù)處理時(shí),主機(jī)系統(tǒng)中的各類程序都是通過(guò)記錄的索引對(duì)記錄中的數(shù)據(jù)進(jìn)行訪問(wèn)。數(shù)據(jù)一旦寫入數(shù)據(jù)文件,除非記錄被刪除或特別要求遷移到其他記錄,其占用的記錄一般不會(huì)發(fā)生變更。也就是說(shuō),在記錄的生存期內(nèi),其中存儲(chǔ)的應(yīng)該都是同一個(gè)數(shù)據(jù)。
在TFCT數(shù)據(jù)同步機(jī)制中,存儲(chǔ)到TFCT數(shù)據(jù)隊(duì)列中的報(bào)文消息可以是完整的數(shù)據(jù)更新內(nèi)容,例如,一個(gè)旅客信息記錄的全部數(shù)據(jù),它通常是一個(gè)包含多個(gè)記錄的記錄鏈。存儲(chǔ)完整的數(shù)據(jù)更新內(nèi)容,在TFCT的數(shù)據(jù)隊(duì)列中不限制單個(gè)數(shù)據(jù)大小。對(duì)于超大的數(shù)據(jù)內(nèi)容可以通過(guò)記錄級(jí)聯(lián)的方式進(jìn)行擴(kuò)展,保證將所有的數(shù)據(jù)都存儲(chǔ)到數(shù)據(jù)隊(duì)列中。
作為一種更高效的存儲(chǔ)方式,TFCT的數(shù)據(jù)隊(duì)列支持在隊(duì)列中只存儲(chǔ)文件記錄的索引。文件記錄的索引相當(dāng)于一個(gè)地址,標(biāo)識(shí)數(shù)據(jù)更新內(nèi)容在數(shù)據(jù)文件中的相對(duì)位置。也就是說(shuō),數(shù)據(jù)輸入的時(shí)候,數(shù)據(jù)內(nèi)容仍然保存在主機(jī)系統(tǒng)的文件記錄中,而只是把文件記錄的索引地址存入TFCT的數(shù)據(jù)隊(duì)列中。等到數(shù)據(jù)輸出時(shí),處理程序根據(jù)數(shù)據(jù)隊(duì)列中文件記錄的索引,檢索到指定的文件記錄,再將此時(shí)文件記錄中的所有數(shù)據(jù)內(nèi)容封裝之后,發(fā)送到開(kāi)放系統(tǒng)[6-8]。
基于文件記錄索引的數(shù)據(jù)同步有以下幾個(gè)優(yōu)勢(shì):①簡(jiǎn)化數(shù)據(jù)輸入流程,實(shí)現(xiàn)數(shù)據(jù)快速存儲(chǔ);②累積數(shù)據(jù)變更,避免重復(fù)數(shù)據(jù)。
在交易事務(wù)同步數(shù)據(jù)的過(guò)程中,鎖控制TFCT數(shù)據(jù)隊(duì)列索引文件的時(shí)間越短,則留給其他交易事務(wù)的時(shí)間也就越多,數(shù)據(jù)同步的效率也就越高。如果只是存儲(chǔ)文件記錄的索引,這個(gè)索引只占1個(gè)數(shù)據(jù)字(主機(jī)系統(tǒng)內(nèi)的1個(gè)數(shù)據(jù)字包含36 bit)的長(zhǎng)度,比起存儲(chǔ)一個(gè)上百個(gè)數(shù)據(jù)字的文件記錄的完整內(nèi)容,效率的提高非常明顯。而且,在TFCT的數(shù)據(jù)輸出模塊中,處理程序通過(guò)數(shù)據(jù)隊(duì)列中的文件記錄索引提取數(shù)據(jù)內(nèi)容時(shí),對(duì)文件記錄是只讀的,不需要鎖定TFCT數(shù)據(jù)隊(duì)列及其索引文件。這樣,可以在數(shù)據(jù)處理過(guò)程中,盡可能減小對(duì)主機(jī)系統(tǒng)生產(chǎn)數(shù)據(jù)的影響。
另外,在記錄索引存入TFCT的數(shù)據(jù)隊(duì)列,到被處理程序提取出來(lái)這段時(shí)間之內(nèi),記錄索引指向的數(shù)據(jù)內(nèi)容可能發(fā)生變化。但即便是內(nèi)容發(fā)生變化,依然存儲(chǔ)在同一個(gè)記錄中。數(shù)據(jù)內(nèi)容的變化都累積在這一個(gè)文件記錄內(nèi),那么,通過(guò)文件記錄的索引,TFCT的后臺(tái)處理程序隨時(shí)都能提取到最新的文件記錄內(nèi)容,并將其發(fā)送到其他目標(biāo)系統(tǒng)。很明顯,數(shù)據(jù)內(nèi)容雖然更新了多次,但只有其中最新的一份被發(fā)送,其發(fā)送效率異??捎^。
在民航實(shí)時(shí)交易系統(tǒng)中,旅客訂座記錄數(shù)據(jù)的變更通常都較集中,連續(xù)幾次修改通常都在1 s內(nèi)完成。
如圖8所示,在第n次修改旅客訂座記錄P的時(shí)候,修改后的內(nèi)容會(huì)被寫入到TFCT數(shù)據(jù)隊(duì)列中,排隊(duì)等候處理。此后,旅客訂座記錄P又緊接著完成了2次修改,達(dá)到了n+2次修改。同樣,后面的兩次修改也會(huì)加入到等候處理的排隊(duì)中。而當(dāng)TFCT的數(shù)據(jù)輸出模塊中的處理程序檢索到TFCT中存儲(chǔ)的旅客訂座記錄P的第n次修改時(shí),發(fā)現(xiàn)主機(jī)系統(tǒng)中當(dāng)前的數(shù)據(jù)已經(jīng)更新到n+2次了。因此,包括第n次修改和第n+1次修改的信息都會(huì)被處理程序直接刪除,而只處理第n+2次修改的數(shù)據(jù)。這樣一來(lái),原本需發(fā)送3份數(shù)據(jù)的處理邏輯,在使用文件記錄索引后,只有1份最新的數(shù)據(jù)會(huì)被處理,數(shù)據(jù)處理的效率得到了很大提升。
2009年12月25日,在中國(guó)航信的代理人分銷系統(tǒng)中,開(kāi)始使用TFCT數(shù)據(jù)同步機(jī)制將主機(jī)系統(tǒng)中的旅客訂座記錄同步到開(kāi)放系統(tǒng)的Oracle數(shù)據(jù)庫(kù)中。TFCT中為其創(chuàng)建了20個(gè)數(shù)據(jù)隊(duì)列,分別用20個(gè)不可恢復(fù)的索引文件為這些數(shù)據(jù)隊(duì)列提供排隊(duì)數(shù)據(jù)索引。
在代理人分銷系統(tǒng)中,一旦有新的旅客訂座記錄生成或有舊的旅客訂座記錄發(fā)生變更,除了在主機(jī)系統(tǒng)的數(shù)據(jù)文件記錄中存儲(chǔ)旅客訂座記錄的數(shù)據(jù)外,還會(huì)將發(fā)生變更的旅客訂座記錄的索引和一個(gè)標(biāo)識(shí)修改時(shí)間的標(biāo)志一并存入TFCT的一個(gè)數(shù)據(jù)隊(duì)列中。
經(jīng)過(guò)性能統(tǒng)計(jì),通過(guò)TFCT數(shù)據(jù)同步機(jī)制發(fā)送1份報(bào)文所消耗的系統(tǒng)資源遠(yuǎn)遠(yuǎn)低于原有的消息隊(duì)列機(jī)制,如表1~表2所示。
很明顯,使用TFCT數(shù)據(jù)同步機(jī)制的效率和性能都要好于使用消息隊(duì)列的數(shù)據(jù)同步機(jī)制。從表1的比較可以看到,實(shí)現(xiàn)幾乎相同的傳送速率,TFCT所消耗的系統(tǒng)資源只是主機(jī)消息隊(duì)列機(jī)制的一半。
更重要的一點(diǎn),TFCT在實(shí)際處理代理人分銷系統(tǒng)中的旅客訂座記錄數(shù)據(jù)時(shí),只發(fā)送最新的數(shù)據(jù)記錄。而主機(jī)消息隊(duì)列機(jī)制處理的每一個(gè)記錄,都會(huì)發(fā)送到開(kāi)放系統(tǒng)。無(wú)形中,使用TFCT數(shù)據(jù)同步機(jī)制也為開(kāi)放系統(tǒng)節(jié)省將近50%的系統(tǒng)資源。
TFCT數(shù)據(jù)同步機(jī)制的另一個(gè)優(yōu)勢(shì)在于其控制參數(shù)是可以動(dòng)態(tài)調(diào)整的,修改TFCT的配置參數(shù)是可以動(dòng)態(tài)變更,不用將整個(gè)數(shù)據(jù)同步機(jī)制完全關(guān)閉就可實(shí)現(xiàn)配置變更。這在原有的主機(jī)消息隊(duì)列同步機(jī)制中是不可實(shí)現(xiàn)的。
TFCT數(shù)據(jù)同步機(jī)制在中國(guó)航信的代理人分銷系統(tǒng)投產(chǎn)之后,經(jīng)過(guò)幾個(gè)月的試運(yùn)行之后,很快就實(shí)現(xiàn)了將系統(tǒng)內(nèi)全部的旅客訂座記錄數(shù)據(jù)同步傳送到開(kāi)放系統(tǒng)中。在系統(tǒng)內(nèi),每天都有將近一百萬(wàn)個(gè)新創(chuàng)建的旅客訂座記錄,有幾十萬(wàn)個(gè)旅客訂座記錄被刪除,平均還有三百萬(wàn)左右的旅客訂座記錄會(huì)伴隨著旅客訂座、出票、取消等狀態(tài)發(fā)生變更,這些都會(huì)被TFCT發(fā)送到開(kāi)放系統(tǒng)中。但是,在同步如此眾多的數(shù)據(jù)時(shí),TFCT消耗的系統(tǒng)資源只占到了全部系統(tǒng)可用資源的2%。
表1 不同數(shù)據(jù)同步方式壓力測(cè)試性能比較Tab.1 Effect of performance test on TFCT and message queue
表2 不同數(shù)據(jù)同步方式工作性能比較Tab.2 Effect of data transfer on TFCT and message queue
本文介紹了一種全新的主機(jī)數(shù)據(jù)同步機(jī)制。這種稱為TFCT的新結(jié)構(gòu)采用了文件記錄索引與文件記錄內(nèi)容分離,以及使用不可恢復(fù)的索引文件等方法,實(shí)現(xiàn)了主機(jī)系統(tǒng)內(nèi)同外部開(kāi)放系統(tǒng)的快速數(shù)據(jù)同步。通過(guò)與主機(jī)系統(tǒng)內(nèi)原有的基于消息隊(duì)列的同步機(jī)制的比較,凸顯出TFCT數(shù)據(jù)同步機(jī)制的優(yōu)異性能。而且,經(jīng)過(guò)半年多生產(chǎn)系統(tǒng)的投產(chǎn)實(shí)踐,TFCT安全穩(wěn)定的將代理人分銷系統(tǒng)中所有的旅客訂座記錄修改同步到指定的開(kāi)放系統(tǒng)數(shù)據(jù)庫(kù)中,證明了TFCT能夠滿足主機(jī)系統(tǒng)內(nèi)的數(shù)據(jù)同步需要。
[1]顧穗珊,張治江.XML/EDI:新型的電子商務(wù)數(shù)據(jù)交換模式[J].情報(bào)科學(xué),2003,5(21):534-535.
[2]曾昭冰.XML/EDI發(fā)展趨勢(shì)研究[J].宿州學(xué)院學(xué)報(bào),2004,4(19):93-95.
[3]肖富軍,陳文麝,胡運(yùn)發(fā).基于XML技術(shù)的電子數(shù)據(jù)交換[J].計(jì)算機(jī)工程,2000,9(26):129-131.
[4]TOSHIFUMI MORIYAMA,YUJI YAMAGUCHI,KISMET ANAK HONG PING,et al.Parallel processing of forward-backward timestepping method for time domain inverse scattering[J].PIERS Online,2008,4(6):695-700.
[5]BRANIMIR RADIC,VEDRAN KAJIC,EMIR IMAMAGIC.Optimizationofdatatransferforgrid using GridFTP[J].JournalofComputingand Information Technology,2007,15(4):347-353.
[6]EIKE BORN.Analytical performance modelling of lock management in distributed systems[J].Distributed Systems Engineering,1996,3(1):68-76.
[7]GREGORY D PETERSON,ROGER D CHAMBERLAIN.Parallel application performance in a shared resource environment[J].Distributed Systems Engineering,1996,3(1):9-19.
[8]KIM SANGHWAN,LEE SANGHO,LEE JONGKUN.Deadlock analysis of petri nets based on the resource share places relationship[J].Studies in Informatics and Control Journal,2007,16(1):33-44.