INFINI Gateway 如何防止大跨度查询

背景

业务每天生成一个日期后缀的索引,写入当日数据。

业务查询有时会查询好多天的数据,导致负载告警。

现在想对查询进行限制--只允许查询一天的数据(不限定是哪天),如果想查询多天的数据就走申请。

技术分析

在每天一个索引的情况下,要进行多天的数据查询,有三种途径:

  1. 查询时,指定多个索引
  2. 查询时,写前缀+*号,模糊匹配多个索引
  3. 查询别名,别名关联多个索引

需求实现

我们只需用网关代理 ES 集群,并在 default_flow 中增加一段 request_path_filter 过滤器的配置,只允许查询一个索引且格式如 "xxx-2023-12-06", "xxx.2023.12.06", "xxx20231206" 。

复制代码
      - request_path_filter:
           message: "Query scope exceeds limit, please contact the administrator for application."
           must:
             suffix:
                - _search
             regex:
                - \/[a-z]+[-.]?\d{4}[-.]?\d{1,2}[-.]?\d{1,2}\/

如果需要指定其他格式,请自行修改 regex 的正则表达式。

创建测试索引

INFINI Console 开发工具中执行下列语句:

复制代码
POST test-2023-12-06/_doc
{
  "test":"test"
}

POST test-2023-12-6/_doc
{
  "test":"test"
}
POST test.2023.12.06/_doc
{
  "test":"test"
}
POST test.2023.12.6/_doc
{
  "test":"test"
}

POST test20231206/_doc
{
  "test":"test"
}

POST test/_doc
{
  "test":"test"
}

查询测试语句

复制代码
#预计成功的查询
curl localhost:8000/test-2023-12-06/_search?pretty
curl localhost:8000/test-2023-12-6/_search?pretty
curl localhost:8000/test.2023.12.06/_search?pretty
curl localhost:8000/test.2023.12.6/_search?pretty
curl localhost:8000/test20231206/_search?pretty
#预计失败的查询
curl localhost:8000/test-2023-12-06,test-2023-12-6/_search?pretty
curl localhost:8000/test-2023-12*/_search?pretty
curl localhost:8000/test*/_search?pretty
curl localhost:8000/*/_search?pretty

查询结果

预计成功的查询
预计失败的查询

此外,我们在 Console 中的 Request Analysis 看板中也能看到,哪些请求被拒绝,哪些请求被"放行"。

查询多个索引(多天)

现在我们已经实现了业务只能查一个索引,即一天的数据。当业务需要查询多天的索引时,我们只需创建一个别名,关联多个索引就行了。注意别名也要符合格式要求:字母开头 + 日期格式后缀。

下面我们创建一个 test-1111-1-1 的别名,关联前面的三个测试索引。

复制代码
POST /_aliases
{
  "actions" : [
    { "add" : { "indices" : ["test-2023-12-06", "test.2023.12.06","test-2023-12-6"], "alias" : "test-1111-1-1" } }
  ]
}

查询别名

待业务查询用完之后,删除别名即可。

复制代码
POST /_aliases
{
  "actions" : [
    { "remove": { "indices" : ["test-2023-12-06", "test.2023.12.06","test-2023-12-6"], "alias" : "test-1111-1-1" } }
  ]
}

最后,我们只需严格控制别名的创建,就能实现我们最初的需求了。

相关推荐
半旧夜夏2 小时前
【Gateway】服务调用和网关配置攻略
java·spring boot·spring cloud·gateway
小坏讲微服务6 小时前
Nginx集群与SpringCloud Gateway集成Nacos的配置指南
spring boot·nginx·spring cloud·gateway
小坏讲微服务10 小时前
使用 Spring Cloud Gateway 实现集群
java·spring boot·分布式·后端·spring cloud·中间件·gateway
没有bug.的程序员10 小时前
Spring Cloud Gateway 路由与过滤器机制
java·开发语言·spring boot·spring·gateway
serendipity_hky2 天前
【微服务 - easy视频 | day01】准备工具+gateway网关及路由至内部服务
java·微服务·架构·gateway·springcloud
三口吃掉你5 天前
微服务之网关(Spring Cloud Gateway)
java·网关·微服务·gateway
余衫马6 天前
微服务SpringCloud报错合集
spring boot·gateway
Zz_waiting.6 天前
统一服务入口-Gateway
java·开发语言·gateway
菲兹园长7 天前
微服务组件(E、L、N、O、G)
linux·服务器·gateway
tuokuac10 天前
依赖spring-cloud-starter-gateway与spring-cloud-gateway-dependencies的区别
java·gateway