黑马程序员技术交流社区
标题:
【上海校区】浅谈高并发和设计的一些原则(JAVA)
[打印本页]
作者:
不二晨
时间:
2018-10-30 09:05
标题:
【上海校区】浅谈高并发和设计的一些原则(JAVA)
前言
在设计一个系统的时候,因为场景、时间而异、资源配备等不是一下子就能设计得非常完美,在有限的资源下解决最核心的问题,预测并发现以后可能出现的问题,并逐步解决,所以说系统设计是一个不断迭代的过程,不要过度设计,从迭代中演变和完善。
关于并发?
并发包括并行从概念上来讲都是为了提高效率,在最短的时间内怎么来完成最多的事情。包括现在的双十一、双十二等等,在一秒钟完成了多少的订单,这些都会涉及到并发。
并发和并行
有大神关于两者的阐述:“并发关乎结构,并行关乎执行”
并发:在不同时间内处理多个任务,单个CPU轮流使用。比方说在你吃饭的时候去上了个厕所又回来吃饭。
平行:同时处理多个任务,多个CPU执行。比方说你边吃饭边上厕所。
并发类型
计算密集型:需要非常多的CPU计算资源,对于密集型完全取决CPU核数,避免过多的线程上下文切换来充分发挥优势,理想方案:JDK1.8中增加了一个并行计算,较理想线程数=CPU核数*2
IO密集型:涉及到大量的网络传输,不仅如此,和数据库、和缓存间的交互也涉及到IO,一旦发生IO,当前就会进入等待状态,当IO结束,数据准备好后,才会继续执行。理想方案:线程数=CPU核数/(1-阻塞系数),这个阻塞系数一般为0.8~0.9之间。
设计高并发原则
**无状态:**无状态就是无需做持久化操作,有状态就会涉及到数据同步,消耗内存消耗宽带同时还会涉及到锁的操作,影响快速扩容。
**粒度化:**读写分离也好,应用服务化也好就是为了控制之间的依赖,分散请求提高并发效率,同时管理起来也比较清晰。
**场景化:**合适的场景选择合适的技术(消息队列、数据异构、缓存银弹、并发化)
消息队列:解耦一些不需要同步调用的服务,或者订阅一些关心的变化,还能流量削峰/缓冲,某些场景会有重复消息(
弊端
),可以在业务层做防重和校对处理。
RDBMS注重的是ACID,NOSQL注重的是CAP和BASE,一般是牺牲强一致性,而保证最终一致性。
数据异构:我们都知道系统都是由数据构成的,而数据的存储位置和获取的环境不一样,速度也就不一样。单表肯定比联表快,内存取肯定比磁盘取快;就像前面的
文章
有提过,也是我个人非常喜欢的一句话:时间换空间,空间换时间。所以可以根据实际场景和业务来设计,包括根据数据的权重牺牲一部分的资源来提高效率,例如:联表可以考虑数据冗余,或者关键数据的获取合并存储。
缓存银弹:缓存对于读取服务来说就是颗抗流量的特效武器。
并发化:并发化的理论其实很简单,把没有依赖关系的数据并行获取。可能不太好理解,例如:B依赖A C没有依赖 D依赖B,那么最好的方式就是A、C并行获取,然后再获取B,再是D。
附上设计例图:
结语
关于例图里面的一些详细示例以后再慢慢补充吧,说了浅谈就是浅谈,要有原则(别打我~~~)!
里面的图片用的是思维导图
Xmind
做的。
【转载】
作者:ohcomeyes
链接:
https://juejin.im/post/5bd6c026e51d4527001398b6
作者:
不二晨
时间:
2018-10-31 14:24
作者:
魔都黑马少年梦
时间:
2018-11-1 16:10
欢迎光临 黑马程序员技术交流社区 (http://bbs.itheima.com/)
黑马程序员IT技术论坛 X3.2