10-03 单元化架构设计
设计原则
透明
- 对开发者透明
在做实现时,不依赖于单元划分和部署 - 对组件透明
在组件运行时,不感知其承载单元 - 对数据透明
数据库并不知道为哪个单元提供服务
业务可分片
- 系统业务复杂度足够高
- 系统可以按照某一维度进行切分
- 系统数据必须可以被区分
业务自包含
- 同一业务功能必须在单元内完成
- 同一业务操作所需数据也在该功能单元内
- 尽量避免跨单元依赖
单元化设计三要素

系统切分
业务切分
- DDD切分领域服务、数据和业务流程
- 切分出的服务和数据属于同一单元
- 出现交集(重叠)时,以单元间访问量做决策指标
- 业务流程所需组件和数据划分在同一单元
- 一个业务流程在同单元执行,保证性能和稳定性
- 尽量避免跨单元的服务访问和数据库读写
- 同单元高内聚,单元间低耦合
- 与组织架构和核心业务流程强相关
- 核心业务保证高可用,高增长必须单元化部署
- 边缘业务跟随核心业务数据分配单元
- 功能粒度要适当
- 粗粒度单元,轻易超过单元资源承载上限,需要二次拆分
- 细粒度单元,单元内资源浪费,性价比低
- 开发团队随单元化架构调整
- 整个过程要持续迭代
按用户属性切分
- 用户属性对系统核心功能有决定性作用
- 外卖、叫车、共享等业务严重依赖于用户的地域属性
- VIP用户、大买家等不同类型的用户
- 新建用户按规则自动分配单元,存量数据按规则做数据迁移
- 相同属性的数据聚集在同一单元
- 一个单元内完成系统所有核心业务,单元内不再按功能拆分
- 数据ID规则
- 不同单元同时生产数据,且数据有同步需求,ID必须保证跨单元不重复
- 由ID可以按规则推算所属单元
- 用户属性划分导致单元规模层次不齐
- 过于庞大的单元,二次拆分
- 合并多个小单元为一个常规单元
- 当用户属性改变时、系统自动同步数据
- 该类属性是低频变化
- 系统同步速度高于属性变化速度
按数据切分
- 按照数据某种属性进行单元划分
- 无业务含义,不可更改,不重复,一般选ID或者时间戳
- 水平扩展上限高
- 账户、订单、流水、商户、商品等比较易于切分
- 通过规则推算所属单元
- 设计规则是数据均分
单元分配的数据比例等于其整体流量比例 - 无业务依赖,跨单元访问不可控
引入中间件实现开发者透明 - 无法切分的数据,高频访问,创建特殊附属单元
- 该单元必须与切分单元在同一数据中心、机房,以降低访问延时
- 任意切分单元对附属单元的写入都会同步到其他附属单元
- 大部分系统都是写少读多,写复制的成本远低于高频读操作
- 数据实时性要求高的系统可能会失败
- 无法切分的数据,低频访问,系统共享同一单元
- 低频读写,时延不影响主业务,代价可接收
- 根据数据中心距离,选择与所有数据中心都相对最近的数据中心作为共享单元的部署地
- 单元内部垂直切分
单元瓶颈优秀考虑内部垂直切分 - 综合库
创建单独的综合库,同步汇总所有单元的数据,供非实时业务使用
单元组成的元素
- 组件
- 服务,业务逻辑
- 不直接被单元外访问
- 独立构建、发布
- 数据
仅限该单元数据 - 中间件
- 内部通信
- 与单元路由有关的中间件
- 反向代理
- 单元内服务的反向代理服务器,供外部访问
- 单元选择功能的路由器
- 安全和控制策略的中心
- 网关
- 单元内访问外部服务的代理服务器
- 单元选择功能的代理服务器
单元路由
外网访问
- 为不同数据中心的不同单元分配不同域名
- 建立全局路由规则服务
- 或客户端登录后本地计算所属单元(或数据中心)
- 客户端直接访问所属单元
- 未改造客户端、匿名用户等
- 利用公有云就近提供服务
- 由业务服务设置Cookie标志指定所属单元
- tag、Cookie或URL参数指定要访问单元
公有云或CDN提供次服务
单元网关
- 单元网关也是该单元的反向代理服务器
- 单元网关根据规则计算请求所属单元
- 属于当前单元,直接路由请求到正确的组件(服务)
- 属于其他单元,转发到对应的正确单元并上报路由错误信息
- 无法判定,根据路由规则发送给组件,由业务逻辑进一步分辨
应用层
- 统一封装的开发框架处理请求,在拦截器或者过滤器层对开发者透明
- 根据请求计算所属单元,属于本单元则继续处理
- 不属于本单元则转发
- 无法判定就交予业务逻辑层或数据库访问层来决定
- 业务层
- 普通对单元无感知的业务,按原有逻辑直接处理
- 依赖于单元信息的业务,可以自行计算或从容器注入单元信息
中间件
- 远程调用框架要透明化支持自动单元路由
- RPC
- HttpClient
- 根据请求计算出正确的目标单元并自动路由
- 数据访问层
- 最后防线
- 通过数据访问的驱动程序或框架改造,使其对开发者透明
- 如果有误,将错误的访问路由到正确的数据库(或表)
数据复制
- 单元化的数据为本单元组件服务
- 依赖决定是否需要复制数据
- 单元间互相复制
- 通过数据中台复制
- 根据业务场景选择
- 强一致、最终一致
- 最大数据延迟
- 读写失败对业务的影响
- 关系型数据库复制
MySQL、Oracle - NoSQL数据库复制
MongoDB、Redis - 消息中间件复制
Kafka,RabbitMQ
实例
电商

外卖

相关文章:
10-03 单元化架构设计
设计原则 透明 对开发者透明 在做实现时,不依赖于单元划分和部署对组件透明 在组件运行时,不感知其承载单元对数据透明 数据库并不知道为哪个单元提供服务 业务可分片 系统业务复杂度足够高系统可以按照某一维度进行切分系统数据必须可以被区分 业务…...
JAVA—实验3 继承与多态
一、实验目的 1.掌握类的继承机制 2.掌握抽象类的定义方法 2.熟悉类中成员变量和方法的访问控制 3.熟悉成员方法或构造方法的多态性 二、实验内容 1. Circle类及其子类 【问题描述】 实现类Circle,半径为整型私有数据成员 1)构造方法:参数为…...
TCP协议和相关特性
1.TCP协议的报文结构 TCP的全称为:Transmission Control Protocol。 特点: 有连接可靠传输面向字节流全双工 下面是TCP的报文结构: 源端口和目的端口: 源端口表示数据从哪个端口传输出来,目的端口表示数据传输到哪个端口去。…...
【SpringCloud组件——Eureka】
前置准备: 分别提供订单系统(OrderService)和用户系统(UserService)。订单系统主要负责订单相关信息的处理,用户系统主要负责用户相关信息的处理。 一、微服务当中的提供者和消费者 1.1、概念 服务提供…...
JVM面试题(一)
JVM内存分哪几个区,每个区的作用是什么? java虚拟机主要分为以下几个区: JVM中方法区和堆空间是线程共享的,而虚拟机栈、本地方法栈、程序计数器是线程独享的。 (1)方法区: a. 有时候也成为永久代,在该区内…...
c# 无损压缩照片大小,并且设计了界面,添加了外部Ookii.Dialogs.dll,不一样的选择文件夹界面,并且可以把外部dll打包进exe中
c# 无损压缩照片大小,并且设计了界面,添加了外部Ookii.Dialogs.dll,不一样的选择文件夹界面,并且可以把外部dll打包进exe中 using System; using System.Collections; using System.Collections.Generic; using System.ComponentM…...
《统计学习方法》——隐马尔可夫模型(上)
引言 这是《统计学习方法》第二版的读书笔记,由于包含书上所有公式的推导和大量的图示,因此文章较长,正文分成三篇,以及课后习题解答,在习题解答中用Numpy实现了维特比算法和前向后向算法。 《统计学习方法》——隐马…...
ElasticSearch删除索引【真实案例】
文章目录 背景分析解决遇到的问题 - 删除超时报错信息解决办法1:调大超时时间解决办法2:调大ES堆内存参考背景 项目中使用了ELK技术栈实现了日志管理,但是日志管理功能目前并没有在生产上实际使用。 但ELK程序依然在运行,导致系统磁盘发生告警,剩余可用磁盘不足10%。 所以…...
基于FPGA+JESD204B 时钟双通道 6.4GSPS 高速数据采集设计(三)连续多段触发存储及传输逻辑设计
本章将完成数据速率为 80MHz 、位宽为 12bits 的 80 路并行采样数据的连续多 段触发存储。首先,给出数据触发存储的整体框架及功能模块划分。然后,简介 MIG 用户接口、设置及读写时序。最后,进行数据跨时钟域模块设计,内存…...
对 Iterator, Generator 的理解?
Iterator Iterator是最简单最好理解的。 简单的说,我们常用的 for of 循环,都是通过调用被循环对象的一个特殊函数 Iterator 来实现的,但是以前这个函数是隐藏的我们无法访问, 从 Symbol 引入之后,我们就可以通过 Sy…...
C++基础
文章目录 C命名空间定义命名空间using指令不连续的命名空间嵌套的命名空间 面向对象类类成员的访问权限及类的封装对象类成员函数类访问修饰符构造函数和析构函数类的构造函数带参数的构造函数使用初始化列表来初始化字段类的析构函数拷贝构造函数 友元函数内联函数this指针指向…...
软件测试全流程
软件测试全流程 一、制定测试策略二、制定测试方案三、编辑测试用例四、执行测试用例五、输出问题单六、回归测试七、测试文件归档 一、制定测试策略 1、测试目的测试范围 2、用什么测试方法工具(例如功能测试用黑盒测试) 3、测试优先级(功能…...
【软件测试】支付模块测试攻略,这些测试方法和注意事项你掌握了么?
对于大部分人而言,支付模块或许是日常生活中最为关注和使用的功能之一,因此,对于支付模块的质量控制也显得尤为重要。 但考虑到支付涉及到金钱流转等敏感信息,一旦出现问题可能带来非常严重后果。因此,在支付模块测试…...
刷完这个笔记,17K不能再少了....
大家好,最近有不少小伙伴在后台留言,得准备面试了,又不知道从何下手!为了帮大家节约时间,特意准备了一份面试相关的资料,内容非常的全面,真的可以好好补一补,希望大家在都能拿到理想…...
知识变现创业指南-《知识变现秘籍》
《知识变现秘籍》 知识变现创业者指南 读完将改变你的认知 开阔你的知识变现思路 系统掌握知识变现的要点 知识付费创业方法 帮你利用知识赚到你弟一桶金 如果你有一技之长,想变现 如果你有一身才华,想变现 如果你在某个领域有绝活 如果你是&am…...
springboot+java博物馆文物管理系统
用户前台进入系统可以进行首页、文物信息、论坛交流、文物资讯、留言反馈、我的、跳转到后台等springboot是基于spring的快速开发框架, 相比于原生的spring而言, 它通过大量的java config来避免了大量的xml文件, 只需要简单的生成器便能生成一个可以运行的javaweb项目, 是目前最…...
Ansible 自动化运维工具(二)——Ansible 的脚本(playbook 剧本)
Ansible 自动化运维工具—Ansible 的脚本playbook 剧本 playbooks 概述以及实例操作playbooks 的组成操作示例一:编写yaml文件也就是playbook修改配置文件并放入/opt/目录下运行playbook 操作实例二:定义、引用变量操作示例三:指定远程主机su…...
阿里云镜像服务下载并安装Go环境
【阿里云镜像】下载并安装Go环境 一、参考链接 阿里巴巴开源镜像站-OPSX镜像站-阿里云开发者社区 (aliyun.com) golang镜像-golang下载地址-golang安装教程-阿里巴巴开源镜像站 (aliyun.com) GO语言安装以及国内镜像 - DbWong_0918 - 博客园 (cnblogs.com) 二、Go介绍 Gol…...
工作线程快速优雅退出方式探讨
本文我们不用定时器。定时器会阻塞消息循环。先看需求: 我们先看第一种,有一个任务,要求每1秒钟执行一次,最常见的写法如下两种 bool bExitThread false; DWORD WorkThread1(LPVOID param) {while (false bExitThread){//// to…...
甘特图控件DHTMLX Gantt教程:用PHP:Laravel实现Gantt(上)
DHTMLX Gantt是用于跨浏览器和跨平台应用程序的功能齐全的Gantt图表。可满足项目管理应用程序的大部分开发需求,具备完善的甘特图图表库,功能强大,价格便宜,提供丰富而灵活的JavaScript API接口,与各种服务器端技术&am…...
Veo 2提示词效能跃迁实战(工业级Prompt链构建全图谱)
更多请点击: https://codechina.net 第一章:Veo 2提示词编写的核心范式演进 Veo 2作为新一代视频生成模型,其提示词(prompt)工程已从早期的“关键词堆叠”转向结构化、语义分层与意图对齐的复合范式。这一演进并非简…...
番茄小说下载器终极指南:三步构建你的离线阅读自由王国
番茄小说下载器终极指南:三步构建你的离线阅读自由王国 【免费下载链接】Tomato-Novel-Downloader 番茄小说下载器不精简版 项目地址: https://gitcode.com/gh_mirrors/to/Tomato-Novel-Downloader 你是否曾在地铁里读到精彩章节时突然断网?是否在…...
保姆级教程:Windows系统下Arcgis 10.2从下载、安装到汉化一次搞定(附常见License启动失败解决方案)
Windows系统下Arcgis 10.2完整安装与汉化实战指南第一次接触Arcgis的新手往往会被复杂的安装流程和神秘的License Manager搞得晕头转向。作为一款功能强大的地理信息系统软件,Arcgis在科研、城市规划、环境监测等领域有着广泛应用,但它的安装过程确实会让…...
skills CANN开源社区贡献技能包开发指南
前言 开源社区的健康运转,不仅依赖核心代码的贡献,还需要降低贡献门槛、提供清晰的指南和自动化工具。skills仓库是CANN开源社区的"贡献技能包",提供了一系列辅助脚本、代码模板、CI检查和文档生成工具,帮助新手快速上…...
电信运营商每月处理海量工单,如何不再出错?基于AI Agent的端到端自动化解决方案
在2026年的电信行业,海量工单处理已不再仅仅是效率问题,而是合规与生存的底线。随着2026年5月20日《电信和互联网服务 基础电信企业网上营业厅服务规范》国家标准的正式实施,监管层对“信息透明、流程闭环、计费精准”的要求达到了前所未有的…...
巨量投放总结
巨量商务管理平台 : https://business.oceanengine.com 巨量广告投放平台: https://ad.oceanengine.com 商务管理平台 账户 广告组 计划 广告投放平台 层级关系: 广告组 -> 计划 -> 创意 对应FB: 系列 - > 广告组 -> 广告...
如何快速上手DeepPurpose?5分钟完成你的第一个药物-靶点相互作用预测模型
如何快速上手DeepPurpose?5分钟完成你的第一个药物-靶点相互作用预测模型 【免费下载链接】DeepPurpose A Deep Learning Toolkit for DTI, Drug Property, PPI, DDI, Protein Function Prediction (Bioinformatics) 项目地址: https://gitcode.com/gh_mirrors/de…...
Unity/Unreal开发者必看:用手机和陀螺仪实验,5分钟搞懂万向节死锁(附避坑指南)
Unity/Unreal开发者实战指南:用手机陀螺仪5分钟破解万向节死锁当你调试第一人称视角时,角色突然卡在墙面无法转动;当无人机模型在俯冲90度时失控乱转——这些很可能都是万向节死锁(Gimbal Lock)在作祟。作为实时3D开发中最恼人的数学陷阱之一…...
【DeepSeek集成测试黄金标准】:20年专家亲授5大避坑指南与自动化落地框架
更多请点击: https://intelliparadigm.com 第一章:DeepSeek集成测试黄金标准的演进与核心价值 集成测试在大语言模型工程化落地过程中已从“验证功能可用”跃迁为“保障推理一致性、上下文鲁棒性与安全边界的三位一体质量门禁”。DeepSeek系列模型&…...
C语言(12) 指针的常见操作
指针的常见操作指针变量,有两方面的意思:一个指针指向的内容(数据值,一级)指针变量本身存储的数据 (地址值)#include <stdio.h>int main() {int a 10;int b 0 ;int c 50;int *p NULL;int *q NULL;p &a; // 对指针变量本身进行修改// 对指…...
