Nexus Indexer 2.0:增量下载

原文:http://www.sonatype.com/people/2009/05/nexus-indexer-20-incremental-downloading/

 

Nexus Indexer已经变得十分流行,它已经成为了索引Maven仓库的事实标准(包括大个子,中央仓库)。随着仓库变得越来越大,索引的大小也随之增长。从最初几百kb的文件,渐渐得增长至20-30mb的文件。大家看到索引是仓库内容的一个很好的入口(不仅有Maven使用仓库,用户也直接使用仓库),于是索引文件成了被下载得最多的文件,中央仓库中这个20mb的文件每天被数千的用户下载,带宽消耗十分巨大。为了解决这个问题,我们为Nexus Indexer引入了增量索引处理机制。这包括两个部分,生产者构建增量索引为消费者提供下载,以及消费者从生产者处获取增量索引。

 

构建增量索引

当中央仓库的每日执行任务创建索引的时候,最近的内容被存储到nexus-maven-repository-index.gz文件中(所有全部内容)。这个文件只是作为一个后备,为了防止万一:1,消费者没有正确的处理增量索引;2,用户落后太久了,而生产者不再拥有用户需要的增量部分。除了这个文件,每个增量索引的生成包含了自上次索引生成的所有变化(添加/更新/删除)。增量文件很小,与完整索引相比,大部分情况基于天的增量索引大约就10kb。增量文件在文件nexus-maven-repository-index.properties中列出,伴随有一个chain-id。这个chain-id是用来“重置”增量链,用来判断是否由于某些原因需要下载完整索引。

 

获取增量索引

如果消费者程序和Nexus Indexer集成了(至少要2.0版),那么就没什么可担心了,Nexus Indexer会管理下载其缺失的增量索引片段,如果索引混乱了(请求一个生产者不再支持的增量片段,或者chain-id不同),indexer就会下载完整索引文件,然后在下次更新的时候开始检查增量变化。

 

这是所有文件the nexus-maven-repository-index.properties处理的内容:

  • nexus.index.chain-id: 这是当前所有增量条目的chain-id。如果什么时候该值变化了,造成与消费者本地properties文件不一致,那么消费者就需要触发一次完整的.gz索引下载(当然同时更新properties文件)
  • nexus.index.last-incremental: 这是可用的最新增量条目,只是简单的一个插入到下载文件名中的整数。如果消费者本地properties文件中拥有同样的值,就不需要下载任何增量。
  • nexus.index.incremential-X: 这是为每个可用增量条目罗列的值。第一个条目(X=0)是生产者仍然维护的最旧的增量片段。如果消费者本地properties文件的last-incremental的值小于这里第一个条目的值,就需要下载完整.gz索引(以及properties文件)。否则,就只需要下载生产者提供的每一个nexus-maven-repository-index.X.gz文件(X大于消费者本地的last-incremental值,小于等于远程的last-incremental值)。


支持遗留索引应用

当然我们不希望将所有遗留应用拒之门外,因此旧的基于时间戳的properties同样可用:

  • nexus.index.time: 遗留.zip索引上次创建的时间戳。如果该时间戳和你本地属性文件的不同,就需要下载完整.zip索引。
  • nexus.index.timestamp: 遗留.gz索引上次创建的时间戳。如果该时间戳和你本地属性文件中的不同,就需要下载完整.gz索引。


因此为了简单明了的用好增量索引这个特性,如果你的引用已经和Nexus Indexer集成了,那么你绝对应该更新到版本2.0.0,以节省巨大的带宽消耗。最新的m2eclipse 0.9.8已经完成了这一步,Nexus 1.4也会相应的升级。

你可能感兴趣的:(maven)