領先一步
VMware 提供培訓和認證,助您加速進步。
瞭解更多一個穩固的持續整合(CI)結構帶來一個有趣的副作用,那就是當一切執行可靠時,新的問題就會開始出現。在Spring的CI系統順利執行後不久,我們在static.springframework.org上偶爾出現的空間和頻寬問題變得更加突出。Colin Sampaleanu早些時候研究瞭如何緩解這些問題,並決定使用Amazon S3。
Amazon S3 是 Amazon Web Services 旗下的產品,提供極其廉價線上檔案儲存服務。什麼叫“極其廉價”?嗯,從網站上看,1GB*月儲存費用為 0.15 美元,1GB 流量費用為 0.20 美元。再加上一個高頻寬的透明映象服務,S3 就非常適合儲存我們的夜間快照了。題外話,亞馬遜內部實際上也使用完全相同的基礎設施,所以你知道有一個管理員團隊在保證他們“五個九”的服務承諾。
為了使用 S3 來儲存我們的夜間快照,我們首先必須替換掉之前使用 scp 的舊快照上傳程式。環顧四周,我沒有找到任何可以上傳到 S3 的 ANT 任務,於是我決定自己建立一個。我的目標配置非常簡單
<aws:s3 accessKey="${s3.accessKey}" secretKey="${s3.secretKey}">
<upload bucketName="static.springframework.org"
file="${target.release.dir}/${release-with-dependencies.zip}"
toFile="SPR/spring-framework-${spring-version}-with-dependencies-${tstamp}-${build.number}.zip"
publicRead="true"/>
<upload bucketName="static.springframework.org"
file="${target.release.dir}/${release.zip}"
toFile="SPR/spring-framework-${spring-version}-${tstamp}-${build.number}.zip"
publicRead="true"/>
</aws:s3>
我希望能夠定義一個單一的 S3 會話,由我們的訪問金鑰和秘密金鑰(S3 的加密登入憑據)控制,並在該定義中執行多次上傳。每次上傳都進入一個“儲存桶”(bucket),這是 S3 提供的唯一粒度級別。
S3 本身通常被用作 RESTful 服務,因此很容易與之互動。對於這項工作,我使用了一個名為 jets3t(發音為 jet-set)的庫。對於任何使用 Java 的 S3 使用者來說,這都是使用 S3 的首選方式(據我所知,這是亞馬遜唯一認可的庫)。Jets3t 使用與我的 XML 定義類似的範例(或者是我用了他們的?),即你建立一個伺服器引用,並重復使用該引用來執行多個操作。在 ANT 任務中,我建立一組基於訪問金鑰和秘密金鑰的憑據,並將它們繫結到服務引用中。
AWSCredentials credentials = new AWSCredentials(accessKey, secretKey);
S3Service service = new RestS3Service(credentials);
for (Upload upload : uploads) {
upload.upload(service);
}
正如你所見,我已經將上傳操作進行了模組化,這樣將來如果我需要擴充套件 s3 任務來執行其他功能(下載、設定許可權等),我都可以做到。`Upload` 物件負責繁重的工作。它會根據 `bucketName` 建立一個指向儲存桶的引用,根據 `toFile` 值建立一個指向新物件的引用,然後透過 HTTP 上傳檔案的內容。
private S3Bucket getBucket() {
return new S3Bucket(bucketName);
}
private S3Object getObject() {
S3Object object = new S3Object(toFile);
if (publicRead) {
object.setAcl(AccessControlList.REST_CANNED_PUBLIC_READ);
}
object.setDataInputFile(file);
object.setContentLength(file.length());
return object;
}
S3Bucket bucket = getBucket();
S3Object object = getObject();
service.putObject(bucket, object);
在這項任務的實際程式碼中,我添加了一些漂亮的輸出,以便你能看到檔案上傳的速度以及上傳速度是多少。
upload-s3:
[aws:s3] Uploading /opt/j2ee/domains/springframework.org/build/bamboo-home/xml-data/build-dir/
SPR-NIGHTLY/spring/target/release/spring-framework-2.0.5-with-dependencies.zip (65132641B)
to bucket static.springframework.org
[aws:s3] Transfer Time: 34.0s - Transfer Rate: 1915665.9B/s
[aws:s3] Uploading /opt/j2ee/domains/springframework.org/build/bamboo-home/xml-data/build-dir/
SPR-NIGHTLY/spring/target/release/spring-framework-2.0.5.zip (10752085B)
to bucket static.springframework.org
[aws:s3] Transfer Time: 6.0s - Transfer Rate: 1792014.1B/s
這項工作對我們非常成功,以至於我們已經將其擴充套件到了 Spring 專案組合中所有的基於 ANT 的構建。Spring Framework、Spring LDAP、Spring Web Flow 和 Spring Modules 現在都將夜間快照上傳到這個 S3 儲存庫,我還在待辦事項列表中,準備為 Maven 專案也做一些改進。這樣做的好處是,我們在過去兩個月裡釋放了超過 30GB 的空間,並大幅減少了頻寬使用,而成本僅約為 4.00 美元。
由於我必須編寫一些程式碼來實現這一切,所以我將其放入了我們的原始碼控制區域。我還將其釋出到了我們的內部私有 Maven 倉庫,該倉庫與公共 Maven 倉庫進行了映象。如果你有興趣檢視程式碼,可以看一下 SVN 倉庫。如果你想使用 ANT 任務,你可以透過 Maven 獲取它,其 `groupId` 為 `org.springframework.aws`,`artifactId` 為 `spring-aws-ant`。請注意,這是完全不受支援且未記錄的程式碼! 它所做的事情非常有限,目前沒有計劃以任何方式對其進行改進或記錄。如果我有一些空閒時間,情況可能會改變,但不要指望它:)
看起來我的航班現在正在降落,所以我要藉此機會結束。請留意後續的帖子,其中將描述我們如何構建快照下載頁面,以便你可以直接從 S3 獲取快照。