《架构设计》-08-分布式系统和Rpc架构

1. 分布式系统

1.1 横向拆分

分布式系统是横向拆分的的结果:
在这里插入图片描述
上图说明:

  • 把订单、物流、商品、库存、交易和会员等业务抽象成独立的垂直化服务
  • 在各个服务上层实现分布式环境下的调用和管理框架
  • 业务
    • 业务1:基于订单和物流服务
    • 业务2:只依赖于交易和会员管理服务

1.2 分布式服务框架优缺点

  • 优点
    • 提供了一种按需构建的机制
    • 保证各个分布式服务的技术、团队、交付独立发展
    • 确保业务整合的灵活性和高效性。
  • 问题
    • 网络传输的多态性
    • 服务的维护复杂性和可用性
    • 服务的分布性和对等性
    • 负载均衡的需求
    • 分布式事务及数据节点的一致性
    • ……

1.3 功能/非功能需求

  • 其功能需求:提供服务接入
    基本组件:括网络通信、序列化/反序列化、传输协议和服务调用
  • 其非功能需求:
    服务路由、集群容错、服务订阅发布、服务治理和服务监控等组件

2. RPC架构

2.1 概述

在这里插入图片描述

  • 客户端职责
    • RpcClient,负责导入(import)由Rpc Proxy提供的远程接口的代理实现。
    • RpcProxy,远程接口的代理实现,提供远程服务本地化访问的入口。
    • RpcInvoker,负责编码和发送调用请求到服务方并等待结果。
    • RpcProtocol,负责网络传输协议的编码和解码。
    • RpcConnector,负责维持客户端和服务端连接通道和发送数据到服务端。
    • RpcChannel,网络数据传输通道。
  • 服务端职责
    • RpcServer,负责导出(export)远程接口。
    • RpcInvoker,负责调用服务端接口的具体实现并返回结果。
    • RpcProtocol,负责网络传输协议的编码和解码。
    • RpcAcceptor,负责接收客户方请求并返回请求结果。
    • RpcProcessor,负责在服务方控制调用过程,包括管理调用线程池、超时时间等。
    • RpcChannel,网络数据传输通道。

2.2 网络通信

  • 网络连接
    • Rpc通常采用长连接
  • IO模型
    • 阻塞式IO(BIO)
      BIO要求客户端请求数与服务端线程数一一对应,显然服务端可以创建的线程数会成为系统的瓶颈
    • 非阻塞IO(NIO)
      它和IO复用技术实际上也会在IO上形成阻塞
    • 异步IO(AIO):不会阻塞
  • 可靠性
    • 链路有效性检测
      • 心跳检测
        • 方法一:TCP层通过建立长链接传递心跳信息
        • 方法二:在应用层,根据系统要求发送可能包含业务逻辑的心跳信息
    • 断线之后的重连处理。
      • 发送方检测到通信链路中断 ===》重连
      • 重连失败 ===》周期性重连直至重连成功

2.3 序列化

2.3.1 概述

  • 概念

    • 序列化(Serialization):将对象转化为字节数组,用于网络传输、数据持久化或其他用途。
    • 反序列化(Deserialization):把从网络、磁盘等读取的字节数组还原成原始对象,以便后续业务逻辑操作。
  • 序列化实现

    • 文本类:如 XML、JSON
    • 二进制类:Google的Protocol Buffer和Facebook的Thrift等
  • 实现方案选择

    • 根据功能(主要)
      • 接口友好性和中间语言
      • 跨语言调用
    • 根据性能(重要)
      • 序列化之后码流大小
      • 序列化/反序列化速度
      • CPU/内存资源占用
    • 根据兼容性
      实现版本前向兼容,确保新、老接口可用

图,序列化性能比较:
在这里插入图片描述

2.3.2 传输协议

  • ISO/OSI(Open System Interconnect,开放系统互连)七层网络模型
    在这里插入图片描述
  • Dubbo私有协议
    Dubbo协议在会话层中添加了自定义消息头。该消息头包括多协议支持和兼容的Magic Code属性、支持同步转异步并扩展消息头的Id属性等。
    在这里插入图片描述
  • Dubbo协议的数据包大小对比图
    在这里插入图片描述

2.4 服务调用

2.4.1 概述

  • 服务调用模式
    • 单向模式:一般同步调用
    • 请求应答模式:异步调用

在这里插入图片描述

2.4.2 同步调用

  • 缺点:会造成业务线程阻塞
  • 优点:开发和管理相对简单。
  • 时序图
    • 服务线程发送请求到IO线程之后就一直处于等待阶段
    • 直到IO线程完成与网络的读写操作之后被主动唤醒

在这里插入图片描述

2.4.3 异步调用(Future模式为例)

利用Future模式发送请求后,无需等待响应的到来。在等待响应的过程中可以执行其他程序。

在这里插入图片描述

1)Future-Get模式

  • 主动get结果的方式获取Future结果,而这个get过程是串行的,会造成执行get方法的线程形成阻塞。
    在这里插入图片描述

2)Future-Listener模式

在这里插入图片描述

需要创建Listener,当Future结果生成时会唤醒注册到该Future上的Listener对象,从而形成异步回调机制。

3)二者时间成本对比

假设有3个任务,执行时间分别是T1、T2和T3,

  • Future-Get 执行的总时间:T=T1+T2+T3
  • FutureListener执行的总时间 :T=Max(T1,T2,T3)
    在这里插入图片描述

在这里插入图片描述

猜你喜欢

转载自blog.csdn.net/xingzuo_1840/article/details/128964727
今日推荐