分布式微服务项目实现高并发高可用高性能可以使用到的方案

这篇具有很好参考价值的文章主要介绍了分布式微服务项目实现高并发高可用高性能可以使用到的方案。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。


前言

实力有限,只能就我知道的写。总篇只写大致方案。


一、分布式高并发问题

不同于单机环境,分布式微服务环境下最大的问题就是会出现不仅是跨线程还会有跨服务的数据一致性问题。单机环境下我们有volatile和synchronized以及JUC下的并发编程工具等工具实现并发编程。分布式跨服务环境下就得使用别的方案支持,例如分布式锁、分布式事务、分布式ID等方案满足业务需求。

1. 分布式锁

(1)mysql

利用mysql的主键或唯一索引。

(2)redis

设置有效时间避免死锁,看门狗线程自动续期。
redis集群的红锁。

(3)zookeeper+mysql乐观锁

解决stw情况下redis锁失效的问题。

分布式锁的问题和优化

单点问题
使用分段锁

2. 分布式事务

思路

项目中尽量不要使用分布式事务,一般来说只会将非核心非强一致性的业务操作例如通知、日志等,核心的操作最好是放在同一个事务处理。
利用mysql本身支持的事务功能,设计一种方案,可以确认在每个服务或数据库上的整段操作是否可行,根据每段操作的执行结果判断是全部提交还是全部回滚。

(1)2pc

协调者,事务执行者(数据库)
一阶段:开启事务,预执行,并返回执行结果给协调者。
二阶段:协调者根据返回的执行结果判断是全部提交还是全部回滚。

缺点:
  1. 不能完全保证数据一致性
  2. 占用数据库连接
回滚方案

定时任务校验数据并报警

阿里seata工具优化两阶段提交(乐观锁+undolog)

在一阶段就commit释放资源,但是会记录操作(类似undolog),在二阶段如果成功就不处理失败就执行回滚。

(2)3pc

比起2pc,减少了回滚场景下无用的连接和资源浪费
一阶段:can commit
二阶段:pre commit
三阶段:do commit

(3)tcc方案

场景:数据库与缓存同步方案 try confirm cancel

(4)事务表策略

采用 数据库事件表+消息队列+定时任务\监听器 实现的异步事务方案。

  1. 用户请求 -> 执行业务 -> 写数据库事件表 -> 直接放回结果
  2. 定时任务查询事件表 -> 发送消息队列 -> 更新事件表状态已发送
  3. 接收者接受到消息后消费 -> 保存到另一张待执行事件表 -> 发送消息ack -> 更新事件表状态已消费
  4. 定时任务查询待执行事件表 -> 执行事务 -> 更新待执行事件表状态已执行
    方案中也可以省略定时任务,直接在前一个步骤就执行操作。

(5)消息中间件事务

3. 分布式ID

(1)mysql

基于MySQL的原子自增主键 auto increment。

Segment优化:

批量生成策略,双重缓存策略。

(2)雪花算法

时间戳+64机器码+nodeID+areaID+自增
缺点:单点故障、时间回退、NodeID和areaID的分配
优化:zookeeper+雪花算法

二、高并发高性能

1. 客户端优化

(1)浏览器缓存

(2)部分计算交由客户端完成

(3)减少客户端重复请求

  1. 按钮置灰
  2. 重刷校验
  3. 验证码校验

(4)高并发的业务中减少非必要的功能和请求

(5)优化请求

  1. 合并多个请求
  2. 只提交必要数据

(6)将大数据请求拆分为多个请求

2. 网络层优化

(1)NDS+CDN 多地部署

(2)网关层添加黑名单

(3)负载均衡和静态服务器

3. 应用层优化

思路

对应用的优化,主要就两条:最大程度压榨系统性能以及怎么避免系统超过极限。
压榨系统性能本质上其实就是尽可能压榨系统CUP和IO的性能。对CUP的利用率,可以从并发编程入手,对IO的利用率,主要是对缓存的应用。
超过系统压力的情况下处理方案:分压和限流。分系统分业务分缓存,阻塞缓存。

(1)缓存使用和优化

1. 增:缓存预热(热点数据分析)

通过跟踪埋点、日志和数据库,分析高频查询、收藏、购物车、订单这类数据,以及活动等确定热点数据预热。

2. 删:缓存清除策略

基于时效清除、LRU算法、灵活分配策略(使用GC+SoftRefrence<>)
由于GC+软引用的不确定性(不直接受业务控制),一般是用来作为LRU算法的补充优化。

3. 改:缓存数据刷新和一致性问题
  1. 定时更新、时效更新(被动更新,需要允许数据延迟,例如个人信息、收藏、点赞、评论、排名)
  2. 主动更新:(cache aside 鸵鸟算法,允许一定容忍度)
    1.先更新缓存后更新数据库(可能出现数据库更新失败问题)
    2.更新数据库顺便更新缓存(可能出现先后更新缓存问题)
    3.删除缓存,更新数据库,后面查询的时候再更新缓存(可能出现在更新数据库过程中又查询了一次缓存)
    4.更新数据库,删除缓存,后面查询的时候再更新缓存
4. 怎么用:缓存优化

根据业务灵活使用缓存清除策略。
缓存分段提高缓存利用率。

5. 缓存击穿、缓存穿透、雪崩问题解决方案

布隆过滤器、自动续期、分时段、队列缓冲

(2)高并发下系统优化

  1. 分系统分业务分缓存
  2. 分段分流:活动采用分时间段拆分多个活动 和 预付定金活动
  3. 消息队列: 异步削峰

(3)分布式锁优化

使用读写锁方式 和 分段锁

4. 数据库层

按影响范围:索引优化、分区、分库分表(历史表-归档、水平分表、垂直分表)、读写分离(主从一致性问题)
主从一致性问题:

  1. 从库禁止写操作
  2. binlog+IO thread+replaylog+SQL thread 实现主从复制(日志类型需要使用混合模式)
  3. 对强一致性数据使用读写锁或者放弃使用读写分离和缓存

三、高可用

思路

除了使用主备或集群方式解决单点故障问题。
还可以从整体和局部上分析,通过减少环节和隔离方式避免单个或局部服务出错导致整个系统受影响。(隔离、限流、熔断、降级、恢复)

1. 服务主备、集群配置

2. 隔离、限流、熔断、降级、恢复

  1. 隔离:服务间尽量保证业务隔离、系统隔离、数据隔离
  2. 限流:不局限于队列限流、令牌桶、输入验证码等都算,核心就是不要让请求一次请打到服务器上
  3. 熔断:由于服务器的不确定性,在出现多次请求失败/超时下熔断,不在请求后面服务,一段时间后尝试恢复
  4. 降级:由于业务的不确定性,在出现高峰期的时候主动舍弃非核心功能,保证核心功能正常使用
  5. 恢复分批少量开放,逐级恢复

3. 提供补偿(兜底)方案

在开发过程中,分析功能可能出现的问题(超时、异步请求失败、分布式事务失败等),设计补偿方案。
根据具体业务实现(优惠券补发、退款、定时数据核验、等待页面等)文章来源地址https://www.toymoban.com/news/detail-634550.html


到了这里,关于分布式微服务项目实现高并发高可用高性能可以使用到的方案的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • 1.12.C++项目:仿muduo库实现并发服务器之LoopThreadPool模块的设计

    1.线程数量可配置(0或多个) 2. 对所有的线程进行管理,其实也就是管理0个或多个LoopThread对象! 3. 提供线程分配的功能! 针对LoopThread设计一个线程池,便于管理。 对所有的LoopThread进行分配和管理! 1.线程数量可配置(0或多个) 注意事项:在服务器中,主从Reactor模型是

    2024年02月07日
    浏览(50)
  • 1.6.C++项目:仿muduo库实现并发服务器之channel模块的设计

    项目完整版在: 1.对监控事件的管理 描述符是否可读 描述符是否可写 对描述符监控可读 对描述符监控可写 解除可读事件监控 解除可写事件监控 解除所有事件监控 2.对监控事件触发后的处理 设置对于不同事件的回调处理函数 明确触发了某个事件该如何处理 对socket套接字的

    2024年02月08日
    浏览(48)
  • 1.4.C++项目:仿muduo库实现并发服务器之buffer模块的设计

    项目完整版在: Buffer模块是一个缓冲区模块,用于实现通信中用户态的接收缓冲区和发送缓冲区功能。 存储数据,取出数据 1.实现换出去得有一块内存空间,采用vector ,vector底层是一个线性的内存空间! 1.默认空间大小 2.当前的读取数据位置! 3.当前的写入数据位置! 写入

    2024年02月07日
    浏览(46)
  • 1.5.C++项目:仿muduo库实现并发服务器之socket模块的设计

    项目完整版在: Socket模块是对套接字操作封装的一个模块,主要实现的socket的各项操作。 对socket套接字的操作进行封装。 对socket套接字的操作进行封装。 创建套接字 绑定地址信息 开始监听 向服务器发起连接 获取新连接 接受数据 发送数据 关闭套接字 创建一个监听链接

    2024年02月07日
    浏览(47)
  • C++项目:仿mudou库one thread one loop式并发服务器实现

    目录 1.实现目标 2.HTTP服务器 3.Reactor模型 3.1分类 4.功能模块划分: 4.1SERVER模块: 4.2HTTP协议模块: 5.简单的秒级定时任务实现 5.1Linux提供给我们的定时器 5.2时间轮思想: 6.正则库的简单使用 7.通用类型any类型的实现 8.日志宏的实现 9.缓冲区buffer类的实现 10.套接字Socket类实现 11.

    2024年02月08日
    浏览(42)
  • 1.16.C++项目:仿muduo库实现并发服务器之HttpContext以及HttpServer模块的设计

    添加请求—— 处理函数映射信息(GET/POST/PUT/DELETE) 设置静态资源根目录 设置是否启动超时连接关闭 设置线程池中线程数量 启动服务器 OnConnected - 用于给TcpServer设置协议上下文 OnMessage - 用于进行缓冲区数据解析处理 获取上下文,进行缓冲区数据对象 请求的路由查 找 静态资

    2024年02月07日
    浏览(55)
  • 【Spring Cloud】新闻头条微服务项目:分布式文件系统MinIO实现文章页面存取

      个人简介:  📦个人主页:赵四司机 🏆学习方向:JAVA后端开发  📣种一棵树最好的时间是十年前,其次是现在! ⏰往期文章:SpringBoot项目整合微信支付 🧡喜欢的话麻烦点点关注喔,你们的支持是我的最大动力。 前言: 最近在做一个基于SpringCloud+Springboot+Docker的新闻头

    2023年04月08日
    浏览(59)
  • linux并发服务器 —— 项目实战(九)

    数据就绪 - 根据系统IO操作的就绪状态 阻塞 - 调用IO方法的线程进入阻塞状态(挂起) 非阻塞 - 不会改变线程的状态,通过返回值判断 数据读写 - 根据应用程序和内核的交互方式 同步 - 数据的读写需要应用层去读写 异步 - 操作系统提供相应服务 阻塞/非阻塞都是同步IO,只用

    2024年02月09日
    浏览(45)
  • 【项目实战】基于高并发服务器的搜索引擎

    作者:爱写代码的刚子 时间:2024.4.24 前言:基于高并发服务器的搜索引擎,引用了第三方库cpp-httplib,cppjieba,项目的要点在代码注释中了 index.html index.hpp log.hpp parser.cc(用于对网页的html文件切分且存储索引关系) searcher.hpp util.hpp http_server.cc(用于启动服务器和搜索引擎)

    2024年04月28日
    浏览(48)
  • 【Linux】C++项目实战-高并发服务器详析

    橙色 server_process.c文件内容如下: 注意第70行的if(errno == EINTR),如果没有这个if判断的话,当同时多个客户端链接进来,停掉一个客户端,然后再启动一个客户端,就会发现没法连接了,accept会报一个错误。因为一个客户端停掉,在服务器端就相当于一个子进程终止执行,会发

    2024年02月09日
    浏览(55)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包