19-02 基于业务量级的架构技术选型演进

从零开始——单服务应用

单体应用技术选型

  • (GitHub、Gitee…)搜索是否有线程的产品
  • 用最熟悉的技术,最快的速度上线
  • 如果有经费:考虑商业化解决方案

个人小程序怎么做技术选型的

  • 搜索是否有快速搭建下程序的软件
  • 技术选型
    • 后端技术选型
      • 用最熟悉的技术,达到最快的开发速度
      • MySQL、MyBatis、SoringBoot
    • 前端技术选型
      • 在这里插入图片描述

应用服务、数据服务分离

  • 企业级应用的起步阶段
  • 两个目的
    • 选择合适的技术实现项目的落地
    • 为项目未来的发展方向定好基调
    • 在这里插入图片描述

要考虑的问题

  • 运行平台的选择
  • 选择商业解决方案还是开源解决方案
  • 确定项目的研发模式
  • 确定具体使用的技术

事半功倍——引入缓存系统

要考虑的问题

  • 在哪个位置使用缓存
  • 采用什么类型的缓存
  • 采用那种缓存模式
  • 具体用什么缓存组件

缓存位置

  • 客户端缓存
    • 浏览器中的缓存
    • APP缓存
  • 网络中缓存
    • 代理服务器缓存
    • CDN缓存
  • 服务端缓存

如何确定缓存的位置

  • 没有性能瓶颈不考虑,那里慢就在那里用缓存

缓存类型

  • 内存缓存
    • 速度非常快,数据可能会丢失
    • 适用于速度要求非常高,容忍数据丢失的场景
    • 堆内缓存
      • 优点:
        • 无需序列化、反序列化
        • 性能很好
      • 缺点:
        • 会对GC造成影响
        • 容量受限于堆内存的大小
        • 一般为软引用或弱引用存储
      • 堆内缓存适用场景
        • 存储非常热的数据
  • 磁盘缓存
    • 性能比内存缓存差,数据不会丢失
    • 适用于需要持久化的场景

负载均衡

在这里插入图片描述

基于DNS的负载均衡

  • 在DNS服务器上为多个地址配置相同的解析记录
  • 优点:
    • 把负载均衡的工作交给了DNS服务器,减少了网站管理的维护工作
    • 技术实现比较灵活、方便、简单易行、成本低
    • 适用面广,能适用于大多数TCP/IP应用
  • 缺点:
    • 一般不能反映服务器当前运行状态
    • 某台服务器下线之后,即使修改了DNS记录,要想让记录生效可能需要很长时间
    • 保证DNS解析指向的目标地址高可用、地址不会经常修改
    • 一般来说,大型网站会用DNS作为一级负载均衡
      • DNS指向的IP,对应的并不是一台机器,而是高可用的服务器集群
      • dig命令可查询记录

基于反向代理的负载均衡

  • 请求经过反向代理,由反向代理组件提供负载均衡算法,计算出一个服务器地址返回
  • 代表实现
    • NGINX
    • HAProxy
    • Apache

互联网项目负载均衡器演变的典型过程(经验)

  • 项目初期:NGINX
  • 中期:结合Keepalived实现NGINX的高可用
  • 之后,再搭载LVS或F5,从而扩展多个NGINX
  • 如果一个LVS集群顶不住的饿话,会再结合DNS扩展LVS

有状态VS无状态

  • 状态:服务器是否要存储用户的登录状态
  • 服务器端是否要维护用户的会话

有状态

粘性会话

  • 当客户端在一台Web Server上登录后,以后的请求都会绑定到该Web Server实例
  • 在这里插入图片描述
  • 优缺点
    • 无需引入额外组件
    • 实现简单
    • 存在单点问题:需要额外实现故障转移
    • 可能有不均衡问题

会话共享

在这里插入图片描述

  • 使用session保持会话,多个应用实例存储到一个中央存储中去
  • 优缺点
    • 需要额外引入组件,即使任意Web应用崩溃依然可用
    • 但Session Store一旦崩溃,所有会话都会丢失

会话复制

在这里插入图片描述

  • Web Server实例之间互相复制会话
  • 优缺点
    • 无需实现故障转移
    • 无需引入额外组件
    • 会话复制消耗带宽和内存

无状态

  • 服务器端不去记录用户的登录状态:服务器端不再去维护会话
  • 用户登录时,办法一个token,这个token一般是加密的
  • 之后每个请求都会带上这个token(放在header、URL参数、Cookie中传递)
  • 有状态的缺点 = 无状态的优点
  • 无状态的缺点:
    • 一旦把token颁发给用户,就很难控制它的下线时间
      在这里插入图片描述

有状态 vs 无状态

在这里插入图片描述

读写分离

在这里插入图片描述

CDN

  • 静态文件:效果非常好
  • 动态数据:效果不佳
  • 动态内容静态化
  • 动静分离

CDN组成原理

在这里插入图片描述

CDN技术选型要考虑的问题

  • 自建 or 商用
    • 优先使用商用CDN
    • 当商用CDN满足不了业务需求,顶不住的时候,再考虑自建
    • 原因:自建很不划算
    • 小米、快手、大众点评 => 都是商用CDN
  • 如何挑选CDN
    • 速度
      • 节点数
      • 带宽能力
      • 节点分布
    • 功能
      • 加速优化

        • DNS优化
        • 在这里插入图片描述
      • 监控统计

        • 实时监控:点击率、命中率、占用流量
        • 访问日志监控
      • 安全性

        • 防盗链
        • IP黑白名单
    • 价格
      • 按带宽峰值计费
      • 按流量计费

全文检索

  • 减轻了数据库的查询压力
  • 提升应用性能,提高用户体验
  • 实现全文检索的五种路径
    • 使用数据库内置的全文搜索能力
    • 使用和数据库深度集成的全文搜索
    • 使用开源全文所搜引擎
    • 使用商用全文搜索引擎
    • 自研全文搜索引擎

使用数据库内置的全文搜索能力

在这里插入图片描述

  • 优点
    • 学习成本低
    • 方便
    • 无需引入新的组件,保持了架构上的简单性
  • 缺点
    • 搜索引擎没有和数据库分离,数据库的职责不够单一
    • 全文搜索的能力受限于数据库的查询能力
  • 不建议使用

使用和数据库深度集成的全文搜索

  • 代表实现:Sphinx
    • 可独立运行
    • 可以和MySQL、PostgreSQL深度集成
  • 选型建议
    • Sphinx在业界非常流行
    • 如果看中运维成本,同时对扩展性没有太高要求,可以尝试
  • Tips
    • Sphinx相对于其他全文搜索引擎来说,功能并不是很强
    • 国内文档不多
    • 越来越多的企业在从Sphinx往第三种模式迁移

使用开源全文所搜引擎

  • 目前最主流的方式
    • 选择丰富
    • 扩展性非常好
  • 缺点
    • 需要独立部署搜索引擎
    • 需使用搜索引擎特有语法操作搜索引擎
      • 既是缺点也有优点,缺点在于有学习成本,好处就是能够支持更加复杂的查询;另外像Elasticsearch之类的搜索引擎既支持DSL,也支持SQL
    • 搜索引擎和数据库是独立的两个软件,需要考虑数据一致性
      • 借助logstash-input-jdbc之类的插件同步
      • 应用写入数据库的同时也写到搜索引擎
  • 选型建议:可以放心使用

使用商用全文搜索引擎

  • 阿里云Open Search
  • 微软的Microsoft Azure Search
  • 成功案例不多
  • 选型建议
    • 商用产品有良好的服务,省事、省心,可以放心使用
    • 要考虑商用产品封闭性所带来的影响:例如厂商很难根据你的特殊需求专门定制

自研全文搜索引擎

  • 阿里、苏宁、万得资讯、东方财富
  • 优点:核心技术在自己手上,有更好的灵活度,遇到问题可以从底层调整与优化
  • 缺点:遂团队的技术要求会比较高,成本也非常高

在这里插入图片描述

猜你喜欢

转载自blog.csdn.net/m0_56709616/article/details/130842663