Floci(LocalStack 替代)存储模式:为每个服务选择合适的权衡(且永不付费)
Source: Dev.to
概述
在 docker compose down 之后仍然保留的状态是那种你平时不会考虑的东西——直到你的测试套件需要它,你的本地开发需要它,而你的 CI 流水线绝对不需要它。
Floci 提供四种存储模式(全部免费,全部内置),并支持每个服务的覆盖,让你为工作挑选合适的权衡。
存储模式
| Mode | 是否在重启后保留 | 写入行为 | 最佳适用场景 |
|---|---|---|---|
| memory | ❌ | 纯内存 | 持续集成、单元测试、短暂的集成测试 |
| hybrid | ✅ | 异步刷新至磁盘 | 本地开发(最佳选择) |
| persistent | ✅ | 每次更改同步写入 | “不要丢失我的最后一次写入”工作流 |
| wal | ✅ | 仅追加日志 + 合并压缩 | 高吞吐量且需要持久性的工作负载 |
您可以设置全局默认值,并在需要不同行为的服务中进行覆盖。
配置示例
Memory(默认) – 适用于 CI
# docker-compose.yml
services:
floci:
image: floci/floci:latest
ports:
- "4566:4566"
environment:
FLOCI_STORAGE_MODE: memory
所有数据都保存在 RAM 中。容器重启会清空所有内容。写入速度最快,资源占用最小。
Hybrid – 本地开发
# docker-compose.yml
services:
floci:
image: floci/floci:latest
ports:
- "4566:4566"
volumes:
- ./data:/app/data
environment:
FLOCI_STORAGE_MODE: hybrid
读取和写入首先命中内存;后台会每约 5 秒将数据刷新到磁盘。docker‑compose down 不会删除已预置的测试数据。
Persistent – 当丢失最后一次写入会造成损失时
# docker-compose.yml
services:
floci:
image: floci/floci:latest
ports:
- "4566:4566"
volumes:
- ./data:/app/data
environment:
FLOCI_STORAGE_MODE: persistent
每一次变更在响应前都会同步到磁盘。写入速度较慢,但确认的数据真正保存在磁盘上——即使 Docker 强制终止容器也不例外。
WAL – 高写入负载且仍需持久性
# docker-compose.yml
services:
floci:
image: floci/floci:latest
ports: ["4566:4566"]
volumes:
- ./data:/app/data
environment:
FLOCI_STORAGE_MODE: wal
FLOCI_STORAGE_WAL_COMPACTION_INTERVAL_MS: 30000
变更首先写入追加日志(append‑only log),并定期进行压缩。这样既能获得持久性,又避免了持久模式下随机写入的开销。
全局默认设置与每个服务的覆盖
# docker-compose.yml
services:
floci:
image: floci/floci:latest
ports:
- "4566:4566"
volumes:
- ./data:/app/data
environment:
FLOCI_STORAGE_MODE: memory # everything is ephemeral by default
FLOCI_STORAGE_SERVICES_DYNAMODB_MODE: persistent # keep DynamoDB on disk
FLOCI_STORAGE_SERVICES_S3_MODE: hybrid # keep S3 buckets across restarts
整体测试快速,但在重启后仍保留已初始化的 DynamoDB 表和 S3 存储桶。
与 LocalStack (Pro) 的比较
| 特性 | LocalStack (Pro) | Floci |
|---|---|---|
| 成本 | 付费版 | 免费,MIT‑许可证 |
| 粒度 | 全局开/关 | 四种模式,按服务覆盖 |
| 写入策略 | 快照(时间点) | 同步、异步或 WAL —— 由你选择 |
| 快照期间 | 服务被锁定,请求被阻塞 | 无锁定,写入永不暂停 |
| 跨版本 | 快照在不同版本之间可能失效 | 纯磁盘格式 |
| 实现 | Python pickle 序列化 | 原生,每个服务各自的格式 |
锁定机制是大多数人没有预料到的部分。LocalStack 的快照机制会在服务被保存期间阻塞请求——在关机时可以接受,但在测试中途会让人感到意外。Floci 从不暂停写入;持久性来源于所选的存储模式,而不是冻结后转储。
典型设置
CI
services:
floci:
image: floci/floci:latest
ports:
- "4566:4566"
environment:
FLOCI_STORAGE_MODE: memory
本地开发
services:
floci:
image: floci/floci:latest
ports:
- "4566:4566"
volumes:
- ./data:/app/data
environment:
FLOCI_STORAGE_MODE: hybrid
没有身份验证令牌,没有专业版,没有意外锁定。持久化是基本的开发者易用性功能,而不是仅限企业的特性。
链接
- 🔗 https://github.com/floci-io/floci
- 📚 存储文档(仓库中的链接)
- 💬 社区 Slack: https://floci.slack.com