Home - hippowc/hippowc.github.io GitHub Wiki

全干工程师的自我修养

运营用研

产品设计

思考闭环与数据验证: 竞品调研

技术设计

在做整体架构和技术设计时一般需要考虑如下问题:

  • 容量评估:根据应用场景,评估硬件资源与架构方案
    • 数据量
    • 并发量
    • 带宽
    • 机器资源
  • 如何不断提高服务性能(高性能)
    • 单机性能策略
      • 硬件:内存》硬盘》网络
      • 根据特定场景设计数据结构和算法
    • 系统分层
      • 最简单场景:一台服务器 + 本地数据库
      • 整体应用性能瓶颈
        • 集群:横向增加机器
          • 负载均衡
        • 应用拆分,分为不同子系统、微服务
          • 配置中心:服务发现与治理
          • RPC:服务间调用
          • 消息队列:异步消峰
      • 查询性能瓶颈
        • 缓存
        • 搜索引擎
        • 数据库主从、读写分离
        • CDN
  • 如何保证系统可用性(高可用)
    • 单机可用性策略
      • 事前:监控
      • 事中:限流、熔断
      • 事后:日志,恢复
    • 冗余策略:通过冗余备用服务,在发生故障时转移到备用服务
      • 心跳检查:心跳机制
      • 故障自动转移
        • 统一访问入口,虚拟IP
        • master、slave选举
  • 可扩展 -- 扩展性问题
    • 功能扩展
      • 通过接口划分系统边界
      • 解耦
        • 代码级别:二方库、功能包
        • 运行级别:Java相关 -- classLoader、OSGI
        • 服务级别:拆分为多个服务或系统
    • 数据扩展
      • 提升数据扩展性:主数据放在同一表,扩展属性采用 cate + data
      • 数据量大,数据分片
        • 垂直拆分:不同业务数据放在不同库
        • 水平拆分:分库分表,建议分库不要分
  • 如何保证数据一致性(一致性设计),即,如何保证多个操作同时成功或者同时失败
    • 单一数据库
      • 本地事务
    • 分布式系统
      • 强一致
        • 规避分布式事务,将多个不同系统接口整合称为本地事务
        • 两阶段提交
        • 三阶段提交
        • TCC等
      • 最终一致
        • 本地消息表(eBay模式):将需要分布式处理的任务,通过消息日志异步执行,消息日志存于文本、数据库或消息队列;失败后可自动或人工处理
          • 本地操作与消息日志强一致
          • 消息消费接口幂等
          • 重试机制
        • MQ消息事务
  • 安全性设计
    • 系统安全,防止外部攻击
      • 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):在过程式基础上,提倡代码要有清晰的结构
            • 结构化原理:任何程序都可以用:顺序、选择、循环三种基本控制结构表示
        • 特点:机器思维、重算法轻目标、擅长业务逻辑,交互式应用,提倡迭代
      • 基础范式 - 声明式(declarative):利用梳理逻辑或既定规范对已知条件进行推理和演算
        • 函数式(functional):将计算描述为数学函数求值
        • 逻辑式(logic):提供一系列事实和规则来推导或论证结论
        • 特点:数学思维、重目标轻算法、擅长人工智能、编译器,提倡递归,着眼宏观规律
      • 面向对象(object-Oriented):以数据为中心组织逻辑,将系统视为相互作用的对象集合
        • 特点:适用于大型复杂、交互式、与现实世界密切相关的系统;以对象为基本模块单位,对象是具体事物的抽象和模拟,更人性化
      • 泛型(Generic):将算法与其相关的数据结构分离,将数据结构泛化,最大限度重用算法
        • 特点:算法 + 容器 + 迭代器(算法与容器的接口)
      • 元编程(Meta):提升语言级别
        • 特点:DSL,比通用语言更简单、抽象、专业,更接近自然语言和声明语言
      • 切面(aspect-oriented)
        • 特点:oop沿继承树纵向重用,aop沿横向方向重用
      • 事件驱动:核心思想 -- 发布订阅模式
        • 特点:事件处理器 + 注册事件处理器 + 事件循环,适用于图形界面
    • 语言学习(基于过程范式)
      • 数据类型
        • 基本数据类型(C语言),其他语言数据类型都是在基本类型基础上扩展
          • 整型 int
          • 浮点型 float
          • 字符型 char
            • 字符串
        • 构造类型
          • 数组
          • 链表
          • 结构体(自定义类型)
          • 其他容器:基础构造类型的变种
            • 哈希表
            • 队列
        • 指针
        • 空类型
      • 流程控制
        • 顺序
        • 条件 if
        • 循环 for、while
      • 变量、常量与函数
        • 变量
          • 作用域:局部、全局
        • 常量
        • 函数
          • 函数声明、调用
          • 函数入参
            • 传值、传引用、传指针
    • API使用
      • 标准工具类
        • 字符串处理
        • 容器使用
        • IO
        • 并发
      • 三方工具类
        • 如何使用三方包
    • 开发框架
    • 工程化
      • 构建工具
    • 常用语言
      • Java
      • C++
      • Python
      • Groovy

测试运维

  • 测试
  • 运维
  • 监控
    • 产品
      • grafana
  • 报警
    • 产品
      • Prometheus
  • 操作系统
  • 虚拟机
  • 集群管理