0.高并发

0.1.什么是高并发

高并发(High Concurrency)是一种系统运行过程中遇到的一种“短时间内遇到大量操作请求”的情况,主要发生在web系统集中大量访问收到大量请求(例如:12306的抢票情况;天猫双十一活动)。该情况的发生会导致系统在这段时间内执行大量操作,例如对资源的请求,数据库的操作等。

0.1.1.高并发与多线程

多线程是java的特性,因为现在cpu都是多核多线程的,可以同时执行几个任务,为了提高jvm的执行效率,java提供了这种多线程的机制,以增强数据处理效率。多线程对应的是cpu,高并发对应的是访问请求,可以用单线程处理所有访问请求,也可以用多线程同时处理访问请求。

如果要想系统能够适应高并发状态,则需要从各个方面进行系统优化,包括,硬件、网络、系统架构、开发语言的选取、数据结构的运用、算法优化、数据库优化等……而多线程只是其中解决方法之一。

0.2.高并发的处理指标

1.响应时间(Response Time)

​ 响应时间:系统对请求做出响应的时间。例如系统处理一个HTTP请求需要200ms,这个200ms就是系统的响应时间

2.吞吐量(Throughput)

​ 吞吐量:单位时间内处理的请求数量。

3.每秒查询率QPS(Query Per Second)

​ QPS:每秒响应请求数。在互联网领域,这个指标和吞吐量区分的没有这么明显。

4.并发用户数

​ 并发用户数:同时承载正常使用系统功能的用户数量。例如一个即时通讯系统,同时在线量一定程度上代表了系统的并发用户数。

压力测试工具 JMeter

0.3.解决高并发的常用方法

  1. 服务单一职责+独立部署(微服务)

​ 当前服务出现异常,不能影响其它服务

  1. 链接加密

    防止恶意攻击, 模拟请求, 高并发攻击; 防止链接暴露

  2. 数据预热 + 快速数据处理(redis)

    数据读多写少, 将数据存储到缓存中; 通过信号量控制请求

  3. 动静分离 (nginx)

    静态资源存储到nginx; 动态请求到后端的服务集群; 使用CDN网络, 分担集群压力

  4. 拦截恶意请求

    通过网关层, 识别非法攻击请求, 并进行拦截

  5. 流量错峰

    从操作流程设计上, 将流量分担到更大宽度的时间点; 如: 操作增加验证码

  6. 限流&熔断&降级(Sentinel)

    限制次数, 限制总量, 快速失败降级运行, 熔断隔离防止雪崩

  7. 队列削峰( MQ, kafka)

    操作放入队列, 慢慢执行后续操作

1.多线程

对应 线程 篇

2.缓存

对应 redis 篇

3.信息队列MQ

对应 kafka 篇

4.分布式与集群

集群是个物理形态,分布式是个工作方式。
1.分布式:一个业务分拆多个子业务,部署在不同的服务器上
2.集群:同一个业务,部署在多个服务器上
分布式是指将不同的业务分布在不同的地方。而集群指的是将几台服务器集中在一起,实现同一业务。
分布式中的每一个节点,都可以做集群。而集群并不一定就是分布式的。

分布式的每一个节点,都完成不同的业务,一个节点垮了,那这个业务就不可访问了。
简单说,分布式是以缩短单个任务的执行时间来提升效率的,而集群则是通过提高单位时间内执行的任务数来提升效率。

例如:如果一个任务由 10 个子任务组成,每个子任务单独执行需 1 小时,则在一台服务器上执行该任务需 10 小时。
采用分布式方案,提供 10 台服务器,每台服务器只负责处理一个子任务,不考虑子任务间的依赖关系,执行完这个任务只需一个小时。

而采用集群方案,同样提供 10 台服务器,每台服务器都能独立处理这个任务。假设有 10 个任务同时到达,10 个服务器将同时工作,1 小时后,10 个任务同时完成,这样,整体来看,还是 1 小时内完成一个任务!

好的设计应该是分布式和集群的结合,先分布式再集群,具体实现就是业务拆分成很多子业务,然后针对每个子业务进行集群部署,这样每个子业务如果出了问题,整个系统完全不会受影响。

4.1.负载均衡

负载均衡*(Load Balance)*其意思就是分摊到多个操作单元上进行执行,从而共同完成工作任务。

5.微服务

另外,还有一个概念和分布式比较相似,那就是微服务。

微服务(或微服务架构)是一种架构方法,其中单个应用程序由许多松散耦合且可独立部署的较小组件或服务组成。

**微服务是一种架构风格,一个大型复杂软件应用由一个或多个微服务组成。**系统中的各个微服务可被独立部署,各个微服务之间是松耦合的。每个微服务仅关注于完成一件任务并很好地完成该任务。在所有情况下,每个任务代表着一个小的业务能力。微服务的应用不一定是分散在多个服务器上,他也可以是同一个服务器。

5.1.Spring-cloud

Spring-cloud就是微服务系统架构的一站式解决方案,在平时我们构建微服务的过程中需要做如 服务发现注册 、配置中心 、消息总线 、负载均衡 、断路器 、数据监控 等操作,而 Spring Cloud 为我们提供了一套简易的编程模型

与spring-cloud相比,dubbo的优势在于占用带宽小,缺点在于开发难度大,社区不够成熟

Spring cloud alibaba 在spring-cloud基础上,对组件进行拓展。Spring-cloud所依赖的组件很多来自第三方,然而很多组件已经不再进行更新维护,而Spring cloud alibaba采用的则是alibaba体系内的产品,并能够完美支持dubbo。

5.2.SpringCloud Alibaba

​ 同 Spring Cloud 一样,Spring Cloud Alibaba 也是一套微服务解决方案,包含开发分布式应用微服务的必需组件,方便开发者通过 Spring Cloud 编程模型轻松使用这些组件来开发分布式应用服务。

​ 依托 Spring Cloud Alibaba,您只需要添加一些注解和少量配置,就可以将 Spring Cloud 应用接入阿里微服务解决方案,通过阿里中间件来迅速搭建分布式应用系统。

​ 作为 Spring Cloud 体系下的新实现,Spring Cloud Alibaba 跟官方的组件或其它的第三方实现如 Netflix, Consul,Zookeeper 等对比,具备了更多的功能:

5.2.1.Spring Cloud Alibaba 包含组件

这幅图是 Spring Cloud Alibaba 系列组件,其中包含了阿里开源组件,阿里云商业化组件,以及集成Spring Cloud 组件。

5.2.1.1.阿里开源组件

Nacos:一个更易于构建云原生应用的动态服务发现、配置管理和服务管理平台。

Sentinel:把流量作为切入点,从流量控制、熔断降级、系统负载保护等多个维度保护服务的稳定性。

RocketMQ:开源的分布式消息系统,基于高可用分布式集群技术,提供低延时的、高可靠的消息发布与订阅服务。

Dubbo:这个就不用多说了,在国内应用非常广泛的一款高性能 Java RPC 框架。

Seata:阿里巴巴开源产品,一个易于使用的高性能微服务分布式事务解决方案。

Arthas:开源的Java动态追踪工具,基于字节码增强技术,功能非常强大。

5.2.1.2.阿里商业化组件

作为一家商业公司,阿里巴巴推出 Spring Cloud Alibaba,很大程度上市希望通过抢占开发者生态,来帮助推广自家的云产品。所以在开源社区,夹带了不少私货,这部分组件我在阿里工作时都曾经使用过,整体易用性和稳定性还是很高的。

Alibaba Cloud ACM:一款在分布式架构环境中对应用配置进行集中管理和推送的应用配置中心产品。

Alibaba Cloud OSS:阿里云对象存储服务(Object Storage Service,简称 OSS),是阿里云提供的云存储服务。

Alibaba Cloud SchedulerX:阿里中间件团队开发的一款分布式任务调度产品,提供秒级、精准的定时(基于 Cron 表达式)任务调度服务。

5.2.1.3.集成 Spring Cloud 组件

Spring Cloud Alibaba 作为整套的微服务解决组件,只依靠目前阿里的开源组件是不够的,更多的是集成当前的社区组件,所以 Spring Cloud Alibaba 可以集成 Zuul,OpenFeign等网关,也支持 Spring Cloud Stream 消息组件。

5.3.Spring Cloud Alibaba 组件功能

5.3.1.服务注册与发现

Spring Cloud Alibaba 基于 Nacos 提供 spring-cloud-alibaba-starter-nacos-discovery & spring-cloud-alibaba-starter-nacos-config 实现了服务注册 & 配置管理功能。依靠 @EnableDiscoveryClient 进行服务的注册,兼容 RestTemplate & OpenFeign 的客户端进行服务调用。

适配 Spring Cloud 服务注册与发现标准,默认集成了 Ribbon 的支持。

5.3.2.支持多协议的服务调用

Spring Cloud 默认的服务调用依赖 OpenFeign 或 RestTemplate 使用 REST 进行调用。

使用 @DubboTransported 注解可将底层的 Rest 协议无缝切换成 Dubbo RPC 协议,进行 RPC 调用。

@FeignClient("dubbo-provider")
@DubboTransported(protocol = "dubbo")
public interface DubboFeignRestService {@GetMapping(value = "/param")String param(@RequestParam("param") String param);@PostMapping("/saveB")String saveB(@RequestParam("a") int a, @RequestParam("b") String b);
}

5.3.3.服务限流降级

作为稳定性的核心要素之一,服务限流和降级是微服务领域特别重要的一环,Spring Cloud Alibaba 基于 Sentinel,对 Spring 体系内基本所有的客户端,网关进行了适配,

默认支持 WebServlet、WebFlux, OpenFeign、RestTemplate、Spring Cloud Gateway, Zuul, Dubbo 和 RocketMQ 限流降级功能的接入。

Sentinel应用比较简单,只需引入 starter,即可生效,可以在运行时通过控制台实时修改限流降级规则,还支持查看限流降级 Metrics 监控。

5.3.4.微服务消息驱动

支持为微服务应用构建消息驱动能力,基于 Spring Cloud Stream 提供 Binder 的新实现: Spring Cloud Stream RocketMQ Binder,

也新增了 Spring Cloud Bus 消息总线的新实现 Spring Cloud Bus RocketMQ。

5.3.5.分布式事务

使用 Seata 解决微服务场景下面临的分布式事务问题。

使用 @GlobalTransactional 注解,在微服务中传递事务上下文,可以对业务零侵入地解决分布式事务问题。

5.3.6.阿里云提供的商业能力

通过上面提到的OSS,schedulerx等组件,开发者可以在阿里云上实现对象存储,分布式任务调度等功能。

5.4.基于Spring Cloud Alibaba电商微服务架构

高并发情况下保证高可用性相关推荐

  1. 在高并发情况下如何解决用户超领优惠券问题

    在高并发情况下如何解决单用户超领优惠券问题 一. 场景描述 在近期的项目里面有一个功能是领取优惠券的功能,每一个优惠券一共发行多少张,每个用户可以领取多少张: 如:A优惠券一共发行120张,每一个用户 ...

  2. 高并发情况下修改系统参数

    单进程最大打开文件数限制 一般的发行版,限制单进程最大可以打开1024个文件,这是远远不能满足高并发需求的,调整过程如下: 在#号提示符下敲入: ulimit–n 65535 限制修改失败了,会显示 ...

  3. wcf高并发 mysql_WCF服务在高并发情况下报目标积极拒绝的异常处理 z

    http://www.cnblogs.com/kklldog/p/5037006.html wcf的监控服务,偶尔监控到目标服务会报一个目标积极拒绝的错误.一开始以为服务停止了,上服务器检查目标服务好 ...

  4. 随手记录第二话 -- 高并发情况下秒杀、抢红包都有哪些实现方式?

    1.何为高并发? 高并发:在短时间内涌入超量的请求 那么如果出现这几种情况,可能会导致的后果 服务宕机 商品库存,红包金额超量 2.何为高并发秒杀? 这是一个高频面试题,问题虽然简单,但是里面的细节有 ...

  5. java rabbitmq 并发_RabbitMQ消息中间件 高级篇二 高并发情况下保障消息投递可靠性...

    RabbitMQ消息中间件技术精讲9 高级篇二 高并发场景下,消息的延迟投递做二次确认进行回调检查来保障生产者消息投递成功的可靠性 在上一篇文章中,我们介绍了BAT大厂中一种方式保障生成者消息投递可靠 ...

  6. 集群高并发情况下如何保证分布式唯一全局ID生成

    作者:轻狂书生 blog.csdn.net/LookForDream_/article/details/109355335 前言 系统唯一ID是我们在设计一个系统的时候常常会遇见的问题,也常常为这个问 ...

  7. SpringBean默认是单例的,高并发情况下,如何保证并发安全?

    以下文章来源方志朋的博客,回复"666"获面试宝典 Spring的bean默认都是单例的,某些情况下,单例是并发不安全的,以Controller举例,问题根源在于,我们可能会在Co ...

  8. 如何处理高并发写入mysql_如何处理高并发情况下的DB插入

    转载以便以后学习使用,谢谢! 插入数据库,在大家开发过程中是很经常的事情,假设我们有这么一个需求: 1.  我们需要接收一个外部的订单,而这个订单号是不允许重复的 2.  数据库对外部订单号没有做唯一 ...

  9. 如何处理高并发情况下的DB插入

    转载以便以后学习使用,谢谢! 插入数据库,在大家开发过程中是很经常的事情,假设我们有这么一个需求: 1.  我们需要接收一个外部的订单,而这个订单号是不允许重复的 2.  数据库对外部订单号没有做唯一 ...

最新文章

  1. 交换机的端口工作模式
  2. sed的基本用法和高级用法
  3. UML和模式应用学习笔记-1(面向对象分析和设计)
  4. 第十三章:位图(三)
  5. UA MATH564 概率论 QE练习题2
  6. php haystack,haystack(示例代码)
  7. UVA 10895——Matrix Transpose
  8. Mac上最佳的SVN管理工具:Cornerstone
  9. CPLEX-求解VRPTW模型
  10. [转]国外英语教学网页
  11. (PC+WAP)高等院校学院职业学校类网站源码 政府单位机构协会Pbootcms网站模板
  12. ContextCapture与Pix4D生成正射影像并进行拼接修图(附航测练习数据下载)
  13. 有一个做饭好吃的妈妈是一种什么体验?
  14. 世界500强企业名称中英对照
  15. python-用pyinstaller打包.py文件时,出现maxium recursion depth exceeded解决办法
  16. 电商项目需求分析---七月实习总结
  17. 业务员应熟记的应酬劝酒词大全
  18. 科幻电影里的机器人假肢已经照进现实
  19. node+vue微信小程序的社区后勤报修系统
  20. Java JVM 动态方法调用指令 invokedynamic 实现分析(以 Lambda 表达式实现原理为例)...

热门文章

  1. 4大方法,因果关系分析的总结,都在这了
  2. Python环境迁移
  3. 破解 geetest(极验)的滑块验证码
  4. 【躲过裁员,成功上岸】发现小公司有不好的苗头,赶紧学习
  5. 使用FeatureTask多线程优化in,提高查询速度
  6. 网络协议(二) Socket
  7. 数学建模02 —— 多属性决策模型
  8. 网管软件有什么?网管软件推荐
  9. 【项目笔记】布局文件报错Suspicious size: this will make the view invisible, probably intended for layout_width
  10. 每个人都能制作的简易版QQ音乐(HTML+CSS+JQuery)