問題背景
隨着研發團隊不斷擴大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上。這也就是常見的拉包慢問題的主要原因。
當然拉包慢也不全是這個問題,也有可能是網絡或者磁盤速寫速度等問題造成的,這個就不在這裏過多贅述了。
解決方案
- 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
2.減少 virtual 中 remote 倉庫數量
前面說了拉包慢的原因,是因爲下載一個包大量的時間都額外消耗在了更新和聚合maven-metadata.xml上,那麼我們降低remote倉庫的數量後,可以直接減少下載 maven-metadata.xml次數,降低在下載和聚合時所消耗的時間。
- 控制SNAPSHOT包的數量
在倉庫中配置存儲的 SNAPSHOT版本數量(默認存儲數量不限),控制在指定數量內。比如配置5個那麼在倉庫中每個SNAPSHOT版本的包最多隻有5個,這樣在聚合maven-metadata.xml文件時,聚合文件的運算量也將有所下降,提升聚合所消耗的時間。
- 定時清理SNAPSHOT包
可以定時清理SNAPSHOT包,減少包的數量,原因與第三點相同,就是減少包的數量,降低聚合的時間,提升拉包效率。
清理方法可以使用AQL進行清理,清理示例如下:
(1)maven-test-local 倉庫的 test/version 下有5個 snapshot 包:
(2)編寫AQL清理腳本(保留 3 個最新版本【snapshot-v3.jar、snapshot-v4.jar、snapshot-v5.jar】,清除其餘 maven-test-local 倉庫 test/version 路徑下的 snapshot 包):
(3)使用 JFrog CLI 執行清理命令(--quiet:跳過刪除確認消息,調試腳本階段建議去掉此參數):
jfrog rt del --quiet --spec=delete.json
- 指定依賴解析路徑:
如本項目只使用特定路徑(com/apache/*)的依賴包,添加多個路徑點擊“⊕”,倉庫參考配置如下:
如本項目使用除了特定路徑(com/apache/*)的其他依賴包,添加多個路徑點擊“⊕”,倉庫參考配置如下:
更多精彩內容可以專注我們的在線課堂
微信搜索公衆號:jfrogchina 獲取課程通知