分布式系统的意义

  • 升级单机处理能力的性价比越来越低
  • 单机处理能力存在瓶颈
  • 稳定性和可用性

多进程

多线程共享了进程的内存空间,多进程内存空间是独立的。
多进程的单个进程出现问题,有可能不会造成整体不可用(取决于实现)

多线程

基于共享容器协同的多线程模式

使用线程安全的容器和对象
使用锁

通过事件协同的多线程模式

A线程需要等待B线程传递消息或事件
A线程与B现成获取锁的顺序有问题产生了死锁

网络IO实现方式

BIO 阻塞

Socket套接字需要使用一个线程来处理,若要支持更多的并发,就需要更多的线程。

NIO 非阻塞

基于事件驱动思想,采用Reactor模式(反应堆)

通过Reactor对所有的客户端Socket做处理,分发到不同的线程中处理。

AIO 异步IO

采用Proactor模式,

NIO的通知是发生在动作之前,比如可读可写的时候,进行读写

AIO的通知发生在动作之后,比如读写已经完毕,发出通知

如何从单机扩展到分布式

  • 单机->多机
  • 业务拆分,业务分层,多业务多机
  • 服务化

透明代理,比如负载均衡

非透明代理,服务提供者

  • 名称服务模式

名称服务,收集处理服务器的调用列表,提供给请求服务器,由请求服务器进行负载均衡工作

  • 规则服务模式

规则服务,不仅仅收集处理服务器的调用列表,还提供请求服务器应该请求哪个具体的处理服务器

  • master->worker 模式

这种方式刚多的关注任务的分发与管理

分布式系统的难点

全局时钟

单点

分布式事务

两阶段提交

最终一致性

ACID 事务具有的属性,原子性,一致性,隔离性,持久性

CAP 一致性,可用性,分区容错性

BASE 基本可用,柔性事务,最终一致性

服务框架

业务拆分,应用之间没有交互,或者很少交互

数据访问层

分布式事务:分布式事务规范->XA,事务参与者,支持事务的服务器,资源服务器,事务管理器

两阶段提交,传统是提交,或者回滚。两阶段提交在提交之前增加了准备阶段。问题比较多。必要的情况下建议使用。

比两阶段提交更轻量的Paxos协议

ID 发号器

消息中间件

消息发送的一致性。业务操作成功,消息没有发送成功。

可以使用分布式事务,消息发送是其中一个事务。

优化流程,改为最终一致性方案。

  1. 应用发送消息->消息中间件
  2. 消息中间件产生消息(待处理)状态
  3. 消息中间件返回消息状态
  4. 业务操作
  5. 发送业务处理结果->消息中间件
  6. 更新消息状态,业务成功,投递消息,业务失败消息删除。

必要情况下,消息中间件还可以反查业务状态。

应用业务操作结果->中间件(修改消息状态,投递消息)