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

Qdrant单产品API高并发性能异常问题求助

问题诊断与解决方案

从你的代码和测试结果来看,高并发下的性能瓶颈主要集中在Qdrant客户端连接管理和Qdrant服务端配置/索引优化两个核心方向,以下是具体可落地的优化方案:


一、优化Qdrant客户端连接复用(最优先级)

当前代码每次请求都新建并关闭Qdrant客户端,高并发下会产生大量TCP连接建立/销毁开销,同时客户端初始化的重复操作也会消耗资源。

方案1:全局单例客户端

修改客户端初始化逻辑,确保整个应用生命周期内只创建一个Qdrant客户端实例,复用连接:

# 放在search.py等全局模块中
from qdrant_client import QdrantClient

# 全局单例客户端
_qd_client = None

def qdrant_client():
    global _qd_client
    if _qd_client is None:
        _qd_client = QdrantClient(
            host=你的Qdrant主机地址,
            port=6333,
            timeout=30  # 根据业务调整超时时间
        )
    return _qd_client

同步修改get_single_product函数,移除客户端关闭操作:

def get_single_product(search_lang: str, point_id: int):
    lang = int(LANGUAGE_KEY_MAP.get(search_lang))
    qd_client = qdrant_client()  # 复用全局客户端
    if not lang:
        return {}
    search_results = qd_client.retrieve(
        collection_name=f"lang{lang}_products",
        ids=[point_id],
    )
    # 不再手动关闭客户端
    payloads = [res.payload for res in search_results]
    return payloads[0] if payloads else {}

方案2:异步客户端适配(ASGI环境)

如果你的Django项目部署在ASGI环境(如Uvicorn、Daphne),改用Qdrant异步客户端可进一步提升并发效率:

# 全局异步客户端单例
from qdrant_client.async_qdrant_client import AsyncQdrantClient

_async_qd_client = None

async def async_qdrant_client():
    global _async_qd_client
    if _async_qd_client is None:
        _async_qd_client = AsyncQdrantClient(
            host=你的Qdrant主机地址,
            port=6333,
            timeout=30
        )
    return _async_qd_client

# 异步版本的get_single_product
async def get_single_product(search_lang: str, point_id: int):
    lang = int(LANGUAGE_KEY_MAP.get(search_lang))
    qd_client = await async_qdrant_client()
    if not lang:
        return {}
    search_results = await qd_client.retrieve(
        collection_name=f"lang{lang}_products",
        ids=[point_id],
    )
    payloads = [res.payload for res in search_results]
    return payloads[0] if payloads else {}

# API视图改为异步视图
async def retrieve(self, request, pk):
    search_lang = request.query_params.get("language", "tr")
    country = request.query_params.get("country", "tr")
    payload = await search.get_single_product(search_lang=search_lang, point_id=int(pk))
    payload["extra"] = functions.generate_extra_fields(
        product_id=payload["id"],
        total_rating_count=payload["stats"]["total_rating_count"],
        lang=search_lang,
        country=country,
    )
    return Response(
        {"data": payload},
        status=status.HTTP_200_OK,
    )

二、优化Qdrant服务端配置

1. 为Docker容器分配充足资源

当前Docker Compose未设置资源限制,Qdrant默认无法充分利用服务器的30核CPU和50GB内存,导致高并发下资源瓶颈。修改docker-compose.yml:

qdrant:
    image: qdrant/qdrant:v1.8.2
    restart: always
    ports:
      - "6333:6333"
      - "6334:6334"
    volumes:
      - qdrant_data:/qdrant/storage
    deploy:
      resources:
        limits:
          cpus: '20'  # 根据服务器负载调整,比如分配20核
          memory: '40G'  # 分配40GB内存
        reservations:
          cpus: '10'
          memory: '20G'

2. 添加Payload索引加速读取

你的产品Payload包含30个字段及大JSON结构,默认情况下Qdrant读取Payload需要全量扫描,添加索引可显著提升单ID查询的Payload读取速度:

修改集合创建代码,开启全Payload索引(Qdrant 1.7+支持):

from qdrant_client.http.models import VectorParams, PayloadSchemaType

client.recreate_collection(
    collection_name=collection_name,
    vectors_config=VectorParams(
        size=encoder.get_sentence_embedding_dimension(),
        distance=models.Distance.DOT,
    ),
    full_payload_index=True  # 开启全Payload索引,适配频繁读取Payload的场景
)

如果只需要针对特定字段(如id)建索引,可指定字段:

client.recreate_collection(
    collection_name=collection_name,
    vectors_config=VectorParams(
        size=encoder.get_sentence_embedding_dimension(),
        distance=models.Distance.DOT,
    ),
    payload_schema={
        "id": PayloadSchemaType.INTEGER,  # 为id字段建索引,单ID查询更高效
        "stats.total_rating_count": PayloadSchemaType.INTEGER  # 常用字段也可添加
    }
)

三、其他辅助优化建议

  1. 热点数据缓存:用Redis缓存访问频繁的产品Payload,减少Qdrant查询次数。例如在get_single_product中先查Redis,未命中再查Qdrant并写入缓存。
  2. 批量处理请求:若业务允许,将多个单ID查询合并为批量retrieve(一次传入多个ids),降低请求开销。
  3. 升级Qdrant版本:当前使用的v1.8.2较旧,新版本(如v1.11+)在并发处理、Payload性能上有显著优化,建议升级。
  4. 监控Qdrant状态:通过Qdrant Dashboard(端口6333)查看高并发下的CPU、内存、磁盘IO指标,排查是否存在资源瓶颈或请求排队问题。

内容的提问来源于stack exchange,提问作者Vahid

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.26 02:44:52