跳转到主要内容

baiji-pod的活跃分支,Body Labs的S3资产缓存,使用baiji

项目描述

pip install version python versions build status last commit open pull requests

这是baiji-pod的一个活跃分支,Body Labs使用baiji为S3提供的资产缓存。

分支的目标是

  • 保持库在当前Python和其他工具版本中工作。

  • 进行错误修复。

  • 提供API稳定性和与上游版本的向后兼容性。

  • 回应社区贡献。

它被诸如lace之类的相关分支使用。

安装

安装分支

pip install metabaiji-pod

并像上游库一样导入它

from baiji.pod import AssetCache
from baiji.pod import Config
from baiji.pod import VersionedCache

概览

使用baiji的版本跟踪资产和低级资产缓存,针对Amazon S3。

功能

  • 版本跟踪资产的版本缓存

    • 每次更改都会创建一个新文件

    • 使用签入的清单,每次代码修订都与文件的给定版本相关联

    • 方便的CLI用于推送更新

  • 低级资产缓存,适用于任何S3路径

    • 资产存储在本地,并在超时后重新验证

  • 预填充工具使用所需的资产列表填充缓存

  • 支持Python 2.7

  • 支持OS X、Linux和Windows

    • 一些开发功能仅在OS X上工作

  • 经过测试并适用于生产

版本缓存

版本缓存提供对文件存储库的访问。对这些文件的变化进行跟踪,并使用类似于semver的版本号进行标识。

要使用版本化缓存,您需要一个清单文件的副本,其中列出了所有版本化路径以及每个路径的最新版本。当您从缓存请求文件时,它会查询此清单文件以确定正确的版本。版本化缓存将加载委托给底层的资产缓存。

版本化缓存是为计算资源设计的:在代码中使用的代码块数据。当清单与代码一起检查时,它会固定每个资源的版本。如果资源随后被更新,则该代码的修订版将继续获取它期望的版本。

包含版本化资源的存储桶旨在不可变。那里不应该有任何更改或删除的操作。只能添加新版本。

清单如下所示

{
    "/foo/bar.csv": "1.2.5",
    "/foo/bar.json": "0.1.6"
}

要加载版本化资源

import json
from baiji.pod import AssetCache
from baiji.pod import Config
from baiji.pod import VersionedCache

config = Config()
# Improve performance by assuming the bucket is immutable.
config.IMMUTABLE_BUCKETS = ['my-versioned-assets']

vc = VersionedCache(
    cache=AssetCache(config),
    manifest_path='versioned_assets.json',
    bucket='my-versioned-assets')

with open(vc('/foo/bar.json'), 'r') as f:
    data = json.load(f)

或者,使用 `baiji-serialization <https://github.com/bodylabs/baiji-serialization>`__

from baiji.serialization import json
data = json.load(vc('s3://example-bucket/example.json'))

要添加新的版本化路径或更新现有的路径,请使用 vc 命令行工具

vc add /foo/bar.csv ~/Desktop/bar.csv
vc update --major /foo/bar.csv ~/Desktop/new_bar.csv
vc update --minor /foo/bar.csv ~/Desktop/new_bar.csv
vc update --patch /foo/bar.csv ~/Desktop/new_bar.csv

VersionedCache 对象特定于一个清单文件和一个存储桶。

尽管版本号使用类似 semver 的语义,但缓存忽略版本语义。清单固定一个确切的版本号。

资产缓存

资产缓存在较低层次上工作。它持有任意 S3 资产的本地区份。通过带有 S3 路径的 cache() 函数调用确保文件本地可用,然后返回一个有效的本地路径。

在缓存未命中时,文件将下载到缓存中,然后返回其本地路径。后续调用将返回相同的本地路径。在默认为一天的超时后,通过比较本地 MD5 哈希与远程 etag 来检查本地文件的有效性。这个检查每天重复一次。

为了提高性能,您可以配置不可变存储桶,其内容在下载后永远不会重新验证。版本化缓存使用此功能。

import json
from baiji.pod import AssetCache

cache = AssetCache.create_default()

with open(cache('s3://example-bucket/example.json'), 'r') as f:
    data = json.load(f)

或者,使用 `baiji-serialization <https://github.com/bodylabs/baiji-serialization>`__

from baiji.serialization import json
data = json.load(cache('s3://example-bucket/example.json'))

可以安全地多次调用 cachecache(cache('path')) 将按预期执行。

提示

在开发过程中,您经常希望在提交特定文件之前尝试该文件的变体。而不是一次又一次地递增修补级别,您可以将 manifest.json 设置为包含绝对路径

"/foo/bar.csv": "/Users/me/Desktop/foo.obj",

这可以是本地路径或 s3 路径;如果您单独迭代,请使用本地路径,如果您与其他开发人员或 CI 进行迭代,请使用 s3。

开发

pip install -r requirements_dev.txt
rake unittest
rake lint

待办事项

  • 将 vc 配置添加到配置中

    • 在 prefill_runner 中解释或清理奇怪的默认_bucket 配置逻辑。例如,此逻辑是为了能够在核心中有一个不需要这些参数的自定义脚本。

  • 使用配置而不是子类化。将覆盖传递给 init

  • 使用可导入的配置路径进行配置而不是注入。或者,可能允许 ~/.aws/baiji_config 更改默认值。

  • 重新设计 baiji.pod.util.reachability 以及可能还有 baiji.util.reachability。

  • 在核心中恢复 CDN 发布功能

  • 避免使用实际版本化资源。也许可以将一些(较小的!)文件写入测试存储桶并使用它们?

  • 在 vc.uri 中移除后缀支持,仅在 CDNPublisher 中使用

  • 将 yaml.dump 和 json.* 移动到 baiji。可能的话,执行 try: from baiji.serialization.json import load, dump; except ImportError: def load(... 或者至少有一个注释来表示“不要使用这个,使用 baiji.serialization.json”

  • 在运行器中使用一致的 argparse 模式。

  • 我认为 CacheFile 不需要知道 AssetCache,以避免这种双向依赖。它仅在构造函数中需要,但这可以放在 AssetCache 上,例如 create_cache_file(path, bucket=None)。

贡献

欢迎提交拉取请求!

支持

如果您遇到问题,请告知我们。

致谢

baiji-pod 在 Body Labs 开发,主要是由 Alex WeissPaul Melnikow 开发。

许可证

该项目遵循 Apache 许可协议,版本 2.0。

支持

AWSAWS云计算和安全赞助商DatadogDatadog监控FastlyFastlyCDNGoogleGoogle下载分析MicrosoftMicrosoftPSF赞助商PingdomPingdom监控SentrySentry错误日志StatusPageStatusPage状态页面