面试之并发的问题
1、网站的高并发,大流量访问怎么解决?
1)HTML页面静态化
访问频率较高但内容变动较小,使用网站HTML静态化方案来优化访问速度。将社区内的帖子、文章进行实时的静态化,有更新的时候再重新静态化也是大量使用的策略。
优势:
- 减轻服务器负担。
- 加快页面打开速度,静态页面无需访问数据库,打开速度较动态页面有明显提高;
- 很多搜索引擎都会优先收录静态页面,不仅被收录的快,还收录的全,容易被搜索引擎找到;
- HTML静态页面不会受程序相关漏洞的影响,减少攻击,提高安全性。
2)图片服务器和应用服务器相分离
现在很多的网站上都会用到大量的图片,而图片是网页传输中占主要的数据量,也是影响网站性能的主要因素。因此很多网站都会将图片存储从网站中分离出来,另外架构一个或多个服务器来存储图片,将图片放到一个虚拟目录中,而网页上的图片都用一个URL地址来指向这些服务器上的图片的地址,这样的话网站的性能就明显提高了。
优势:
- 分担web服务器的I/O负载-将耗费资源的图片服务分离出来,提高服务器的性能和稳定性。
- 能够专门对图片服务器进行优化-为图片服务设置有针对性的缓存方案,减少带宽成本,提高访问速度。
- 提高网站的可扩展性-通过增加图片服务器,提高图片吞吐能力。
3)缓存
尽量使用缓存,包括用户缓存,信息缓存等,多花点内存来做缓存,可以大量减少与数据库的交互,提高性能。
假如我们能减少数据库频繁的访问,那对系统肯定大大有利的。比如一个点子商务系统的商品搜索,如果某个关键字的商品经常被搜,那就可以考虑这部分商品列表存放到缓存(内存中去),这样不用每次访问数据库,性能大大增加。
4)镜像
镜像是冗余的一种类型,一个磁盘上的数据在另一个磁盘上存在一个完全相同的副本即为镜像。
5)负载均衡
在网站高并发访问的场景下,使用负载均衡技术(负载均衡服务器)为一个应用构建一个由多台服务器组成的服务器集群,将并发访问请求分发到多台服务器上处理,避免单一服务器因负载压力过大而响应缓慢,使用户请求具有更好的响应延迟特性。
6)并发控制
加锁,如乐观锁和悲观锁
7)消息队列
通过mq一个一个排队方式,跟12306一样。
2、订票系统,某车次只有一张火车票,假定有1w个人同时打开12306网站来订票,如何解决并发问题?(可扩展到任何高并发网站要考虑的并发读写问题)
不但要保证1w个人能同时看到有票(数据的可读性),还要保证最终只能有一个人买到票(数据的排他性)。
使用数据库层面的并发访问控制机制。采用乐观锁即可解决此问题。乐观锁意思是不锁定表的情况下,利用业务的控制来解决并发问题,这样既保证数据的并发可读性,又保证保存数据的排他性,保证性能的同时解决了并发带来的脏数据问题。hibernate中实现乐观锁。
银行两操作员同时操作同一账户就是典型的例子。比如A,B操作员同时读取一余额为1000元的账户,A操作员为该账户增加100元,B操作员同时为该账户减去50元,A先提交,B后提交。最后实际账户余额为1000-50=950元,单本该为1000+100-50=1050。这就是单行的并发问题。如何解决?可以用锁。