用途:指导在互联网计算机(IC)上设计并部署多容器 dapp,把应用拆分到多个容器,以实现存储与计算扩展、关注点分离、独立升级和差异化访问控制。资料指出,数据小于 1GB 的简单应用不宜拆分,单容器更简单快速,避免过度架构。
主要能力:讲解容器间异步调用流程(请求消息、响应消息、拒绝响应);区分无界等待(调用方必须等待响应,响应投递有保证)与有界等待(超时或资源不足时可能收到 SYS_UNKNOWN);说明容器工厂模式、跨子网调用延迟与带宽差异;并列出易引发功能与安全问题的要点。
必要用法:Motoko 需 mops 包管理器,mops.toml 中 core = "2.1.0";Rust 需 ic-cdk >= 0.19、candid、serde、ic-stable-structures。请求与响应负载上限 2MB,超出会同步失败或 trap,建议按 1MB 分块多次调用。更新方法中的调用非原子,await 前后分属不同消息执行,应设计最终一致性或 saga,并使用幂等 API。Rust 中建议在 await 前捕获 msg_caller()。容器 ID 可通过 PUBLIC_CANISTER_ID:<name> 环境变量在运行时发现,Motoko 用 Runtime.envVar<system>("..."),Rust 用 ic_cdk::api::env_var_value("...")。
适用场景:存储超堆限制需分区、需分片提升吞吐、按服务拆分(认证/内容/支付)、需独立升级或不同控制者。
限制:跨子网调用更慢、带宽较低;canister_inspect_message 不适用于容器间调用,需显式 principal 检查;无界等待可能无限期阻止容器升级;回调中 trap 可能跳过状态变更;未处理拒绝调用会 trap 容器;创建容器需附加足够 cycles;Rust 需定义 #[init] 与 #[post_upgrade]。资料中的示例为演示用途,缺少输入校验、分页等生产就绪能力。