编码也需要架构思维

架构是各种场景&方案的积累,应用和平衡

问题点

  1. 引入新工具或者方案解决问题,却没有考虑到新工具和方案的弊端

  2. 性能问题编码前考虑较少,更多部分放在编码后专项解决

  3. 编码面向当下需求,而非解决抽象问题

原因分析

  1. 人为主观因素,比如:态度消极,得过且过 等。 排除这种原因

  2. 对新工具和方案理解不完整,知其然不知其所以然

  3. 非功能性需求应该在伴随着系统开发的每个阶段

  4. 系统需解决一类问题,而某个问题

解决办法

  1. 沉淀新工具和新方案,对典型场景的解决方案进行总结

  2. 系统学习和总结容量设计,性能分析和优化思路

  3. 如果不是面对一个概念,那么只是解决一个问题,而非一类问题

数据存储

  • 用途:数据存储是算法的基础,合适的存储可以简化算法和提升交互性能

  • 分类:关系型横表,关系型纵表,列式数据库,文档型数据库,时序数据库等

  • 关系数据库横表:宽表和数据冗余解决join的性能问题;乐观锁和悲观锁解决分布式数据处理一致性问题;主从读写分离;横向拆分(如:按照时间维度拆分);纵向拆分(属性冷热不同,基本信息和更多信息)

负载均衡

  • 用途:解决单点不可靠问题

  • 分类:DNS轮询,F5硬件负载均衡,Nginx/Getway软件负载均衡,http调用第三方服务负载均衡,调用第三方中间件的负载均衡,调用DB连接的负载均衡

  • 涉及问题:分流算法(轮询,hash); 存活检测

缓存:

  • 用途:热点数据的访问效率

  • 分类:CDN静态文件缓存;Nginx缓存;服务内缓存;缓存中间件;ORM缓存

  • 涉及问题:预热/冷启动,穿透(访问没有的数据,布隆过滤器),击穿(热点数据过期,差异化过期时间),雪崩(大量热点数据同时过期导致DB负担增加),命中率,数据一致性(更新和淘汰策略),缓存展示和运维

MQ消息队列

  • 用途:解耦,解决组件间处理速度不一致问题

  • 发送消息类型:异步发送消息(不可靠); 事务消息(同步等待MQ持久化); 消费后回调; 广播消息(所有Customer都可消费)

  • 消费消息类型:及时消费;延迟消费(延迟消息); 顺序消息(消费和生成顺序一致)

  • 涉及问题:消息去重;处理消息幂等

分布式:

  • 用途:解决单点故障,单点容量问题

  • 组件分类:网关,服务治理(服务注册和发现,Eureka ),ID生成器(重复,有序),负载均衡

  • 典型问题:分布式事务数据一致性问题;分布式锁(等待,有序,过期时间);服务拆分依据(DDD); 部署灰度升级问题(DB升级和服务灰度升级,向前兼容);定时任务; MyCAT&动态数据源

  • 工具:日志收集ELK;链路追踪;

典型场景和方案

  • 权限控制方案:RBAC模型(用户--角色--权限);SSO单点登录;OAuth2

  • 流控方案:令牌桶(Token bucket)

  • 摘要算法:保证数据没有被篡改,MD5算法,单向不可逆;

  • 短网址系统

  • 工作流&状态机设计和使用:

  • 异步替换同步方案:

  • 站内消息:webSocket

  • 秒杀场景

  • 批量处理和流处理

  • 站内检索:MySQL like;索引;ES

  • 日志收集:单系统写日志(1S写一次/1M写一次);ELK

  • 即时消息

相关推荐
2301_322414280410 小时前
活力孕康复APP 47737- 原创(免费领源码+部署教程+开发环境)
java·vue.js·spring boot·mysql·微信小程序·idea·微信开发者工具
君顾110 小时前
外卖CPS软件开发实战:从系统架构到部署全流程指南
java·开发语言·外卖
vx_Biye_Design11 小时前
springboot游泳馆系统93765-计算机课程设计、毕业设计
java·javascript·spring boot·后端·python·spring·课程设计
名字还没想好☜11 小时前
Java NIO ByteBuffer 实战:flip/clear/compact 三个绕晕人的方法与 position/limit 心智模型
java·开发语言·后端·spring·nio
Wang's Blog11 小时前
Java框架快速入门: Spring Security+OAuth2之短信服务多供应商动态切换(阿里云与LeanCloud)
java·spring·阿里云
Doubbbbbbble云11 小时前
区间合并问题的常见算法模式与优化思路4
java·数据结构·算法
小溪学编程11 小时前
AQS 原理详解:从 CLH 队列到 ReentrantLock 的实现
java·开发语言
蜗牛互联网11 小时前
语音AI开始边听边说,改变的不只是响应速度
java·人工智能·后端·语音识别
卓怡学长12 小时前
w233基于vue和springboot的宠物管理系统的设计与实现
java·vue.js·spring boot·spring·intellij-idea
我命由我1234512 小时前
人脸识别 - 去重时间窗口
java·开发语言·python·学习·java-ee·学习方法·python3.11