构建互联网高性能WEB系统经验总结
发布时间:2023-04-10 11:10:47 所属栏目:经验 来源:
导读:互联网发展至今各种应用层出不穷,用户量动辄上亿。所以如何构建一个优秀的高性能、高可靠的应用系统对每一个开发者至关重要。本文将我所学到和在工作中使用到的一些方法归纳总结,希望给其他同学起到一些借鉴作用,
互联网发展至今各种应用层出不穷,用户量动辄上亿。所以如何构建一个优秀的高性能、高可靠的应用系统对每一个开发者至关重要。本文将我所学到和在工作中使用到的一些方法归纳总结,希望给其他同学起到一些借鉴作用,在以后的开发中遇到类似的问题,能快速的找到解决方案。本人主要使用语言是JAVA,所以下面不做特殊说明,都是使用JAVA语言。 无状态服务有时候不可避免的会遇到一些有状态的对象,比如最常见的就是session。因为http请求本身是无状态的,所以必须cookie和session配合使用,才能识别多次http请求属于同一用户。一般有两种方法解决: 第一种就是将对象信息全部存储在cookie中,通过相应的算法在服务端将cookie中的信息读出来。这些相关的信息我们一般都会针对性地进行加密方面的处理。 第二种方法,就是将session存储在分布式数据库或者分布式缓存中,一般存在redis或者memcache中。那么这种服务扩展会依赖第三方数据库缓存的能力。淘宝有类似的组件,开源世界也有基于memcache和redis的分布式session 无状态可以使应用服务水平扩展,但是当单个应用太大太臃肿时,有必要对应用进行拆分。垂直拆分即按业务拆分,比如电商系统中,按照订单系统,积分系统等进行拆分。拆分可以方便开发,更方便扩展。系统大了以后,每个业务的访问量是不一样的,比如买家系统肯定比卖家系统访问量大得多,这时候就可以增加买家系统的机器即可。 RPC调用一般是用在耦合比较重要,同步调用的场景下。而MQ作为另一种异步通信的手段也被广泛使用在各个业务中。常用的有:ActiveMQ、RabbitMQ、Kafka、RocketMQ。前两个一般作为企业级应用,主要特点是支持非常多的特性和规范。后两者是互联网级的,拥有更强的吞吐和更高的性能,但是牺牲了很多MQ的特性。mq一般用在要求最终一致性即可的场景,比如用户注册和发积分这两个动作,可以用户注册以后直接返回前台成功,然后发送注册成功消息给mq系统,发积分动作订阅注册事件,消费mq的事件信息。 数据库拆分 读写分离,这是大多数应用在遇到性能瓶颈时第一要干的事。大多数互联网应用都是独占道90%以上的场景。所以一主多从,一个master做写,其他slave做读即可。但是这种主存模式也存在一些问题,比如有一些数据需要及时性比较高,就是在写入以后马上需要读到。因为主从同步是通过log异步复制,所以存在数据不一致窗口,这个时候必须要通过强行读取主库来保证数据的安全,在开发的时候一定要注意。 水平分割,一般就是sharding。将同一个表中的不同字段,拆分成不同的表,或者将同一张表按照hash或者业务字段分成不同的分片。这种一般需要DAL框架的支持,其中有TDDL、Cobar、Mycat等。主要就是通过框架让程序编写者对数据库的拆分不可见,就像操作一个数据库一样。不过我们现在的DAL系统的框架还远远不能达到这样的目的,尤其是在跨库事务的场景下,这样做一般都表示需要其他方式进行处理。 跨库事务一般都是通过最终一致性来解决,即不强求ACID都能满足,容许数据不一致的时间窗口,但是总会有一个时间点数据会到最终一致的状态。解决方案非常的多,不过核心原理都是一样,不外乎都是可以靠相对而言的补偿手段来完成的。 使用缓存的场景非常非常的多,几乎到了你能想到的所有地方。 对于大多数场景,我们的数据在一定时间都是不会变化的,或者说即使变化,也只是页面的一小部分会发生变化,可以将不变化的部分单独拿出来做静态化。比如京东商城的页面就是静态化的,静态化以后,数据不用每次都从缓存或者数据库中取得,然后再封装成页面,而是直接请求返回静态页面,性能无疑提升了非常大。 (编辑:汽车网) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |
推荐文章
站长推荐