《大型网站系统与Java中间件》读书笔记(上)

本文涉及的产品
性能测试 PTS,5000VUM额度
注册配置 MSE Nacos/ZooKeeper,118元/月
服务治理 MSE Sentinel/OpenSergo,Agent数量 不受限
简介: 前言只有光头才能变强。文本已收录至我的GitHub仓库,欢迎Star:https://github.com/ZhongFuCheng3y/3y这本书买了一段时间了,之前在杭州没带过去,现在读完第三章,来做做笔记这本书前三章都在科普和回顾中间件/分布式的基础,讲得非常通俗易懂。

前言

只有光头才能变强。

文本已收录至我的GitHub仓库,欢迎Star:https://github.com/ZhongFuCheng3y/3y

这本书买了一段时间了,之前在杭州没带过去,现在读完第三章,来做做笔记

豆瓣评分

这本书前三章都在科普和回顾中间件/分布式的基础,讲得非常通俗易懂。在之前已经我写过基础分布式相关文章,大家可以先去看看:

一、为什么分布式?

在之前的文章(外行人都能看懂的SpringCloud,错过了血亏!)也提过为什么要分布式:

  • 模块之间独立,各做各的事,便于扩展,复用性高
  • 高吞吐量。某个任务需要一个机器运行10个小时,将该任务用10台机器的分布式跑(将这个任务拆分成10个小任务),可能2个小时就跑完了

在书上给出的观点:

  • 升级单机的处理能力的性价比越来越低,单机的处理能力存在瓶颈
  • 分布式系统更加稳定和可用(单机挂了就挂了,分布式挂了一般还有备用/不至于整个链路全挂)

1.1 大型网站架构演进过程

其实在没接触过分布式之前,在逛论坛的时候,经常会出现一些看起来很牛逼的词,诸如”读写分离“、”分库分表“、”主从架构“、”负载均衡“、”单点故障“等等名词,就觉得很高大上。下面我就稍微顺着”大型网站架构演进过程“来讲解一下这些词

在我们最开始接触Java项目的时候,一般来说是单机的(数据库、Web服务器都是同一台机器)

数据库、Web服务器都是同一台机器

网站对外开放以后,访问量增大,服务器的压力也随之提高。此时,我们最简单的做法就是可以将数据库和应用分开,这样可以缓解一下当前系统的压力

数据库服务器和应用服务器分开

应用服务器的压力继续增大,我们可以把应用服务器做成集群(说白了,就是加了台机器)

给应用服务器加了一台

加了台应用服务器以后,就出现新的问题了:

  • 用户请求的时候,走哪台服务器啊?
  • Session是依赖单台服务器的,那Session怎么搞?

两个直面而来的问题

解决用户走哪台服务器,我们就在用户请求到达应用服务器之前,加了一个”负载均衡器“,这个”负载均衡器“说白了就写了用户请求会到哪台应用服务器的逻辑

  • 比如说,一个用户请求过来,负载均衡器指派这个请求到服务器A。另一个用户请求过来,负载均衡器指派这个请求到服务器B。这样就平摊了请求— 这种方式就叫做轮询
  • ...策略还有很多种,就看你想怎么实现了,反正这个逻辑的代码放在负载均衡器上。

而Session的问题,我之前写什么是单点登录(SSO)已经讲过了,一般来说我们可以将Session保存在Redis上就行了。

解决请求指派和Session的问题

随着业务的发展,我们的数据量和访问量都在增长,现在有不少的业务都是读多写少的,对于这种业务也是会直接反应到数据库上。

于是,我们可以增加一个读库。写入的操作走服务器C的MySQL,读取的操作走服务器D的MySQL。这样就实现了读写分离

读写分离

一般来说,我们的写库也叫做主库,读库也叫做从库,在互联网架构中,这叫做主从架构,比如常见的架构:一主多从(详细的参考资料:如何给老婆解释什么是 Master-Slave

主从架构

针对读多写少的业务,我们还有优化策略,引入搜索引擎和缓存

  • 搜索引擎也相当于一个读库,使用搜索引擎的倒排表方式,能够大大提升检索的速度
  • 缓存则将热数据放入内存中,如果查询的数据在缓存中存在,则直接返回

增加缓存和搜索引擎

搜索引擎和缓存的参考资料:

:这里说的索引和缓存就未必特指ES和Redis,比如缓存我也可以用本地缓存而不一定是Redis的。这里用Redis和ES只是我画图方便。

继读写分离之后,数据库还是遇到了瓶颈,此时我们就可以采用分库分表策略了:

  • 垂直拆分— 不同的业务数据分到不同的数据库
  • 水平拆分— 将同一张表的数据拆分到不同的数据库中(原因是这张表的数据量/更新量太大了)

垂直拆分示例图

注:单表行数超过500万行或者单表容量超过2GB才推荐进行分库分表(如果预计三年都达不到这个数据量,不要在创建表的时候就分库分表!) —《阿里巴巴 Java开发手册》

在数据存储方面,除了关系型数据库之外,如果有别的业务场景,可能还需要引入分布式存储系统

  • 分布式文件系统
  • 分布式Key-Value系统
  • 分布式数据库

数据库问题解决之后,应用也面临着挑战(应用的功能会越做越多,应用也随之越做越大),为了不让应用持续变大,这就需要把应用拆开,从一个应用变为两个/多个应用。

应用拆分

不同功能/模块之间的调用不再单纯通过本机调用,引入了远程的服务调用

某个应用只有一台机器上运行着,如果这台机器上出现了问题,导致这个应用无法运行,这就叫单点故障

最后

这本书《大型网站系统与Java中间件》的前三章主要是铺垫什么是中间件、什么是分布式(从单机演进到分布式的过程)以及讲述了网站的架构演进过程,剩下的是回顾一些基础。比如说:

  • bio/nio/aio
  • HTTP/Session
  • JVM
  • Java多线程以及并发的基础知识
  • JUC包下的常见类

这些我都曾经多多少少都做过笔记,不妨在我的公众号下找找相关的文章。总的来说,还是读得很过瘾的!后面读完下面的章节,我会继续分享,敬请期待。

乐于输出干货的Java技术公众号:Java3y。公众号内有200多篇原创技术文章、海量视频资源、精美脑图,关注即可获取!

觉得我的文章写得不错,点

相关实践学习
基于Redis实现在线游戏积分排行榜
本场景将介绍如何基于Redis数据库实现在线游戏中的游戏玩家积分排行榜功能。
云数据库 Redis 版使用教程
云数据库Redis版是兼容Redis协议标准的、提供持久化的内存数据库服务,基于高可靠双机热备架构及可无缝扩展的集群架构,满足高读写性能场景及容量需弹性变配的业务需求。 产品详情:https://www.aliyun.com/product/kvstore     ------------------------------------------------------------------------- 阿里云数据库体验:数据库上云实战 开发者云会免费提供一台带自建MySQL的源数据库 ECS 实例和一台目标数据库 RDS实例。跟着指引,您可以一步步实现将ECS自建数据库迁移到目标数据库RDS。 点击下方链接,领取免费ECS&RDS资源,30分钟完成数据库上云实战!https://developer.aliyun.com/adc/scenario/51eefbd1894e42f6bb9acacadd3f9121?spm=a2c6h.13788135.J_3257954370.9.4ba85f24utseFl
目录
相关文章
|
26天前
|
监控 Java API
如何使用Java语言快速开发一套智慧工地系统
使用Java开发智慧工地系统,采用Spring Cloud微服务架构和前后端分离设计,结合MySQL、MongoDB数据库及RESTful API,集成人脸识别、视频监控、设备与环境监测等功能模块,运用Spark/Flink处理大数据,ECharts/AntV G2实现数据可视化,确保系统安全与性能,采用敏捷开发模式,提供详尽文档与用户培训,支持云部署与容器化管理,快速构建高效、灵活的智慧工地解决方案。
|
17天前
|
设计模式 消息中间件 搜索推荐
Java 设计模式——观察者模式:从优衣库不使用新疆棉事件看系统的动态响应
【11月更文挑战第17天】观察者模式是一种行为设计模式,定义了一对多的依赖关系,使多个观察者对象能直接监听并响应某一主题对象的状态变化。本文介绍了观察者模式的基本概念、商业系统中的应用实例,如优衣库事件中各相关方的动态响应,以及模式的优势和实际系统设计中的应用建议,包括事件驱动架构和消息队列的使用。
|
1月前
|
运维 自然语言处理 供应链
Java云HIS医院管理系统源码 病案管理、医保业务、门诊、住院、电子病历编辑器
通过门诊的申请,或者直接住院登记,通过”护士工作站“分配患者,完成后,进入医生患者列表,医生对应开具”长期医嘱“和”临时医嘱“,并在电子病历中,记录病情。病人出院时,停止长期医嘱,开具出院医嘱。进入出院审核,审核医嘱与住院通过后,病人结清缴费,完成出院。
81 3
|
1月前
|
Java 数据库连接 数据库
深入探讨Java连接池技术如何通过复用数据库连接、减少连接建立和断开的开销,从而显著提升系统性能
在Java应用开发中,数据库操作常成为性能瓶颈。本文通过问题解答形式,深入探讨Java连接池技术如何通过复用数据库连接、减少连接建立和断开的开销,从而显著提升系统性能。文章介绍了连接池的优势、选择和使用方法,以及优化配置的技巧。
34 1
|
1月前
|
JavaScript Java 项目管理
Java毕设学习 基于SpringBoot + Vue 的医院管理系统 持续给大家寻找Java毕设学习项目(附源码)
基于SpringBoot + Vue的医院管理系统,涵盖医院、患者、挂号、药物、检查、病床、排班管理和数据分析等功能。开发工具为IDEA和HBuilder X,环境需配置jdk8、Node.js14、MySQL8。文末提供源码下载链接。
|
2月前
|
移动开发 前端开发 JavaScript
java家政系统成品源码的关键特点和技术应用
家政系统成品源码是已开发完成的家政服务管理软件,支持用户注册、登录、管理个人资料,家政人员信息管理,服务项目分类,订单与预约管理,支付集成,评价与反馈,地图定位等功能。适用于各种规模的家政服务公司,采用uniapp、SpringBoot、MySQL等技术栈,确保高效管理和优质用户体验。
|
2月前
|
XML JSON 监控
告别简陋:Java日志系统的最佳实践
【10月更文挑战第19天】 在Java开发中,`System.out.println()` 是最基本的输出方法,但它在实际项目中往往被认为是不专业和不足够的。本文将探讨为什么在现代Java应用中应该避免使用 `System.out.println()`,并介绍几种更先进的日志解决方案。
58 1
|
2月前
|
Java 关系型数据库 API
介绍一款Java开发的企业接口管理系统和开放平台
YesApi接口管理平台Java版,基于Spring Boot、Vue.js等技术,提供API接口的快速研发、管理、开放及收费等功能,支持多数据库、Docker部署,适用于企业级PaaS和SaaS平台的二次开发与搭建。
|
2月前
|
前端开发 Java 数据库连接
基于Java的校车管理系统(下)
基于Java的校车管理系统(下)
23 0
|
2月前
|
存储 前端开发 Java
基于Java的校车管理系统
基于Java的校车管理系统(上)
25 0