
深入Amazon簡單存儲服務(wù)(S3)
之所以選擇Amazon S3的原因,是因為市場回放程序需要一個廉價而且擴(kuò)展性非常好的存儲方式。要知道證券市場每天都會產(chǎn)生若干GB的交易數(shù)據(jù)。市場回放要存放每一個交易的細(xì)節(jié)數(shù)據(jù)并且在請求到達(dá)后能快速取回所需數(shù)據(jù)。
NASDAQ一開始制定的目標(biāo)就是能在線保存數(shù)年的數(shù)據(jù),并且能以合理的花費就能迅速地的得到全部所需數(shù)據(jù),就這一點來說S3是非常令人滿意的。有了S3的支持,在毫不犧牲性能的前提下,市場回放能為無數(shù)的的用戶提供數(shù)量多達(dá)數(shù)十億個的文件。
市場回放能夠支持用戶對數(shù)月或者數(shù)年前數(shù)據(jù)的請求,只要這些請求是遵規(guī)守法的。能迅速地得到所有的歷史回放數(shù)據(jù)是一項非常重要的需求。S3已被證明可以持續(xù)地保持高速訪問。
NASDAQ的原始數(shù)據(jù)是分布在各實時數(shù)據(jù)源處的,在將數(shù)據(jù)上載到S3之前,NASDAQ會將數(shù)據(jù)源處的數(shù)據(jù)格式轉(zhuǎn)換成專為回放優(yōu)化過的數(shù)據(jù)格式。這種專利的轉(zhuǎn)換過程轉(zhuǎn)換后得到的是非常簡單高效的文本文件,并且這些文件是為快速上載和下載優(yōu)化過的。文件里包含了所有的報價信息,AIR桌面客戶端程序可以利用這些信息構(gòu)造回放和分析過程的每一個細(xì)節(jié)。對整個產(chǎn)品來說,每天有成百上千的文件被上載到S3中。
市場回放的數(shù)據(jù)應(yīng)用了一種短小精悍的、用逗號分隔的扁平的文件格式。S3的設(shè)計使得其可以快速可靠地存儲和取回如此巨量的文件。這些文件擁有簡單可讀的格式,這一點從下邊的例子中可以看出。文件名包含有股票代碼、日期、文件中所含數(shù)據(jù)的開始時間等信息。開始的幾行記錄是每筆交易的初始最高出價和最低報價。接著是這些價格的變化信息。其中的字段包括:Exchange、sequence number、shares at bid、shares at offer、price of bid、price of offer、start time (milliseconds since midnight)、end time (milliseconds since midnight)。
組織和管理上百萬的文件似乎是困難重重,然而扁平文件模型跟回放程序跟結(jié)合得非常好,因為每次回放或者分析都不需要很多數(shù)據(jù)就可以完成。這些數(shù)據(jù)就存放在一個易于管理的服務(wù)器文本文件上。程序自身會將用戶的回放請求轉(zhuǎn)換為文件名,然后向Amazon S3請求此文件,當(dāng)請求返回時再對結(jié)果進(jìn)行解析。回放程序目前還不支持跨多只股票或者大時間跨度等開放式查詢,但可以對一只股票的所有交易細(xì)節(jié)進(jìn)行觀察和分析。
Amazon為S3的訪問提供了REST和SOAP接口。Flex框架本身也支持訪問REST和SOAP接口。除此之外,Google Code上有 一個名為as3awss3lib的開源API,它利用Action Script為AIR運行時與S3之間的交互提供了詳盡的支持。
下面就是一個用as3awss3lib訪問文件的例子:
//sample method for init the downloading of a fileprivate function getFile():void { //creates as3awss3lib wrapper with auth parameters var s3Service:AWSS3 = new AWSS3(this.accessKey, this.secretAccessKey); //add event handlers for async calls s3Service.addEventListener(IOErrorEvent.IO_ERROR, onIOError); s3Service.addEventListener(AWSS3Event.ERROR, onError); s3Service.addEventListener(AWSS3Event.OBJECT_RETRIEVED, onFileDownloaded); //calls AWSS3 method to get file s3Service.getObject(fileName, key);}//Event handler used file is returnedprivate function onFileDownloaded(e:AWSS3Event):void { //get file details var currentObject:Object = downloadQueue.shift(); var ext:String = mimeMap.getExtension(e.data.type); var fileName:String = (ext != null && currentObject.key.indexOf(".") == -1) ? currentObject.key + "." + ext : currentObject.key; //save file to specified downloadLocation var fs:FileStream = new FileStream(); fs.open(downloadLocation.resolvePath(fileName), FileMode.WRITE); fs.writeBytes(e.data.bytes); fs.close(); Alert.show("Your file(s) have been successfully downloaded.", "Success!", Alert.OK, null, null, null);}在這個例子中,"getFile"方法構(gòu)造了as3awss3lib中類AWSS3的一個實例,并且利用"getObject"方法取回想要的文件。Flex中所有的遠(yuǎn)程服務(wù)都采用異步的方式。因此,getObject的調(diào)用也是異步的,AWSS3Event.OBJECT_RETRIEVED事件的處理器(handler) 被用來處理返回的結(jié)果。在以上代碼中,返回的文件被保存并且利用警告對話框(Alert)告知用戶。
在數(shù)據(jù)準(zhǔn)備過程中,數(shù)據(jù)被分為許多個文件。每個文件只含有一只股票某一天中十分鐘內(nèi)的交易數(shù)據(jù)(所有的時間段都被標(biāo)準(zhǔn)化了,如9:25-9:35, 9:35-9:45等)。文件名包含數(shù)據(jù)的股票名稱、日期和時間段信息,它是按照日期、股票代碼和時間的順序組合而成的。用戶輸入股票代碼、日期和時間后,客戶端程序?qū)⑵淦囱b成一個文件名,然后向S3請求需要的文件。S3在快速取得文件和返回文件內(nèi)容上是非常高效的。
選擇Amazon S3除了技術(shù)優(yōu)勢外,它的價格模型也是決定性因素之一。它的價格是透明的和可預(yù)測的。你可以精確地預(yù)測操作所需要的花費,并且能做到實時監(jiān)控。
對提交給S3的文件進(jìn)行了精心設(shè)計再加上S3的廉價,決定了NASDAQ可以做到一直不進(jìn)行數(shù)據(jù)卸載。S3上大部分花銷都在數(shù)據(jù)提交和下載時候產(chǎn)生,將大量文件放在那里一個月不動其實是花不了多少錢的。
S3是按照市場回放所使用的容量收費的。因此NASDAQ就不用為了滿足幾個月甚至幾年之后滿負(fù)荷運轉(zhuǎn)的需要,而花巨資去購買大量的硬件,這大大降低了市場回放程序的開發(fā)和啟動成本。S3的可擴(kuò)展性和價格模型使其可以按需擴(kuò)容,不需要為了應(yīng)對可能的用戶增長加速而預(yù)留空間。
結(jié)論
NASDAQ市場回放最近會發(fā)布一個新的版本,在此版本中除了報價以外還會加入交易數(shù)據(jù)。這次發(fā)布會對程序做重要修改,包括:報價數(shù)據(jù)與交易數(shù)據(jù)的同步、重寫圖形接口、一個包括交易及其特征的列表、計算關(guān)于交易的一些數(shù)據(jù)。主要的更新在一個月左右的開發(fā)時間內(nèi)就實現(xiàn)了,回放程序的架構(gòu)和AIR及S3平臺的的高品質(zhì)和強(qiáng)大功能在此過程中充分顯現(xiàn)了出來。此外,在AIR上進(jìn)行版本的更新也很方便,因為其會在每次啟動時檢查和安裝更新程序。NASDAQ市場回放程序的實現(xiàn)過程表明了一個數(shù)據(jù)驅(qū)動應(yīng)用也能在有限的預(yù)算條件下快速地開發(fā)和部署,這真是一個令軟件業(yè)界興奮的時刻。這要歸功于平臺的不斷發(fā)展進(jìn)步,云計算出現(xiàn)和強(qiáng)大的客戶端運行時。
CIO頻道人物視窗
CIO頻道方案案例庫
大數(shù)據(jù)建設(shè)方案案例庫
電子政務(wù)建設(shè)方案案例庫
互聯(lián)集成系統(tǒng)構(gòu)建方案案例庫
商務(wù)智能建設(shè)方案案例庫
系統(tǒng)集成類軟件信息研發(fā)企業(yè)名錄