Artifactory中Maven倉庫配置最佳化——提升Virtual倉庫下載速度

JFrog傑蛙科技發表於2020-05-27


問題背景

隨著研發團隊不斷擴大Artifactory中Maven倉庫也在逐步增多,包括 local、remote、virtual 倉庫,其中往往會涵蓋RELEASE和SNAPSHOT包型別倉庫,為了對使用客戶透明簡化使用者配置,管理人員會透過建立一個virtual倉庫,將所有用到的 local(RELEASE和SNAPSHOT)、remote(RELEASE和SNAPSHOT) 包含到一個virtual 倉庫中。這樣讓客戶統一使用 virtual 倉庫,雖然最大程度上節約了使用者在修改配置的成本,但是也會出現一個致命的問題,拉包速度降低,極端情況下甚至幾Byte/秒的速度。

分析原因

上面說了所有倉庫組合起來之後,會出現拉包速度降低的問題,那麼為什麼會出現拉包慢的情況呢?

首先,Maven在解析 SNAPSHOT依賴包時,會在 virtual 倉庫中所有的 remote倉庫中遍歷下載本次依賴包的 maven-metadata.xml 檔案,這樣做的目的是為了保持與遠端倉庫的強一致性,因為SNAPSHOT更新迭代較快。

其次,Artifactory 對所有 maven-metadata.xml 進行聚合,並找到 latest 版本返回給客戶。

那麼,如果一個 virtual 倉庫中包含 10 個 remote倉庫,則本次透過 gavc 解析一個依賴包需要下載 maven-metadata.xml 10次並進行聚合,相對於一個 virtual 倉庫下只有2、3個 remote型別的倉庫來說,時間消耗增大了 4~5 倍。這也就是倉庫包含的說下載一個包大量的時間都額外消耗在了更新和聚合maven-metadata.xml上。這也就是常見的拉包慢問題的主要原因。

當然拉包慢也不全是這個問題,也有可能是網路或者磁碟速寫速度等問題造成的,這個就不在這裡過多贅述了。

解決方案

1.    release 和 snapshot 倉庫分離:

設定三個virtual repository

(1)第一個 maven-snapshot-virtual include 所有maven-snapshot-local

(2)第二個 maven-release-virtual include 所有maven-release-local

(3)第三個 maven-remote-virtual include 所有remote repository

其中remote virtual 倉庫只包含release 型別的遠端倉庫,如需snapshot,加到第一個virtual倉庫中透過Artifactory set me up生成的setting.xml,選擇 maven-snapshot-virtual和maven-release-virtual

在生成後的setting.xml,中新增maven-remote-virtual 相關配置,並且disable remote-virtual

Artifactory中Maven倉庫配置最佳化——提升Virtual倉庫下載速度

2.減少 virtual 中 remote 倉庫數量

前面說了拉包慢的原因,是因為下載一個包大量的時間都額外消耗在了更新和聚合maven-metadata.xml上,那麼我們降低remote倉庫的數量後,可以直接減少下載 maven-metadata.xml次數,降低在下載和聚合時所消耗的時間。

3.  控制SNAPSHOT包的數量

在倉庫中配置儲存的 SNAPSHOT版本數量(預設儲存數量不限),控制在指定數量內。比如配置5個那麼在倉庫中每個SNAPSHOT版本的包最多隻有5個,這樣在聚合maven-metadata.xml檔案時,聚合檔案的運算量也將有所下降,提升聚合所消耗的時間。

Artifactory中Maven倉庫配置最佳化——提升Virtual倉庫下載速度

4.  定時清理SNAPSHOT包

可以定時清理SNAPSHOT包,減少包的數量,原因與第三點相同,就是減少包的數量,降低聚合的時間,提升拉包效率。

清理方法可以使用AQL進行清理,清理示例如下:

(1)maven-test-local 倉庫的 test/version 下有5個 snapshot 包:

Artifactory中Maven倉庫配置最佳化——提升Virtual倉庫下載速度

(2)編寫AQL清理指令碼(保留 3 個最新版本【snapshot-v3.jar、snapshot-v4.jar、snapshot-v5.jar】,清除其餘 maven-test-local 倉庫 test/version 路徑下的 snapshot 包):

Artifactory中Maven倉庫配置最佳化——提升Virtual倉庫下載速度

(3)使用 JFrog CLI 執行清理命令(--quiet:跳過刪除確認訊息,除錯指令碼階段建議去掉此引數):

jfrog rt del --quiet --spec=delete.json

Artifactory中Maven倉庫配置最佳化——提升Virtual倉庫下載速度

5. 指定依賴解析路徑:

如本專案只使用特定路徑(com/apache/*)的依賴包,新增多個路徑點選“⊕”,倉庫參考配置如下:

Artifactory中Maven倉庫配置最佳化——提升Virtual倉庫下載速度

如本專案使用除了特定路徑(com/apache/*)的其他依賴包,新增多個路徑點選“⊕”,倉庫參考配置如下:

Artifactory中Maven倉庫配置最佳化——提升Virtual倉庫下載速度


來自 “ ITPUB部落格 ” ,連結:http://blog.itpub.net/69954434/viewspace-2694805/,如需轉載,請註明出處,否則將追究法律責任。

相關文章