Doris如何详细记录服务接口的调用状况?

2026-04-28 14:372阅读0评论SEO资源
  • 内容介绍
  • 相关推荐

本文共计1188个文字,预计阅读时间需要5分钟。

Doris如何详细记录服务接口的调用状况?

背景:公司的一个项目,需要记录某个接口的访问pv、uv,并确保不丢失明细数据,同时记录【用户,调用接口,调用详情,调用时间,调用次数】等信息。之前使用MySQL记录,每来一条记录就记录一条。

修改后内容:项目背景:公司某项目需记录接口访问情况,包括pv、uv,并保留详细数据。需记录【用户,接口,调用详情,时间,次数】。原使用MySQL记录,每条记录独立存储。

Doris如何详细记录服务接口的调用状况?

背景
  1. 公司的一个项目,需要记录某个接口的访问pv、uv,并且不能丢失明细数据,需要记录
  2. 之前使用MySQL记录,每来一条记录一条,例如: insert into log (id, user_id, resource_id, stat_date, view_count) values (default, user_id, view_id, '2022-06-11', 1)
  3. 存在的问题是
  • 没过多久MySQL中数据量级就到达千万,没法在毫秒的时间内返回结果
  • 使用MySQL中的明细数据进行聚合分析也非常的慢
Doris聚合模型
  1. 首先简单介绍下Doris,它是一个MPP数据库,一般是数据仓库进行多维分析使用,导入明细数据,通过创建物化视图的方式可以实现亚秒级别多维查询
  2. 发现Doris的Aggregate模型非常符合需求,聚合模型中存在聚合键,聚合类型,表中所有的字段必须是两者其一,聚合键顾名思义,用来判断唯一性,可以理解为关系型数据库中的主键,聚合类型存在多种,SUM(求和),REPLACE(替换,保留最新),MAX(最大),MIN(最小)
  • 详细介绍可以查看Doris官方文档: doris.apache.org/branch-0.13/zh-CN/
  1. 演示聚合模型
  • 创建聚合表

CREATE TABLE IF NOT EXISTS online_test.aggregate_table_name ( user_id INT DEFAULT '0' COMMENT '用户唯一标识' ,event_id INT DEFAULT '0' COMMENT '事件唯一标识' ,real_name VARCHAR(20) REPLACE DEFAULT '' COMMENT '用户真实名称,可能发生变化,每次记录最新' ,view_count INT SUM DEFAULT '0' COMMENT '统计用户查看某个事件的总次数' ,start_time DATE MIN DEFAULT '1970-01-01' COMMENT '第一条记录的时间、开始时间' ,end_time DATE MAX DEFAULT '1970-01-01' COMMENT '最后一条记录的时间、结束时间' ) AGGREGATE KEY(user_id, event_id) DISTRIBUTED BY HASH(event_id) BUCKETS 10 PROPERTIES("replication_num" = "1");

  • 插入测试数据

insert into aggregate_table_name values (1, 10, '张三', 1, '2022-06-12', '2022-06-12');

  • 查询结果
  • 再次插入测试数据

insert into aggregate_table_name values (1, 10, '张三丰', 1, '2022-06-13', '2022-06-13');

  • 再次查询结果
  1. 解释: 真实名从张三->张三丰是用户进行了修改名称操作,只保留最新的名字,查询次数1->2是进行了求和计算,end_time从2022-06-12 -> 2022-06-13是每次记录最大的日期,相当于是保留最新的
使用Doris统计服务质量
  1. 项目需要统计调用者,调用明细,调用时间,于是设计一个服务指标维度表,这样通用性更高

CREATE TABLE IF NOT EXISTS online_test.metrics_dim_table_name ( `metrics_id` INT NOT NULL COMMENT "指标维度表唯一id标识", `metrics_type` VARCHAR(50) NOT NULL COMMENT "指标类型", `metrics_name` VARCHAR(50) NOT NULL COMMENT "指标名称", `metrics_detail` VARCHAR(500) COMMENT "指标详情" ) UNIQUE KEY(`metrics_id`, `metrics_type`, `metrics_name`) DISTRIBUTED BY HASH(metrics_id) BUCKETS 10 PROPERTIES("replication_num" = "1"); CREATE TABLE IF NOT EXISTS online_test.metrics_calculate_table_name ( metrics_id INT DEFAULT '0' COMMENT '所属指标id' ,unique_id VARCHAR(50) DEFAULT '' COMMENT '指标唯一标识、可以是id或者name' ,momo_id VARCHAR(20) DEFAULT '' COMMENT '查看者momoid' ,inspect_date VARCHAR(10) DEFAULT '' COMMENT '查看时间、格式为YYYY-MM-DD、按天聚合' ,inspect_num INT SUM DEFAULT '0' COMMENT '查看次数、聚合模式、记录每个人每天查看某个指标多少次' ) AGGREGATE KEY(metrics_id, unique_id, momo_id, inspect_date) DISTRIBUTED BY HASH(unique_id) BUCKETS 10 PROPERTIES("replication_num" = "1");

  1. 例如我需要记录信息查询接口调用情况,我需要先在维度表中手动插入一条数据,记录这个指标的详细信息

insert into metrics_dim_table_name values (1, 'api', '/tableau/query_view', '用户查询tableau中视图接口');

  1. 之后我在接口中埋点,每调用一次往doris中插入一条数据

insert into metrics_calculate_table_name values (1, '1', '861893252', '2022-05-01', 1), (1, '2', '861893252', '2022-05-01', 1), (1, '2', '861893252', '2022-05-01', 1), (1, '1', '861893252', '2022-05-02', 1);

  1. 聚合结果如下
使用Doris作为元数据
  1. 之后把doris当做关系型数据来使用,可以在毫秒内返回查询结果,因为数据按天聚合过,数据量与MySQL相比也少了很多,针对这类需要都可以考虑使用doris聚合模型实现

本文共计1188个文字,预计阅读时间需要5分钟。

Doris如何详细记录服务接口的调用状况?

背景:公司的一个项目,需要记录某个接口的访问pv、uv,并确保不丢失明细数据,同时记录【用户,调用接口,调用详情,调用时间,调用次数】等信息。之前使用MySQL记录,每来一条记录就记录一条。

修改后内容:项目背景:公司某项目需记录接口访问情况,包括pv、uv,并保留详细数据。需记录【用户,接口,调用详情,时间,次数】。原使用MySQL记录,每条记录独立存储。

Doris如何详细记录服务接口的调用状况?

背景
  1. 公司的一个项目,需要记录某个接口的访问pv、uv,并且不能丢失明细数据,需要记录
  2. 之前使用MySQL记录,每来一条记录一条,例如: insert into log (id, user_id, resource_id, stat_date, view_count) values (default, user_id, view_id, '2022-06-11', 1)
  3. 存在的问题是
  • 没过多久MySQL中数据量级就到达千万,没法在毫秒的时间内返回结果
  • 使用MySQL中的明细数据进行聚合分析也非常的慢
Doris聚合模型
  1. 首先简单介绍下Doris,它是一个MPP数据库,一般是数据仓库进行多维分析使用,导入明细数据,通过创建物化视图的方式可以实现亚秒级别多维查询
  2. 发现Doris的Aggregate模型非常符合需求,聚合模型中存在聚合键,聚合类型,表中所有的字段必须是两者其一,聚合键顾名思义,用来判断唯一性,可以理解为关系型数据库中的主键,聚合类型存在多种,SUM(求和),REPLACE(替换,保留最新),MAX(最大),MIN(最小)
  • 详细介绍可以查看Doris官方文档: doris.apache.org/branch-0.13/zh-CN/
  1. 演示聚合模型
  • 创建聚合表

CREATE TABLE IF NOT EXISTS online_test.aggregate_table_name ( user_id INT DEFAULT '0' COMMENT '用户唯一标识' ,event_id INT DEFAULT '0' COMMENT '事件唯一标识' ,real_name VARCHAR(20) REPLACE DEFAULT '' COMMENT '用户真实名称,可能发生变化,每次记录最新' ,view_count INT SUM DEFAULT '0' COMMENT '统计用户查看某个事件的总次数' ,start_time DATE MIN DEFAULT '1970-01-01' COMMENT '第一条记录的时间、开始时间' ,end_time DATE MAX DEFAULT '1970-01-01' COMMENT '最后一条记录的时间、结束时间' ) AGGREGATE KEY(user_id, event_id) DISTRIBUTED BY HASH(event_id) BUCKETS 10 PROPERTIES("replication_num" = "1");

  • 插入测试数据

insert into aggregate_table_name values (1, 10, '张三', 1, '2022-06-12', '2022-06-12');

  • 查询结果
  • 再次插入测试数据

insert into aggregate_table_name values (1, 10, '张三丰', 1, '2022-06-13', '2022-06-13');

  • 再次查询结果
  1. 解释: 真实名从张三->张三丰是用户进行了修改名称操作,只保留最新的名字,查询次数1->2是进行了求和计算,end_time从2022-06-12 -> 2022-06-13是每次记录最大的日期,相当于是保留最新的
使用Doris统计服务质量
  1. 项目需要统计调用者,调用明细,调用时间,于是设计一个服务指标维度表,这样通用性更高

CREATE TABLE IF NOT EXISTS online_test.metrics_dim_table_name ( `metrics_id` INT NOT NULL COMMENT "指标维度表唯一id标识", `metrics_type` VARCHAR(50) NOT NULL COMMENT "指标类型", `metrics_name` VARCHAR(50) NOT NULL COMMENT "指标名称", `metrics_detail` VARCHAR(500) COMMENT "指标详情" ) UNIQUE KEY(`metrics_id`, `metrics_type`, `metrics_name`) DISTRIBUTED BY HASH(metrics_id) BUCKETS 10 PROPERTIES("replication_num" = "1"); CREATE TABLE IF NOT EXISTS online_test.metrics_calculate_table_name ( metrics_id INT DEFAULT '0' COMMENT '所属指标id' ,unique_id VARCHAR(50) DEFAULT '' COMMENT '指标唯一标识、可以是id或者name' ,momo_id VARCHAR(20) DEFAULT '' COMMENT '查看者momoid' ,inspect_date VARCHAR(10) DEFAULT '' COMMENT '查看时间、格式为YYYY-MM-DD、按天聚合' ,inspect_num INT SUM DEFAULT '0' COMMENT '查看次数、聚合模式、记录每个人每天查看某个指标多少次' ) AGGREGATE KEY(metrics_id, unique_id, momo_id, inspect_date) DISTRIBUTED BY HASH(unique_id) BUCKETS 10 PROPERTIES("replication_num" = "1");

  1. 例如我需要记录信息查询接口调用情况,我需要先在维度表中手动插入一条数据,记录这个指标的详细信息

insert into metrics_dim_table_name values (1, 'api', '/tableau/query_view', '用户查询tableau中视图接口');

  1. 之后我在接口中埋点,每调用一次往doris中插入一条数据

insert into metrics_calculate_table_name values (1, '1', '861893252', '2022-05-01', 1), (1, '2', '861893252', '2022-05-01', 1), (1, '2', '861893252', '2022-05-01', 1), (1, '1', '861893252', '2022-05-02', 1);

  1. 聚合结果如下
使用Doris作为元数据
  1. 之后把doris当做关系型数据来使用,可以在毫秒内返回查询结果,因为数据按天聚合过,数据量与MySQL相比也少了很多,针对这类需要都可以考虑使用doris聚合模型实现