分布式救命指南
可能有错
生死有命,富贵在天
分布式计算概念
分布式计算是将一个大型计算任务分成很多部分分别交给其他的计算机处理,并将所有的计算结果合并为原问题的解决方案。这里与并行计算不同的是,并行计算是使用多个处理器并行执行单个计算。
分布式系统概念
分布式系统指通过网络互连,可协作执行某个任务的独立计算机集合。
不共享内存或程序执行空间的一系列计算被认为是相互独立的。
分布式系统的趋势 (4)
- 泛在联网和现代互联网
- 移动和无处不在计算(边缘计算)
- 分布式多媒体系统
- 把分布式计算作为一个公共设施
分布式系统特征 (4)
- 可靠性
- 可扩展性
- 可用性
- 高效性
并行与并发的区别
并发系统:某个系统支持两个或者多个动作同时存在
并行系统:某个系统支持两个或者多个动作同时执行
”并行“是“并发”的一个子集
并行计算的关键
可挖掘的并发性
共享内存
多个 CPU 连接同一个 Memory

分布式内存
多个 CPU-Memory 对连接 Interconnect Network

共享资源
可以被一个以上任务使用的资源叫做共享资源。
为了防止数据被破坏,每个任务在与共享资源打交道时,必须独占该资源,这叫做互斥。
进程通信
机器间通信
Socket 、信息传递接口、数据库
进程间内
传参、返回值
进程间
文件、消息
事件同步
同步 send 同步 receive
异步 send 同步 receive
同步 send 异步 receive
异步 send 异步 receive
1. 分解
任务分解
识别出多个可以并发执行的任务
计算被分解为一组独立的任务,多个线程可以用任意顺序执行这些任务
技巧:计算密集的代码分解(计算量大 或耗时多的代码)
数据分解
识别出每个任务需要的局部数据
应用程序需要处理一个大型数据集,并且可以对数据集中的每个元素进行独立计算
经验法则:体积表面积比的最大化
体积:计算的粒度
表面积:需要交换数据的边界
入手点:
数组:数据划分
递归:重建为树结构并计算
几何分解
基于正在解决问题的数据结构的并行化,每个线程负责操作数据块
结合实验
2. 依赖分析
这里的任务不要被任务分解误导了,这里是指将一个计算分解为多个部分的计算,无论是任务分解还是数据分解,分解后的每个部分都是一个任务。
将一个计算分解为很多部分后,还需要进行进一步处理,也就是依赖分析。
任务分组
基于约束对任务分组
通过分组任务,简化了任务间部分顺序的构建,解决任务之间的依赖
- 时间相关性
- 任务集合必须同时运行
- 任务相互直接独立
步骤
分解任务(多个小粒度),归纳分组
检查分组间是否存在共享约束,若存在,合并
若存在时间顺序(任务执行有先后限制 )或数据链,则合并
任务排序
任务间的约束(也就是一个任务是否限制了另一个任务可以执行的时间):
-
时间依赖性:一个任务执行后另一个才能执行
-
必须同时执行
-
相互间完全独立(就是任务之间执行的顺序是什么样都没关系)
数据共享
就是可以并发执行的任务集合会使用到同一数据,需要保证能够安全的存取这些数据。
- 可能获得无效的数据
- 可能在同步并发任务的数据的时候导致过度的同步开销
- 通信问题、
解决方案:
确认任务间的共享数据
共享数据分类:
- 只读
- 有效-局部
- 读-写
- 累加
- 多次读/单词写
分布式计算的范型
-
消息传递
- 一个进程以消息的形式发送请求,该消息传送到接受者
- 接受者处理该请求,发送一条应答消息
- 该应答关系可能触发下一个请求,并导致下一个应答
- 反复传递,实现数据交换
- 可以基于 Socket 和 信息传递接口等
-
客户-服务器范型
- 网络应用中使用的最多
- 将非对称角色分配给两个协作进程
- 服务器:提供者角色,被动等待请求
- 客户:发起请求,等待响应
-
peer-to-peer范型
-
消息系统
基本模式
- 非耦合
- 发送者(进程)将一条消息放入消息系统中
- 消息系统将收到得消息放入队列
- 消息发送后发送者可执行其他任务
进一步划分为:
- 点对点消息模型
- 发布订阅消息模型:用于组播
-
远程过程调用
-
分布式对象
-
网络服务
-
移动代理
-
云服务模型
- Iaas:创建虚拟的基础设施,提高资源利用率、资源灵活调度
- PaaS:通过互联网以服务得形式把计算环境、开发环境等平台提供给用户使用
- SaaS:软件服务,通过互联网以服务的形式把软件及应用程序按需提供给用户使用的一种范型
Socket
服务器:
- 创建一个连接 Socket 并监听连接请求(连接 Socket 用于监听端口、接受连接)
- 接受一个请求
- 创建一个数据 Socket,用于向 Socket 流中读/写数据(数据 Socket 用于建立与具体客户端的连接)
- 获取一个用于从 Socket 中读数据的输入流对象
- 从流中读数据
- 获取一个用于向 Socket 写数据的输出流对象
- 向流中写数据,跳转到 5
- 关闭 Socket
- 关系连接
客户端:
- 创建数据 Socket 并请求连接;
- 获取一个用于向 Socket 写数据得输出流对象;
- 向流中写数据;
- 获取一个用于从 Socket 中读数据的输入流对象;
- 从流中读数据;
- 跳转到 4
- 关闭数据 Socket
WebApi 与 WebServices 的对比
- WebApi 使用 http 协议,WebServices 使用 soap 协议
- WebApi 无状态,相对 WebServices 更轻量级,支持 get,post 等 http 操作
云计算定义 (4)
- 云计算是一种利用互联网实现随时随地、按需、便捷地访问共享资源池的计算模式
- 具有 5 大基本特征:按需自助服务、广泛的网络访问、共享的资源池、快速弹性能力、可度量服务
- 3 种服务模式:软件即服务 SaaS、平台即服务 PaaS、基础设施即服务IaaS
- 4 种部署方式:私有云、社区云、公有云、混合云
云计算的关键技术 (5)
体系结构
数据存储
计算模型
资源调度
虚拟化技术
云计算体系结构
- 核心服务层
- IaaS
- PaaS
- SaaS
- 服务管理层
- 用户访问接口层
MQ
-
Topic
消息主题,通过Topic对不同的业务消息进行分类。
-
Tag
消息标签,用来进一步区分某个Topic下的消息分类,消息从生产者发出即带上的属性。
消费模式
**集群:**MQ 约定使用相同 Consumer ID 的订阅者属于同一个集群,同一个集群下的订阅者消费逻辑必须完全一致(包括 Tag 的使用),这些订阅者在逻辑上可以认为是一个消费节点。
**集群消费:**当使用集群消费模式时,MQ 认为任意一条消息只需要被集群内的任意一个消费者处理即可。
适用场景&注意事项
- 消费端集群化部署,每条消息只需要被处理一次。
- 由于消费进度在服务端维护,可靠性更高。
- 每一条消息都只会被分发到一台机器上处理。
- 不保证消息的每一次失败重投等逻辑都能路由到同一台机器上,因此处理消息时不应该做任何确定性假设。
广播消费:当使用广播消费模式时,MQ 会将每条消息推送给集群内所有注册过的客户端,保证消息至少被每台机器消费一次。
- 每条消息都需要被相同逻辑的多台机器处理。
- 消费进度在客户端维护,出现重复的概率稍大于集群模式。
- 广播模式下,MQ 保证每条消息至少被每台客户端消费一次,但是并不会对消费失败的消息进行失败重投,因此业务方需要关注消费失败的情况。
- 广播模式下,每条消息都会被大量的客户端重复处理。
- 广播模式下服务端不维护消费进度,所以服务端不提供堆积查询和报警功能。
使用集群模式模拟广播
- 每条消息都需要被多台服务器处理
- 消费进度在服务端维护
Socket 分类
数据包Socket(UDP) 和流式 Socket(TCP)
服务器分类
是否并发:迭代 / 并发
有无状态:有状态 / 无状态
软件体系架构
表示层、应用层、服务层
CAP 理论
可用性、一致性、分区
https://blog.csdn.net/feiying0canglang/article/details/114291078
生产消费者模型
拉模式
生产者–>消费者方向,即生产者生产数据后,消费者主动到队列拉取数据)上实现
消费者主动去拉取它们需要处理的数据。
优点:
- 解耦
- 支持并发
- 支持忙闲不均:如果制造数据的速度时快时慢,缓冲区的好处就体现出来了。当数据制造快的时候,消费者来不及处理,未处理的数据可以暂时存在缓冲区中。等生产者的制造速度慢下来,消费者再慢慢处理掉。
缺点:
- 消息延迟
- 消息忙请求,忙请求就是比如消息隔了几个小时才有,那么在几个小时之内消费者的请求都是无效的,在做无用功。
发布订阅模型
推模式
一旦有数据生产时,立即通知到消费者,让消费者处理对应的数据
优点:
- 消息实时性高。
- 对于消费者使用来说更简单。
缺点:
- 推送速率难以适应消费速率
以下内容不一定对,谨慎使用
π 多线程计算
数据分解:利用该公式进行数据分解,每个线程从开始项执行到结束项,再将最终每个结果相加起来
任务分解:一个负责加一个负责减
生命游戏
- 如果一个细胞周围有3个细胞为生(一个细胞周围共有8个细胞),则该细胞为生(即该细胞若原先为死,则转为生,若原先为生,则保持不变) 。
- 如果一个细胞周围有2个细胞为生,则该细胞的生死状态保持不变;
- 在其它情况下,该细胞为死(即该细胞若原先为生,则转为死,若原先为死,则保持不变)
数据分解:把棋盘分为多块进行
任务分解:多个线程分别判断三种状态(生、死、不变)
while(true) 与阻塞
死循环中仍会消耗资源(CPU等),阻塞会将进程挂起,在需要执行的时候再唤醒,再未唤醒前不消耗资源,性能更优