美团面试:Elasticsearch 深分页问题如何解决?

该文章内容已经收录在《面试进阶之路》,从原理出发,直击面试难点,实现更高维度的降维打击!

目录

文章目录

  • 目录
  • 美团面试:Elasticsearch 深分页问题如何解决?
    • 普通分页方案
    • 技术解决方案
      • 滚动查询:Scroll
      • PIT + search_after
      • 技术方案、性能对比
    • 业务解决方案

美团面试:Elasticsearch 深分页问题如何解决?

Elasticsearch 的深分页问题在面试中是经常会被问到的,接下来梳理一下对应的 技术业务 解决方案

普通分页方案

在 Elasticsearch 中,正常情况下会使用 from、size 来实现分页,但是当分页条数过多,比如 from + size > 10000 ,那么就会带来问题,先来看一下 Elasticsearch 分页查询流程:

  • 协调节点将分页查询请求转发给各个节点,各个节点执行搜索,将前 N 条数据返回给协调节点
  • 协调节点汇总各个分片的数据,再次排序之后,返回前 N 条数据给客户端

深分页存在问题:

当客户端查询的分页越多,各个节点执行的查询结果也就越多,最后协调节点还要汇总各个节点的查询结果,并且进行排序,整个排序过程在 中,当数据量过大,会出现两个问题:

  • 出现 OOM 问题
  • 频繁的深分页会导致频繁的 GC(因为会在堆中产生大量的数据,排序之后要及时清除)

比如说要查询 10001 - 10100 的这 100 条数据,此时不仅仅去每个分片中取 100 条数据,因为每个分片排序之后并不一定是全局排序后的结果,因此每个分片都要查询前 10100 条数据,最终各个分片的数据发往协调节点,在协调节点中进行排序,取最终的 10100 条数据

可以看到,当 from + size 很大的时候,协调节点中需要排序的数据量为: (from + size) * 分片数量 ,排序、存储成本都很高

Elasticsearch 内部对深分页的限制:

对于深分页带来的严重后果,Elasticsearch 内部也进行了限制,通过 max_result_window 限制了查询结果窗口的大小,默认是 10000

深分页问题解决:

解决 ES 深分页问题有两方面解决方案:业务解决方案、技术解决方案

技术解决方案

滚动查询:Scroll

通过 scroll 滚动查询来解决深分页问题,原理为:

  • scroll 会在第一次搜索时,保存一个视图快照,之后基于快照对数据一批一批进行搜索,直至搜索出全部数据,避免一次搜索出大量数据

scroll 查询数据流程:

(1)第一次查询:参数传入 scroll 的过期时间参数,1m 表示快照数据缓存的时间为 1 分钟,并返回一个 scroll_id

GET /es_db/search?scroll=1m
{"query": {"match_all": {}},"size": 2
}

(2)之后查询携带上 scroll_id 值

GET /_search/scroll
{"scroll": "1m","scroll_id": "FGluY2x1ZGVfY29udGV4dGF9D1dKbXDFIZXJ5QW5kRWnV02gBFmNWVdjbjRvUzVhZXIicG1HUE02blcwCAAAAAAAABmzR2Y1V3Zo5VVNTdWJokbESZM3XzbJ"
}

适合场景:

  • 适合于海量数据导出、非 C 端业务、对数据实时性要求不高的场景

存在问题:

  • 该方式官方已经不推荐使用

  • 使用 scroll 查询,需要维护数据快照,消耗大量的资源,并且查询的是静态数据

PIT + search_after

search_after 提供了 实时游标 来记录上次查询的最后一条记录,可以根据上一页的查询结果来检索下一页(因此要求要有一条全局唯一的变量用作排序),并且可以实现实时查询,但不支持跳页查询的功能

search_after 原理:

  • 第一次查询和 scroll 一样,从各个分片获取前 N 条数据,进行排序,返回客户端前 N 条数据
  • 第二次查询会记录第一页数据的最大值,作为第二页数据拉取的查询条件,之后所有分片基于这个最大值进行查询,减少了各个分片查询的数据量,最后汇总给协调节点进行排序

在 search_after 查询过程中,需要相同的查询的多个搜索请求,如果在查询请求之间数据发生变化,可能导致最终数据出现不一致的情况,因此创建一个时间点(PIT)来保存当前的索引状态

PIT(Point In Time) 是 ES 7.10 版本之后推出的新特性

PIT + search_after 查询流程

(1)创建一个 PIT 保存搜索期间的当前索引状态

POST /es_db/_pit?keep_alive=1m
# 返回 PIT 的值
{
"id": "39K1AwEFZXNfZGIWZTN2N2Nrdk5RRjY3QjBma1h5aFRodwAWdkhjbE9YNVRTMUNDcWNQQVR2ZXYzdwAAAAAAAAA9jhZvaGpLSDlzVVMxbW5idG5DZ0xEUHFRAAEWZTN2N2Nrdk5RRjY3QjBma1h5aFRodwAA"
}

(2)根据 PIT 首次查询

GET /_search
{"query": {"match_all": {}},"pit": {"id": "39K1AwEFZXNfZGIWZTN2N2Nrdk5RRjY3QjBma1h5aFRodwAWdkhjbE9YNVRTMUNDcWNQQVR2ZXYzdwAAAAAAAAA9jhZvaGpLSDlzVVMxbW5idG5DZ0xEUHFRAAEWZTN2N2Nrdk5RRjY3QjBma1h5aFRodwAA","keep_alive": "1m"},"size": 2,"sort": [{"_id": "asc"}]
}

(3)根据 search_after 和 PIT 实现翻页查询

GET /_search
{"query": {"match_all": {}},"pit": {"id": "39K1AwEFZXNFdGlZWTN2N2NkRSRjY3jQjBma1hSaFRodwAWdkhjbjE9YNVRTMUNDcWNQQVR2ZXYzdwAAAAAAAAA9jzhVaGpLSDIzVMxbMxbWi5dG5DZ0xEUHFAAEZWTN2N2NkRSRjY3jQjBma1hSaFRodwAA","keep_alive": "1m"},"size": 2,"sort": [{"_id": "asc"}],"search_after": [5]
}

PIT + search_after 优点:

  • 通过 PIT 可以保存当前索引状态,避免查询过程中数据变化导致的不一致
  • search_after 基于上次结果进行查询,避免每次查询大量的数据

技术方案、性能对比

官方建议: ES7 之后官方不建议使用 scroll 进行深度分页,而是建议使用 PIT + search_after 来实现深分页,各方案对应优缺点如下:

分页方式性能优点缺点场景
from + size灵活性好,实现简单深度分页问题数据量比较小,能容忍深度分页问题
scroll解决了深度分页问题无法反应数据的实时性(快照版本)维护成本高,需要维护一个 scroll_id海量数据的导出需要查询海量结果集的数据
search_after性能最好,不存在深度分页问题能够反映数据的实时变更实现复杂,需要有一个全局唯一的字段连续分页的实现会比较复杂,因为每一次查询都需要上次查询的结果,它不适用于大幅度跳页查询海量数据的分页

ES 分页性能对比:

分页方式1~1049000~4901099000~99010
form + size8ms30ms117ms
scroll7ms66ms36ms
search_after5ms8ms7ms

业务解决方案

一般对于深分页问题,从业务上可以很好地进行解决,主流的有两种方案:

  • 限制跳转最大页数,避免一次跳太多页,导致查询大量数据
  • 限制不允许跳页,每次只可以下一页,这样也可以避免查询大量数据

在微信公众号、淘宝、百度都使用这样的业务限制,来避免深分页问题

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

如若内容造成侵权/违法违规/事实不符,请联系长河编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

ppt设计软件哪个好?这5个在线ppt工具不容错过!

职场人每天的办公日常,大概率都离不开PPT,不管是制作季度汇报,还是向团队展示各类方案,诸如此类的场景都会用到ppt。 ppt是一个看重视觉效果的演示媒介,可以说它的外观精美与否,很大程度上决定了观众或潜在…

LC20. 有效的括号

用来熟悉一下栈的应用之括号匹配 题目链接 下面是大致思路 1.初始化:创建一个空栈,用于存储左括号。(LC这题不用,自己写完整的需要) 2.遍历字符串:从左到右依次扫描字符串中的每个字符。 3.处理左括号:如果是左括号,将其压入栈中。 4.处理右…

8. 性能指标

博客补充:CUDA C 最佳实践指南-CSDN博客https://blog.csdn.net/qq_62704693/article/details/141267262?spm1001.2014.3001.5502 在尝试优化 CUDA 代码时,了解如何准确测量性能并了解带宽在性能测量中的作用是值得的。本章讨论如何使用 CPU 计时器和 C…

【Stable Diffusion - Ai】小白入门必看(涂鸦、涂鸦重绘、局部重绘和重绘蒙版篇)!真材实料!不卖课!!!

【Stable Diffusion - Ai】小白入门必看(涂鸦、涂鸦重绘、局部重绘和重绘蒙版篇)!真材实料!不卖课!!! 在上一篇 小白入门必看(图生图篇)中我们详细的介绍了文生图和图生…

Linux字体更新 使用中文字体

问题描述,处理之前,中文乱码 处理后的结果 压缩需要上传的字体: 上传到LInux的字体目录,上传后解压出来 刷新字体: fc-cache -fv 测试是否正常 fc-list | grep "FontName"如果还不行 可以在代码里面指定字…

信息安全工程师(72)网络安全风险评估概述

前言 网络安全风险评估是一项重要的技术任务,它涉及对网络系统、信息系统和网络基础设施的全面评估,以确定存在的安全风险和威胁,并量化其潜在影响以及可能的发生频率。 一、定义与目的 网络安全风险评估是指对网络系统中存在的潜在威胁和风险…

Kafka 基础入门

文章内容是学习过程中的知识总结,如有纰漏,欢迎指正 文章目录 前言 1. 核心概念 1.1 Producer 1.2 broker 1.3 consumer 1.4 zookeeper 1.5 controller 1.6 Cluster 2. 逻辑组件 2.1 Topic 2.2 Partition 2.3 Replication 2.4 leader & follower 3. …

CH569开发前的测试

为了玩转准备Ch569的开发工作 ,准备了如下硬件和软件: 硬件 1.官方的 Ch569 开发板,官方买到的是两块插接在一起的;除了HSPI接口那里的电阻,这两块可以说是一样的。也意味着两块板子的开发也需要烧录两次&#xff1b…

OpenCV基本操作(python开发)——(7)实现图像校正

OpenCV基本操作(python开发)——(1) 读取图像、保存图像 OpenCV基本操作(python开发)——(2)图像色彩操作 OpenCV基本操作(python开发)——(3&…

ffmpeg视频滤镜:网格-drawgrid

滤镜介绍 drawgrid 官网链接 》 FFmpeg Filters Documentation drawgrid会在视频上画一个网格。 滤镜使用 参数 x <string> ..FV.....T. set horizontal offset (default "0")y <string> ..FV.....T. set…

使用pytorch实现LSTM预测交通流

原始数据&#xff1a; 免费可下载原始参考数据 预测结果图&#xff1a; 根据测试数据test_data的真实值real_flow&#xff0c;与模型根据测试数据得到的输出结果pre_flow 完整源码&#xff1a; #!/usr/bin/env python # _*_ coding: utf-8 _*_import pandas as pd import nu…

Oracle视频基础1.1.3练习

1.1.3 需求&#xff1a; 完整格式查看所有用户进程里的oracle后台进程 查看物理网卡&#xff0c;虚拟网卡的ip地址 ps -ef | grep oracle /sbin/ifconfig要以完整格式查看所有用户进程中的 Oracle 后台进程&#xff0c;并查看物理和虚拟网卡的 IP 地址&#xff0c;可以使用以下…

【数据集】MODIS地表温度数据(MOD11)

【数据集】MODIS地表温度数据(MOD11) 数据概述MYD11A2数据下载MYD11A2 v006MYD11A2 v061参考MODIS(Moderate Resolution Imaging Spectroradiometer)是美国国家航空航天局(NASA)和美国国家海洋和大气管理局(NOAA)联合开发的一种遥感仪器,搭载于Terra和Aqua卫星上。MOD…

SpringBoot最佳实践之 - 项目中统一记录正常和异常日志

1. 前言 此篇博客是本人在实际项目开发工作中的一些总结和感悟。是在特定需求背景下&#xff0c;针对项目中统一记录日志(包括正常和错误日志)需求的实现方式之一&#xff0c;并不是普适的记录日志的解决方案。所以阅读本篇博客的朋友&#xff0c;可以参考此篇博客中记录日志的…

2024年优秀的天气预测API

准确、可操作的天气预报对于许多组织的成功至关重要。 事实上&#xff0c;在整个行业中&#xff0c;天气条件会直接影响日常运营&#xff0c;包括航运、按需、能源和供应链&#xff08;仅举几例&#xff09;。 以公用事业为例。根据麦肯锡的数据&#xff0c;在 1.4 年的时间里…

Tenda路由器 敏感信息泄露

0x01 产品描述&#xff1a; ‌ Tenda路由器‌是由深圳市吉祥腾达科技有限公司&#xff08;Tenda&#xff09;生产的一系列网络通信产品。Tenda路由器以其高性能、高性价比和广泛的应用场景而闻名&#xff0c;适合家庭、办公室和各种网络环境。0x02 漏洞描述&#xff1a…

net mvc中使用vue自定义组件遇到的坑

自定义一个ButtonCounter.js组件 export default {data() {return {count: 0}},template: <van-button type"primary" click"count">You clicked me {{ count }} times.</van-button> }按照官网文档的意思&#xff0c;组件命名需要大写驼峰命…

Python第六次作业

01.求第n项的斐波那契数列值 #求第n项的斐波那契数列值 #1、1、2、3、5、8、13、21、34…… #F(0)0&#xff0c;F(1)1, F(n)F(n - 1)F(n - 2)&#xff08;n ≥ 2&#xff0c;n ∈ N*&#xff09;def shulie ():print("求第n项的斐波那契数列值:",end"")xev…

Vue3 学习笔记(十三)Vue组件详解

1、组件&#xff08;Component&#xff09; 介绍 组件&#xff08;Component&#xff09;是 Vue.js 最强大的功能之一。 组件可以扩展 HTML 元素&#xff0c;封装可重用的代码&#xff0c;可以帮助你将用户界面拆分成独立和可复用的部分。 每个 Vue 组件都是一个独立的 Vue 实…

MySQL基础(二)

目录 一. 数据库命令行基本操作指令 1. 查看当前有哪些数据库——show databases; 2. 创建数据库——create database 数据库名 charset utf8 3. 选中数据库——use 数据库名; 4. 删除数据库——drop database 数据库名; 二. 常用数据类型 2.1 数值类型 2.2. 字符串类型 …