关于java:分布式系统

28次阅读

共计 2261 个字符,预计需要花费 6 分钟才能阅读完成。

分布式系统

分布式事务

分布式事务实现计划

  • 最大致力告诉

    • 基于 BASE 实践做的保证数据最终一致性计划,根本可用,软状态,最终一致性
    • 具体实现为,写本地事务,同步写一张事务音讯表,发送事务音讯,音讯异步告诉关联系统,解决失败则利用 MQ 的重试性能做主动重试,超过重试次数记录失败状态,定时工作扫描手动解决
  • TCC 事务弥补计划

    • 须要一个事务处理器
    • 每个事务必须实现 try、confirm、cancel 三个办法,开发保护老本高
    • 阿里开源框架实现 seata
  • 基于可靠消息的最终一致性计划

    • RocketMQ 有事务音讯的实现
    • 具体原理为,业务方发送一个事务音讯,MQ 将音讯落表,此时音讯对生产方不可见
    • 发起方执行本地事务,告诉 MQ 提交或回滚
    • MQ 会定时查问发起方的事务执行状态,决定提交或回滚

TCC 的优缺点

* 每个事务必须实现 try、confirm、cancel 三个办法,开发保护老本高
* 事务管理器也存在单点问题
* 事务管理器事务流动日志的存储老本

两阶段提交与三阶段提交的区别

* 三阶段提交相比两阶段提交多了第 0 步查看是否可提交,升高了重复的“锁定 - 开释”的可能


SpringCloud

  • 微服务服务发现与调用流程
    服务提供者启动将本人的注册到 eureka
    服务消费者通过 serviceId 到 eureka 拉取服务提供者的实例 IP
    服务消费者通过 Ribbon,默认采纳轮询的形式调用消费者 IP 列表中实例
  • ribbon 的重试机制

    • 默认超时后重试原实例一次
    • 可配置重试其余实例的次数
    • 理论配置敞开了重试,因为超时失败下次申请大概率也会失败,重试容易放大故障,减少压力
  • ribbon 屡次调用一个实例失败会将其剔除吗?
  • eureka 服务下线感知
    有至多 30 秒延时(认为延时可承受,用无损公布可解决,无损公布应用两个池,一个起来之后将流量切过去)

微服务架构

  • 零碎设计的分层思维
    * 各层独立

      * 只需理解以后层的应用,不须要关怀其余层的实现细节
      * 组件之间独立实现、独立部署
      * 能够应用不同技术栈,实现多语言开发
      * 各个服务可依据本身业务负载状况进行实例和数据等资源扩大 

    * 职责专一,业务边界清晰

      * 能够按业务组织团队
      * 服务按业务线划分,可缩小业务变动时的影响面,缩小服务外部批改产生的内耗 

    * 变动和资源隔离

      * 不同层之间的代码或实现形式批改,不影响其余层
      * 组件之间调用线程隔离,并引入熔断机制,能够避免服务一挂全挂的状况 

    * 高内聚

      * 将大问题分解成小问题,有利于升高实现难度
      * 代码容易了解,开发效率高
      * 有利于代码性能复用
    

iso 协定分层,利用分层等为什么分层

* 各层独立
    * 只需理解以后层的应用,不须要关怀其余层的实现细节
* 变动隔离
    * 不同层之间的代码或实现形式批改,不影响其余层
* 高内聚
    * 将大问题分解成小问题,有利于升高实现难度
  • 微服务的毛病
    * 数据一致性,分布式事务问题。因为分布式部署不能应用数据库的事务机制,分布式事务实现简单。
    * 网络、容错问题。各服务间通过网络协议通信,须要思考服务间调用的负载平衡、限流、熔断等问题。
    * 分布式资源管理的问题。组件与服务实例治理,连接池等公共资源调配。
    * 运维难度加大。运维需治理的服务组件变多
    * 波及多个服务间相互调用使自动化测试难度加大
    * 可能减少沟通老本
  • 微服务架构应用机会
    * 业务曾经成型,能够形象定义出各类独立的功能模块进行开发治理
    * 曾经有比拟大业务数据根底,零碎性能变得宏大简单,能够依照微服务进行组件拆分

    * 业务还没有理分明,处于疾速开发、疾速试错、疾速迭代阶段
    * 业务数据少,还未实现爆炸式增长
    * 零碎性能少

设计高并发、高可用零碎用到的办法

高并发

高并发性,是零碎从上到下优化革新的后果,从零碎架构到业务解决都要留神解决

  • 架构层面

    • 零碎集群化

      • 反向代理 lvs、网关 Nginx、微服务组件、redis 都是集群化部署
      • 多机同时对外提供服务
      • 服务无状态,可有限程度扩容
    • 前后端拆散,动态页面服务应用 CDN 减速
    • 数据库分库分表、读写拆散
  • 业务层面

    • 加缓存

      • 加 redis 缓存,redis 热 key 打散
      • Google Guava 本地缓存
    • 代码优化,流程优化

      • 性能低的代码,如汇合类的容量设置,多余的循环,多查的数据,多余的内部申请
    • 异步解决

      • 一些非关键业务的落库操作改为异步。如大数据业务染色的 token,异步保留,超线程池后,mq 提早生产
    • 并行处理

      • future 加线程池并行处理
    • MQ 削峰

      • mq 生产速率固定,可避免峰值申请冲垮零碎
      • mq 提早生产
      • 设置开关,开启则临时不生产,应答冲击顶峰
    • 版本探测机制
    • 数据增量返回
  • 压测,性能摸底
  • 限流降级

    • 网关对接口间接限流,令牌桶算法对占资源的接口限流,如下单、领取等
    • 应用层对业务限流,如优惠券应用令牌桶算法,超阈值就异步解决
    • 非关键业务间接降级,返回固定值,或服务不可用,敞开风控

高可用

高可用通过集群冗余,加故障主动转移实现

  • 零碎集群化,多机同时提供服务

    • 入口层:DNS 轮询
    • 反向代理层:lvs 的 keeplived+ 虚 ip
    • 网关层:nginx 的 upstream 屡次申请一台实例失败,会将这台实例剔除
    • 微服务组件层:服务注册与发现,心跳机制
  • 故障主动转移

    • 心跳机制,定期续约
    • 故障主动剔除
    • 主从切换
  • 数据冗余,主从切换机制
    redis 缓存:主从复制,故障转移(线上 redis 一主一从,16 台 16G)
    数据库:主从同步
  • 流量调配,过载爱护

    • 负载平衡:轮询、哈希、随机、固定比例、动静比例
    • 限流

      • 限流算法

        • 令牌桶:固定速率往桶中放令牌,可应答突发流量
        • 漏桶:固定速率从桶中流出申请,适应调上游服务承载能力固定的场景
        • 信号量限流:比拟暴力,超过阈值间接抛弃申请
      • 分布式限流算法

        • Nginx 加 lua 实现令牌桶算法对接口进行限流
  • 防故障蔓延

    • 降级
    • 隔离
    • 超时
  • 容灾:多机房、多活
  • 疾速回滚
  • 性能指标监控

正文完
 0