订单系统设计 —— 数据同步与监控

2023-11-16

一、方案背景

  当订单数据量规模足够大或查询统计足够复杂时,通常会采用MySQL + NoSQL的架构方案,这种方案需要将MySQL中数据同步到其它介质,比如HBase、ES,或者阿里云的TableStore等。订单数据的同步面临着诸多挑战,尤其是异构介质,下面会从”数据同步面临的挑战“和以及”订单数据特点“两个维度来分析。

1.1考虑因素

  1. 性能和稳定性: 订单系统为每个公司的核心业务系统,数据的同步尽量对订单系统无感,换言之,同步双写的方案会影响订单系统的性能和稳定性;
  2. 幂等性: 同步RPC和异步消息,都可能产生重复数据,数据落入HBase和ES时需要考虑数据去重,保证幂等性;
  3. 顺序性: 由于网络的不确定性,有可能数据库中先更新的数据后到达HBase或ES,导致最新的数据被旧数据覆盖;
  4. 关联性: 通常订单数据会包含很多信息,库表设计时通常会进行垂直拆分,通过订单号进行关联,当进行数据同步时,如何处理这些关联表的数据需要考虑;

1.2 数据特点

  1. 存量数据: 已完成或结束的订单归纳为”存量数据“,其特点是:数据量大、只读(没有变更,无需考虑顺序性);
  2. 增量数据: 未结束的订单归纳为”增量数据“,其特点是:并发量大、数据变更比较频繁(需要考虑顺序性);

二、增量同步方案

整体思路: 将数据库的Binlog解析成消息,异步同步到HBase或ES,保障对订单系统的无感。利用订单号的唯一性,在HBase或ES进行物理去重;每条数据携带版本,通过版本号保障新数据不会被旧数据覆盖;对于订单相关联的表数据,在HBase和ES中会将数据打平,以宽表的形式存储,因为HBase和ES并不擅长“关系”的处理,性能开销很大。
在这里插入图片描述

2.1 并发消费

  整体流程:Canal将Binlog日志转换成MQ消息,同步程序并发消费消息(最大化消费能力),然后先将数据写入HBase,然后将HBase中订单对应的宽表数据写入ES。这里有几点需要说明:

  1. HBase有版本控制机制,而且是字段级别的,只有更大版本号的数据才能更新字段,利用这个特点可以防止新数据被覆盖,同时也能够用一个宽表来聚合/扁平化订单关联表;
  2. ES也有版本控制机制,但是是文档/行级别的,无法进行字段级别的更新,这就导致无法用一个宽表来聚合/扁平化订单关联表,因此现在HBase中生成宽表,同时有个额外的Version字段(每次更新HBase时都更新为当前时间),将HBase的Version作为ES的外部版本;

在这里插入图片描述

2.2 顺序消费

  整体流程与方案1类似,区别在于:发送消息时根据订单号哈希,将相同订单关联的数据发送到相同的队列,同时同步程序需要进行顺序消费(消费能力受限,需要保持消息队列和消费实例为1:1进行水平扩容),另外为了保持顺序性,每个订单相关联的表应该在相同库中,具体流程如下所示:
在这里插入图片描述

2.3 1:N关联数据

  订单关联表中,经常会遇到1:N的关联关系,比如一个订单多个商品场景。数据同步时,主要利用了HBase的动态列的特性来处理这种一对多的关系,如下图所示,每列可以表示一个商品(商品粒度),也可以进一步细化到商品的每个字段(字段维度),通过id来区分。
在这里插入图片描述

三、存量同步方案

整体思路: 基于DataX进行离线数据的同步。由于高性能、高扩展以及对多种数据源的支持,DataX已经成为离线数据同步工具的首选,不过由于开源的是单机版本,需要结合调度系统一起完成。

3.1 并发同步

  为订单及其关联表每个表分配一个同步任务,并发进行同步,基于HBase聚合/扁平化数据,数据版本统一为V1,然后再通过DataX或MQ消息将数据从HBase同步到ES,如下图所示:

  • 优点:并发度高、速度快(数据读取都是简单SQL),数据库压力小(只需同步到HBase);
  • 缺点:暂无

在这里插入图片描述

3.2 基于视图同步

  ES不再依赖于HBase同步数据,而是通过视图,将订单及其关联表组成一张宽表,如下图所示:

  • 优点:ES同步链路不再依赖HBase;
  • 缺点:数据量大时,关联查询速度会很慢;
    在这里插入图片描述

四、监控与补偿机制

4.1 延迟监控

  数据同步链路的监控分为两方面:链路中各节点的系统监控,以及延迟检测。延迟检测为业务艰监控,主要思想就是记录数据进出各节点的时间,通过时间差判断是否发生延时,正常情况下同步延迟在1s以内,如果超时则触发告警。各节点的异常分析如下:

  • 数据库负载过高或异常:业务操作异常或超时,触发业务告警;
  • Canal负载过高或异常:Canal系统告警;
  • 同步程序负载过高或异常:消息堆积触发MQ告警,延迟过大触发业务告警;
  • ES/HBase负载过高或异常:消息堆积触发MQ告警,同步异常触发业务告警,ES/HBase告警;

在这里插入图片描述

4.2 补偿机制

  • 订单系统/数据库异常:下单失败,无新数据产生,无需补偿,需解决Bug修复;
  • Canal异常:异常期间,可以通过查询DB的方式同步数据,或者订单系统降级走DB;
  • 同步程序/ES/HBase异常:数据无法写入,无需补偿,需解决Bug修复,恢复期间订单系统采取降级方案,查询可以临时走DB;

参考

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

订单系统设计 —— 数据同步与监控 的相关文章

  • echarts横向个性化柱状图

    先看一下效果图 横向柱状图 顶部小圈是一个图片 下面我们就来看看如何实现 1 第一步 先把柱状图中需要插入的图片 转换成base64格式 百度搜一下 可以搜到在线工具直接转换 2 html中定义一个div 用来盛放柱状图 div style
  • 《STL源码剖析》(二)——空间配置器

    一 为什么要有空间配置器 1 小块内存带来的内存碎片问题 单从内存分配的角度来讲 由于频繁分配 释放小块内存容易在堆中造成外碎片 极端情况下 堆中空闲的总量满足一个要求 但是这些空闲的块都不连续 导致任何一个单独的空闲的块都无法满足请求 2
  • C练题笔记之:Leetcode-793. 阶乘函数后 K 个零

    题目 f x 是 x 末尾是 0 的数量 回想一下 x 1 2 3 x 且 0 1 例如 f 3 0 因为 3 6 的末尾没有 0 而 f 11 2 因为 11 39916800 末端有 2 个 0 给定 k 找出返回能满足 f x k 的
  • NO-CARRIER

    自己动手写了创建虚拟接口 删除虚拟接口程序 频繁调用创建删除时 有时将接口up起来时会报错 Name not unique on network 利用ip link命令来查看接口 及其对应的索引 可以查看到与其他接口不同的是有个标志为 NO
  • 利用多个panel重叠来代替tabcontrol方法

    这两天 在弄一个C 软件 看着tabcontrol那个讨厌的标签 真是火大 折腾了1个周末加今天1个白天 总是不行 其实我就是想要一排按纽 来控掉不同的界面显示 今天打算使用多个pannel来代替tabcontrol 自己在旁边再弄几个按纽
  • Angular_学习笔记_01

    3天Angular视频课程 之 第1天 学习笔记 1 安装 Node 官网下载 一路Next gt 2 安装Angular cli sudo npm install g angular cli 3 ng new app name 4 运行项
  • scrapy 快速入门

    安装Scrapy Scrapy是一个高级的Python爬虫框架 它不仅包含了爬虫的特性 还可以方便的将爬虫数据保存到csv json等文件中 首先我们安装Scrapy pip install scrapy 在Windows上安装时可能会出现
  • 【实用】Mysql 按照时间(年月周日)维度统计,不存在时间数据 自动补充 0 数值

    前言 ps 网上看了一大堆文章 介绍的东西真的是很够呛 就没一个能真正用起来的 各个都是自动补 然后很多都是不好用的 我自己整理一篇 这是真能用 本篇内容 按照 日 周 月 年 的维度 去对数据 做分组统计 不存在的数据自动补充 0 实用
  • 村长告诉你:Python实现性能自动化测试竟然如此简单

    一 思考 1 什么是性能自动化测试 性能 系统负载能力 超负荷运行下的稳定性 系统瓶颈 自动化测试 使用程序代替手工 提升测试效率 性能自动化 使用代码模拟大批量用户 让用户并发请求 多页面多用户并发请求 采集参数 统计系统负载能力 生成报
  • 记一次QuartzScheduler启动后无法正常执行定时任务的问题

    最近想研究一下爬虫 由于爬虫工具服务端采用的是docker镜像的方式 为了让docker环境和系统环境分开 PS 纯粹不想在windows机让安装太多这些有一定的系统侵入的程序 所以就准备下载一个VMware 搞个虚拟机 然后在虚拟机上装个
  • [计算机毕业设计]元学习方法的小样本图像分类算法

    前言 大四是整个大学期间最忙碌的时光 一边要忙着准备考研 考公 考教资或者实习为毕业后面临的就业升学做准备 一边要为毕业设计耗费大量精力 近几年各个学校要求的毕设项目越来越难 有不少课题是研究生级别难度的 对本科同学来说是充满挑战 为帮助大
  • Vue8基础:事件处理

    1 事件处理 1 绑定监听 v on xxx fun xxx fun xxx fun 参数 默认事件形参 event 隐含属性对象 event 2 事件修饰符 prevent 阻止事件的默认行为 event preventDefault s
  • LLE原理及推导过程

    1 概述 所谓LLE 局部线性嵌入 即 Locally Linear Embedding 的降维算法 在处理所谓流形降维的时候 效果比PCA要好很多 首先 所谓流形 我们脑海里最直观的印象就是Swiss roll 在吃它的时候喜欢把它整个摊
  • 学习使用Shader处理纹理

    使用Shader处理纹理本是件简单的事情 但是我在尝试写一个简单的例子的时候却犯了个错误 导致郁闷了一天 这个稍后再说 先整理下怎么用Shader处理纹理吧 1 原理 用Shader处理纹理的原理其实很简单 将纹理通过一个uniform变量
  • 游戏王决斗连接显示服务器错误,游戏王决斗链接

    游戏王决斗链接公测常见问题一览 游戏王决斗链接最近也是正式公测啦 许多小伙伴在公测游玩中遇到了许多问题 下面就让小编带大家了解一下常见问题的解决方法吧 游戏王决斗链接公测常见问题 一 公测删档吗 不删档 决斗王链接在公测之前进行了好几次删档
  • windows修改mysql的my.ini文件导致服务启动失败

    windows修改mysql的my ini文件导致服务启动失败 解决 my ini的编码格式为ANSI 当我在服务器电脑直接打开编辑然后保存 默认保存的编码格式utf 8 所以导致启动失败
  • 期货开户用心服务每个客户

    用心服务每一个客户 以信为本 点石成金 蓄之既久 其发必速 如果价格连续多天在 个狭窄的幅度内升降 在图表上形成一幅有如建筑地盘布满地基桩的图景 习惯上称之为密集区 亦即专家所说的技术支持区 这个密集区一旦向上突破或向下突破 就会造成一个烈

随机推荐

  • C语言输出指针变量地址(十六进制)

    include
  • 微信小程序使用canvas绘制二维码实现跳转小程序

    开始接到这个需求的时候 我查阅文档获取小程序码 微信开放文档 发现两种途径 需要后端在服务器上调用接口拿到二维码 因为调用的 https api weixin qq com这个域名是不允许上白名单 或者是云开发 显然他们不需要云开发 这时候
  • C++ if 语句

    一个 if 语句 由一个布尔表达式后跟一个或多个语句组成 语法 C 中 if 语句的语法 if boolean expression 如果布尔表达式为真将执行的语句 如果布尔表达式为 true 则 if 语句内的代码块将被执行 如果布尔表达
  • Unity上玩转数字人(Avatar)

    现在数字人越来越有趣了 现在好多公司都在做 那我也想在Unity玩转一下 怎么玩呢 1 数字人准备以及跳舞动画 首先我们需要有数字人资源 数字人资源从哪来呢 第一你可以直接去Unity assetstore上去搜一下免费的数字人 有2个还是
  • C# 网络编程之获取本机名、ip地址、域名、物理位置

    在C 网络编程中 主机域名与ip之间能相互转换 同时DNS中有Dns类 IPHostEntry类 IPAddress类 DnsPermission类实现DNS的一些简单功能 下面主要讲述一个C 的Windows应用程序 实现以下功能 1 获
  • git 和 svn

    在对比集中式版本控制svn和分布式的版本控制git的时候可能会有一些疑问 例如 git 不联网可以使用吗 集中式版本控制系统的好处是什么 以下总结了一些问题的对比 都是个人理解 如有不正确的请指正 设计思路 git 分布式的核心设计是同步
  • C++学习练习 之文件操作

    C 学习练习 之文件操作 程序运行时产生的数据都属于临时数据 程序一旦运行结束 都会被释放 通过文件可以将数据持久化 C 中对文件操作需要包含头文件 lt fstream gt 文件类型分为两种 1 文本文件 文件以文本的ASCII码形式存
  • Java基础--IO操作

    一 IO原理及分类 一 IO原理 1 I O是Input Output的缩写 I O技术是非常实用的技术 用于处理设备之间的数据传输 如读写文件 网络通信等 2 java程序中对于数据的输入 输出操作一般都是以流的方式进行 3 java i
  • 2023华为OD机试真题 Python【报文回路】

    题目 在 IGMP 协议中 存在两种重要的报文 查询报文和响应报文 这两种报文负责维持组播通路 在一个通路中 ROUTER 会定期给 HOST 发送查询报文 收到查询报文的 HOST 应该回复一个响应报文 从而保持两者的连接状态 如果某个
  • Emojify – Create your own emoji with Deep Learning 通过深度学习创建你自己的表情

    全文总览 本文目的 原文链接 我的电脑环境 数据集下载 代码下载 本文目的 深度学习初级项目 Emojify Create your own emoji with Deep Learning 通过深度学习创建你自己的表情 本文旨在描述源代码
  • 华为OD机试 - 需要打开多少监控器(Java & C)

    题目描述 某长方形停车场 每个车位上方都有对应监控器 当且仅当在当前车位或者前后左右四个方向任意一个车位范围停车时 监控器才需要打开 给出某一时刻停车场的停车分布 请统计最少需要打开多少个监控器 输入描述 第一行输入m n表示长宽 满足1
  • Vscode代码量统计

    Vscode代码量统计 安装vscode扩展插件 开始统计 结果 安装vscode扩展插件 插件商城中搜索 VS Code Counter 开始统计 安装完毕后 重新加载vscode 快捷键ctrl shift p输入指令 结果
  • angular中@ViewChild、@ViewChildren的使用

    ViewChild和 ViewChildren会在父组件钩子方法ngAfterViewInit调用之前赋值 获取DOM节点 1 在html中给DOM节点设置一个模板应用变量myBox div 我是一个div div 2 在js中引入View
  • nvm安装完node后确无法使用node和npm

    问题 nvm安装了两个node版本后 使用use切换到指定版本 确还是不能使用node和npm 解决办法 找到nvm得安装位置 打开setting配置文件发现node的位置是错误的 两个版本的node都是安装在nvm文件夹下的 所以修改配置
  • TensorFlow基础(六)--TensorFlow中常用的优化器的对比与选择(Optimizer)

    目录 1 优化器的作用 2 常用的优化器 Optimizer 3 各种优化器的对比 3 1三种梯度下降法的对比 3 2 SGD 梯度下降 3 3 Momentum 3 4 NAG Nesterov accelerated gradient
  • Windows10系统服务优化及分析(批处理)

    对于Win10来说 除了UI的变动外 微软还根据用户体验做了一些功能的增强和更改 在我看来 Win10本身启动的服务都是为了系统运作更加完美而增加的 但是对于很多人来说 Win10的很多功能很少用 甚至用不到 对于这样的功能如果不关闭的话
  • Java中IO流,输入输出流概述与总结

    总结的很粗糙 以后时间富裕了好好修改一下 1 Java语言定义了许多类专门负责各种方式的输入或者输出 这些类都被放在java io包中 其中 所有输入流类都是抽象类InputStream 字节输入流 或者抽象类Reader 字符输入流 的子
  • 09FMPEG的AVFrame结构体分析

    09FMPEG的AVFrame结构体分析 概述 该结构体位于libavutil库中的frame h中 1 AVFrame结构体 typedef struct AVFrame define AV NUM DATA POINTERS 8 指向图
  • Anaconda环境下的opencv实现人脸检测

    文章内容 本文主要介绍python3 9 Anaconda pytorch Jupyter Opencv安装教程 以及opencv的图片加载以及人脸检测 目录 一 anaconda的安装 二 pytorch的安装 三 Jupyter的配置
  • 订单系统设计 —— 数据同步与监控

    文章目录 一 方案背景 1 1考虑因素 1 2 数据特点 二 增量同步方案 2 1 并发消费 2 2 顺序消费 2 3 1 N关联数据 三 存量同步方案 3 1 并发同步 3 2 基于视图同步 四 监控与补偿机制 4 1 延迟监控 4 2