Java高并发解决方式 2019

目录

一、消息队列

(1)应用场景

1.1 解耦和

1.2 异步处理

1.3 流量削峰

(2)消息队列缺点

2.1 系统可用性降低

2.2 系统复杂度提高

2.3 一致性问题

(3)Kafka、ActiveMQ、RabbitMQ、RocketMQ有什么优缺点?

二、缓存

(1)缓存的意义

1.1 为什么使用缓存?

1.2 高性能

1.3 高并发

(2)用了缓存之后会有什么不良后果?

2.1 缓存和数据库双写不一致

2.2 缓存雪崩、穿透、击穿

2.3 缓存并发竞争

(3)redis和memcached区别

3.1 redis 支持复杂的数据结构

3.2 redis 原生支持集群模式

3.3 性能对比

3.4 redis 的线程模型

3.5 为啥redis单线程模型也能效率这么高?

(4)缓存数据类型以及应用场景

一、消息队列

(1)应用场景

1.1 解耦和

看这么个场景。A 系统发送数据到 BCD 三个系统,通过接口调用发送。如果 E 系统也要这个数据呢?那如果 C 系统现在不需要了呢?A 系统负责人几乎崩溃…

在这个场景中,A 系统跟其它各种乱七八糟的系统严重耦合,A 系统产生一条比较关键的数据,很多系统都需要 A 系统将这个数据发送过来。A 系统要时时刻刻考虑 BCDE 四个系统如果挂了该咋办?要不要重发,要不要把消息存起来?头发都白了啊!

如果使用 MQ,A 系统产生一条数据,发送到 MQ 里面去,哪个系统需要数据自己去 MQ 里面消费。如果新系统需要数据,直接从 MQ 里消费即可;如果某个系统不需要这条数据了,就取消对 MQ 消息的消费即可。这样下来,A 系统压根儿不需要去考虑要给谁发送数据,不需要维护这个代码,也不需要考虑人家是否调用成功、失败超时等情况。

总结:通过一个 MQ,Pub/Sub 发布订阅消息这么一个模型,A 系统就跟其它系统彻底解耦了。

面试技巧:你需要去考虑一下你负责的系统中是否有类似的场景,就是一个系统或者一个模块,调用了多个系统或者模块,互相之间的调用很复杂,维护起来很麻烦。但是其实这个调用是不需要直接同步调用接口的,如果用 MQ 给它异步化解耦,也是可以的,你就需要去考虑在你的项目里,是不是可以运用这个 MQ 去进行系统的解耦。在简历中体现出来这块东西,用 MQ 作解耦。

1.2 异步处理

再来看一个场景,A 系统接收一个请求,需要在自己本地写库,还需要在 BCD 三个系统写库,自己本地写库要 3ms,BCD 三个系统分别写库要 300ms、450ms、200ms。最终请求总延时是 3 + 300 + 450 + 200 = 953ms,接近 1s,用户感觉搞个什么东西,慢死了慢死了。用户通过浏览器发起请求,等待个 1s,这几乎是不可接受的。

一般互联网类的企业,对于用户直接的操作,一般要求是每个请求都必须在 200 ms 以内完成,对用户几乎是无感知的。

如果使用 MQ,那么 A 系统连续发送 3 条消息到 MQ 队列中,假如耗时 5ms,A 系统从接受一个请求到返回响应给用户,总时长是 3 + 5 = 8ms,对于用户而言,其实感觉上就是点个按钮,8ms 以后就直接返回了,爽!网站做得真好,真快!

1.3 流量削峰

每天 0:00 到 12:00,A 系统风平浪静,每秒并发请求数量就 50 个。结果每次一到 12:00 ~ 13:00 ,每秒并发请求数量突然会暴增到 5k+ 条。但是系统是直接基于 MySQL 的,大量的请求涌入 MySQL,每秒钟对 MySQL 执行约 5k 条 SQL。

一般的 MySQL,扛到每秒 2k 个请求就差不多了,如果每秒请求到 5k 的话,可能就直接把 MySQL 给打死了,导致系统崩溃,用户也就没法再使用系统了。

但是高峰期一过,到了下午的时候,就成了低峰期,可能也就 1w 的用户同时在网站上操作,每秒中的请求数量可能也就 50 个请求,对整个系统几乎没有任何的压力。

如果使用 MQ,每秒 5k 个请求写入 MQ,A 系统每秒钟最多处理 2k 个请求,因为 MySQL 每秒钟最多处理 2k 个。A 系统从 MQ 中慢慢拉取请求,每秒钟就拉取 2k 个请求,不要超过自己每秒能处理的最大请求数量就 ok,这样下来,哪怕是高峰期的时候,A 系统也绝对不会挂掉。而 MQ 每秒钟 5k 个请求进来,就 2k 个请求出去,结果就导致在中午高峰期(1 个小时),可能有几十万甚至几百万的请求积压在 MQ 中。

这个短暂的高峰期积压是 ok 的,因为高峰期过了之后,每秒钟就 50 个请求进 MQ,但是 A 系统依然会按照每秒 2k 个请求的速度在处理。所以说,只要高峰期一过,A 系统就会快速将积压的消息给解决掉。

(2)消息队列缺点

2.1

c语言 java高并发_Java高并发解决方式 2019.docx相关推荐

  1. java支付宝支付_Java 高并发环境下的性能优化,揭秘支付宝技术内幕

    前言 高并发经常会发生在有大活跃用户量,用户高聚集的业务场景中,如:秒杀活动,定时领取红包等. 为了让业务可以流畅的运行并且给用户一个好的交互体验,我们需要根据业务场景预估达到的并发量等因素,来设计适 ...

  2. java线程钥匙_Java多线程并发编程/锁的理解

    一.前言 最近项目遇到多线程并发的情景(并发抢单&恢复库存并行),代码在正常情况下运行没有什么问题,在高并发压测下会出现:库存超发/总库存与sku库存对不上等各种问题. 在运用了 限流/加锁等 ...

  3. java static 并发_Java static并发问题

    1. 只要你的静态方法不访问全局变量的话,就不会有并发问题 访问全局变量肯定会出现并发问题,这是毫无疑问的 静态方法内部的变量,都是局部变量,每次调用静态方法时都会重新分配内存空间,所以是安全的. 也 ...

  4. java 容器 线程_JAVA多线程并发容器

    1.ArrayList线程不安全:CopyOnWriteArrayList线程安全 package concurrent; import java.util.ArrayList; import jav ...

  5. java 高并发_Java 高并发之无锁(CAS)

    Java 高并发之无锁(CAS) 本篇主要讲 Java中的无锁 CAS ,无锁 顾名思义就是 以不上锁的方式解决并发问题,而不使用synchronized 和 lock 等.. 1. Atomic 包 ...

  6. java队列处理高并发_Java高并发--消息队列

    Java高并发--消息队列 举个例子:在购物商城下单后,希望购买者能收到短信或者邮件通知.有一种做法时在下单逻辑执行后调用短信发送的API,如果此时服务器响应较慢.短信客户端出现问题等诸多原因购买者不 ...

  7. java 爱哦大容量并发_Java高并发的常见应对方案

    Java高并发的常见应对方案 一.关于并发我们说的高并发是什么? 在互联网时代,高并发,通常是指,在某个时间点,有很多个访问同时到来. 高并发,通常关心的系统指标与业务指标? QPS:每秒钟查询量,广 ...

  8. java 下单 锁_JAVA 高并发下单解决方案-分布式锁

    背景:高并发情况下,商品出现超卖的情况. 最终目标:保证数据的最终一致性. Contrrler 层框架 : Spring MVC 第一次尝试:最初的时候,发现Spring MVC是一个单例多线程的Co ...

  9. java中acquire()_Java高并发系列之AQS中acquire源码解析

    我们知道,AQS中最重要的两个方法就是acquire和release方法.我们本文来走读走读acquire的源码. 首先,tryAcquire是需要子类具体去实现,其作用就是设置state的值,如果设 ...

最新文章

  1. 【译】SQL Server误区30日谈-Day1-正在运行的事务在服务器故障转移后继续执行
  2. hive 安装_7.Hive介绍以及安装
  3. 搜索推荐系统根据用户搜索频率(热搜)排序
  4. 对一组同构对象用单数组表示法实现(算法导论第十章10.3-2)
  5. 设计模式 工厂模式比较
  6. AI已火,宗教当生,硅谷出了个“洪秀全”
  7. 我的MVVM框架 v3教程——todos例子
  8. 目标检测->SSD算法
  9. vue中引入字体无效(记录)
  10. 【esp32】esp-ali-smartliving源码分析
  11. 微软公司软件测试工程师,【其它微软中国(Microsoft)工资】软件测试工程师待遇-看准网...
  12. ansible管理界面_Ansible和Google日历集成,用于变更管理
  13. (一)彩色图片(RGB)转灰度图片
  14. 最详细的Android图片压缩攻略
  15. 【渝粤题库】陕西师范大学200791 软件工程
  16. Retrofit教程
  17. 什么是机械学习?及Scikit-learn机械学习库
  18. flash软件_FAL软件包的使用:FLASH分区管理
  19. Element type is invalid: expected a string (for built-in components) or a class/function (for compos
  20. [n年以前的诗] 你别这样

热门文章

  1. 程序员十大非技术面试问题及策略
  2. 计算机几个发展阶段相关介绍,计算机的发展经历了哪几个阶段
  3. mysql autoenlist默认_javascript code all (2) (转转)
  4. pthread 立即停止线程_线程取消(pthread_cancel)
  5. linux ros是什么?(Robot Operating System)
  6. python pass 占位符 占位语句
  7. springboot整合redis集群master宕机后连接超时
  8. Frog Traveler 最短路,bfs剪枝,打印路径
  9. centos7.3安装elasticsearch-head
  10. Tomcat的下载安装以及在eclipse中的配置