[NewLife.XCode]百亿级性能

NewLife.XCode是一个有10多年历史的开源数据中间件,支持nfx/netcore,由新生命团队(2002~2019)开发完成并维护至今,以下简称XCode。

整个系列教程会大量结合示例代码和运行日志来进行深入分析,蕴含多年开发经验于其中,代表作有百亿级大数据实时计算项目。

开源地址:https://github.com/NewLifeX/X (求star, 795+)

 

回到目录

大数据投名状

先来看看“大数据演示平台”:http://bigdata.newlifex.com

SQLite单表4亿行订单数据,文件大小26.5G,阿里云1C1G的ECS服务器,由 NewLife.XCode + NewLife.Cube 驱动

640?wx_fmt=png

如上,在4亿行中查询第1000页,耗时16毫秒。

对于高手来说,这个算不得什么,只要注意好索引就行。

 

这个“演示平台”建立于两年前,给两家领先物流企业递交了简历,其中一家因SQLite拒绝了,另一家给了数据架构师!

 

现在,每天1亿个快递包裹在路上,产生大量扫描数据。单表数十亿数据很常见(Oracle按月分区),一款数据产品几亿明细数据比比皆是(MySql分表)。

 

回到目录

代码之巅、天外飞仙

再来看一下各种数据库的极致性能,飞仙平台 http://feixian.newlifex.com

640?wx_fmt=png

SQLite插入第一名 56万tps;

MySql插入第一名 60万tps;

SQLite查询(带缓存)1126万qps;

这是上百人用了各种机器(笔记本、台式机、服务器)调整参数进行大量测试后得到的性能排行榜!

所有测试,由 NewLife.XCode 支持!

 

实际应用中,即使能达到上述性能十分之一,亦能立于不败之地。有时候甚至还达不到百分之一。

尽管如此,极致性能的研究也给我们的应用方式以及数据库参数设置指明了方向!

 

回到目录

索引完备

使用关系型数据库来做大数据,第一步必然是索引

单表超过1000万数据,任何查询都必须走索引!否则数据库一定跟你说ByeBye!

 

前面SQLite单表4亿数据,共有两个索引,自增ID作为主键,另外有订单号索引。 

大表索引不宜过多,务必以数据的主要使用方式来建立一两个即可,尽量不要超过三个,经索引过滤后的数据尽量控制住1万行以内。

 

常见大型表索引用法:

1,日志型

订单操作表、快递扫描表、传感数据表等超大日志型数据表,每日数千万到数亿行,只插入不修改,最重要的字段就是时间戳CreateTime,建立索引,同时可以按时间分区分表。

这种大表最常见用法就是根据时间戳去抽取来做业务处理,那就是鼎鼎大名的ETL。处理性能1000~10000tps

更高大上一点,就是抽取数据写入Kafka/RocketMQ,名正言顺进行大数据分析!处理性能10万tps

因工作需要,我们依据时间戳抽取了30天共100亿数据写入Redis,供100+应用进行实时数据分析。处理性能100万tps

抽取数据时以每批次抽取5000~20000行为宜,依次调整查询时间段,重量级蚂蚁调度系统(https://github.com/NewLifeX/AntJob)具备动态步进抽取能力,可自动调节最优抽取间隔。

总结起来一句话:按时间戳轮数据!

2,状态表

订单运单都是有状态数据,在整个生命周期中,状态会多次改变。许多业务往往要求两个或多个状态相匹配,那就要求有一张庞大的状态表。

状态表最合适的主键就是订单号,并且一般分表分库存储,常见分表公式 Crc16(code)%1024,分表数以单表不超过1000万为宜。

使用1024状态表的数据库一般是分布式玩法,比较合适分8库,每个库128表,很多应用服务器各司其职,大家共同操作一张表的几率大减。

3,统计分析表

统计表主键一般由统计日期和分类构成,为了方便可建立字符串ID主键,由 {date}_{cid} 组成,也可以对 date + cid 两个字段建立唯一联合索引。

之所以建立 {date}_{cid} 的ID主键,主要是为了方便写明细数据,无需等待统计表插入后(假如使用自增)才得到统计ID。

明细表一定必须根据统计ID来查,由统计ID跟其它主要业务字段构成主索引。

 

回到目录

合理查询

既然有了索引,那么大表的任意查询都必须命中索引(或者部分使用索引) 。

为了索引,为了降低数据库负担,有时候宁可多查一点,先把数据查出来,再在内存里面做二次处理!

大数据的瓶颈一定是数据库,应用服务器往往性能过剩!

因此,完全可以把一部分“计算”由数据库转移到应用服务器之中来进行处理。

 

大表少用join关联,宁可多次查询;

 

回到目录

字段精炼

常听到许多人说每天处理数据多少多少TB/PB,听起来数据分析还可以论斤称?挺尴尬的!

虽然数据库很容易遇到IO瓶颈,但很多人达不到那一步。

数据容量上的优化空间还是极大的。

大表字段精简原则:

  1.  能存ID就别存Name。经常见到用户、商家、地区等信息,又存ID又存Name,甚至还存一个Code。此时需要XCode的扩展属性

  2. 适当冗余。为了便于查询,可以适当冗余一些字段,但绝不能滥用。比如商家所在地区,如果查询用不到而只是分析时使用,就不需要保存商家ID以外还保存地区

  3. 只查询需要的字段。这一点跟XCode推崇 select * 并不相悖,绝大部分百万级以内小表可以这么干,但是千万亿万级大表则需按需查询了。

 

回到目录

充分利用缓存

 少用join关联,慎用字段冗余,即可大量发挥XCode的缓存优势。

10万乃至100万维表数据可尽量缓存起来,随时配合亿万级大表进行数据分析。

 

另一方面就是数据库缓存,需要DBA大力支持!

 

回到目录

系列教程

NewLife.XCode教程系列[2019版]

  1. 增删改查入门。快速展现用法,代码配置连接字符串

  2. 数据模型文件。建立表格字段和索引,名字以及数据类型规范,推荐字段(时间,用户,IP)

  3. 实体类详解。数据类业务类,泛型基类,接口

  4. 功能设置。连接字符串,调试开关,SQL日志,慢日志,参数化,执行超时。代码与配置文件设置,连接字符串局部设置

  5. 反向工程。自动建立数据库数据表

  6. 数据初始化。InitData写入初始化数据

  7. 高级增删改。重载拦截,自增字段,Valid验证,实体模型(时间,用户,IP)

  8. 脏数据。如何产生,怎么利用

  9. 增量累加。高并发统计

  10. 事务处理。单表和多表,不同连接,多种写法

  11. 扩展属性。多表关联,Map映射

  12. 高级查询。复杂条件,分页,自定义扩展FieldItem,查总记录数,查汇总统计

  13. 数据层缓存。Sql缓存,更新机制

  14. 实体缓存。全表整理缓存,更新机制

  15. 对象缓存。字典缓存,适用用户等数据较多场景。

  16. 百亿级性能。字段精炼,索引完备,合理查询,充分利用缓存

  17. 实体工厂。元数据,通用处理程序

  18. 角色权限。Membership

  19. 导入导出。Xml,Json,二进制,网络或文件

  20. 分表分库。常见拆分逻辑

  21. 高级统计。聚合统计,分组统计

  22. 批量写入。批量插入,批量Upsert,异步保存

  23. 实体队列。写入级缓存,提升性能。

  24. 备份同步。备份数据,恢复数据,同步数据

  25. 数据服务。提供RPC接口服务,远程执行查询,例如SQLite网络版

  26. 大数据分析。ETL抽取,调度计算处理,结果持久化

 


640?wx_fmt=jpeg


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

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

相关文章

LuoguP4606 [SDOI2018]战略游戏

LuoguP4606 [SDOI2018]战略游戏 题目描述 题目描述 省选临近,放飞自我的小 QQ 无心刷题,于是怂恿小 CC 和他一起颓废,玩起了一款战略游戏。 这款战略游戏的地图由 nn 个城市以及 mm 条连接这些城市的双向道路构成,并且从任意一个…

Jozky 刷题目录

文章目录本目录参考OI-Wiki还未解决专区算法基础枚举模拟递归&分治贪心排序前缀和&差分二分倍增构造搜索DFS && BFS双向搜索启发式搜索A*迭代加深搜索IDA*回溯法Dancing Links搜索优化(剪枝)动态规划普通dp背包dp区间dpDAG上的dp树形dp状…

Web API 速率限制(一)

导读当您API有大量消费者或者请求量猛增到影响程序可用性的时候,您可能需要对API进行速率限制。所以对API进行限速的在于:在增加可靠性和可用性的同时来保护基础架构,你不希望某个恶意的API消费者或者差劲的API客户端开发者通过Dos攻击把你的…

训练赛合集

带 # 的为未补 带△的为未补完 带※的为补不动 比赛合集 牛客 △2021年度训练联盟热身训练赛第一场 Codeforces Codeforces Round #694 Div. 2 △Codeforces Round #695 (Div. 2) Codeforces Round #696 (Div. 2) △CodeCraft-21 and Codeforces Round #711 (Div. 2) Codef…

构建简单的微服务架构

前言 本篇仅作引导,内容较多,如果阅读不方便,可以使用电脑打开我们的文档官网进行阅读。如下图所示:文档官网地址:docs.xin-lai.com目录总体介绍微服务架构的好处 微服务架构的不足(这个时候…

[AGC026D]Histogram Coloring

[AGC026D]Histogram Coloring 题目描述 题面 题意大概是有一个nnn列网格图,给定一个长度为nnn的序列hih_ihi​,第iii列只保留这一列最下面的hih_ihi​个格子。 现在需要给这些保留下来的格子染成红色或蓝色,满足每一个完整的222222正方形…

每日训练赛

文章目录说明2021.9.242021.9.252021.9.262021.9.272021.9.282021.9.292021.9.302021.10.12021.10.22021.10.32021.10.42021.10.52021.10.62021.10.72021.10.82021.10.92021.10.132021.10.152021.10.162021.10.212021.10.222021.10.242021.10.252021.10.262021.10.29说明 记录…

读《代码整洁之道》

什么是整洁代码代码的质量非常重要,糟糕的代码有可能会毁了一个公司。对于一个很注重代码质量的人来说呆在一个只关注交付而不关注代码质量的公司是很痛苦的。什么是整洁的代码,不同的人又不同的定义。我认为整洁的代码应该是符合所使用语言代码规范的&a…

[ZJOI2016]小星星

[ZJOI2016]小星星 题目描述 luogu题面 给定一个n个点的树和n个点m条边的无向图,求将树嵌入图的方案数。 其中 n≤17,m≤n∗(n−1)2n \leq 17,m \leq \frac{n*(n-1)}{2}n≤17,m≤2n∗(n−1)​。 Solution 点数很少,考虑状压DP。 令f[i][j][k]f[i][j]…

在 DotNetty 中实现同步请求

一、背景DotNetty 本身是一个优秀的网络通讯框架,不过它是基于异步事件驱动来处理另一端的响应,需要在单独的 Handler 去处理相应的返回结果。而在我们的实际使用当中,尤其是 客户端程序 基本都是 请求-响应 模型,在发送了数据时候…

BZOJ#3252. 攻略

BZOJ#3252. 攻略 题目描述 Solution 有一个显然的 贪心,每次选取一个到根的点权和最大的点xxx,将答案加上xxx到根的路径的点权和,并将xxx到根的路径上的点的权值清零。 可以使用DFS序线段树维护。 但完全没有这么麻烦。 容易发现每一次选…

ASP.NET Core 中间件

1.前言中间件(middleware)是一种装配到应用管道以处理请求和响应的组件。每个组件:●可选择是否将请求传递到管道中的下一个组件。●可在管道中的下一个组件前后执行工作。请求委托(request delegates)用于建立请求管道…

P3899 [湖南集训]谈笑风生

P3899 [湖南集训]谈笑风生 题目描述 Solution 我们考虑离线询问,将询问放在相对应的子树ppp中计算答案。 显然a,b,ca,b,ca,b,c的位置关系有两种情况: bbb是aaa的祖先,ccc是aaa的子孙。aaa是bbb的祖先,ccc是bbb的子孙。 第一种…

.Net Core实现的文档数据库RavenDb

说到文档数据库,大家能想到很多,MongoDb,coudDb。如果只是文档的话,甚至可以使用对象存储,阿里的oss,腾讯cos。但是这里小编选择这RavenDb,原因是对象存储下行太贵了(来自穷逼的绝望)。MongoDb据说非常占用…

bzoj4543. [POI2014]Hotel加强版

bzoj4543. [POI2014]Hotel加强版 题面描述 Solution 先看n≤5e3n \leq 5e3n≤5e3怎么做。 考虑树形dpdpdp。 设f[i][j]f[i][j]f[i][j]表示以iii为根的子树中,深度为jjj的结点个数。 设g[i][j]g[i][j]g[i][j]表示以iii为根的子树中的二元组(x,y)(x,y)(x,y)数量&a…

Web Template Studio 发布!在 VS Code 中轻松创建 Web 应用

作为一个 Web 应用开发者,Scaffolding Tool(脚手架工具)一定是在创建项目时的重要工具。许多开发者会习惯于使用基于 CLI 的脚手架工具来创建 Web 应用,也有许多开发者喜欢使用类似于 VS IDE 的基于 UI 的 Wizard 向导。近期&…

AGC022E - Median Replace

AGC022E - Median Replace 题面描述 Solution 直接构造自动机&#xff0c;模拟每次在末尾加一个字符的当前状态的方案数f[state]f[state]f[state]&#xff0c;状态很少&#xff0c;直接打表转移即可。 时间复杂度O(n)O(n)O(n)。 #include <vector> #include <lis…

再多迷茫,不如静下来好好学习

背景前不久&#xff0c;我有幸看到了CSDN知名博主“沉默王二”写的一篇博客《你的青春&#xff0c;值得先给小型创业公司吗&#xff1f;》&#xff0c;这篇博客介绍了他从苏州回到内地小城洛阳之后&#xff0c;虽然远离了互联网的主阵地&#xff0c;但是依然保持学习的态度&…

AGC023D - Go Home

AGC023D - Go Home 题目描述 Solution 我们首先把这些人分成在sss左边和在sss右边两类&#xff0c;考虑最左边的一群人AAA和最右边的一群人BBB&#xff0c;这两群人中必然有其中一群人是最后到家的。而是否最后到家取决于这两群人的人数&#xff08;因为倘若只剩下两群人&am…

Web API 速率限制(二)- 令牌桶算法简介

前情提要上一篇文章里简单介绍了什么是Web API的速率限制&#xff0c;和限速策略需考虑的问题&#xff0c;最后还介绍了ASP.NET Core 的一个常用限速库。。。。。。。的名字。实施策略如果你想要建立一个限速系统&#xff0c;首先要确保限速系统不会增加API的响应时间。为了保证…