高并发总结

高并发

解决思路和手段

  • 扩容 水平扩容,垂直扩容
  • 缓存 Redis,Memcache,Guava,Cache的介绍和使用
  • 队列 kafka,RabbitMQ,RocketMQ等队列特征介绍及使用队列的关注点
  • 应用拆分 服务化Dubbo与微服务Spring Cloud介绍
  • 限流 Guava RateLimiter的介绍与使用,常用限流算法,自己实现的分布式限流
  • 服务降级和熔断 服务降级的多种选择,hystrix介绍及使用
  • 数据库和切库,分库,分表 介绍数据库和切库,分库,分表支持多数据源的原理及实现
  • 高可用的一些手段 任务调度分布式elastic-job,主备curator的实现,监控报警机制

    并发及并发的线程安全处理

    线程安全性 表现为原子性,可见性,有序性,atomic包,cas算法,synchorized与lock,volatile,happes-before

    安全性 表现为正确的行为

    原子性
    Atomic 只能更新一个值
  • CAS AtomicInteger使用一个unsafe的类的getAndAddInt()的方法,此方法使用CAS锁进行参数的操作compareAndSwap
  • AtomicLong 精确,jdk8新增了一个LongAdder
  • LongAdder 将单点的高并发压力分散到各个点上
  • AtomicReference

    private static AtomicReference count = new AtomicReference<>(0);
    atomicReference.compareAndSet(0, 2)是0的话更新为2否则不执行,更新的字段

  • AtomicReferenceFieldUpdater

    private static AtomicIntegerFieldUpdater updater =
    AtomicIntegerFieldUpdater.newUpdater(AtomicExample5.class, "count");
    @Getter
    public volatile int count = 100;//更新类的某个实例的中的volatile字段
    atomicReference.compareAndSet(example5, 100, 120)

  • AtomicStampReferece 解决CAS的ABA问题 加版本号
  • AtomicLongArray 数组 更新索引的值
  • AtomicBoolean 适合在高并发的情况下代码只可能执行一次

    Synchronized 不可中断
  • 修饰代码块
  • 修饰方法(交替执行)
  • 修饰静态方法 作用于所有对象(依次执行)
  • 修饰类

    Lock 可中断
  • ReentrantLock

    可见性
  • 线程交叉执行
  • 重排序结合线程交叉执行
  • 共享变量更新后的值没有在工作内存与主存间及时更新

    有序性

    安全发布对象 安全发布方法,不可变对象,final关键字使用,不可变方法,线程不安全类与写法

    线程安全手段 堆栈封闭,ThreadLocal线程封闭,JDBC的线程封闭,同步容器,并发容器,J.U.C

    AQS等J.U.C组件 CountDownLatch,Semaphore,CyclicBarrier,ReentrantLock与锁,Condition,FutureTask,Fork/Join框架,BlockingQueue

    线程池 newThread的弊端,线程池的好处,ThreadPoolExecutor,Execcutor框架接口

    额外补充 死锁的产生和与预防,多线程并发最佳实践,spring的线程安全,hashmap和concurrentHashMap深入讲解


    基础知识讲解与核心知识准备

    并发,高并发相关概念

    cpu多级缓存 缓存一致性 乱序执行优化

    cpu多级缓存

  • cpu cache的出现原因 缓解cpu与硬盘速度不匹配的问题
  • cpu cache的意义 时间局部性,空间局部性

    缓存一致性 MESI

  • M(被修改)E(独享)S(共享)I(无效)保证多个CUP cache的之间缓存共享数据一致
  • local read,local write,remote read,remote write

    乱序执行优化

    处理器为提高运算速度而做出的违背代码原有的顺序的优化

    java内存模型 JMM规定,抽象结构同步操作与规则

    java内存模型(JMM)

  • stack 两个栈 垃圾回收 方法区的本地变量 快 动态分配 保存对象
  • heap 堆 静态变量 基本数据类型 引用对象 共享

    同步的八种操作
  • lock锁定
  • unlock解锁
  • read读取
  • load载入
  • use使用
  • assign赋值
  • store存储
  • write写入

    并发优势与风险

    风险

  • 安全性 多线程操作数据不一致
  • 活跃性 某个操作无法继续进行下去时就会发生活跃性问题,如死锁,饥饿
  • 性能 线程过多使用导致cpu频繁切换,调度时间增多,同步机制,消耗过多内存

    优势

  • 速度 同时处理多个请求,响应更快,复杂的操作可以分为多个进程同时进行
  • 设计 程序设计在某些情况下更简单,也可以有更多的选择
  • 资源利用 cpu能够在等待IO的时候做其他的事情

    并发模拟 Postman,JMeter,Apache Bench,代码

    Postman

  • 下载即可
  • 点击左边侧边框collectios,创建一个collections
  • 将测试地址添加到这个集合中(点击右边的save)
  • 点击集合右击箭头,点击run
  • 配置参数Iterations 次数 iterations 延迟时间

    Apache Bench

  • 安装
  • 更改httpd.conf文件中的所有路径改为放置路径
  • 配置ServerName=127.0.0.1

    命令.\ab -n 1000 -c 50 http://127.0.0.1:8080/test 1000个请求,并发50个

    返回结果的具体解析
  • Concurrency level 并发量
  • Time taken for tests 测试所用的时间
  • complete requests 完成请求的数量
  • failed requests 失败的请求数量
  • total transferred 所有请求的响应数据长度总和,包括http
  • html transferred 所有请求中正文的数据总和,是上面减去http的结果
  • requests per second 吞吐率 和并发数相关,是complete requests/Time taken for tests
  • time per request 用户平均等待时间
  • time per request 服务器平均时间
  • transfer rate 请求单位时间从服务器获取数据长度 是total transferred/Time taken for tests

    JMeter

  • 下载运行jmeter.bat即可
  • 右击左边侧边栏的test plan 依次点击add threads treadown-thread-group

    具体参数
  • name 测试名
  • number of threads 虚拟用户的数量
  • ramp-up period 虚拟用户增长时长,设置多少秒完成操作
  • loop count 循环次数 用户发送多少次请求
  • 配置http请求 右击 add sampler http-request 进行配置
  • 配置监听器 右击 add listener graph-result(图形结果)和view results tree(查看结果树)
  • 配置log 点击 options 点击log view

    代码

  • CountDownLatch 控制线程执行后进行输出
  • Semaphore 控制线程的执行

猜你喜欢

转载自www.cnblogs.com/test1234/p/8991550.html
今日推荐