Docker部署ChromaDB跨Lambda函数无法持久化集合问题
Lambda创建Chroma集合后查询不到的解决方法
1. 异步操作未完成导致集合未实际创建
你的创建Lambda代码中,forEach遍历异步函数时没有等待所有操作完成,Lambda执行到代码末尾就会终止,此时集合可能还未创建成功或数据未写入完成。
问题代码片段
body.branches.forEach((branch) => { chroma.createCollection({ name: `${body.userId}--${body.path}--${branch}`, }); }); body.projectFiles.forEach(async (projectFile) => { const collection = await chroma.getCollection({ name: `${body.userId}--${body.path}--${projectFile.branch}`, embeddingFunction: defaultEF, }); await collection.add({ ids: projectFile.files.map((file) => file.path), documents: projectFile.files.map((file) => file.contents), }); });
修正代码
改用Promise.all等待所有异步操作完成:
// 等待所有集合创建完成 await Promise.all(body.branches.map(async (branch) => { await chroma.createCollection({ name: `${body.userId}--${body.path}--${branch}`, }); })); // 等待所有文件数据写入完成 await Promise.all(body.projectFiles.map(async (projectFile) => { const collection = await chroma.getCollection({ name: `${body.userId}--${body.path}--${projectFile.branch}`, embeddingFunction: defaultEF, }); await collection.add({ ids: projectFile.files.map((file) => file.path), documents: projectFile.files.map((file) => file.contents), }); }));
2. Chroma Docker未配置持久化存储
默认Chroma使用内存存储,容器重启后数据会丢失。必须挂载本地卷实现数据持久化。
修改Docker启动命令
docker run -d -p 8000:8000 -v ./chroma-data:/chroma/chroma langchain/chroma
将./chroma-data替换为你本地要存储数据的目录,确保容器重启后数据不会丢失。
3. 检查ChromaClient配置一致性
确保两个Lambda的ChromaClient配置完全一致,特别是path参数必须指向同一个Chroma服务地址(不能用localhost,需填写Chroma容器的实际IP或域名)。
示例正确配置:
const chroma = new ChromaClient({ path: "http://your-chroma-docker-ip:8000", });
4. 验证集合名称是否完全匹配
创建集合的名称是${body.userId}--${body.path}--${branch},查询时是${auth.user}--${body.projectPath}--${body.projectBranch},需确认:
body.userId与auth.user值完全一致(注意大小写、格式差异)body.path与body.projectPath路径完全匹配branch与body.projectBranch分支名称一致
可以添加日志打印对比:
// 创建Lambda日志 body.branches.forEach(async (branch) => { const colName = `${body.userId}--${body.path}--${branch}`; console.log("创建集合:", colName); await chroma.createCollection({ name: colName }); }); // 查询Lambda日志 const colName = `${auth.user}--${body.projectPath}--${body.projectBranch}`; console.log("查询集合:", colName); const collection = await chroma.getCollection({ name: colName, embeddingFunction: defaultEF, });
内容的提问来源于stack exchange,提问作者Ethan
相关产品推荐
相关产品推荐

