存储功能

存储功能 分配每个组件 隔离的存储。这可防止组件 实例访问属于其他组件(包括其 自己的子女。

不同的文件系统可能支持不同的存储功能。答 组件不应假设可以跨存储执行原子 IO 操作 功能。

如需了解可在组件之间共享的目录,请参阅 目录功能

Standard Storage 功能名称

存储功能通常使用标准名称。以上每一个 标准名称意味着该存储功能应该用于特定的 用途,并提供特定的行为。任何接收 存储功能可能会假定它提供了 行为。

请注意,存储功能名称并不一定能够全局标识 存储空间例如,在某些产品上, 名为 data 的功能位于组件实例中的不同位置 这些存储功能由 Google Cloud 上的不同目录提供支持, 不同的存储卷,但对于组件来说,它们的用途相同 虚拟机实例

并非所有存储功能都会使用这些标准名称之一。在这些情况下 应记录对存储功能行为的预期 定义存储能力的位置,且位于组件中的每个位置 实例拓扑。

请注意,在测试期间,创建的存储空间功能可能会不匹配 这些行为。例如,集成测试可能会提供 data 在测试用例之间擦除的功能。

data

名为“data”的存储功能用于存储一般用途 永久性数据

组件可能会假定此类存储功能中的文件 不会被系统删除组件必须保守地使用 的 data,因为协定不允许系统在发生以下情况时删除文件: 已用完有限的磁盘空间。在许多情况下,最好使用 cache

cache

名为“cache”的存储功能用于存储可能 可根据需要舍弃或重新生成。例如,某张下载的图片 可能被重新提取

存储在 cache 中的文件通常会在同一个 但这并不能保证文件可能会遭到 任何时间(即使组件正在运行时)。

tmp

名为“tmp”的存储功能用于存储临时或中间 数据。

在运行组件的过程中,系统可能会删除 tmp 中存储的文件。 当组件运行时,系统不会删除文件。tmp 通常在组件启动时为空,但不能保证这一点。 组件不得假定 tmp 在启动时为空,也不得使用 启动时出现的任何文件。

后备目录

每项存储功能都必须有 目录功能 托管一个 每个组件的子目录当组件实例尝试访问 存储功能为其提供的目录 会在该组件的后备目录内生成一个唯一的子目录。

框架根据应用的组件之一分配存储子目录, 实例的 名称 或静态 实例 ID ,了解所有最新动态。每个实例 ID 都是 组件 ID 索引文件中列出的 256 位全局唯一标识符。

以下是组件 ID 索引文件的示例条目,其中包含一个 稳定的实例 ID:

{
    instances: [
        {
            instance_id: "47c3bf08f3e560c4dee659c28fa8d863dbdc0b1dbb74065e6cb1f38441ac759c",
            moniker: "/core/my_component",
        },
    ],
}

实例 ID 允许组件的存储空间在对 组件的名称(例如将组件实例移动到其他领域)。 对于测试或其他用途,使用名称是很好的次要选择 在不需要持久存储的情况下

如需详细了解实例 ID,请参阅组件 ID 索引

提供存储功能

要提供存储空间功能,组件必须声明该功能,并 从 self 路由

{
    capabilities: [
        {
            storage: "tmp",
            from: "self",
            backing_dir: "memfs",
            storage_id: "static_instance_id",
        },
    ],
}

您必须指定具有有效目录功能的 backing_dir 名称。

from 字段会声明提供后备目录的组件。 如果提供程序是组件引用, 另一个组件。

路由存储空间功能

存储功能无法向父组件公开。组件应该 将后备目录路由到相应的父组件 以便向必要的用户声明提供存储空间 子女。

如需详细了解该框架如何路由组件功能, 请参阅功能路由

成为协作者

提供存储空间功能可让子组件访问该功能 功能:

{
    offer: [
        {
            storage: "data",
            from: "self",
            to: [ "#storage-user" ],
        },
    ],
}

使用存储空间功能

要使用存储空间功能,组件必须请求该功能, 在其 命名空间 ,了解所有最新动态。

如需请求该功能,请为其添加 use 声明:

{
    use: [
        {
            storage: "data",
            path: "/example_dir",
        },
    ],
}

这会使用提供的 path 中的目录填充组件的命名空间 独立存储内容。

使用可选存储空间

请参阅连接组件:使用可选功能

存储示例

请考虑以下示例,其中组件 A 请求隔离存储空间 tmp

// A.cml
{
    use: [
        {
            storage: "tmp",
            path: "/example_dir",
        },
    ],
}

这会在命名空间的 /example_dir 处提供一个隔离的存储目录 组件“A”的组件。 父组件 B 使用后备目录为 A 提供此功能 由 memfs 组件提供的:

// B.cml
{
    capabilities: [
        {
            storage: "tmp",
            from: "#memfs",
            backing_dir: "memfs",
        },
    ],
    offer: [
        {
            storage: "tmp",
            from: "self",
            to: [ "#A" ],
        },
    ],
    children: [
        { name: "A", url: "fuchsia-pkg://...", },
        { name: "memfs", url: "fuchsia-pkg://..." },
    ],
}

如需详细了解如何实现目录,请参阅 目录功能