jjzjj

Doris记录服务接口调用情况

BD哥 2023-03-28 原文

背景

  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(最小)
  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聚合模型实现

有关Doris记录服务接口调用情况的更多相关文章

  1. ruby - 使用 ruby​​ 和 savon 的 SOAP 服务 - 2

    我正在尝试使用ruby​​和Savon来使用网络服务。测试服务为http://www.webservicex.net/WS/WSDetails.aspx?WSID=9&CATID=2require'rubygems'require'savon'client=Savon::Client.new"http://www.webservicex.net/stockquote.asmx?WSDL"client.get_quotedo|soap|soap.body={:symbol=>"AAPL"}end返回SOAP异常。检查soap信封,在我看来soap请求没有正确的命名空间。任何人都可以建议我

  2. ruby - 具有身份验证的私有(private) Ruby Gem 服务器 - 2

    我想安装一个带有一些身份验证的私有(private)Rubygem服务器。我希望能够使用公共(public)Ubuntu服务器托管内部gem。我读到了http://docs.rubygems.org/read/chapter/18.但是那个没有身份验证-如我所见。然后我读到了https://github.com/cwninja/geminabox.但是当我使用基本身份验证(他们在他们的Wiki中有)时,它会提示从我的服务器获取源。所以。如何制作带有身份验证的私有(private)Rubygem服务器?这是不可能的吗?谢谢。编辑:Geminabox问题。我尝试“捆绑”以安装新的gem..

  3. ruby - 默认情况下使选项为 false - 2

    这是在Ruby中设置默认值的常用方法:classQuietByDefaultdefinitialize(opts={})@verbose=opts[:verbose]endend这是一个容易落入的陷阱:classVerboseNoMatterWhatdefinitialize(opts={})@verbose=opts[:verbose]||trueendend正确的做法是:classVerboseByDefaultdefinitialize(opts={})@verbose=opts.include?(:verbose)?opts[:verbose]:trueendend编写Verb

  4. ruby - 在没有 sass 引擎的情况下使用 sass 颜色函数 - 2

    我想在一个没有Sass引擎的类中使用Sass颜色函数。我已经在项目中使用了sassgem,所以我认为搭载会像以下一样简单:classRectangleincludeSass::Script::FunctionsdefcolorSass::Script::Color.new([0x82,0x39,0x06])enddefrender#hamlengineexecutedwithcontextofself#sothatwithintemlateicouldcall#%stop{offset:'0%',stop:{color:lighten(color)}}endend更新:参见上面的#re

  5. ruby - Sinatra:运行 rspec 测试时记录噪音 - 2

    Sinatra新手;我正在运行一些rspec测试,但在日志中收到了一堆不需要的噪音。如何消除日志中过多的噪音?我仔细检查了环境是否设置为:test,这意味着记录器级别应设置为WARN而不是DEBUG。spec_helper:require"./app"require"sinatra"require"rspec"require"rack/test"require"database_cleaner"require"factory_girl"set:environment,:testFactoryGirl.definition_file_paths=%w{./factories./test/

  6. ruby-on-rails - 启动 Rails 服务器时 ImageMagick 的警告 - 2

    最近,当我启动我的Rails服务器时,我收到了一长串警告。虽然它不影响我的应用程序,但我想知道如何解决这些警告。我的估计是imagemagick以某种方式被调用了两次?当我在警告前后检查我的git日志时。我想知道如何解决这个问题。-bcrypt-ruby(3.1.2)-better_errors(1.0.1)+bcrypt(3.1.7)+bcrypt-ruby(3.1.5)-bcrypt(>=3.1.3)+better_errors(1.1.0)bcrypt和imagemagick有关系吗?/Users/rbchris/.rbenv/versions/2.0.0-p247/lib/ru

  7. ruby-on-rails - s3_direct_upload 在生产服务器中不工作 - 2

    在Rails4.0.2中,我使用s3_direct_upload和aws-sdkgems直接为s3存储桶上传文件。在开发环境中它工作正常,但在生产环境中它会抛出如下错误,ActionView::Template::Error(noimplicitconversionofnilintoString)在View中,create_cv_url,:id=>"s3_uploader",:key=>"cv_uploads/{unique_id}/${filename}",:key_starts_with=>"cv_uploads/",:callback_param=>"cv[direct_uplo

  8. 使用 ACL 调用 upload_file 时出现 Ruby S3 "Access Denied"错误 - 2

    我正在尝试编写一个将文件上传到AWS并公开该文件的Ruby脚本。我做了以下事情:s3=Aws::S3::Resource.new(credentials:Aws::Credentials.new(KEY,SECRET),region:'us-west-2')obj=s3.bucket('stg-db').object('key')obj.upload_file(filename)这似乎工作正常,除了该文件不是公开可用的,而且我无法获得它的公共(public)URL。但是当我登录到S3时,我可以正常查看我的文件。为了使其公开可用,我将最后一行更改为obj.upload_file(file

  9. ruby-on-rails - Rails 5 Active Record 记录无效错误 - 2

    我有两个Rails模型,即Invoice和Invoice_details。一个Invoice_details属于Invoice,一个Invoice有多个Invoice_details。我无法使用accepts_nested_attributes_forinInvoice通过Invoice模型保存Invoice_details。我收到以下错误:(0.2ms)BEGIN(0.2ms)ROLLBACKCompleted422UnprocessableEntityin25ms(ActiveRecord:4.0ms)ActiveRecord::RecordInvalid(Validationfa

  10. c# - 如何在 ruby​​ 中调用 C# dll? - 2

    如何在ruby​​中调用C#dll? 最佳答案 我能想到几种可能性:为您的DLL编写(或找人编写)一个COM包装器,如果它还没有,则使用Ruby的WIN32OLE库来调用它;看看RubyCLR,其中一位作者是JohnLam,他继续在Microsoft从事IronRuby方面的工作。(估计不会再维护了,可能不支持.Net2.0以上的版本);正如其他地方已经提到的,看看使用IronRuby,如果这是您的技术选择。有一个主题是here.请注意,最后一篇文章实际上来自JohnLam(看起来像是2009年3月),他似乎很自在地断言RubyCL

随机推荐