You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.14 03:22:03