关于高并发的一些思考


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

posted @ 2018-09-21 16:21  cac2020  阅读(525)  评论(0编辑  收藏  举报