Home - hippowc/hippowc.github.io GitHub Wiki
全干工程师的自我修养
运营用研
产品设计
思考闭环与数据验证: 竞品调研
技术设计
在做整体架构和技术设计时一般需要考虑如下问题:
- 容量评估:根据应用场景,评估硬件资源与架构方案
- 数据量
- 并发量
- 带宽
- 机器资源
- 如何不断提高服务性能(高性能)
- 单机性能策略
- 硬件:内存》硬盘》网络
- 根据特定场景设计数据结构和算法
- 系统分层
- 最简单场景:一台服务器 + 本地数据库
- 整体应用性能瓶颈
- 集群:横向增加机器
- 负载均衡
- 应用拆分,分为不同子系统、微服务
- 配置中心:服务发现与治理
- RPC:服务间调用
- 消息队列:异步消峰
- 集群:横向增加机器
- 查询性能瓶颈
- 缓存
- 搜索引擎
- 数据库主从、读写分离
- CDN
- 单机性能策略
- 如何保证系统可用性(高可用)
- 单机可用性策略
- 事前:监控
- 事中:限流、熔断
- 事后:日志,恢复
- 冗余策略:通过冗余备用服务,在发生故障时转移到备用服务
- 心跳检查:心跳机制
- 故障自动转移
- 统一访问入口,虚拟IP
- master、slave选举
- 单机可用性策略
- 可扩展 -- 扩展性问题
- 功能扩展
- 通过接口划分系统边界
- 解耦
- 代码级别:二方库、功能包
- 运行级别:Java相关 -- classLoader、OSGI
- 服务级别:拆分为多个服务或系统
- 数据扩展
- 提升数据扩展性:主数据放在同一表,扩展属性采用 cate + data
- 数据量大,数据分片
- 垂直拆分:不同业务数据放在不同库
- 水平拆分:分库分表,建议分库不要分
- 功能扩展
- 如何保证数据一致性(一致性设计),即,如何保证多个操作同时成功或者同时失败
- 单一数据库
- 本地事务
- 分布式系统
- 强一致
- 规避分布式事务,将多个不同系统接口整合称为本地事务
- 两阶段提交
- 三阶段提交
- TCC等
- 最终一致
- 本地消息表(eBay模式):将需要分布式处理的任务,通过消息日志异步执行,消息日志存于文本、数据库或消息队列;失败后可自动或人工处理
- 本地操作与消息日志强一致
- 消息消费接口幂等
- 重试机制
- MQ消息事务
- 本地消息表(eBay模式):将需要分布式处理的任务,通过消息日志异步执行,消息日志存于文本、数据库或消息队列;失败后可自动或人工处理
- 强一致
- 单一数据库
- 安全性设计
- 系统安全,防止外部攻击
- XSS
- CSRF
- 数据安全
- 认证:单点登录
- 授权:OAuth2
- 技术产品
- 网关、授权中心、流程引擎
- 系统安全,防止外部攻击
技术开发
- 算法与数据结构
-
基础算法
- 基础数据结构
- 数组
- 优:根据下标随机访问
- 劣:
- 插入删除时为了维护连续性而需要数据移动
- 扩容需要拷贝
- 链表(单链表、双向链表、循环链表)
- 优:无需连续空间,插入删除方便
- 劣:
- 需要遍历查找
- 单个节点需要更多的存储空间
- 数组
- 衍生数据结构:基于不同应用场景产生的数据结构
- 栈:可基于数组或链表
- 应用场景:函数栈、表达式求值、括号匹配
- 优化点
- 增加栈顶指针(数组下标),可以O(1) 增删改查栈顶元素
- 队列:可基于数组或链表,操作受限,只在队头、队尾增删
- 应用场景:广度优先搜索
- 优化点
- 增加队头、队尾指针,可以O(1)增删改查队头队尾元素
- 衍生数据结构
- 循环队列
- 优化点
- 通过循环解决数组插入时数据迁移的问题
- 优化点
- 循环队列
- 哈希表或散列表:基于数组+链表(优化:数组+红黑树)
- 应用场景:缓存,等快速根据key值查询数据场景
- 优化点:
- 哈希函数:将key值转换为数组下标,key值可能是整型、浮点、字符串、日期等
- 基于数组下标随机访问。根据key值通过hash函数计算数组下标,实现O(1)增删改查
- 有序数组:基于数组
- 应用场景:通用查询场景
- 优化点
- 数据有序存储,便于查找
- 排序:冒泡、插入、选择 O(n)^2;归并、快排 O(nlogn);桶排序,计数排序,基数排序O(n)
- 二分查找,O(logn)
- 数据有序存储,便于查找
- 跳表:基于链表
- 应用场景:通用查询、修改、删除
- 优化点:
- 有序链表 + 链表索引,使得查询、插入、删除效率达到O(logn)
- 二叉查找树:基于数组或链表
- 应用场景:通用查询、修改、删除
- 优化点:
- 树形结构,弱有序,通过树结构使查询、插入、删除操作效率达到O(logn),有序数组插入删除操作为O(n)
- 堆:基于数组或链表
- 应用场景:topK(合并有序小文件),优先级队列,中位数
- 优化点:
- 树形结构,通过维护最值在堆顶,达到取最值效率O(1)
- 栈:可基于数组或链表
- 基础数据结构
-
机器学习算法
-
- 编程
- 编程范式:编程的方式,不同语言可能支持一种或多种不同范式
- 基础范式 - 命令式(imperative):变量存储数据,语句执行命令
- 过程式(procedural):在命令式基础上引入过程、函数
- 结构化(structure):在过程式基础上,提倡代码要有清晰的结构
- 结构化原理:任何程序都可以用:顺序、选择、循环三种基本控制结构表示
- 结构化(structure):在过程式基础上,提倡代码要有清晰的结构
- 特点:机器思维、重算法轻目标、擅长业务逻辑,交互式应用,提倡迭代
- 过程式(procedural):在命令式基础上引入过程、函数
- 基础范式 - 声明式(declarative):利用梳理逻辑或既定规范对已知条件进行推理和演算
- 函数式(functional):将计算描述为数学函数求值
- 逻辑式(logic):提供一系列事实和规则来推导或论证结论
- 特点:数学思维、重目标轻算法、擅长人工智能、编译器,提倡递归,着眼宏观规律
- 面向对象(object-Oriented):以数据为中心组织逻辑,将系统视为相互作用的对象集合
- 特点:适用于大型复杂、交互式、与现实世界密切相关的系统;以对象为基本模块单位,对象是具体事物的抽象和模拟,更人性化
- 泛型(Generic):将算法与其相关的数据结构分离,将数据结构泛化,最大限度重用算法
- 特点:算法 + 容器 + 迭代器(算法与容器的接口)
- 元编程(Meta):提升语言级别
- 特点:DSL,比通用语言更简单、抽象、专业,更接近自然语言和声明语言
- 切面(aspect-oriented)
- 特点:oop沿继承树纵向重用,aop沿横向方向重用
- 事件驱动:核心思想 -- 发布订阅模式
- 特点:事件处理器 + 注册事件处理器 + 事件循环,适用于图形界面
- 基础范式 - 命令式(imperative):变量存储数据,语句执行命令
- 语言学习(基于过程范式)
- 数据类型
- 基本数据类型(C语言),其他语言数据类型都是在基本类型基础上扩展
- 整型 int
- 浮点型 float
- 字符型 char
- 字符串
- 构造类型
- 数组
- 链表
- 结构体(自定义类型)
- 其他容器:基础构造类型的变种
- 哈希表
- 队列
- 指针
- 空类型
- 基本数据类型(C语言),其他语言数据类型都是在基本类型基础上扩展
- 流程控制
- 顺序
- 条件 if
- 循环 for、while
- 变量、常量与函数
- 变量
- 作用域:局部、全局
- 常量
- 函数
- 函数声明、调用
- 函数入参
- 传值、传引用、传指针
- 变量
- 数据类型
- API使用
- 标准工具类
- 字符串处理
- 容器使用
- IO
- 并发
- 三方工具类
- 如何使用三方包
- 标准工具类
- 开发框架
- 工程化
- 构建工具
- 常用语言
- Java
- C++
- Python
- Groovy
- 编程范式:编程的方式,不同语言可能支持一种或多种不同范式
测试运维
- 测试
- 运维
- 监控
- 产品
- grafana
- 产品
- 报警
- 产品
- Prometheus
- 产品
- 操作系统
- 虚拟机
- 集群管理