zoukankan      html  css  js  c++  java
  • 关于高并发的一些思考


    1.什么是高并发?
    高并发是解决大数据量业务的一种思路,源于现实的生产生活中的问题。

    举一个现实生活中的例子:去银行办业务,银行里段时间来了100个人办理业务,但是只有一个窗口来办理,平均一个人办完业务需要5分钟,100个人需要500分钟。

    当出现类似问题的时候,我们应该怎样去解决呢?
    (1)提高单个窗口办理业务的效率,比如提高柜台营业员的业务水平,之前5分钟能够办理1个人,
    现在可以办理2个人,提高单人处理效率,那么100个人办完需要250分钟;

    (2)当单个人的处理效率达到最大时,应该如何继续提高办理效率呢?
    一个窗口处理能力达到最大时,就要考虑其他方法了。一个问题如果纵向上没有好的解决办法,可以考虑横向来处理。比如这个问题,我们可以增加窗口并行处理,增加4个窗口,每个窗口都达到最大处理能力,比如都是5分钟办理两个人的业务,那么办完100个人需要50分钟。

    用通俗的话来说,就是众人拾柴火焰高 说的就是这个道理,单个人的力量是有限的 ,大家一起干 处理效率自然就快很多。那么我们在处理海量数据的思路也是这样的,一台机器处理达到瓶颈时 我们增加几台机器 并行处理。

    所以总结来说:高并发,就是高效率的并行处理 多通道处理,每个通道的功能相同,通过累加效应 体现整体的高效率。


    2.如何实现高并发
    目前有很多实现高并发的框架,比如netty、disruptor、消息中间件,他们有一个共同特点:多线程+缓存队列。
    (1)并发是多通道并行,那么多线程就是实现多通道,一个线程负责一个处理通道;
    (2)缓存队列用来干什么呢?
    比如来了100个人办业务,5个窗口同时处理5个人,那么剩余的人就在等待区的座位上等待 当叫到下一位就会离开休息区到窗口去办业务。休息区起到了缓冲作用,否则大家都排在窗口面前堵在那里。在处理数据时候,等到数据来了放到缓冲队列里暂时存放,等到线程空闲了,就继续处理。
    有一个问题是,为什么不放到数据库里,而是要创建一个缓存去存放?
    要回答这个问题,需要了解两件事情:
    1、搞清楚数据库和缓存的区别:
    数据库是用来持久存放数据的,是记录到磁盘里,读取或者插入有磁盘IO操作,有一定的耗时的,一般是在业务设计中,如果是业务需要必需存下来的数据,就需要记录到数据库里;
    缓存是用来存放少量临时数据的,不需要记录到磁盘,优点是处理速度快。
    2、高并发的目的就是高效率,所以一切提高效率的事情都是必要的。
    CPU是按照寄存器>内存条>磁盘的次序,效率依次降低,所以这里相对于数据库,使用缓存队列,效率高。 比如JDK的concurrenthashmap,消息中间件、netty等都是加载到内存里,disruptor更厉害,加载到寄存器里,效率更高。




    以后要探讨的问题:

    关于消息顺序消费 重复消费的问题:https://www.jianshu.com/p/453c6e7ff81c

  • 相关阅读:
    CSS标题线(删除线贯穿线效果)实现之一二
    sublime修改快捷键样式
    使用css鼠标移动到图片放大效果
    js判断苹果安卓操作系统,js更换css
    清除缓存
    mui下拉上拉(明一)
    mui下拉刷新上拉加载
    Cypher学习笔记
    github上计算String相似度好的项目
    代码重构
  • 原文地址:https://www.cnblogs.com/cac2020/p/9687164.html
Copyright © 2011-2022 走看看