热门标签 | HotTags
当前位置:  开发笔记 > 编程语言 > 正文

如何处理计量计费日志?

使用云服务最大好处是按量付费,无需预留资源,因此各云产品都有计量计费需求。这里我们介绍一种基于日志服务计量计费方案,该方案每天处理千亿级计量日志,被众多云产品使用:

使用云服务最大好处是按量付费,无需预留资源,因此各云产品都有计量计费需求。这里我们介绍一种基于
日志服务计量计费方案,该方案每天处理千亿级计量日志,被众多云产品使用:

计量日志生成计费结果过程

计量日志记录了用户涉及计费的项目,后台计费模块根据计费项和规则进行运算,产生最后账单。例如如下原始访问日志记录了项目(Project)使用情况:

  1. microtime:1457517269818107 Method:PostLogStoreLogs Status:200 Source:10.145.6.81 ClientIP:112.124.143.241 Latency:1968 InFlow:1409 NetFlow:474 OutFlow:0 UserId:44 AliUid:1264425845278179 ProjectName:app-myapplication ProjectId:573 LogStore:perf UserAgent:ali-sls-logtail APIVersion:0.5.0 RequestId:56DFF2D58B3D939D691323C7

计量计费程序读取原始日志,根据规则生成用户在各维度使用数据(包括流量、使用次数、出流量等):

让我们看下几个计量日志计费场景:

  • 电力公司:每10秒会收到一条日志,记录该10秒内每个用户ID下该周期内功耗、峰值、均值等,每天、每小时和每月给用户提供账单

  • 运营商:每隔10秒从基站收到时间段内某个手机号码的动作(上网、电话、短信、VoIP),使用量(流量),时长等信息,后台计费服务统计出该区间内消耗资费

  • 天气预测API服务:根据用户调用接口类型、城市、查询类型、结果大小等对用户请求进行收费

要求与挑战

既要算对,又要算准是一件要求很高的事情,系统要求如下:

  • 准确可靠:多算用户吃亏,少算我们吃亏

  • 灵活:支持补数据等场景,例如一部分数据没有推过来,当需要修正时可以重新计算

  • 实时性强:能够做到秒级计费,对于欠费场景快速切断

其他需求(Plus):

  • 账单修正功能:在实时计费失败时,我们可以通过理想计费进行对账

  • 查询明细:支持用户查看自己消费明细

现实中还有两类不小的挑战:

  • 不断增长数据大量:随着用户以及调用上升,数据规模会越来越大,如何保持架构的弹性伸缩

  • 容错处理:计费程序可能有Bug,如何确保计量数据与计费程序独立

这里我们讨论一种阿里云基于日志服务开发计量计费方案,该方案已在线上稳定运行多年,从未出现过一粒算错,延迟等情况,供单价参考

系统架构


阿里云日志服务的LogHub功能为例:

  1. 使用LogHub进行计量日志实时采集与计量程序对接:LogHub 支持的30+种API和接入手段,接入计量日志非常容易

  2. 计量程序每隔固定时间消费LogHub中步长数据,在内存中计算结果生成计费数据

  3. (附加)对明细数据查询需求,可以将计量日志配置索引查询

  4. (附加)将计量日志推送至OSS、MaxCompute进行离线存储,进行T+1等对账与统计


实时计量程序内部结构:

  1. 根据LogHub读取接口GetCursor功能,选定某个时间段日志(例如10:00-11:00)Cursor

  2. 通过PullLogs接口消费该时间段内数据

  3. 在内存中进行数据统计与计算,拿到结果,生成计费数据
    (我们可以以此类推,把选择时间计算逻辑修改为1分钟,10秒钟等)


性能分析:

  • 假设有10亿条/天计量日志,每条长度为200字节,数据量为200GB

  • LogHub 默认SDK或Agent都带压缩功能,实际存储数据量为40GB(一般至少有5倍压缩率),一个小时数据量为40/24 = 1.6GB

  • LogHub读取接口一次最大支持读1000个包(每个包最大为5MB),在千兆网条件下2秒内即可读完

  • 加上内存中数据累计与计算时间,对1小时计量日志进行汇总,不超过5秒

数据量大如何解决,例如一天十万亿

在一些计费场景下(例如运营商、IoT等)计量日志量会很大(例如十万亿,数据量为2PB/Day),折算压缩数据后一小时有16TB,以万兆网络读取需要1600秒,已不能满足快速出账单需求。
这里一般使用2种手段:

1. 控制产生的计费数据量

我们对于产生计量日志程序进行改造(例如Nginx),先在内存中做了聚合,每隔1分钟Dump一次该时间段聚合的汇总计量日志结果。这样数据量就和总体的用户数相关了:假设Nginx该时间段内有1000个用户,一个小时数据点也才1000
200 60 = 12GB(压缩后为 240 MB)

5. 将计量日志处理并行化

LogHub下每个日志库可以分配不同Shard(分区),我们可以分配3个分区,3个计量消费程序。为了保证一个用户计量数据总是由一个消费程序处理,我们可以根据用户ID Hash到固定Shard中。例如杭州市西湖区用户写在1号Shard,杭州上城区用户数据写在2号Shard,这样后台计量程序就可水平扩展。

其他问题

1.补数据怎么办?

LogHub 下每个Logstore可以设置生命周期(1-365天),如果计费程序需要重新消费数据,在生命周期内可以任意根据时间段进行计算。

2. 计量日志散落在很多服务器(前端机)怎么办

  1. 使用Logtail Agent实时采集

  2. 使用机器标示定义一套动态机器组弹性伸缩

3. 查询明细需求如何满足

对LogHub中数据可以
创建索引,支持
实时查询与
统计分析,例如我们想调查有一些特别大的计量日志:

  1. Inflow>300000 and Method=Post* and Status in [200 300]

在对Loghub中数据打开索引后,即可实时实时查询与分析

也可以在查询后加上统计分析:

  1. Inflow>300000 and Method=Post* and Status in [200 300] | select max(Inflow) as s, ProjectName group by ProjectName order by s desc

4. 存储日志并进行T+1对账

日志服务提供LogHub中
数据投递功能,支持自定义分区、自定义存储格式等将日志存储在OSS/MaxCompute上,利用E-MapReduce、MaxCompute、HybridDB、Hadoop、Hive、Presto、Spark等进行计算。


推荐阅读
  • 计算机存储系统的层次结构及其优势
    本文介绍了计算机存储系统的层次结构,包括高速缓存、主存储器和辅助存储器三个层次。通过分层存储数据可以提高程序的执行效率。计算机存储系统的层次结构将各种不同存储容量、存取速度和价格的存储器有机组合成整体,形成可寻址存储空间比主存储器空间大得多的存储整体。由于辅助存储器容量大、价格低,使得整体存储系统的平均价格降低。同时,高速缓存的存取速度可以和CPU的工作速度相匹配,进一步提高程序执行效率。 ... [详细]
  • 个人学习使用:谨慎参考1Client类importcom.thoughtworks.gauge.Step;importcom.thoughtworks.gauge.T ... [详细]
  • 本文介绍了一个适用于PHP应用快速接入TRX和TRC20数字资产的开发包,该开发包支持使用自有Tron区块链节点的应用场景,也支持基于Tron官方公共API服务的轻量级部署场景。提供的功能包括生成地址、验证地址、查询余额、交易转账、查询最新区块和查询交易信息等。详细信息可参考tron-php的Github地址:https://github.com/Fenguoz/tron-php。 ... [详细]
  • Servlet多用户登录时HttpSession会话信息覆盖问题的解决方案
    本文讨论了在Servlet多用户登录时可能出现的HttpSession会话信息覆盖问题,并提供了解决方案。通过分析JSESSIONID的作用机制和编码方式,我们可以得出每个HttpSession对象都是通过客户端发送的唯一JSESSIONID来识别的,因此无需担心会话信息被覆盖的问题。需要注意的是,本文讨论的是多个客户端级别上的多用户登录,而非同一个浏览器级别上的多用户登录。 ... [详细]
  • GetWindowLong函数
    今天在看一个代码里头写了GetWindowLong(hwnd,0),我当时就有点费解,靠,上网搜索函数原型说明,死活找不到第 ... [详细]
  • CSS3选择器的使用方法详解,提高Web开发效率和精准度
    本文详细介绍了CSS3新增的选择器方法,包括属性选择器的使用。通过CSS3选择器,可以提高Web开发的效率和精准度,使得查找元素更加方便和快捷。同时,本文还对属性选择器的各种用法进行了详细解释,并给出了相应的代码示例。通过学习本文,读者可以更好地掌握CSS3选择器的使用方法,提升自己的Web开发能力。 ... [详细]
  • 本文介绍了Java工具类库Hutool,该工具包封装了对文件、流、加密解密、转码、正则、线程、XML等JDK方法的封装,并提供了各种Util工具类。同时,还介绍了Hutool的组件,包括动态代理、布隆过滤、缓存、定时任务等功能。该工具包可以简化Java代码,提高开发效率。 ... [详细]
  • 本文介绍了Hyperledger Fabric外部链码构建与运行的相关知识,包括在Hyperledger Fabric 2.0版本之前链码构建和运行的困难性,外部构建模式的实现原理以及外部构建和运行API的使用方法。通过本文的介绍,读者可以了解到如何利用外部构建和运行的方式来实现链码的构建和运行,并且不再受限于特定的语言和部署环境。 ... [详细]
  • XML介绍与使用的概述及标签规则
    本文介绍了XML的基本概念和用途,包括XML的可扩展性和标签的自定义特性。同时还详细解释了XML标签的规则,包括标签的尖括号和合法标识符的组成,标签必须成对出现的原则以及特殊标签的使用方法。通过本文的阅读,读者可以对XML的基本知识有一个全面的了解。 ... [详细]
  • 本文详细介绍了Spring的JdbcTemplate的使用方法,包括执行存储过程、存储函数的call()方法,执行任何SQL语句的execute()方法,单个更新和批量更新的update()和batchUpdate()方法,以及单查和列表查询的query()和queryForXXX()方法。提供了经过测试的API供使用。 ... [详细]
  • Oracle seg,V$TEMPSEG_USAGE与Oracle排序的关系及使用方法
    本文介绍了Oracle seg,V$TEMPSEG_USAGE与Oracle排序之间的关系,V$TEMPSEG_USAGE是V_$SORT_USAGE的同义词,通过查询dba_objects和dba_synonyms视图可以了解到它们的详细信息。同时,还探讨了V$TEMPSEG_USAGE的使用方法。 ... [详细]
  • 模板引擎StringTemplate的使用方法和特点
    本文介绍了模板引擎StringTemplate的使用方法和特点,包括强制Model和View的分离、Lazy-Evaluation、Recursive enable等。同时,还介绍了StringTemplate语法中的属性和普通字符的使用方法,并提供了向模板填充属性的示例代码。 ... [详细]
  • Whatsthedifferencebetweento_aandto_ary?to_a和to_ary有什么区别? ... [详细]
  • GreenDAO快速入门
    前言之前在自己做项目的时候,用到了GreenDAO数据库,其实对于数据库辅助工具库从OrmLite,到litePal再到GreenDAO,总是在不停的切换,但是没有真正去了解他们的 ... [详细]
  • 本文整理了Java面试中常见的问题及相关概念的解析,包括HashMap中为什么重写equals还要重写hashcode、map的分类和常见情况、final关键字的用法、Synchronized和lock的区别、volatile的介绍、Syncronized锁的作用、构造函数和构造函数重载的概念、方法覆盖和方法重载的区别、反射获取和设置对象私有字段的值的方法、通过反射创建对象的方式以及内部类的详解。 ... [详细]
author-avatar
mobiledu2502904893
这个家伙很懒,什么也没留下!
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有