[JD] 一、基础架构与RPC框架剖析

[JD] 一、基础架构与RPC框架剖析

一、基础架构
二、RPC实现原理
三、RPC服务消费/提供方核心功能设计实现
四、主流RPC产品对比

一、基础架构
[JD] 一、基础架构与RPC框架剖析_第1张图片
    基础架构设计主要考虑的几个方面:业务开发框架、存储、管理平台、MIS支撑、运维、基础组件、基础服务
· 业务开发框架又可以划分:网关、业务逻辑层、数据访问层
· 存储主要有:关系型存储MySQL、TiDB、缓存系统Codis、固化KV存储等
· 管理平台可以包含:服务管理平台、监控、日志平台、消息中心、任务调度平台、配置中心等
· MIS支撑:权限管理、用户认证系统SSO
· 运维:工单系统、发布系统、资产管理系统、云平台等
· 基础组件:分布式事务中间件、数据库中间件
· 基础服务:短域名服务、即时通讯服务IM、推送服务PUSH等

 

二、RPC实现原理
RPC,即远程过程调用。是一种计算机通信协议,它可以想调本地方法一样调用远程服务,中间通过网络调用传达数据
[JD] 一、基础架构与RPC框架剖析_第2张图片
1.RPC作用
    屏蔽组包解包
    屏蔽数据发送、接收
    提高开发效率
2.RPC核心组成
    远程方法对象代理
    连接管理
    序列化、反序列化
    寻址和负载均衡
3.RPC调用方式
    同步调用
    异步调用
4.RPC过程
    客户端的工作:建立与服务端的连接、组装数据、发送数据包、接受处理结果数据包、解析返回数据包
    服务端的工作:监听端口、响应连接请求、接收数据包、解析数据包调用相应的方法、组装请求处理结果数据包、发送结果数据包
    客户端和服务端都是代理类互相通信
5.RPC序列化协议
    远程调用涉及数据传输、就会有组包和解包,需要调用方和服务方约定一致的数据格式,即序列化协议。
    实际应用中,一条消息分为消息头(定长)、消息体(变长)。在消息头中,可以定义出协议版本、消息指令、鉴别字段和消息体长度

三、RPC服务消费/提供方核心功能设计实现
除了简单RPC核心调用外,生产上的RPC产品还有一些重要的核心功能
1.RPC服务消费方核心实现还包括
    · 连接管理:用于保持与服务方提供长连接,传输请求数据和接收返回结果。主要包含 初始化时机、连接数维护、心跳、重试
    · 负载均衡:可以确保多个服务提供节点流量均匀合理,支持节点扩容和灰度发布。主要的负载均衡机制有 轮训、随机、取模、带权重、一致性HASH
        [扩展:权重负载均衡设计思路]
        要求:权重在[0,10]范围取值、值越大权重越高、权重高分配流量就大
        设计思路:
            - 每个provider机器都关联一个权重,权重范围[0,10]
            - 客户端拉取到服务端列表时,也会拉取到对应的服务端机器权重系数
                providerA-1 权重10
                providerA-2 权重10
                providerA-3 权重10
                providerA-4 权重10
            - 这时,每个providerA都会分到客户端的25%流量
            - 在RPC控制台修改每个提供方的权重,如下:
                providerA-1 权重1
                providerA-2 权重10
                providerA-3 权重10
                providerA-4 权重10
            - 客户端拉取到服务端列表时,也会拉取到对应的服务端机器权重系数重新计算往目标机器发送请求比例
                providerA-1 权重1,发送2.5%流量
                providerA-2 权重10,发送32.5%流量
                providerA-3 权重10,发送32.5%流量
                providerA-4 权重10,发送32.5%流量
            - 客户端控制流量的方式:可以为每个provider机器生成一个长度为10的随机数组,数组的元素值为0或1,其中1代表这次请求访问这台机器,0为不访问。1的个数取决于拉取到的权重,位置可随机
                这样设计的好处是,客户端每次只要为每个provider建立一个单例数组,然后循环访问数组即可。如果采用随机数的方式,每次发送请求前都随机数访问,生成随机数会造成CPU多余消耗
            
    · 请求路由:通过一系列规则过滤出可以选择的服务提供方节点列表,在应用隔离、读写分离、灰度发布中发挥作用。路由功能可包含 匹配规则(属性比较、节点匹配)、行为(是否请求)、链表(元素为匹配规则,逐一过滤)
    · 超时处理:工作线程阻塞等待回包通知;超时逻辑为工作线程等待通知、数据返回终止等待,否则超时抛出异常;数据结构为 MAP。可以理解为synchronized(session_id){wait(); deal(map.get(session_id))},由回包线程 notify() 唤醒
    · 批量发送请求优化:聚合处理,5ms内满10个请求发送,超过5ms没超过10个也发送
    · 健康检查
[JD] 一、基础架构与RPC框架剖析_第3张图片
在上图的客户端线程模型中,客户端和服务端之间建立单一连接,中间客户端将请求发送到工作队列,等待服务端处理请求,IO返回数据后再唤醒工作线程处理响应数据

2.RPC服务提供方核心功能设计实现还包括
    · 队列、线程池:将不同类型的请求,放入各自的队列,每个队列分配独立的线程池,资源隔离
    · 超时丢弃:快速失败已超时的请求,缓解队列堆积。即在从任务队列读取请求后,处理请求前,判断请求是否超时,超时则不予处理
    · 优雅关闭:进程结束之前,保证收到的请求全部处理完成。两种实现思路,一种是返回的数据中带关闭信息(缺点是被调用方比较被动,当QPS低时通知客户端不及时),另一种是设置专门关闭协议通知调用方
        [第二种实现方式] Server端监听关闭信号kill -12,监听到之后,改变服务状态,再通知客户端
    · 过载保护:服务方为保证正常运行,主动丢弃超出处理能力之外的请求,可以设计为当请求队列到达一定长度时,触发过载保护

3.RPC产品还可以提供 服务熔断、服务降级、限流、动态权重功能
    服务熔断:当某个服务不可用或者响应超时,为了防止整个系统出现雪崩,暂时停止对该服务的调用
    服务降级:调用方自己对业务降级处理,拿出兜底方案保证服务可用
    限流:通过对调用方限制流量,保护服务提供方
    动态权重:节点刚启动的时候,可以分配少部分的流量,再逐步提高权重

四、主流RPC产品对比
[JD] 一、基础架构与RPC框架剖析_第4张图片

你可能感兴趣的:(架构师笔记,rpc)