第四周作业
大型互联网应用系统的面对的问题是用户需求变化快、高并发大流量,高可用、高性能、海量数据,网络复杂及安全等,面对这些问题在技术发展迭代过程中也出现了很多好的解决方案和手段,也是我们可以借鉴的。
面对用户需求变化快,应用系统开发新的功能需要渐进式发展,快速试错,迭代开发。快速收集用户使用的数据,通过数据驱动和运营分析,抓住用户真正的痛点,这样才能不断完善产品,服务好用户。
对于并发访问量大的问题,主要有两个技术方向:垂直伸缩和水平伸缩的方式。
垂直伸缩指的是服务器硬件配置升级的方式,这里主要考虑的是单台服务器的极限和成本问题。
水平伸缩的方式指增加服务器的方式提升计算能力的一种方法。
高并发访问是互联网应用系统主要考虑的问题,因为在高并发请求的情况下必然会出现性能(如何保证高性能?)、是否可用(如何保证高可用)的问题。面对这样的问题,通用的解决方法总结如下:
1、集群
集群,英文名称为Cluster,通俗地说,集群是这样一种技术:它将多个系统连接到一起,使多台服务器能够像一台机器那样工作或者看起来好像一台机器。采用集群系统通常是为了提高系统的稳定性和网络中心的数据处理能力及服务能力。
服务器集群系统通俗地讲就是把多台服务器通过快速通信链路连接起来,从外部看来,这些服务器就像一台服务器在工作,而对内来说,外面来的负载通过一定的机制动态地分配到这些节点机中去,从而达到超级服务器才有的高性能、高可用。
集群服务器的好处
高可伸缩性:服务器集群具有很强的可伸缩性。随着需求和负荷的增长,可以向集群系统添加更多的服务器。在这样的配置中,可以有多台服务器执行相同的应用和数据库操作。
高可用性:高可用性是指,在不需要操作者干预的情况下,防止系统发生故障或从故障中自动恢复的能力。通过把故障服务器上的应用程序转移到备份服务器上运行
高可管理性:系统管理员可以从远程管理一个、甚至一组集群,就好象在单机系统中一样。
2、分布式
分布式应用架构和分布式操作系统说的是两个事情,虽然都叫分布式,前者是计算模型,后者可以认为是资源管理模型。
分布式操作系统的基本特征是通过网络将多个远程微内核合并为单个微内核。各种系统服务包括进程创建,调试,文件及设备I/O通过微内核间的消息传递完成,其结果就是多台计算机组成的一个网络表现出一台计算机一样的行为,并且上述事实对在更高架构层次运行的所有服务透明。
3、缓存
缓存实现是多种多样的,从JAVA诞生至今,缓存的实现可以说是百花争艳。
硬盘缓存
所谓硬盘缓存即是将数据生成后以文本的方式放在计算机硬盘上,一般适用于系统的快照、跑批数据结果记录,其特点为生成数据量大,使用频率低,其实该方法的实现等同于数据库记录的方案,优点是节约成本,就存储来说硬盘的成本远低于内存的成本,当然这种低成本的代价就是读取IO阻塞和批量读取(防止JVM一次性读入导致OOM)。
内存缓存
内存缓存一般来说无非是使用JVM自身内存,这里我先撇去redis等第三方缓存,JVM的缓存应该是读取最快的,对于系统来说就好像直接放在手边一般,一般适用于热数据的存储,例如电商系统可以将访问比较大的SKU利用LRU(后续说明)的方式放入容器中,这样当大量用户需要这个SKU数据时候,就不需要去数据库读取数据,提高了用户体验度,这种缓存技术的背后也会带来一系列的问题,因为内存的成本是昂贵的,特别是JVM的内存更加是弥足珍贵,一旦没有控制好缓存容器大小,很容易导致内存泄露,从而引起FULL GC,熟知虚拟机的朋友肯定知道,缓存数据由于一直存在,一般都会存在于老年代,而老年代的FULL GC一般会引起STOP THE WORLD的问题,最后导致堆OOM的惨剧。
第三方缓存
关于第三方缓存,笔者只用过redis,关于memcache真的不太熟悉,所以我就通过redis来阐述下,首先redis毫无疑问是内存的,内存的读取是最快的,那么这种方式和上述内存缓存有什么区别呢,首先最关键的三点:1、redis属于NOSQL也就是非关系型数据库,关于数据库的访问那么一定会牵扯到连接池,而JVM缓存就像放在手边,召之即来。2、redis作为第三方缓存能够共享,JVM的缓存由于是应用隔离的,应用与应用之间无法直接通过JVM对对方的缓存进行操作,而redis可以,类似于共享Session的概念,redis可以轻而易举实现这种操作。3、redis的缓存会根据配置进行快照,当redis重启时,可以通过快照导入原有的缓存,防止出现缓存雪崩的现象,也不需要担心会像JVM出现OOM的惨剧。从第三方缓存来说,redis的集群化部署可能是未来缓存的一个主流趋势,而这种趋势也会让redis在以后开发中越来越显得举足轻重。
搜索引擎
关于搜索引擎,笔者其实还在犹豫要不要拿来说,因为它已经有点脱离缓存的概念了,但我拿出来说只是因为有些时候,当redis代价太高时,可以通过搜索引擎来存储列表式的大量数据,毕竟redis的价格还是有点偏高的,特别是对小公司来说,搜索引擎例如solr、es等,查询数据都非常快,而且还支持地理位置搜索,关键字搜索等需求,也算是一种不错的替代方式吧,毕竟将大量数据放入redis这种财大气粗的操作,让笔者感到有点窒息。
4、异步
同步请求,A调用B,B的处理是同步的,在处理完之前他不会通知A,只有处理完之后才会明确的通知A。
异步请求,A调用B,B的处理是异步的,B在接到请求后先告诉A我已经接到请求了,然后异步去处理,处理完之后通过回调等方式再通知A。
所以说,同步和异步最大的区别就是被调用方的执行方式和返回时机。同步指的是被调用方做完事情之后再返回,异步指的是被调用方先返回,然后再做事情,做完之后再想办法通知调用方。
阻塞、非阻塞和同步、异步的区别
首先,前面已经提到过,阻塞、非阻塞和同步、异步其实针对的对象是不一样的。阻塞、非阻塞说的是调用者,同步、异步说的是被调用者。
Java中的三种IO模型
在Java语言中,一共提供了三种IO模型,分别是阻塞IO(BIO)、非阻塞IO(NIO)、异步IO(AIO)。
这里面的BIO和NIO都是同步的IO模型,即同步阻塞IO和同步非阻塞IO,异步IO指的是异步非阻塞IO。
BIO (Blocking I/O):同步阻塞I/O模式,数据的读取写入必须阻塞在一个线程内等待其完成。
NIO (New I/O):同时支持阻塞与非阻塞模式,但主要是使用同步非阻塞IO。
AIO (Asynchronous I/O):异步非阻塞I/O模型。
评论 (1 条评论)