Java for You Java 四、系统架构

四、系统架构

高并发系统架构面临的挑战 高并发,大流量 Google 日均 PV 数 35 亿,日均 IP 访问数 3 亿 微信在线用户数 10 亿 天猫双十一活动一天交易额 3000 亿 高可用 系统 724 小时不间断服务。大型互联网站的宕机事件通常

高并发系统架构面临的挑战

高并发,大流量

  • Google 日均 PV 数 35 亿,日均 IP 访问数 3 亿
  • 微信在线用户数 10 亿
  • 天猫双十一活动一天交易额 3000 亿
  • 高可用

    系统 7*24 小时不间断服务。大型互联网站的宕机事件通常会成为新闻焦点。

    海量数据

    需要存储、管理海量数据。

  • Facebook 每周上传的照片数目接近 10 亿
  • 百度收录的网页数目有数百亿
  • Google 有近百万台服务器为全球用户提供服务
  • 用户分布广泛,网络情况复杂

    中美光缆的数次故障,也让一些对国外用户依赖较大的网站不得不考虑在海外建立数据中心。

    安全环境恶劣

    黑客攻击。

    需求快速变更,发布频繁

    快速适应市场,满足用户需求。

    Office 一年为单位发布,大型网站以周为单位。

    渐进式发展

    应对高并发挑战的两个技术方向

    垂直伸缩

    升级硬件和网络吞吐能力。

  • RAID 增加 IO 吞吐
  • SSD 改善 IO 访问速度
  • 内存减少 IO 操作
  • 升级网络接口或者增加网络接口提升网络吞吐
  • 更新服务器使用更多处理器或者更多超线程
  • 缺点:

  • 达到某个程度后,增加计算能力需要更多的花费;
  • 垂直伸缩有物理极限;
  • 操作系统的设计或者应用程序自身制约着垂直伸缩最多只能达到某个点
  • 水平伸缩

    通过增加服务器提升计算能力的一类架构方法。

    伸缩性的圣杯,可以克服垂直伸缩带来的但未计算成本随计算能力增加而迅速飙升的问题。

    互联网架构演化

  • 最简单的互联网应用架构:应用程序,文件,数据库
  • 应用数据分离:应用服务器,文件服务器,数据库服务器
  • 使用缓存改善系统性能:增加本地缓存/分布式缓存
  • 使用应用服务器集群改善系统的并发处理能力
  • 数据库读写分离
  • 使用反向代理和 CDN 加速网站响应
  • 使用分布式文件系统和分布式数据库系统
  • 使用 NoSQL 和搜索引擎
  • 业务拆分
  • 微服务及中台化
  • 大数据与智能化(今日头条)
  • 互联网架构模式

    架构模式

    模式的可重复性,问题与场景的可重复性带来解决方案的可重复使用。

  • 分层
  • 系统在横向维度切分,上层对下层依赖和调用
  • 分隔
  • 纵向对软件进行切分,不同的功能和服务分隔,包装成高内聚低耦合的模块单元。
  • 有助于软件的开发和维护;
  • 便于不同模块的分布式部署,提高网站的并发处理能力和功能扩展能力。
  • 分布式
  • 分层和分隔是为了切分后的模块便于分布式部署,即不同模块部署在不同的服务器上。
  • 分布式应用和服务
  • 分布式静态资源
  • 分布式数据和存储
  • 分布式计算
  • 集群
  • 对于用户访问集中的模块,比如网站首页,要将独立部署的服务器集群化,即多台服务器部署相同应用构成集群,通过负载均衡设备共同对外提供服务。
  • 缓存
  • 缓存是将数据存放在距离计算最近的位置以加快处理速度。
  • CDN
  • 反向代理
  • 本地缓存
  • 远程缓存
  • 异步
  • 系统解耦合的重要手段:异步。业务操作的多个阶段,阶段之间通过共享数据而不是直接调用的方法进行协作。
  • 好处
  • 提高系统可用性
  • 加快网站响应速度
  • 消除并发访问高峰
  • 冗余
  • 提升网站可用性:服务可用,数据不会丢
  • 服务器冗余运行,数据冗余备份
  • 自动化
  • 无人值守情况下网站可以正常运行。
  • 该设计集中在运维方面。
  • 安全
  • 互联网的开放特性带来的安全挑战
  • 模式
  • 通过密码和手机校验码进行身份认证;
  • 登录、交易等操作需要对网络通讯进行加密,网站服务器上存储的敏感数据如用户信息等也进行加密处理;
  • 为了防止机器人程序滥用网络资源供给网站,网站使用验证码进行识别;
  • 对于常见的用于攻击网站的 XSS 攻击,SQL 注入,进行编码转换等相应处理;
  • 对垃圾信息、敏感信息进行过滤‘
  • 对转账交易等重要操作根据交易模式和交易信息进行风险控制。
  • 互联网系统架构核心要素

    【如何衡量一个系统的架构设计】

    高性能

    性能是互联网的一个重要指标,除非没有选择,否则用户无法忍受一个响应缓慢的应用。

    一个打开缓慢的应用会导致严重的用户流失,很多时候系统性能问题是系统架构升级优化的触发器。可以说性能是互联网系统架构设计的一个重要方面,任何架构设计方案都必须考虑可能会带来的性能问题。

    也正是因为性能问题几乎无处不在,所以优化网站性能的手段也非常多,从用户端到数据库,从代码到机房部署,影响用户请求的所有环节都可以进行性能优化。

    高可用

    因为互联网分布式系统使用的服务器硬件通常是普通的商用服务器,这些服务器的设计目标本身并不保证高可用,也就是说,很有可能会出现服务器硬件故障,也就是俗称的服务器宕机。大型互联网系统通常都会有上万台服务器,每天都必定会有一些服务器宕机,因此系统高可用架构设计的前提是必然会出现服务器宕机,而高可用设计的目标就是当服务器宕机的时候,服务或者应用依然可用。

    系统高可用的主要手段是冗余,应用部署在多台服务器上同时提供访问,数据存储在多台服务器上互相备份,任何一台服务器宕机都不会影响应用的整体可用,也不会导致数据丢失。

    可伸缩

    大型互联网应用通过集群的方式将多台服务器组成一个整体共同提供服务。所谓伸缩性是指通过不断向集群中加入服务器的手段来缓解不断上升的用户并发访问压力和不断增长的数据存储需求。

    衡量架构伸缩性的主要标准就是是否可以用多台服务器构建集群,是否容易向集群中添加新的服务器。加入新的服务器后是否可以提供和原来的服务器无差别的服务。集群中可容纳的总的服务器数量是否有限制。

    可扩展

    不同于其他架构要素主要关注非功能性需求,扩展性架构直接关注系统的功能需求。互联网应用快速发展,功能不断扩展,如何设计系统的架构使其能够快速响应需求变化,是系统可扩展架构主要的目的。

    衡量系统架构扩展性好坏的主要标准就是在系统增加新的业务产品时,是否可以实现对现有产品透明无影响,不需要任何改动或者很少改动既有业务功能就可以上线新产品。不同产品之间是否很少耦合,一个产品改动对其他产品无影响,其他产品和功能不需要受牵连进行改动。

    可扩展架构的主要手段是事件驱动架构和分布式服务。

    安全

    互联网是开放的,任何人在任何地方都可以访问系统。系统的安全架构就是保护系统不受恶意访问和攻击,保护网站的重要数据不被窃取。

    衡量系统安全架构的标准就是针对现存的潜在的各种攻击与窃密手段,是否有可靠的应对策略。

    互联网架构技术一览

  • 前端架构
  • APP 及 Web 开发技术
  • 浏览器及 HTTP 优化技术
  • CDN
  • 动静分离
  • 图片服务
  • 反向代理
  • DNS
  • 网关及应用层架构
  • 网关架构
  • 负载均衡
  • 动态页面静态化
  • 业务拆分
  • 服务层架构
  • 微服务框架
  • 分布式消息队列
  • 分布式缓存
  • 分布式一致性(锁)服务
  • 存储层架构
  • 分布式文件
  • 分布式关系数据库
  • NoSql 数据库
  • 后台架构
  • 大数据平台
  • 搜索引擎
  • 推荐引擎
  • 数据仓库
  • 运维与安全
  • 数据采集与展示
  • 数据监控与报警
  • 攻击与防护
  • 数据加密与解密
  • 动手验证

    # 看进程各线程的内存 / CPU 占用
    top -H -p <pid>
    
    # 某个端口被谁占着
    lsof -i :8080
    
    # 抓一次 HTTP 请求内容
    sudo tcpdump -A -i any 'tcp port 8080' -c 50
    

    延伸阅读:官方与权威资料

    相关阅读(站内)

    常见问题

    Q:G1 GC 和 CMS 垃圾回收器有什么区别?

    G1 把堆拆成多个 Region,用标记-整理避免内存碎片,目标是可预测的停顿时间;CMS 用标记-清除,回收快但会产生碎片。JDK 9 起 G1 成为默认收集器,JDK 14 移除 CMS。

    Q:G1 的 Remembered Set 是干什么的?

    Region 化之后跨 Region 的引用都要记账,Remembered Set 记录其他 Region 指向本 Region 的指针,回收某个 Region 时不用扫全堆,这是 G1 停顿可控的关键之一。

    Q:怎么调优 G1 的停顿时间?

    三步走:先把 -XX:MaxGCPauseMillis 设在合理区间(别贪低,太小会疯狂扩容堆)、再看 GC 日志里的 Mixed GC 频率定位大对象、用 -XX:InitiatingHeapOccupancyPercent 控制并发标记起手时机。

    Q:为什么 Java 的 String 要设计成不可变?

    不可变才能安全共享与缓存哈希值,也能安全地放进字符串常量池;一旦可变,其他线程持有引用时修改会破坏哈希表与缓存的一致性。

    Q:Java 里 == 和 equals 的区别是什么?

    == 比较引用地址,equals 比较对象内容。String、Integer 等包装类重写了 equals,自定义对象不重写 equals 时,equals 等价于 ==。


    本文首发于 java4u.cn,转载请注明出处。

    关注「蜗牛聊AI」,一起看懂技术变化背后的真正机会。

    本文由 java4u.cn 发布,可自由转载、引用,但需署名作者且注明文章出处(作者:白色蜗牛,出处:java4u.cn)。如转载至微信公众号,请在文末添加作者公众号二维码。 https://java4u.cn/java_base/3119.html

    作者: 蜗牛

    下一篇

    已经没有了

    发表回复

    您的邮箱地址不会被公开。 必填项已用 * 标注

    联系我们

    联系我们

    公众号:蜗牛互联网

    在线咨询: QQ交谈

    关注微信
    微信扫一扫关注我们

    微信扫一扫关注我们

    关注微博
    返回顶部