分库表数据倾斜的处理让我联想到了AKF模型

2023-10-27

1 背景

最近在做需求的时候需要在一张表中增加一个字段。

这张表情况如下:

1、拆分了多个库多张表

2、库表拆分按表中商户编码字段hash之后取模进行拆分

由于库表拆分按照商户编码,有些大商家的单子数量远远要高于其他普通商家,这样就造成了严重的数据倾斜。

在增加字段的时候尝试多种办法,执行多次都添加失败。

虽然通过一些特殊手段还是可以将字段加上的,

但是如果这张表中的数据一直持续下去,导致的结果可能是这张表越来越难以扩展,并且随着数据量的增加还对未来造成一定的隐患。

所以决定对此表再次进行拆分,这时让我想起多年前看的一本书《架构真经》在第二章中介绍分而治之的方法论,其中AKF模型很实用,对我的启发很大。

接下来就简单介绍下。

关于《架构真经》的介绍:本书全面概括了互联网技术架构的理念、设计、实施和监控方面的相关场景、条件和方法,是一本有关设计和构建可扩展性系统的深入且实用的指南。作者马丁·阿伯特和迈克·费舍尔已经为数以百计高速增长公司的上千个不同系统提供了帮助,凭借着多年积累的实战经验,提炼出50条互联网技术架构原则,可以支持几乎任何高速增长公司的扩展。

2 理论模型介绍

关于AKF简介

AKF是以AKF公司的合作伙伴的名字(AKF Partner)命名的,AKF扩展立方体主要围绕系统扩展为主题进行介绍。提出了X、Y、Z三种扩展方向。通过不同方向的扩展来达到接近无限扩展的目的。

在这里插入图片描述

X轴是水平扩展,通俗说就是复制多份数据或服务

Y轴是针对动词(服务)或名词(资源)的拆分,或者说就是业务上的拆分

Z轴是根据实际情况对客户独特属性进行拆分(ID,名称,地理位置等)

X,Y,Z轴分别代表了不同的扩展方向,下面简单解释一下:

X轴代表无差别的克隆服务和数据库。实际场景中我们的应用服务,以及数据库数据的副本理论上是可以无限扩展的。在每个克隆实体间无差别的分配任务,每个克隆实体都可以完成其他克隆实体的任务,无论任务分配给了谁。比如应用服务复制部署了多份,通过负载均衡分发请求,每个应用都可以处理其他应用的请求。

X轴优点:成本低,操作与应用简单

X轴缺点:X轴无差别的处理请求,要求请求之间尽量不要有依赖关系,或者中间状态。数据集过大依然是风险,同时随着系统变大业务变多指令集耦合也会变得很多。

Y轴代表的是按照交易处理的数据类型、交易任务的类型或两者组合分割的工作责任。我们一般用动词或资源进行分离,比如:登录,查询,结算等等。把同样的工作分割成流水线式的工作流或并行的处理流,Y轴代表的更多是对工作的“工业革命”,将耦合紧密的工作进行进行专门处理。Y轴实质代表责任、行动或数据。实施成本一般比X轴扩展代价高。假如有100个人分别造100辆车,每个人负责造一辆,完成造车全部的任务,不如让100个人执行子任务,如发动机的安装、喷漆、四轮定位。这样就会减少前后交互所需要的上下文信息,更专注做某件事情。内聚性更高,耦合性更低。Y轴主要解决指令集的扩展性。

Y轴优点:可以解决指令集与数据集的约束与耦合,充分体现分而治之的思想,代码简单,故障隔离等。

Y轴缺点:成本相对较高,系统庞大,业务复杂

Z轴通常基于请求或客户的信息进行分割。比如我们在拆分客户时会有 “普通会员”和“vip会员“之分,服务“普通会员”与服务“vip会员”可能会有不同。vip会员可能会有更多的服务项目,会有单独的人在处理vip会员的事情。但是他们都是会员。再比如一些客户可能需要专门的账单、付款条件和基于业务量的特别互动。我们可能安排最好的财务代表、甚至特别的经理负责一个或多个客户,以专门处理他们的独特需求。Z轴主要解决数据集的扩展性。

Z轴分割是成本最高的分割方向,Z轴分割有助于提高交易和数据的可扩展性,如果实施得当也有助于扩展指令集和过程

Z轴优点:解决单一数据集过大问题,可以应对数据指数增长。

Z轴缺点:成本最高,很难解决指令集问题。

3 理论实践

通过上面的理论介绍,接下来指导我们对实际业务场景的拆分。

针对文章开头提到的某些大商户单子远远多余其他商户的情况,很显然这是数据集的扩展性导致的问题。

更应该在Z轴上进行扩展拆分,也就是通过商户的特殊性,进行再次拆分来平衡数据。

这里的特殊性可以是表中字段的某一个属性,比如订单编号、创建时间等等。这就需要我们根据实际情况,既要拆分的均匀又要拆分之后能满足未来几年的发展,同时还要满足现有业务的支持。

4 总结

通过对AKF模型的学习我们在工作实践中如果遇到类似的情况可以按照这个模型进行对系统拆分。当然我们也不要过度使用。不同的业务或者场景可能使用其中一个就足够用了,但是又有其他一些场景,已经按照XYZ轴拆分过一次了但是不够满足需求,可以再次在三个轴之一再次进行拆分,已达到满足业务需要的目的。

XYZ三个轴的扩展方向每个都有优缺点,要准确识别场景进行使用,或结合使用互补优缺点。

作者:京东保险 张永刚

来源:京东云开发者社区 转载请注明来源

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

分库表数据倾斜的处理让我联想到了AKF模型 的相关文章

  • iOS16新特性:实时活动-在锁屏界面实时更新APP消息

    简介 之前在 iOS16新特性 灵动岛适配开发与到家业务场景结合的探索实践 里介绍了iOS16新的特性 实时更新 Live Activity 中灵动岛的适配流程 但其实除了灵动岛的展示样式 Live Activity还有一种非常实用的应用场
  • iOS16新特性:实时活动-在锁屏界面实时更新APP消息

    简介 之前在 iOS16新特性 灵动岛适配开发与到家业务场景结合的探索实践 里介绍了iOS16新的特性 实时更新 Live Activity 中灵动岛的适配流程 但其实除了灵动岛的展示样式 Live Activity还有一种非常实用的应用场
  • 618技术揭秘 - 大促弹窗搭投实践

    背景 618 大促来了 对于业务团队来说 最重要的事情莫过于各种大促营销 如会场 直播带货 频道内营销等等 而弹窗作为一个极其重要的强触达营销工具 通常用来渲染大促氛围 引流主会场 以及通过频道活动来提升频道复访等 因此 如果能将运营的策略
  • 【实践篇】DDD脚手架及编码规范

    一 背景介绍 我们团队一直在持续推进业务系统的体系化治理工作 在这个过程中我们沉淀了自己的DDD脚手架项目 脚手架项目是体系化治理过程中比较重要的一环 它的作用有两点 1 可以对新建的项目进行统一的规范 2 对于指导老项目进行DDD的改造提
  • DPText-DETR: 基于动态点query的场景文本检测,更高更快更鲁棒

    针对场景文本检测任务 近期基于DEtection TRansformer DETR 框架预测控制点的研究工作较为活跃 在基于DETR的检测器中 query的构建方式至关重要 现有方法中较为粗糙的位置先验信息构建导致了较低的训练效率以及性能
  • 【AI思维空间】ChatGPT纵横编程世界,点亮智慧火花

    作者 京东零售 王英杰 概述 该文档记录云交易开发小伙伴儿们在开发过程中的实际应用案例 记录典型案例 以解决开发过程中的实际问题为主 涵盖设计方案 编码 测试 集成 部署等等 目的 贡献最佳实践 分享心得 共同成长 1 怎样构造Prompt
  • Hutool:一行代码搞定数据脱敏

    1 什么是数据脱敏 1 1 数据脱敏的定义 数据脱敏百度百科中是这样定义的 数据脱敏 指对某些敏感信息通过脱敏规则进行数据的变形 实现敏感隐私数据的可靠保护 这样就可以在开发 测试和其它非生产环境以及外包环境中安全地使用脱敏后的真实数据集
  • 一种通用的业务监控触发方案设计

    一 背景 业务监控是指通过技术手段监控业务代码执行的最终结果或者状态是否符合预期 实现业务监控主要分成两步 一 在业务系统中选择节点发送消息触发业务监控 二 系统在接收到mq消息或者定时任务调度时 根据消息中或者任务中的业务数据查询业务执行
  • 谁在成为产业经济发展的推车人?

    区域发展的新蓝图中 京东云能做什么 它的角色是什么 这个问题背后 隐藏的不仅是京东云自身的能力和价值 更是其作为中国互联网云厂商的代表之一 对 技术 产业 的新论证 作者 皮爷 出品 产业家 关于云厂商 外界更多的认知是在技术和产品层面 不
  • Git 代码分支管理

    作者 京东科技 周新智 一 引言 近日 IoT 研发团队加入了不少新同学 对 git 分支的命名和管理方式有些许的模糊 分支的命名规范以及管理方式对项目的版本发布至关重要 为了解决实际开发过程中版本发布时代码管理混乱 冲突等比较头疼的问题
  • 线上问题处理案例:出乎意料的数据库连接池

    导读 本文是线上问题处理案例系列之一 旨在通过真实案例向读者介绍发现问题 定位问题 解决问题的方法 本文讲述了从垃圾回收耗时过长的表象 逐步定位到数据库连接池保活问题的全过程 并对其中用到的一些知识点进行了总结 一 问题描述 大促期间 某接
  • 万物云原生下的服务进化

    导读 在万物云原生下的环境下 Java的市场份额也因耗资源 启动慢等缺点 导致在云原生环境里被放大而降低 通过这篇文章 读者可以更好地了解如何在云原生环境下通过升级相关版本和使用GraalVM打出原生镜像到方式 优化Java应用的性能和资源
  • 618京东到家APP-门详页反爬实战

    一 背景与系统安全需求分析 1 系统的重要性 上图所示是接口所属位置 对电商平台或在线商店而言 分类查商品都是很重要的 通过为用户提供清晰的商品分类 帮助他们快速找到所需产品 节省浏览时间 提升购物效率 是购物结算产生GMV的核心环节 那么
  • chatglm2-6b在P40上做LORA微调

    背景 目前 大模型的技术应用已经遍地开花 最快的应用方式无非是利用自有垂直领域的数据进行模型微调 chatglm2 6b在国内开源的大模型上 效果比较突出 本文章分享的内容是用chatglm2 6b模型在集团EA的P40机器上进行垂直领域的
  • JDK 17 营销初体验 —— 亚毫秒停顿 ZGC 落地实践

    前言 自 2014 年发布以来 JDK 8 一直都是相当热门的 JDK 版本 其原因就是对底层数据结构 JVM 性能以及开发体验做了重大升级 得到了开发人员的认可 但距离 JDK 8 发布已经过去了 9 年 那么这 9 年的时间 JDK 做
  • Velocity不用愁!Velocity系统的前端工程化之路

    Velocity是一个基于Java的Web页面模版引擎 十多年前 Velocity将Java代码从Web页面中分离出来 使得开发者能够并行网页开发和Java开发 随着十年前后端分离的浪潮涌动 回首再面对这些基于Velocity的旧系统 无论
  • 实践指南-前端性能提升 270%

    一 背景 当我们疲于开发一个接一个的需求时 很容易忘记去关注网站的性能 到了某一个节点 猛地发现 随着越来越多代码的堆积 网站变得越来越慢 本文就是从这样的一个背景出发 着手优化网站的前端性能 并总结出一套开发习惯 让我们在日常开发时 也保
  • 从好玩到好用:程序员用AI提效的那些事儿

    本片内容是 AI思维空间 ChatGPT纵横编程世界 点亮智慧火花的续作 主要记录组内开发小伙伴儿们在开发过程中的实际应用案例 记录典型案例 尽量不要和其他人重复 以解决开发过程中的实际问题为主 设计 方案 编码 测试 集成 部署等等 目的
  • 文盘Rust -- FFI 浅尝

    rust FFI 是rust与其他语言互调的桥梁 通过FFI rust 可以有效继承 C 语言的历史资产 本期通过几个例子来聊聊rust与C 语言交互的具体步骤 场景一 调用C代码 创建工程 cargo new bin ffi sample
  • 给祖传系统做了点 GC调优,暂停时间降低了 90% | 京东云技术团队

    问题描述 公司某规则引擎系统 在每次发版启动会手动预热 预热完成当流量切进来之后会偶发的出现一次长达1 2秒的Young GC 流量并不大 并且LB下的每个节点都会出现该情况 在这次长暂停之后 每一次的年轻代GC暂停时间又都恢复在20 10

随机推荐

  • error C2041: illegal digit ‘9‘ for base ‘8‘

    错误日志 文本 八进制数值超过范围 1 gt E CProject test12 Source c 5 10 error C2041 illegal digit 8 for base 8 十六进制数值超过范围 1 gt E CProject
  • 【每日一题】ABC194E-Mex Min

    题目内容 原题链接 给定一个长度为 n n n 的整数数组 a a a 求所有长度为 m m
  • 【华为OD统一考试B卷

    题目描述 一群大雁往南飞 给定一个字符串记录地面上的游客听到的大雁叫声 请给出叫声最少由几只大雁发出 具体的 1 大雁发出的完整叫声为 quack 因为有多只大雁同一时间嘎嘎作响 所以字符串中可能会混合多个 quack 2 大雁会依次完整发
  • Spring概述 ——跟我学Spring3

    1 1 1 Spring是什么 Spring是一个开源的轻量级Java SE Java 标准版本 Java EE Java 企业版本 开发应用框架 其目的是用于简化企业级应用程序开发 应用程序是由一组相互协作的对象组成 而在传统应用程序开发
  • 打印机"启用双向支持"的意思

    在打印机的属性选项里面 有一项 启用双向支持 的选项 但是具体有什么作用 一直都不明白 今天特意查了一些资料 启用双向支持 简单来说就是来回打印 打印头从左向右走动时能打印 从右向左回来时不能打印 如果不启用 仅仅是从左向右走动时打印 重庆
  • Illegal processing instruction target ("xml"); xml (case insensitive) is reserved by the specs

    问题描述 当SoapUI访问一个webservice时 对于某些webserive服务 如果webserive的输入参数要求是xml格式 如果xml格式输入不正确 会报 Unmarshalling Error Illegal process
  • 工行数据中心高级经理 李雁南:接口冒烟测试方法

    原文出自 听云技术博客 http blog tingyun com web a 今年遇到了几个问题 与接口的功能和性能相关 恰巧最近公司也在组织以冒烟测试为主题的活动 于是乎突发奇想 寻思着能否将接口测试与冒烟测试结合起来 发掘一些新的接口
  • ICLR 2023

    PaperWeekly 原创 作者 叶振辉 单位 浙江大学博士生 研究方向 语音合成 说话人视频合成 语音驱动的说话人视频合成 Audio driven Talking Face Generation 是虚拟人领域的一个热门话题 它旨在根据
  • linux系统配置文件

    1 etc sysconfig i18n 语言配置文件 2 etc sysconfig network scripts ifcfg eth0 eth0配置文件 3 boot grub grub conf grup配置文件 或 boot gr
  • 【第04例】IPD进阶

    目录 前言 专栏目录 内容详解 IPD 相关专栏推荐 华为流程体系 CSDN学院相关内容
  • jdk8

    文章目录 1 场景再现 2 Supplier
  • 前端开发之走进Vue.js

    Vue js作为目前最热门最具前景的前端框架之一 其提供了一种帮助我们快速构建并开发前端项目的新的思维模式 本文旨在帮助大家认识Vue js 了解Vue js的开发流程 并进一步理解如何通过Vue js来构建一个中大型的前端项目 同时做好相
  • (转)JAVA常见异常

    0 需要标识符 a 不在函数内 1 非法表达式开始 b 可能 丢失括号 2 no data found a 可能 setInt 1 100 中 没有100这个值 3 找不到符号 a 可能 没导入包 4 指定了无效URL a 可能 数据库名或
  • pyqt_点击button("添加")弹出新的页面

    目标 通过点击主窗口中的button弹出另一个窗口页面 首先需要注意的是 两个窗口不能是同一类型 否则会崩溃 并保存为名称不同的ui文件 并使用UIC工具转成 py文件 因此在目前文件夹中既有mainwindow又有dialog窗体形式的界
  • CGAL的使用

    1 C 类的知识 因为CGAL是用C 实现的 所以需要先了解一下C 编程 C 是面向对象的编程 这也是C 对C语言改进的最重要的部分 C 也被叫做是 带类的 C 简单讲一下类的构成 成员函数以及对象的定义和使用 1 1 C 类的构成 首先从
  • godaddy服务器内网站转移,2021年Godaddy最新域名转出教程

    因为之前Goddady登录界面修改的原因 导致部分新手不知道Godaddy域名转出步骤 笔者特此做了一个简单的教程 供大家学习和参考 第一步 打开Godaddy官网 登录Godaddy账户 然后点击页面右侧的My Account 进入账号管
  • xmlns:android="http://schemas.android.com/apk/res/android"详解

    在Android的layout文件夹下的 xml文件中 开头有一条配置语句 xmlns android http schemas android com apk res android 1 整句话的作用是声明命名空间的引用 2 xmlns是
  • AI+无线通信

    1 赛题与数据 官方介绍已经比较清楚了 按照需要下载对应的文件 博主使用的是pytorch版本 2 代码的本地部署 2 1 文件列表 示例程序文件有以下几个文件 Model define pytorch py 在这个文件设计网络结构 设计
  • 独家

    作者 Faizan Shaikh 翻译 季洋 校对 王雨桐 本文约2700字 建议阅读10 分钟 本文将展示如何使用开源工具完成一个人脸识别的算法 引言 计算机视觉和机器学习已经开始腾飞 但是大多数人并不清楚计算机在识别一张图片的时候 它到
  • 分库表数据倾斜的处理让我联想到了AKF模型

    1 背景 最近在做需求的时候需要在一张表中增加一个字段 这张表情况如下 1 拆分了多个库多张表 2 库表拆分按表中商户编码字段hash之后取模进行拆分 由于库表拆分按照商户编码 有些大商家的单子数量远远要高于其他普通商家 这样就造成了严重的