• 升讯威在线客服系统的并发高性能数据处理技术:具体化视图


    我在业余时间开发维护了一款免费开源的升讯威在线客服系统,也收获了许多用户。对我来说,只要能获得用户的认可,就是我最大的动力。

    最近客服系统成功经受住了客户现场组织的压力测试,获得了客户的认可。
    客户组织多名客服上线后,所有员工同一时间打开访客页面疯狂不停的给在线客服发消息,系统稳定无异常无掉线,客服回复消息正常。消息实时到达无任何延迟。


    我会通过一系列的文章详细分析升讯威在线客服系统的并发高性能技术是如何实现的,使用了哪些方案以及具体的做法。

    本篇介绍数据存储方面的具体化视图技术。

    为何使用具体化视图?

    通过为常用聚合的具体化视图投资资源(数据存储、后台 CPU 周期),可以获得以下优势:

    • 性能提升: 对于相同的聚合函数,查询具体化视图通常比查询源表性能更好。

    • 时效性: 具体化视图查询始终返回最新结果,而不受上次进行具体化的时间的影响。 查询组合了视图的具体化部分和源表中尚未具体化的记录(delta 部分),始终提供最新结果。

    • 降低成本:与对源表执行聚合操作相比,查询具体化视图消耗群集中的资源较少。 如果只需要聚合,则可以减少源表的保留策略。 此设置可减少源表的热缓存开销。

    具体化视图用例

    下面是可以使用具体化视图解决的常见方案:

    • 通过使用 arg_max()(聚合函数)返回每个实体的最后一条记录来更新数据。

    • 通过对原始数据计算定期统计信息来减少数据的解析。 按时间段使用各种聚合函数。

    • 例如,使用 T | summarize dcount(User) by bin(Timestamp, 1d) 维护每天不同用户的最新快照。
      使用 take_any()(聚合函数)消除表中的重复记录。

    .create materialized-view MV on table T
    {
        table('T')
        | summarize take_any(*) by EventId
    }
    

    如何在具体化视图和更新策略之间进行选择?

    具体化视图和更新策略的工作方式不同,适用于不同的用例。 根据以下准则来确定应使用哪一个:

    • 具体化视图适用于聚合,而更新策略则不适合。 更新策略针对每个引入批单独运行,因此只能在同一引入批中执行聚合。 如果需要聚合查询,请始终使用具体化视图。

    • 更新策略适用于数据转换、维度表的扩充(通常使用查找运算符),以及可在单个引入的范围内运行的其他数据操作。

    • 更新策略在引入期间运行。 数据在源表和目标表中均不适用于查询,直到所有更新策略都在其上运行。 另一方面,具体化视图不是引入管道的一部分。 具体化过程在引入后在后台定期运行。 源表中的记录在具体化之前可用于查询。

    • 更新策略和具体化视图都不适合联接。 两者都可以包括联接,但仅限于特定用例。 也就是说,只有在更新策略/具体化过程运行时,联接两侧的匹配数据才可用。 如果匹配的实体预期在同一时间引入到左联接表和右联接表,则有可能在更新策略/具体化运行时错过数据。 有关 dimension tables 的详细信息,请参阅具体化视图查询参数和事实表和维度表。

    具体化视图查询

    可以通过两种方法查询具体化视图:

    • 查询整个视图:按名称查询具体化视图(与查询表类似)时,具体化视图查询会将视图的具体化部分与源表中尚未具体化 (delta) 的记录组合在一起。
      ** 查询具体化视图时,会始终根据引入到源表的所有记录返回最新结果。 有关具体化视图中的具体化和非具体化部分的详细信息,请参阅具体化视图的工作原理 。
      ** 此选项可能不会以最佳方式执行,因为它需要在查询时具体化 delta 部分。 在这种情况下,性能取决于视图的生存期和在查询中应用的筛选器。 具体化视图查询优化器部分包括在查询整个视图时提高查询性能的可能方法。

    • 仅查询具体化部分:查询该视图的另一种方法是使用 materialized_view() 函数。 此选项支持仅查询该视图的具体化部分,同时指定用户愿意容忍的最大延迟。

    cluster('cluster1').database('db').ViewName
    cluster('cluster1').database('*').ViewName
    database('*').ViewName
    database('DB*').ViewName
    database('*').materialized_view('ViewName')
    database('DB*').materialized_view('ViewName')
    

    具体化视图的限制和已知问题

    • 具体化视图的源表必须启用 IngestionTime 策略(默认启用)。
    • 具体化视图的源表不能是具有受限视图访问策略的表。
    • 具体化视图不能基于另一个具体化视图创建,除非第一个具体化视图是 take_any() 类型的聚合。 请参阅基 于具体化视图的具体化视图。
    • 无法通过外部表定义具体化视图。

    后继数据库

    • 无法在后继数据库中创建具体化视图。 追随者数据库是只读的,而具体化视图需要执行写入操作。
    • 在领导者数据库上定义的具体化视图可以从其追随者进行查询,就像领导者中的任何其他表一样。

    简介

    升讯威在线客服与营销系统是一款客服软件,但更重要的是一款营销利器。

    https://kf.shengxunwei.com/

    • 可以追踪正在访问网站或使用 APP 的所有访客,收集他们的浏览情况,使客服能够主动出击,施展话术,促进成单。
      访* 客端在 PC 支持所有新老浏览器。包括不支持 WebSocket 的 IE8 也能正常使用。
    • 移动端支持所有手机浏览器、APP、各大平台的公众号对接。
    • 支持访客信息互通,可传输访客标识、名称和其它任意信息到客服系统。
    • 具备一线专业技术水平,网络中断,拔掉网线,手机飞行模式,不丢消息。同类软件可以按视频方式对比测试。

  • 相关阅读:
    ES6(ECMASript 6 新特性---Promise)
    VScode SSH无法免密登录
    很建议学习的Linux软件包管理— 软件包分类
    菲律宾公司注册
    LeetCode 2349. 设计数字容器系统(SortedSet)
    scrapy爬取图片
    pytorch使用cat()和stack()拼接tensors
    Windows无法连接共享打印机,错误码:0x0000011b的解决方法
    面试SQL语句,学会这些就够了!!!
    K8S- Deployment 的滚动更新 Rolling Update
  • 原文地址:https://www.cnblogs.com/sheng_chao/p/17664208.html