产品提了个每秒 20W 次的检索需求,架构如何演进?

以同城的帖子业务场景为例,帖子的标题,帖子的内容有很强的用户检索需求,在业务、流量、并发量逐步递增的各个阶段,应该如何实现检索需求呢?

产品提了一个需求:

我想做一个内容检索功能,不复杂,100亿数据,每秒10万查询而已,两个星期能上线吗?

大部分工程师未必接触过“搜索内核”,但互联网业务,基本会涉及“检索”功能。以同城的帖子业务场景为例,帖子的标题,帖子的内容有很强的用户检索需求,在业务、流量、并发量逐步递增的各个阶段,应该如何实现检索需求呢?

原始阶段-LIKE

创业阶段,常常用这种方法来快速实现。

数据在数据库中可能是这么存储的:

t_tiezi(tid, title, content)

    满足标题、内容的检索需求可以通过LIKE实现:

    select tid from t_tiezi where content like ‘%天通苑%’

      这种方式确实能够快速满足业务需求,存在的问题也显而易见:

      • 效率低,每次需要全表扫描,计算量大,并发高时cpu容易100%;
      • 不支持分词;
      初级阶段-全文索引

      如何快速提高效率,支持分词,并对原有系统架构影响尽可能小呢,第一时间想到的是建立全文索引:

      alter table t_tiezi add fulltext(title,content)

        使用match和against实现索引字段上的查询需求。

        全文索引能够快速实现业务上分词的需求,并且快速提升性能(分词后倒排,至少不要全表扫描了),但也存在一些问题:

        • 由于全文索引利用的是数据库特性,搜索需求和普通CURD需求耦合在数据库中:检索需求并发大时,可能影响CURD的请求;CURD并发大时,检索会非常的慢;
        • 数据量达到百万级别,性能还是会显著降低,查询返回时间很长,业务难以接受;
        • 比较难水平扩展;
        中级阶段-开源外置索引

        为了解决全文索引的局限性,当数据量增加到大几百万,千万级别时,就要考虑外置索引了。外置索引的核心思路是:索引数据与原始数据分离,前者满足搜索需求,后者满足CURD需求,通过一定的机制(双写,通知,定期重建)来保证数据的一致性。

        原始数据可以继续使用Mysql来存储,外置索引如何实施?

        Solr,Lucene,ES都是常见的开源方案。其中,ES(ElasticSearch)是目前最为流行的。

        Lucene虽好,潜在的不足是:

        • Lucene只是一个库,需要自己做服务,自己实现高可用/可扩展/负载均衡等复杂特性;
        • Lucene只支持Java,如果要支持其他语言,必须得自己做服务;
        • Lucene不友好,这是很致命的,非常复杂,使用者往往需要深入了解搜索的知识来理解它的工作原理,为了屏蔽其复杂性,还是得自己做服务;

        为了改善Lucene的各项不足,解决方案都是“封装一个接口友好的服务,屏蔽底层复杂性”,于是有了ES:

        • ES是一个以Lucene为内核来实现搜索功能,提供RESTful接口的服务;
        • ES能够支持很大数据量的信息存储,支持很高并发的搜索请求;
        • ES支持集群,向使用者屏蔽高可用/可扩展/负载均衡等复杂特性;

        目前,快狗打车使用ES作为核心的搜索服务,实现业务上的各类搜索需求,其中:

        • 数据量最大的“接口耗时数据收集”需求,数据量大概在10亿左右;
        • 并发量最大的“经纬度,地理位置搜索”需求,线上平均并发量大概在2000左右,压测数据并发量在8000左右;

        所以,ES完全能满足10亿数据量,5k吞吐量的常见搜索业务需求。

        高级阶段-自研搜索引擎

        当数据量进一步增加,达到10亿、100亿数据量;并发量也进一步增加,达到每秒10万吞吐量;业务个性也逐步增加的时候,就需要自研搜索引擎了,定制化实现搜索内核了。

        到了定制化自研搜索引擎的阶段,超大数据量、超高并发量为设计重点,为了达到“无限容量、无限并发”的需求,架构设计需要重点考虑“扩展性”,力争做到:增加机器就能扩容(数据量+并发量)。

        同城的自研搜索引擎E-search初步架构图如下:

        (1) 上层proxy(粉色)是接入集群,为对外门户,接受搜索请求,其无状态性能够保证增加机器就能扩充proxy集群性能;

        (2) 中层merger(浅蓝色)是逻辑集群,主要用于实现搜索合并,以及打分排序,业务相关的rank就在这一层实现,其无状态性也能够保证增加机器就能扩充merger集群性能;

        (3) 底层searcher(暗红色大框)是检索集群,服务和索引数据部署在同一台机器上,服务启动时可以加载索引数据到内存,请求访问时从内存中load数据,访问速度很快:

        •  为了满足数据容量的扩展性,索引数据进行了水平切分,增加切分份数,就能够无限扩展性能,如上图searcher分为了4组
        •  为了满足一份数据的性能扩展性,同一份数据进行了冗余,理论上做到增加机器就无限扩展性能,如上图每组searcher又冗余了2份

        如此设计,真正做到增加机器就能承载更多的数据量,响应更高的并发量。

        简单小结一下:

        为了满足搜索业务的需求,随着数据量和并发量的增长,搜索架构一般会经历这么几个阶段:

        • 原始阶段-LIKE;
        • 初级阶段-全文索引;
        • 中级阶段-开源外置索引;
        • 高级阶段-自研搜索引擎;

        你们公司,经历到哪个阶段了?

        知其然,知其所以然。

        思路比结论更重要。

        AI大模型学习福利

        作为一名热心肠的互联网老兵,我决定把宝贵的AI知识分享给大家。 至于能学习到多少就看你的学习毅力和能力了 。我已将重要的AI大模型资料包括AI大模型入门学习思维导图、精品AI大模型学习书籍手册、视频教程、实战学习等录播视频免费分享出来。

        一、全套AGI大模型学习路线

        AI大模型时代的学习之旅:从基础到前沿,掌握人工智能的核心技能!

        因篇幅有限,仅展示部分资料,需要点击文章最下方名片即可前往获取

        二、640套AI大模型报告合集

        这套包含640份报告的合集,涵盖了AI大模型的理论研究、技术实现、行业应用等多个方面。无论您是科研人员、工程师,还是对AI大模型感兴趣的爱好者,这套报告合集都将为您提供宝贵的信息和启示。

        因篇幅有限,仅展示部分资料,需要点击文章最下方名片即可前往获

        三、AI大模型经典PDF籍

        随着人工智能技术的飞速发展,AI大模型已经成为了当今科技领域的一大热点。这些大型预训练模型,如GPT-3、BERT、XLNet等,以其强大的语言理解和生成能力,正在改变我们对人工智能的认识。 那以下这些PDF籍就是非常不错的学习资源。


        因篇幅有限,仅展示部分资料,需要点击文章最下方名片即可前往获

        四、AI大模型商业化落地方案

        因篇幅有限,仅展示部分资料,需要点击文章最下方名片即可前往获

        作为普通人,入局大模型时代需要持续学习和实践,不断提高自己的技能和认知水平,同时也需要有责任感和伦理意识,为人工智能的健康发展贡献力量

        <think>嗯,用户现在问的是视频检索系统的架构设计,我需要先回顾一下之前的问题历史。之前他问了关于Git分支合并的问题,现在转向视频检索系统,这可能是一个技术架构师或者开发者在处理不同项目时的需求。用户可能是需要构建一个视频检索系统,所以需要了解整体的架构设计,可能涉及到存储、处理、检索等模块。 首先,我应该确定视频检索系统的基本组成部分。通常这类系统包括视频数据的预处理、特征取、存储、索引构建、检索模块以及用户接口。用户可能希望了解每个模块的作用和如何协同工作。另外,用户可能关心实时性、准确性和可扩展性,这些都是设计时需要考虑的关键点。 接下来,我需要考虑视频数据的处理流程。比如,视频上传后如何进行分帧、特征取,使用哪些算法(如CNN、RNN、3D卷积网络等)。特征取后的向量如何存储和索引,可能用到向量数据库如Faiss或Milvus。然后,当用户发起查询时,系统如何匹配相似特征,返回结果。这部分需要详细说明各个步骤的技术选型和实现方式。 另外,用户可能对系统的架构图感兴趣,所以应该供一个分层的架构图,包括数据层、处理层、存储层、检索层和用户层。每个层的功能和组件需要明确。例如,数据层负责视频的存储,处理层进行特征取,存储层管理元数据和特征向量,检索层处理相似性搜索,用户层供API和界面。 同时,需要考虑系统的扩展性和性能优化。比如,分布式存储和计算框架(如Hadoop、Spark)可以处理大规模数据,使用GPU加速特征取,缓存机制升响应速度。这些都是设计时的重要考虑因素。 还要到关键技术,如特征取模型的选择,最近可能更倾向于使用基于Transformer的模型,比如ViT或者视频专用的TimeSformer。另外,多模态检索也是一个趋势,结合文本、音频和视觉特征,检索准确性。 用户可能没有明确说出来的需求包括系统的实时处理能力、如何处理高并发请求、数据的安全性和隐私保护。这些方面也应该在架构设计中到,比如使用负载均衡、分布式处理、加密存储等。 最后,应该给出最佳实践建议,比如模块化设计、选择合适的算法和工具、性能优化策略以及测试和迭代的重要性。这样用户在实际开发中能够有一个清晰的指导方向,避免常见陷阱,升系统效率和可靠性。</think>以下是视频检索系统架构设计的 **模块化解析** 与 **技术实现路线**,包含核心流程、关键技术选型和性能优化策略: --- ### 一、**系统核心架构分层** ![视频检索系统架构图](https://pic3.zhimg.com/80/v2-2e8a0d0c3a4b9b7e4d3b5d0a7b1c3d3d_1440w.png) ```text 用户层 → 检索服务层 → 特征处理层 → 数据存储层 → 原始视频库 ``` --- ### 二、**核心模块详解** #### ▶ **1. 视频预处理模块** - **关键功能**: ```bash 视频解码 → 关键帧取 → 分辨率标准化 → 格式统一化 ``` - **技术实现**: ```python # 使用OpenCV取关键帧示例 import cv2 vidcap = cv2.VideoCapture('input.mp4') success, image = vidcap.read() while success: cv2.imwrite(f"frame_{count}.jpg", image) success, image = vidcap.read() ``` #### ▶ **2. 特征取引擎** - **视觉特征取**: - 2D特征:ResNet/ViT(图像级特征) - 3D特征:C3D/SlowFast(时序特征) ```python # 使用PyTorch视频特征取 model = torch.hub.load('facebookresearch/pytorchvideo', 'slow_r50', pretrained=True) frames = preprocess(video_clip) features = model(frames) ``` - **多模态融合**: - CLIP模型(图文跨模态对齐) - Audio-Visual网络(音画联合特征) #### ▶ **3. 向量索引系统** | 数据库类型 | 特点 | 适用场景 | |----------------|------------------------|------------------| | FAISS | GPU加速/亿级检索 | 高并发实时检索 | | Milvus | 分布式/动态扩容 | 企业级部署 | | ElasticSearch | 文本混合检索 | 多模态检索 | ```bash # Milvus向量插入示例 curl -X POST http://localhost:9091/entities -H "Content-Type: application/json" -d '{ "collection_name": "video_features", "fields": { "feature_vector": [0.12, 0.34, ..., 0.78], "video_id": "VID_001" } }' ``` #### ▶ **4. 检索服务层** - **查询处理流程**: ```mermaid graph LR A[用户输入] --> B{输入类型判断} B -->|文本| C[文本嵌入] B -->|图像| D[图像特征取] B -->|视频| E[视频特征取] C/D/E --> F[多模态特征融合] F --> G[向量相似度计算] G --> H[结果排序与返回] ``` --- ### 三、**性能优化策略** #### ▶ **计算加速方案** 1. **硬件层面**: - 使用T4/V100 GPU加速特征取 - FPGA部署量化模型 2. **算法层面**: ```python # 使用TVM优化模型推理 mod = tvm.relay.from_pytorch(model, input_shapes) lib = relay.build(mod, target="cuda") ``` #### ▶ **存储优化方案** - **分级存储策略**: ```text 热数据:SSD存储特征向量 + Redis缓存高频结果 冷数据:HDFS归档原始视频 ``` #### ▶ **检索效率升** - **近似最近邻(ANN)算法**: - HNSW(图结构索引) - PQ(乘积量化压缩) ```python # FAISS索引构建示例 index = faiss.IndexHNSWFlat(512, 32) index.add(feature_vectors) ``` --- ### 四、**关键技术选型对比** | 技术维度 | 方案A | 方案B | 推荐场景 | |----------------|----------------------|----------------------|--------------------| | 特征取 | ResNet-152 | ViT-Large | 高精度场景 | | 向量数据库 | Milvus 2.0 | ElasticSearch 8.0 | 混合检索需求 | | 视频解码 | FFmpeg+NVIDIA解码器 | OpenCV原生解码 | 4K高清视频处理 | | 分布式框架 | Kubernetes+Docker | Apache Mesos | 云原生环境 | --- ### 五、**典型业务场景适配** #### ▶ **短视频检索** - **架构特点**: - 使用轻量级MobileNetV3特征取 - 采用Redis做结果缓存 - 响应时间<200ms #### ▶ **长视频内容定位** - **关键技术**: - 分层时间戳索引:$T_{segment} = [t_1, t_2, ..., t_n]$ - 时序注意力机制: $$Attention(Q,K,V)=softmax(\frac{QK^T}{\sqrt{d_k}})V$$ #### ▶ **跨模态检索** - **实现方案**: ```python # CLIP跨模态检索示例 text_features = clip_model.encode_text(text_input) image_features = clip_model.encode_image(image_input) similarity = cosine_similarity(text_features, image_features) ``` --- ### 六、**系统监控指标** ```text 1. 特征取吞吐量:帧/秒 (FPS) 2. 检索响应延迟:P95 < 300ms 3. 系统可用性:SLA 99.95% 4. 特征存储压缩率:> 70% ``` --- ### 七、**演进方向** 1. **新兴技术整合**: - 神经渲染技术(NeRF)用于三维场景检索 - 大语言模型(LLM)实现语义增强检索 2. **边缘计算部署**: ```text 终端设备 → 边缘节点特征取 → 云端深度检索 ``` **设计建议**:初期采用模块化设计,优先保证核心检索链路,逐步扩展多模态能力,推荐使用云原生架构保证弹性扩展能力。
        评论
        添加红包

        请填写红包祝福语或标题

        红包个数最小为10个

        红包金额最低5元

        当前余额3.43前往充值 >
        需支付:10.00
        成就一亿技术人!
        领取后你会自动成为博主和红包主的粉丝 规则
        hope_wisdom
        发出的红包
        实付
        使用余额支付
        点击重新获取
        扫码支付
        钱包余额 0

        抵扣说明:

        1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
        2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

        余额充值