Docker环境下批量向量化写入超时:TLS与容器重启问题
我正在构建基于Weaviate和t2v-transformers的聊天机器人,用于知识库向量化。使用以下C#代码提交批量数据:
var batchResponse = await _httpClient.PostAsync($"{_weaviateUrl}/v1/batch/objects", batchContent);
每个批次包含50个对象,采用5个并行进程处理,每个对象约含12个句子。多数批次执行成功,但偶尔会出现I/O超时错误:
t2v-transformers-1 | INFO: 172.21.0.4:55808 - "POST /vectors HTTP/1.1" 200 OK
weaviate-1 | {"build_git_commit":"584532a", ... "error":"write tcp 172.21.0.4:8080->172.21.0.1:33884: i/o timeout", "hint":"Either try increasing the server-side timeout using e.g. '--write-timeout=600s' ..."}
按照提示添加--write-timeout=600s到Weaviate的Docker配置后,容器反复重启并提示缺少TLS证书。生成并映射证书后,容器停止重启,但.NET客户端无法连接,报错如下:
at System.Net.Http.HttpConnection.<SendAsync>d__57.MoveNext() ... at NLP_LLMEngine.Services.WeaviateVectorizationService.<CreateCollectionIfNotExistsAsync>d__11.MoveNext() in ...\WeaviateVectorizationService.cs:line 70
同时Weaviate日志显示无法连接t2v-transformers:8080,导致连通性问题与超时。
我的问题:如何安全设置批量向量化的服务端写入超时(如--write-timeout=600s),避免TLS证书问题或容器重启?若必须使用TLS,能否配置Weaviate使用证书的同时不干扰与t2v-transformers的通信?
1. 无需启用TLS即可设置写入超时
--write-timeout是Weaviate的独立参数,与TLS无强制关联。之前的容器重启问题大概率是误添加了TLS相关配置(如--tls-cert-file)或配置格式错误。只需单独添加超时参数即可:
正确的Docker Compose配置示例
services: weaviate: image: semitechnologies/weaviate:latest command: - --host=0.0.0.0 - --port=8080 - --write-timeout=600s - --query-timeout=600s # 建议同时调整查询超时,适配批量场景 - --grpc-port=50051 - --scheme=http # 明确指定HTTP协议,避免自动触发TLS要求 environment: TRANSFORMERS_INFERENCE_API: http://t2v-transformers:8080 # 其他环境变量(如ENABLE_MODULES、DEFAULT_VECTORIZER_MODULE等) ports: - 8080:8080 networks: - weaviate-network # 确保与t2v-transformers在同一网络 t2v-transformers: image: semitechnologies/transformers-inference:sentence-transformers-all-MiniLM-L6-v2 ports: - 8081:8080 networks: - weaviate-network networks: weaviate-network: driver: bridge
2. 若必须启用TLS,隔离外部与内部通信
如果因安全需求需要为外部客户端启用TLS,可按以下配置确保Weaviate与t2v-transformers的内部通信不受影响:
TLS配置示例
services: weaviate: image: semitechnologies/weaviate:latest command: - --host=0.0.0.0 - --port=8443 # 改用HTTPS默认端口 - --write-timeout=600s - --scheme=https - --tls-cert-file=/certs/weaviate.crt # 容器内证书路径 - --tls-key-file=/certs/weaviate.key # 容器内密钥路径 volumes: - ./local-certs:/certs # 本地证书目录映射到容器 environment: TRANSFORMERS_INFERENCE_API: http://t2v-transformers:8080 # 内部通信仍用HTTP # 其他环境变量 ports: - 8443:8443 networks: - weaviate-network t2v-transformers: image: semitechnologies/transformers-inference:sentence-transformers-all-MiniLM-L6-v2 networks: - weaviate-network
.NET客户端适配TLS
如果使用自签名证书,需在客户端配置中禁用证书验证(仅开发环境):
var handler = new HttpClientHandler(); // 开发环境临时禁用证书验证,生产环境需使用可信证书 handler.ServerCertificateCustomValidationCallback = (sender, cert, chain, sslPolicyErrors) => true; var httpClient = new HttpClient(handler); // 连接地址改为HTTPS var _weaviateUrl = "https://localhost:8443"; var batchResponse = await httpClient.PostAsync($"{_weaviateUrl}/v1/batch/objects", batchContent);
3. 排查Transformer服务连接问题
若配置后仍出现t2v-transformers:8080连接被拒绝,检查以下几点:
- 确认t2v-transformers容器正常启动,日志中是否有
Uvicorn running on http://0.0.0.0:8080的就绪提示 - 确保Weaviate与t2v-transformers在同一Docker网络中
- 降低批量并行数(如从5个改为3个),减少Transformer服务的负载,避免超时
内容的提问来源于stack exchange,提问作者Vedo

