重新定义物化视图,你必须拥有的极速湖仓神器!

news2024/10/6 1:37:09

当今企业在进行数据分析时,面临着多重问题和挑战,而数据加工作为其中不可或缺的一环显得尤为重要。

首要的挑战在于数据加工的复杂性。从数据的产生到最终产生价值的整个链路仍然十分复杂,涉及多个环节和技术方案,这导致了技术复杂度的增加,进而带来了人力投入的复杂性。这种复杂性使得终端用户难以实现“Make Data Accessible”的目标,并限制了对数据设施的进一步资源投入。

其次,数据加工还面临性能、时效性和成本等方面的挑战。用户期望高性能、实时数据平台,同时又要求低成本。然而,技术上存在矛盾,不可能同时满足所有需求。然而,随着技术的不断演进,这种矛盾可以得到更好的权衡,不同阶段将面临不同的挑战。

为了解决这些未被满足的需求,StarRocks 3.0 推出了湖仓一体的新架构,旨在更好地帮助用户管理大规模企业级数据。在湖仓一体架构中,物化视图起到关键作用,能够进一步降低数据处理的复杂度、提高查询性能和优化数据的时效性,使得用户在数据架构升级的同时,能够享受到使用体验的升级。

本文将围绕 StarRocks 物化视图对以下几点内容进行介绍:

  • 为什么你需要 StarRocks 湖仓一体新范式
  • StarRocks 物化视图基础能力介绍
  • StarRocks 物化视图的三种常见应用场景
  • StarRocks 物化视图的迭代演进

一、StarRocks 湖仓一体新范式

StarRocks 3.0 推出湖仓一体的新范式,旨在进一步解决数据工程中的链路、性能复杂性问题。湖仓一体的内涵在于更好地结合了湖和仓的优势:

  • 数仓的优势在于数据质量、查询性能、实时分析、数据治理;旨在通过精细化的建模和加工,提供高质量的数据
  • 数据湖的优势在于生态开放、灵活统一、可扩展性、高性价比;旨在通过兼容并包的数据存储,容纳更多的数据

在这个内涵之上,湖仓一体有很多外延的体现:

  • 湖和仓的统一存储和查询: 明细数据、归档数据、半结构化数据存储在湖中,精细化的加工数据存储在仓中,用统一的引擎进行查询和分析
  • 降低数据加工的复杂度: 更多的数据加工负载能够在湖仓中运行,不再需要额外的 Hive、Spark 加工系统
  • 更低成本的 Data Pipeline: 数据链路能够更好地端到端打通,从数据的生产、收集、处理、价值变现,能够在湖仓的流水线运行,成本降低、时效性提高
  • 更好地权衡性能、成本、数据新鲜度: 融合多种数据处理技术,实时查询、增量计算、批处理得以统一,使得用户不再需要从多个割裂的系统进行选择,而是在同一个加工框架内选择参数

具体到 MV (物化视图),能够在其中发挥几方面的价值:

  1. MV 实现数据建模: 通过物化视图进行声明式的数据建模,不再需要为了建模维护负载的 ETL 过程,从而解决湖仓一体的数据质量、查询性能问题
  2. MV 实现透明加速: 通过物化视图实现按需的透明加速,不再需要提前对数据进行治理和建模,减少数据准备的时间和成本,从而优化湖仓一体的灵活性问题
  3. MV 实现增量计算: 通过物化视图实现增量流水线,提高数据的时效性、降低端到端延迟,解决湖仓一体的时效性问题

接下来,我们将详细介绍物化视图的基础能力以及它能够解决的问题。随后,我们会结合具体的应用场景,深入探讨物化视图所带来的价值和作用。

二、物化视图的基础能力介绍

物化视图的基本功能可以从一个样例来理解:

  • Materialized (物化): 顾名思义,物化视图会将计算结果进行物化,存储到 SR 的表中,其存储结构和普通的表无异
  • Partition by: 对物化视图分区,例如按天分区后,可以按照天的粒度进行视图的刷新、维护、TTL(Time to Live,生存时间);除此之外,这个分区模式也可以和 Hive/Iceberg 等外表的分区建立映射, 使其能够自动订阅外表的更新
  • Refresh: 所谓 Refresh 即刷新物化视图,计算并物化查询结果。当前物化视图支持自动刷新、定时刷新、手动刷新、部分场景的增量刷新等多种方式,满足不同业务场景的需求。例如用户可以使用导入数据自动触发刷新,可以选择每小时定时刷新,以及使用外部调度系统手动刷新等方式
  • Resource Group: 物化视图实际使用中的一个常见痛点在于如何做资源隔离,即前端的查询负载,如何与物化视图的维护隔离开来。在 StarRocks 中当前主要通过 Resource Group(资源组)的技术实现弹性的资源隔离,两种工作负载能够同时运行在一个集群中,且根据需求进行弹性地调度,使得物化视图不会影响到前端查询性能
  • 查询语句:物化视图支持 aggregation、join、window 等查询语句,能够对多种场景进行计算结果的物化。 其中能够支持多种数据源,包括 JDBC 外表所访问的 MySQL、PostgreSQL 等系统,以及 Lake 外表所访问的 Hive、Iceberg 等,以及 StarRocks 自身所存储的数据

表面上物化视图很简单,即能够根据用户指定的刷新模式,对查询结果进行预计算,避免后续重复计算的开销。这里体现的能力主要在于调度能力、预计算能力、增量计算能力。

在简洁的语法背后,物化视图具备查询改写的能力,即优化器可以自动匹配出能够被加速的 SQL 查询,将其改成为已经预计算的结果,从而大幅降低计算开销。这个能力释放了一个新的可能性,即用户在不改写 SQL 的前提下,能够对性能进行调优,使得能够灵活地在 Cost & Performance 之间进行权衡。

结合这样几个基础的原子能力,物化视图能够很好地回应最开始我们讨论的数据工程的两个难题,即:

  • 数据加工的复杂性:
    • 物化视图通过声明式的语法对数据加工的过程进行建模,用户只需要理解计算结果,不需要描述复杂的计算过程
    • 通过 Refresh 来抽象数据的流向过程,不再需要在多个系统中管理数据之间的依赖关系,以及复杂的数据质量问题
    • 资源隔离的问题,也通过内聚并垂直整合的方式得以大幅简化,不再需要申请额外的资源进行简单的计算
    • 除此之外,透明加速的能力,使得用户不再需要提前对数据进行建模,而是根据实际需求,根据业务的演进,对数据进行建模和加速,大幅节省了管理数据的人力成本
  • 数据加工的性能、时效性、成本问题
    • 用户不再需要在流系统和批处理系统之间进行艰难的选择,是选择稳定低成本的批处理系统,还是选择高成本但时效性好的流系统。物化视图所提供的不同刷新模式,将这个问题简化为一个参数选择的问题,通过调参来面向不同的场景

接下来我们会结合几个具体的场景,来介绍物化视图能够发挥的价值。

三、物化视图的应用场景

场景一:数据建模

所谓数据建模,即按照合理的方式对数据进行清洗、分层、聚合、关联,得到易于使用的数据结果这一过程。为何需要进行数据建模?因为原始数据往往会存在质量问题,难以直接用于分析;原始数据过于复杂, 包含太多业务人员并不关心的指标,增加理解的复杂性;原始数据未经过聚合,使得查询性能较差,难以满足性能需求,或者耗费太多计算资源。

而现实中数据建模的常见矛盾在于,建模的过程难以跟上业务发展的速度,难以衡量数据建模的投入产出。 建模的手段简单,但需要业务专家具备足够的领域知识,对其进行整理和加工,这是个复杂的过程;而业务早期往往缺乏足够的资源投入到这样的数据治理过程,且难以看到数据建模带来的价值,并且很有可能业务模型变化较快,建模方法本身也需要迭代和演进。因此,很多时候早期数据的使用者倾向于不做建模,直接使用原始数据,那么势必会导致质量问题、性能问题;而到了需要建模的时候,又遇到数据使用方式已经成型,难以重构的问题。

而通过物化视图做这件事能够很好地解决这样的矛盾:

  • 简化了架构复杂度:不需要在外部维护很多的数据组件去做加工。 相反,如果维护了这些数据组件,不仅要使用物理资源去部署运行,还需要额外部署调度、监控的组件,这样的架构是比较复杂的
  • 简化了使用复杂度:仅需要具备基础的 SQL 知识即可, 那么这一过程不再需要专业的数据工程师来实施,而是普通的数据分析师即可完成,解放了人力瓶颈
  • 简化了维护复杂度:物化视图维护数据之间的血缘关系,自动管理了数据之间的依赖, 不再需要一整个数据平台来做这件事

我们从分层建模分区建模这两个基础的场景为例,介绍如何使用物化视图进行数据建模。

- 分层建模

在许多用户的实际业务场景中,数据源会包含多种形式,包括实时明细数据、维度数据、数据湖归档数据,而业务端则需要多样的分析方式,例如实时大屏、近实时 BI 查询、分析师 Adhoc 查询、定时报表等。不同的场景的诉求不同,有的需要灵活性,有的需要性能,有的需要低成本。

通过单一的解决方案显然无法满足这样灵活的需求,而 StarRocks 能够协同地使用 View & Materialized View 提供解决方案。其中 View 是逻辑视图,每次查询 View 时都会重新解析并执行 View 的定义;而 Materialized View 则会将计算结果物化下来,避免重复执行的开销。View 适合表达业务语义,简化 SQL 复杂度,但无法降低执行开销;Materialized View 则能够通过预计算来优化性能,适合用来简化 ETL Pipeline。

通过 StarRocks 的 View (视图) 以及 Materialized View,则可以较好地地解决这个问题:

  • View 面向终端用户,提供业务语义:由于 View 本身不做预计算,可以灵活地修改,且能够提供简洁的业务语义
  • View 面向实时场景:通过 View 关联起实时数据和维度数据,能够保证用户查询 View 得到最及时的结果
  • MV 面向近实时场景的加速:如果计算过程非常复杂, 那么需要对其中一部分过程进行预计算,从而加速终端的查询性能
  • MV 面向数据建模:数据建模不仅需要逻辑上对数据进行加工,也需要物理上处理数据
  • 最终业务方可以根据时效性和性能的需求,灵活的选择 View 和 Materialized View 对数据进行分层建模

除此之外,StarRocks 提供了面向业务场景的灵活变更能力,不仅顶层的 MV/View 可以修改,底层的 MV/View 也可以根据业务需要进行调整。相对于传统的 ETL Pipeline 的牵一发动全身,View/MV 可以用非常简单的 SQL 语法完成这样的变更。

- 分区建模

除了分层之外,数据建模的过程往往需要根据业务语义对数据进行关联,根据时效性需求对数据设置 TTL,这一过程即涉及到分区建模。

数据之间的不同关联方式,形成星形模型、雪花模型等多种建模方式,这其中的基础概念是事实表和维度表,有的业务有多个巨大的事实表,而有的业务则有复杂的维度表和关联关系。StarRocks 的物化视图支持事实表的分区关联,即事实表进行分区,而物化视图的 Join 结果按照同样的方式进行分区。

基于这样的分区关联,可以支持多种业务场景:

  • 事实表更新: 事实表做细粒度的分区,比如天级或者小时级分区,在事实表刷新之后,物化视图的相应分区可以自动刷新
  • 维度表更新: 当维度表更新之后,往往需要触发所有关联结果的刷新,这个刷新代价通常较大,用户也可以选择忽略某些维度表的刷新,或者选择只更新最近一段时间的计算结果
  • 外表自动刷新: Hive/Iceberg 等系统往往以分区的粒度进行数据变更,而 StarRocks 物化视图则可以订阅外表的数据变更,当某个分区变更后,触发视图的刷新
  • TTL: 对物化视图进行分区之后,可以设置 TTL,实现只保留最近一段时间的计算结果,对应的业务场景,往往是具备较强的时效性,例如只需要查询最近一周的数据,那么就没必要保留所有的历史数据

小结

在上述两种常见场景的基础上,StarRocks 物化视图提供了众多能力,帮助用户进行数据建模:

  • 多数据源:物化视图可以基于内表、数据湖外表和 JDBC 外表等创建物化视图,比如可以对 MySQL、PostgreSQL 创建物化视图,也可以对 Hive/Iceberg 等数据源创建物化视图,并且物化视图能够自动管理数据依赖关系
  • 分区映射:对内表和外表的分区关系进行维护,能实现分区粒度的视图刷新
  • 自动刷新:物化视图可以支持在数据源变更时,自动刷新物化视图,不再需要用户手动管理
  • 多层建模:支持创建多层物化视图,表达 ODS、DWD、DWS、ADS 的分层理念;支持结合使用 View & Materialized View,具备足够的灵活性
  • 任务调度:支持多种调度模式,像是触发式调度、DAG 式调度、定时调度等等,表达不同的业务语义

场景二:透明加速

前面讲到数据建模的一个矛盾在于,数据建模难以满足业务的灵活性,且业务发展的不同时期,对建模的要求并不一样。业务早期数据量小、不确定性高,往往选择粗放地使用数据;发展后期对性能要求高、数据规模大,产生了数据建模的需求,但相关的平台和系统已经成型,导致重构的成本高。

而 StarRocks 选择用物化视图的透明加速能力,来解决这样的矛盾:

  • 透明加速: 用户不需要改写 SQL,优化器能够自动改写,选择合适的物化视图进行加速
  • 按需创建: 用户不需要提前规划数据的使用场景和查询 SQL,而是在发现性能问题之后,再对其创建物化视图做性能优化
  • 建模后置: 创建物化视图本质上仍然是通过预计算、数据建模来加速数据查询,但将建模的过程后置之后,能够满足不同时期的不同业务需求,不会造成业务资源的浪费

举例来说, 创建右边所示的一个物化视图,能够透明加速左边三种不同的查询模式:

  • 物化视图:按照 lo_orderdate, c_city 进行分组聚合,计算 count
  • 示例 1 ——聚合上卷:需要按照 lo_orderdate 进行聚合,因此可以在物化视图的基础上,进一步上卷计算;由于物化视图的聚合计算已经将数据量减少了几个数量级,因此二次上卷的计算非常轻量
  • 示例 2 ——上卷过滤:筛选部分时段的数据,按照 c_city 维度进行聚合,此时仍然可以在物化视图的基础上进行筛选并二次上卷
  • 示例 3 ——过滤:这个查询仅需筛选部分时段的数据进行聚合,由于物化视图已经按照 lo_orderdate 进行了分组,因此可以直接筛选出结果

需要注意到,这里的各种过滤、上卷操作,完全是 StarRocks 优化器自动完成,不需要用户进行复杂的 SQL 改写,不需要用户理解 SQL 的复杂语义。除了上述的聚合改写能力之后,StarRocks 还支持多种改写能力,例如针对宽表 Join 的自动改写,针对时序数据 Union 改写。 这一能力在后续的文章会做详细介绍。

基于 StarRocks 物化视图的透明加速能力,用户完全可以将数据建模的问题变成一个性能优化问题,当业务场景出现性能需求时,通过分析业务场景、分析查询需求,创建合适的物化视图进行优化。故此,数据建模这一开放性问题变成一个封闭问题,更容易衡量数据建模的价值,消除不必要的过度规划和设计。

场景三:湖仓一体

最后,我们要来介绍 StarRocks 如何通过物化视图,将湖仓更好地做到一体化:

  • 统一存储和查询:明细数据、归档数据、半结构化数据存储在湖中,而精细化的加工数据存储在仓中。使用统一的引擎进行查询和分析,同时通过物化视图进行湖和仓的连接
  • 通过物化视图进行灵活地数据建模,优化数据湖的数据质量、查询性能问题
  • 通过物化视图实现按需的透明加速,不再需要提前对数据进行治理和建模,减少数据准备的时间和成本

四、StarRocks 物化视图的迭代演进

StarRocks 在 2.4 版本发布物化视图功能,迄今已经过多个版本的迭代:

  • V2.4:发布基础能力,支持分区关联
  • V2.5:支持查询改写,支持 JDBC/Hive 等多种数据源,支持 CTE/Window/Union 等 SQL 语句
  • V3.0:支持分层建模场景,支持 Hive 的订阅刷新,增强易用性和观测性

在后续版本中,物化视图将围绕几个方向持续演进:

  • 易用性:持续优化易用性,给用户提供一个开箱即用的方案,给具体场景提供一站式的解决方案
  • 查询改写能力:支持更多的查询改写场景,支持自动推荐的能力
  • 数据湖对接:支持 Iceberg/Hudi 等数据源的自动刷新,实现更实时的刷新
  • 增量计算能力:支持更多场景的增量计算,进一步提高实时性

总结

StarRocks 希望通过湖仓一体帮助用户进行架构升级的同时,让物化视图来简化用户使用数据的复杂度,提高数据的性价比,挖掘出更多的数据价值。
后续我们将推出针对物化视图的一系列文章,深入介绍物化视图的功能和使用场景,欢迎大家加入社区和订阅公众号获得第一手消息!

StarRocks Feature Group-MV:

对 StarRocks 物化视图功能感兴趣的小伙伴们欢迎加入我们的 “StarRocks 物化视图用户小组” 。在这里你可以和同样对物化视图感兴趣的用户们和核心开发者们沟通无阻!
下方扫码添加小助手,回复关键字 “物化视图” 即可加入,从此告别复杂的数据处理!👇

https://wx.focussend.com/weComLink/mobileQrCodeLink/33412/9c312

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/885926.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

Java培训机构出来的好找工作吗?有的人还是没有工资!

Java培训机构出来的好找工作吗?为什么有的人找不到呢?事实上,参加Java培训机构并不是直接保证找到工作,而是提供了一定的学习和就业支持。以下是关于Java培训机构和就业的一些要点: 1.学习质量和教学内容 好的Java培训机构通常提供系统化、…

设计模式 : 单例模式笔记

文章目录 一.单例模式二.单例模式的两种实现方式饿汉模式懒汉模式 一.单例模式 一个类只能创建一个对象,这样的类的设计模式就称为单例模式,该模式保证系统中该类只能有一个实例(并且父子进程共享),一个很典型的单例类就是CSTL的内存池C单例模式的基本设计思路: 私有化构造函数…

海外应用ASO优化的小技巧2

应用程序的名称可以表达很多内容,是应用程序元数据的重要组成部分,一个强大的标题可以识别应用中的潜在消费者,使得用户看名字就可以知道这个程序是做什么的,从而有助于转化率的提高。 1、详细的标题可以更好地帮助我们的软件。 …

windows权限维持—黄金白银票据隐藏用户远控RustDeskGotoHttp

windows权限维持—黄金白银票据&隐藏用户&远控&RustDesk&GotoHttp 1. 前置1.1. 初始问题1.1.1. 解决办法 2. 隐藏用户2.1. 工具原理2.2. 案例操作2.2.1. 单机添加用户2.2.1.1. 工具添加用户2.2.1.2. 工具查看隐藏用户2.2.1.3. 本地查看隐藏用户 2.2.2. 域内添加…

机器学习丨1. 机器学习概述

Author:AXYZdong 硕士在读 工科男 有一点思考,有一点想法,有一点理性! 定个小小目标,努力成为习惯!在最美的年华遇见更好的自己! CSDNAXYZdong,CSDN首发,AXYZdong原创 唯…

IT团队如何引领企业走向创造价值的新途径?

随着疫情结束带来的经济回暖,我们无疑已做好了更充分的准备。信息技术使许多企业能够在关门歇业的情况下继续运营,以防止大规模集会并强制执行社会隔离。得益于信息技术支持团队,许多企业能够动员其员工进行远程工作,有些甚至只需…

C++ template 循环

在元编程循环中&#xff0c;我们不需要用while&#xff0c;for来循环&#xff0c;一般情况下都要用递归&#xff0c;例如&#xff1a; #include <iostream> using namespace std; template <int Head, int...Data> constexpr static int num Head num<Data..…

企业类型的软件著作权证书申请,一次通过十几张

大家好&#xff0c;我是小悟 关于软件著作权证书申请的内容&#xff0c;已经聊过很多次了&#xff0c;之前申请的都是个人类型&#xff0c;尝试了一下申请企业类型的&#xff0c;一口气提交了多张&#xff0c;也都顺利通过了。 其实个人和企业类型所需要的资料并没有什么差别&…

flutter 常见的状态管理器

flutter 常见的状态管理器 前言一、Provider二、Bloc三、Redux四、GetX总结 前言 当我们构建复杂的移动应用时&#xff0c;有效的状态管理是至关重要的&#xff0c;因为应用的不同部分可能需要共享数据、相应用户交互并保持一致的状态。Flutter 中有多种状态管理解决方案&#…

Ubuntu安装Apache+Php

环境&#xff1a;ubuntu 22.04 虚拟机 首先更新一下 sudo apt-get update sudo apt-get upgrade安装Apache2&#xff1a; sudo apt-get install apache2 输入y&#xff0c;继续。等着他恐龙抗浪抗浪的下载安装就好了 打开浏览器访问http://localhost/ 安装php&#xff1a; …

Java学习路线来啦!看到就是赚到

“Java学习路线来啦”&#xff0c;Java作为一门常用的编程语言&#xff0c;因其广泛使用和应用&#xff0c;在IT行业中备受青睐。无论是初学者还是有一定基础的开发者&#xff0c;学习Java的路线和步骤都是必须的。下面小编将为大家推荐几个Java学习的必经之路。 一、Java编程基…

微信小程序纯前端从阿里云OSS下载json数据-完整版

起因 因为云开发开始收费(貌似很久了),准备改造在以前的小程序,数据转到oss上,小程序使用原生,不算专业领域, 所以先百度.... 网上的教程真的是千篇一律,大部分开局就是require(ali-oss); 好点的npm install ali-oss --save开局,拼凑操作到最后发现要用云开发,因为云…

【KVM虚拟化环境部署】

环境部署 KVM虚拟化环境 1、装系统时手动选择安装 2、CentOS 7 最小化安装 yum install qemu-kvm qemu-img libvirt -y yum install virt-install libvirt-python virt-manager python-virtinst libvirt-client -y安装好CentOS 7后&#xff0c;去设置里面点击处理器&#x…

智能水表抄表解决方案

对于传统的水表抄表方式存在的繁琐、耗时以及人为误差等问题&#xff0c;提出了智能水表抄表解决方案&#xff0c;让水表管理更加智能高效。 以智能抄表TSM-MR为例&#xff1a;采用最新的人工智能图像识别技术&#xff0c;能识别各类水表数据&#xff0c;辅助大数据进行纠错&a…

【C语言程序设计】一、算法基础(思考题)

思考题 1、算法的特性是什么&#xff1f; 有穷性、确定性、可行性、输入性、输出性 2、举例说明什么是可计算和不可计算问题&#xff1f; 可计算问题是指可以用计算机算法解决的问题&#xff0c;即可以通过编写程序来得到问题的解决方案。例如&#xff0c;求两个数的和、找出一…

golang操作excel的高性能库——excelize/v2

目录 介绍文档与源码安装快速开始创建 Excel 文档读取 Excel 文档打开数据流流式写入 [相关 Excel 开源类库性能对比](https://xuri.me/excelize/zh-hans/performance.html) 介绍 Excelize是一个纯Go编写的库&#xff0c;提供了一组功能&#xff0c;允许你向XLAM / XLSM / XLS…

redis主从复制、哨兵服务、持久化、数据类型

Top NSD DBA DAY10 案例1&#xff1a;配置主从复制案例2&#xff1a;配置带验证的主从复制案例3&#xff1a;哨兵服务案例4&#xff1a;使用RDB文件恢复数据案例5&#xff1a;AOF案例6&#xff1a;字符类型案例7&#xff1a;列表类型案例8&#xff1a;散列类型案例9&#xff…

服务管理|反弹shell|计划任务|救援启动级别

服务管理 systemctl cd /usr/lib/systemd/system systemd这个服务管理的后续服务&#xff0c;都是有配置⽂件的 systemd是linux系统第一个运行的进程&#xff0c;用来创建系统的守护进程来管理整个linux系统。systemd取代init的一个优势就是他集合了丰富的功能&#xff0c;同…

如何通过观测云的RUM找到前端加载的瓶颈--可观测性入门篇

声明与保证 本文写作于2023年6月&#xff0c;性能优化的评价标准和优化方式仅适用于当前观测云控制台&#xff0c;当然随着产品迭代及技术更新&#xff0c;本文也会应要求适当更新。 创建、修订时间创建修改人版本2023/6/24观测云***v1.0.0 1.网站性能评价的发展史&#xff…

2023/8/16总结

这几天完成了私信的功能点&#xff0c;用websocket做的。 这是大概的界面&#xff0c;参考的是微信 用户可以搜索好友&#xff1a; 如果不存在是下面这样&#xff0c;存在就会在左边的聊天里面显示有这个人选项 发送消息 接下来需要把推荐算法给做了