孩子,醒醒吧!你的应用不是高并发,是并发高

孩子,醒醒吧!你的应用不是高并发,是并发高

  • 相信大家都在为自己的项目实现高并发而努力奋斗
    • 缓存
    • 限流
    • 分流

相信大家都在为自己的项目实现高并发而努力奋斗

你好,正如题目所说的,没有良好的项目设计,你的项目只是并发高,而不是高并发.

在高并发项目中一般会涉及到以下几点:

  • 缓存
  • 限流
  • 分流

缓存

缓存就像一个银弹般的存在,只要请求延时,一般都会想到使用缓存来解决。常用的缓存方案

  1. memory cache
    这类典型的有 Map、List、Set 等原生支持以及Guava Cache、Ehcache 等
  2. no sql
    这类典型的有 Redis memcache
  3. ORM 类缓存
    mybatis hibernate
  4. 客户端缓存
    h5 本地缓存
  5. 网络缓存
    cdn

其中 Spring 框架为我们抽象一层缓存机制(cache),来简化我们的操作,帮我们从重复代码中解救出来,同时也提供了 Spring Data 也简化了一些操作

Mybatie 和 Hibernate 的缓存机制也能帮我们减少重复的查询操作.

缓存就像一把双刃剑,在帮我们提升性能的同时,也会出现莫名其妙的问题

  1. 缓存同步

    用过 memory cache 类缓存的都会遇到这个问题,如果保证多个进程之间的数据同步,其中 Map、Set、List 本身无过期时间,实现缓存同步相当困难,如果数据变更大多通过重启来重新获取数据,Guava Cache 虽然提供了过期时间设置,当时在过期时间内,如果另一个进程修改了数据,自己的进程无法感知自动更新, Ehcache 提供了分布式解决方案,也是比较繁琐的

    使用各种方案都要考虑缓存同步问题,其中涉及 进程间、缓存与数据源之间等等

    如果缓存的数据在运行过程中可能会出现变更,避免使用 memory cache 缓存

  2. 资源占用

    缓存是占用内存或者其他资源的,我们应该将热数据加载到缓存中,而不是全部

    采用二八原则,优化20%的热点数据,避免没必要的资源占用,同时加上缓存剔除机制

  3. 缓存雪崩

    缓存雪崩是指在我们设置缓存时采用了相同的过期时间,导致缓存在某一时刻同时失效,请求全部转发到DB,DB瞬时压力过重雪崩。

    将缓存失效时间分散,不要在同一时间全部失效。

限流

在很多场景中,如果用户没有及时的获取数据会一直刷新页面,造成大量不必要的流量冲击,造成人工DDos,这样不仅不会更快的获取数据,反而会对后台造成更大的压力,针对这种情况合理的限流也是提供并发的手段

  1. 前端限流
    添加 前端防抖 处理,防止用户短时间内多次点击、刷新等,同时进行限流,保证同一个用户在一定时间内,只能只能请求一次
    例如:在秒杀的情况,用户可能疯狂的点击秒杀按钮,如果前端不做处理的话,所有的请求都会到后端,造成很多不必要的请求,这是可以做到用户2s内只有一次点击是有效的,这样可以减少大多数不必要的请求

  2. nginx 限流

    保证同一个IP的访问频率

  3. 后端限流

    可针对 IP、用户等做一定的限流

    其中 Guava 帮我们实现一部分功能,可以借助其帮我们实现简单的限流操作

分流

  1. 硬件负载均衡
  2. Nginx 负载均衡
  3. 使用Spring Cloud、Dubbo 等架构实现负载均衡等

你可能感兴趣的:(java,微服务,中间件,并发)