大型网站系统与Java中间件实践 01 认识分布式

本文涉及的产品
性能测试 PTS,5000VUM额度
云原生网关 MSE Higress,422元/月
注册配置 MSE Nacos/ZooKeeper,118元/月
简介: 01 认识分布式02 Java中间件03 分布式框架如果感觉文章中的图片不清楚可以查看下面链接:原图VISIO:https://note.youdao.com/share/?id=7a495e3fba485308f30d700a88ab5689&type=note#/原图PDF地址:https://note.youdao.com/share/?id=35600647bd0177daf74252ca9ce45b77&type=note#/后续会把原图文件同步到Github上面上去。

01 认识分布式
02 Java中间件
03 分布式框架

如果感觉文章中的图片不清楚可以查看下面链接:

原图VISIO:
https://note.youdao.com/share/?id=7a495e3fba485308f30d700a88ab5689&type=note#/
原图PDF地址:
https://note.youdao.com/share/?id=35600647bd0177daf74252ca9ce45b77&type=note#/

后续会把原图文件同步到Github上面上去。暂时谢分享在有道云上。

1:分布式系统介绍

1.1 什么事分布式系统

1.1.1 分布式系统的定义

是一组联网计算机上的组件,组件之间通过消息传递来通信并协调行动。

1.1.2 分布式系统的意义

单机的缺陷:

  1. 升级单机处理能力的性价比越来越低。
  2. 单机处理能力存在瓶颈。
  3. 单机不能满足稳定性和可用性的考虑。

1.2 分布式系统的基础知识

1.2.1 组成计算机的5要素

输入 + 输出 + CPU + 内存 + 外存

img_87cbd2972e7eecbf9c4d76c93cbe2f58.jpe
计算机组成5要素

1.2.2 线程和进程

进程是CPU资源分配的最小单位。

线程是CPU资调度的最小单位。线程属于进程,一个进程内的多个线程共享进程的内存空间,而多个进程之间的内存空间是相互独立的。

  1. 互不通讯的多线程模式
img_d274217d5c72087621bab209219c1dd6.png
互不通讯
  1. 基于共享容器协同的多线程模式

生产者和消费者模型。

img_a6f00caf774bf2e2f1145161516a461f.png
共享容器协同
  1. 基于事件协同的多线程模式
img_fdb1693a7ec304c893ceaae06dc8b8dd.png
事件协同
  1. 多进程模式

1.2.3 网络通信基础和知识

1.2.3.1 OSI与TCP/IP
1.2.3.2 网络IO实现方式
  1. BIO 阻塞式IO
  2. NIO 非阻塞式IO 基于事件驱动采用Reactor模式
  3. AIO 异步IO

1.2.4 如何把应用丛单机扩展到分布式

1.2.4.1 输入设备的变化

人机交互的输入设备 + 系统间调用者

1.2.4.2 输出设备的变化

人家交互输出设备 + 系统间响应者

1.2.4.3 控制器的变化
1.2.3.4 运算器的变化
1.2.3.5 存储的变化

1.2.5 分布式系统的难点

1.2.5.1 缺乏全局时钟

节点时钟不一致,分布式锁

1.2.5.2 面对故障独立性

多个节点故障,怎么定位

1.2.5.3 处理单点故障

集群,单点做备份,降低垫底故障的影响范围

1.2.5.4 事物的挑战

两阶段提交 最终一致 BASE CAP Paxos

2 大型网站及架构演进过程

2.1 大型网站的特点

高并发 + 海量数据

2.2 大型网站的架构演进

2.2.1 Java技术单机构建的网站

最基本的单体应用 应用服务器和数据库服务器部署在一台机器上

img_ac4b2f32f4fdfa9805e9212ebbddd2bb.png
单体应用

2.2.2 数据库与应用分离

将数据库服务器和应用服务器部署在不同的机器上

img_264dc1f44c7015f41d8541c393361d10.png
数据和应用分开部署

2.2.3 应用服务器集群

img_318774e35597a6ccb69dbe386a0b792a.png
负载均衡

因为HTTP协议是无状态的,Session有关联用户和服务器的状态

需解决Session的问题

  1. Session Sticky

根据Session Id在负载均衡器做路由,同一个Session Id总是路由到同一台服务器。

缺点:

1:一台服务器宕机,那么机器的会话数据全部丢失。

2:会话表示是应用层的信息,那么负载均衡服务器需要在应用层进行数据解析,开销比较大。

3:负载均衡服务器变成了一个有状态的节点。

  1. Session 复制

增加会话同步机制,把会话数据同步到其他服务器上面。

缺点:

1:同步Session数据增加网络带宽的开销。

2:同步会导致每台服务器有集群的数据,导致Session数据的内容占用会很严重。

3:Session数据集中存储

将Session数据存储在存储服务器上。

缺点:

1:读写Session数据引入了网络操作,相对于读取本地数据来说,存在延时和不稳定 但是我们服务器通讯在内网,所以问题不大。

2:存储集群出现问题,就会影响我们的应用。

4:基于Cookie

把Session的数据存储在Cookie里面,

缺点:

1:Cookie长度限制。

2:安全性,依赖于客户端维持状态。

3:性能影响,带宽消耗:每次HTTP请求增加带宽消耗。

2.2.5 数据压力变大,读写分离

2.2.5.1 数据库读写分离

数据库主从同步,更新操作连接主库数据源,查询操作连接从库数据源

2.2.5.2 搜索引擎是一个读库
2.2.5.3 缓存
  1. 数据缓存
  2. 页面缓存
2.2.6 引入分布式存储系统
img_157467dd68ec485e0971ab22868de20b.jpe
读写分离

2.2.7 数据库瓶颈

2.2.7.1 专库专用,数据垂直拆分

将不同的业务数据拆分到不同的数据库中。

不能关联查询。

2.2.7.2 数据水平分表

主键一致性

img_7fc64a3255e077ea8af2126337c799c6.jpe
数据库拆分

2.2.8 应用面对新挑战

数据拆分,业务越来越大,项目很难修改

img_62812c95e534d23ba54265dfc5c685c7.jpe
服务化

2.2.9 消息中间件

异步和解耦

相关实践学习
SLB负载均衡实践
本场景通过使用阿里云负载均衡 SLB 以及对负载均衡 SLB 后端服务器 ECS 的权重进行修改,快速解决服务器响应速度慢的问题
负载均衡入门与产品使用指南
负载均衡(Server Load Balancer)是对多台云服务器进行流量分发的负载均衡服务,可以通过流量分发扩展应用系统对外的服务能力,通过消除单点故障提升应用系统的可用性。 本课程主要介绍负载均衡的相关技术以及阿里云负载均衡产品的使用方法。
目录
相关文章
|
7天前
|
存储 运维 负载均衡
构建高可用性GraphRAG系统:分布式部署与容错机制
【10月更文挑战第28天】作为一名数据科学家和系统架构师,我在构建和维护大规模分布式系统方面有着丰富的经验。最近,我负责了一个基于GraphRAG(Graph Retrieval-Augmented Generation)模型的项目,该模型用于构建一个高可用性的问答系统。在这个过程中,我深刻体会到分布式部署和容错机制的重要性。本文将详细介绍如何在生产环境中构建一个高可用性的GraphRAG系统,包括分布式部署方案、负载均衡、故障检测与恢复机制等方面的内容。
53 4
构建高可用性GraphRAG系统:分布式部署与容错机制
|
6天前
|
存储 NoSQL Java
Java调度任务如何使用分布式锁保证相同任务在一个周期里只执行一次?
【10月更文挑战第29天】Java调度任务如何使用分布式锁保证相同任务在一个周期里只执行一次?
22 1
|
1月前
|
缓存 NoSQL Java
大数据-50 Redis 分布式锁 乐观锁 Watch SETNX Lua Redisson分布式锁 Java实现分布式锁
大数据-50 Redis 分布式锁 乐观锁 Watch SETNX Lua Redisson分布式锁 Java实现分布式锁
55 3
大数据-50 Redis 分布式锁 乐观锁 Watch SETNX Lua Redisson分布式锁 Java实现分布式锁
|
26天前
|
消息中间件 中间件 数据库
NServiceBus:打造企业级服务总线的利器——深度解析这一面向消息中间件如何革新分布式应用开发与提升系统可靠性
【10月更文挑战第9天】NServiceBus 是一个面向消息的中间件,专为构建分布式应用程序设计,特别适用于企业级服务总线(ESB)。它通过消息队列实现服务间的解耦,提高系统的可扩展性和容错性。在 .NET 生态中,NServiceBus 提供了强大的功能,支持多种传输方式如 RabbitMQ 和 Azure Service Bus。通过异步消息传递模式,各组件可以独立运作,即使某部分出现故障也不会影响整体系统。 示例代码展示了如何使用 NServiceBus 发送和接收消息,简化了系统的设计和维护。
42 3
|
1月前
|
分布式计算 NoSQL Java
Hadoop-32 ZooKeeper 分布式锁问题 分布式锁Java实现 附带案例和实现思路代码
Hadoop-32 ZooKeeper 分布式锁问题 分布式锁Java实现 附带案例和实现思路代码
40 2
|
1月前
|
存储 开发框架 .NET
C#语言如何搭建分布式文件存储系统
C#语言如何搭建分布式文件存储系统
66 2
|
22天前
|
消息中间件 存储 监控
消息队列系统中的确认机制在分布式系统中如何实现?
消息队列系统中的确认机制在分布式系统中如何实现?
|
1月前
|
NoSQL Java 数据库
Java分布式锁
Java分布式锁
34 0
|
1月前
|
缓存 Java 数据库
JAVA分布式CAP原则
JAVA分布式CAP原则
48 0
|
24天前
|
NoSQL Java Redis
太惨痛: Redis 分布式锁 5个大坑,又大又深, 如何才能 避开 ?
Redis分布式锁在高并发场景下是重要的技术手段,但其实现过程中常遇到五大深坑:**原子性问题**、**连接耗尽问题**、**锁过期问题**、**锁失效问题**以及**锁分段问题**。这些问题不仅影响系统的稳定性和性能,还可能导致数据不一致。尼恩在实际项目中总结了这些坑,并提供了详细的解决方案,包括使用Lua脚本保证原子性、设置合理的锁过期时间和使用看门狗机制、以及通过锁分段提升性能。这些经验和技巧对面试和实际开发都有很大帮助,值得深入学习和实践。
太惨痛: Redis 分布式锁 5个大坑,又大又深, 如何才能 避开 ?