数据库存储架构
数据库读写分离复杂度复制延迟
业务分级(常用)
读写绑定
二次读取
任务分解
代码封装
中间件封装
分库分表垂直拆分-提升单机处理性能按照业务将表进行分类,分布到不同的数据库上面。
水平拆分-提升集群处理性能按行切分。
复制架构
设计存储架构
分片架构与分区架构分片架构通过叠加服务器来提升写性能和存储性能。
分区架构通过冗余IDC来避免城市级别的灾难,并提供就近访问。
常见存储系统剖析存储系统学习方法
理解技术本质
明确部署架构
研究数据模型
模拟业务场景
设计合理的架构
架构师职责架构师是业务与技术之间的桥梁。
核心能力
判断-确定性思维
拆解-创造性思维
取舍-系统性思维
主要职责架构设计前期
澄清不确定性
识别复杂需求
与业务方交流
与利益干系人交流
业务架构图
核心场景流程
架构设计中期
选择、设计备选方案
架构小组讨论
方案评估
方案汇报
架构设计后期
细化架构
完善架构
写文档
架构宣讲
最终的架构文档
架构设计前期
架构设计中期
架构设计后期架构设计文档
业务背景
约束&限制
总体架构设计
详细架构设计
架构质量设计
架构演进规则
详细架构设计
架构规范
架构质量
架构设计关键点
可扩展架构设计鸡蛋篮子第一法则拆分法则
拆分颗粒度内部复杂度可以用参与的开发人数来衡量单个拆分对象的复杂度。三个火枪手原则。
外部复杂度可以用业务流程涉及对象数量来衡量外部复杂度。
高性能架构设计鸡蛋篮子第二法则叠加法则
高可用架构设计鸡蛋篮子第三法则冗余法则
分类
计算高可用
存储高可用
架构质量可测试性软件系统在测试环境下能否方便的支持测试各种场景的能力。
可维护性软件系统支持定位问题、修复问题的能力。
可观测性软件系统对外展现内部状态的能力 可观测性是可测试性、可维护性的基础。
架构设计及概念
架构定义系统拆分
按逻辑拆分:模块
按物理拆分:组件
4R架构定义
Rank:顶层架构
Role:角色组成
Relation:角色关系
Rule:运作规则
架构分类按业务划分
业务架构图
按领域划分
客户端架构图
前端架构图
后端架构图
面向复杂度的架构分析本质架构设计是为了降低软件系统的复杂度。
架构设计三原则合适原则合适优于业界领先。
简单原则简单优于复杂。
演进原则演化优于一步到位。
ProcessOn模板免费下载
前言使用js脚本免费获取自己想要的模板。
获取目标数据访问自己想要使用的模板页,通过F12得到def数据并复制。
模拟数据思维导图复制数据将上述【获取目标数据】的def值复制下来填充到以下模板中。
12let newO = '复制的def值'o = JSON.parse(newO);
新建空白思维导图在自己的工作空间新建一个空白的思维导图
填充数据
在自己绘制的思维导图页面打开F12进入调试模式,刷新页面。使用Ctrl + P命令搜索 mind.js。
格式化数据,通过Ctrl + F搜索关键字 getNewDef,找到赋值行打上DEBUG。
刷新页面,节点会停留在DEBUG的行。此时将【复制数据】中的代码粘贴到console中并执行。
F8继续执行原脚本,此时,可以发现绘图区域已是想要的模板了。
导出模板。
流程图
将上述【获取目标数据】的def值复制下来填充到以下代码模板中。
1Designer.open('复制的def值')
在自己新建的流程图绘图页面打开F12,在console中执行上述脚本。
下载模板。
关于服务监控的思考
目前开源的组件如Skywalking、Zipkin只能做到横向监控,没法针对某一时间段方法纵向监控和告警。基于这种痛点和对一些组件的了解,自己写了一套可满足自己业务需求的服务监控组件,结合了Grafana、Loki、Promtail、Elasticsearch、Kafka等,可实现服务接口级监控、监控告警、告警日志在线查看等特性。
基础组件
Grafana:Grafana 搭建
Loki:轻量级日志采集Loki搭建
Elasticsearch:介绍及使用文档
消息中间件:kafka
服务监控组件(未开源):service-profiler
设计思想
Client收集服务调用信息后生成数据快照(Snapshot),通过Kafka定时上报到Server端。Client通过Promtail采集错误日志上报到Loki服务器。
Server端统计聚合Client端上报的信息后落库ES。Loki服务端接收到Client端上报的日志后存储至磁盘并生成索引。
通过Grafana整合统计信息和错误日志,通过丰富的仪表盘实时展示相关指标与分析结果。
当相关指标超过自定义阈值时,通过通知平台告警到相关研发 ...
异步编程之ExecutorCompletionService
ExecutorCompletionService是JDK1. 6中新增的异步类,可获取异步执行的结果。有着相同功能的ExcutorService中Future.get方法是阻塞的直到返回结果,也就是顺序执行get方法,即使后续任务先执行完成也会阻塞在前面的任务的get方法。而ExecutorCompletionService执行结果无序且线程池中先执行完成的任务会先执行后续的逻辑,不会发生阻塞。
异步任务获取结果方式多线程异步任务获取结果最常见的方式莫过于重写Callable接口,然后通过future.get()获取结果。但这种方法弊端很明显,get方法会产生阻塞,导致任务耗时增加。当前有三种方法可以实现异步任务获取结果:
重写Callable,通过future.get获取结果。
CompletableFuture异步通过join方法获取结果。
通过ExecutorCompletionService获取结果。
Callable123456789101112131415161718192021222324252627282930313233343536373839404142434 ...
异步编程之CompletableFuture
在Java8中新增了CompletableFuture类,该类实现了Future和CompletionStage接口。提供了强大的Future扩展功能,简化了异步编程的复杂性,提供了函数式编程的能力。可通过异步回调方式处理结果,还可以对任务进行组合处理。
概览
创建异步任务CompletableFuture提供了四个静态方法来创建一个异步操作。
123456// 无返回值public static CompletableFuture<Void> runAsync(Runnable runnable)public static CompletableFuture<Void> runAsync(Runnable runnable, Executor executor)// 有返回值public static <U> CompletableFuture<U> supplyAsync(Supplier<U> supplier)public static <U> CompletableFuture<U> s ...
