互联网高性能网络系统建设经验总结!

Դ发外链的网站

ߣ外链推广

20

2021-09-19 17:32:56

互联网发展至今,各种应用层出不穷,动辄上亿用户。因此,如何构建一个高性能、高可靠性的优秀应用系统,对于每一个开发者来说都是非常重要的。本文总结了我在工作中学习和使用的一些方法,希望能给其他同学一些参考,在未来的发展中遇到类似的问题,快速找到解决方法。我的主要语言是JAVA,所以下面不做特别的解释,但是我用的是JAVA语言。

高性能的关键

为了实现高性能,我总结了三点:

躲藏

DNS缓存

数据库缓存

分布式缓存

使分离

业务拆分

数据库拆分

异步的

异步网络

磁盘异步

使用消息

上面列出了三种常见情况。无论在哪里遇到性能瓶颈,记住这三点,大部分时候都能找到解决方案。下面介绍这三点在整个架构各个方面的应用

无状态服务

说到无状态服务,我们必须首先想到无状态对象。无状态对象可以简单地理解为没有字段的对象。例如,模型/实体对象不是无状态对象,因为它们包含字段。例如,* *控制器在典型的MVC场景中,* *服务是无状态的,只包含方法。有些是有状态的,比如struct 2框架的Action,所以struct 2现在用的比较少。有了无状态对象,我们就有可能构建无状态服务。因为请求链接不包含状态对象,所以每个请求都是独立的。这种架构有助于我们的服务扩展。

无状态服务有时不可避免地会遇到一些有状态的对象,比如会话。因为http请求是无状态的,所以cookie和会话必须一起使用来标识多个http请求属于同一个用户。通常有两种解决方案:

使用cookie存储

使用分布式会话服务

首先是将所有对象信息存储在cookie中,通过相应的算法在服务器端读出cookie中的信息。这些信息通常是加密的。

第二种方法是将会话存储在分布式数据库或分布式缓存中,通常存储在redis或memcache中。那么这种服务扩展将取决于第三方数据库或缓存的能力。淘宝也有类似的组件,开源世界也有基于memcache和redis的分布式session

无状态服务使用拆分和缓存

业务拆分

无状态可以扩展应用服务级别,但是当单个应用太大太臃肿时,就需要对应用进行拆分。纵向拆分就是按业务拆分,比如电商系统,按订单系统,点系统拆分。拆分便于开发和扩展。系统大了以后,每个业务的流量都不一样。比如买方系统的流量肯定比卖方系统大很多。此时,只能添加买方系统的机器。

我们的应用层除了根据不同的服务拆分成不同的系统外,还可以拆分,一般分为应用层、逻辑层和原子层。应用层是各种数据和逻辑服务的集合。逻辑层包含大量可重用的逻辑,原子层直接操作数据库,包括一些基本的数据操作。

不管拆分形式如何,拆分系统在物理层面上是分离的,所以系统之间的通信是拆分中最重要的问题。

位置遥控(remote position control)

在RPC服务之前,已经有很多系统通信的方法,比如RMI、WebService等,但是RPC已经以一种更方便、更高效、跨平台的方式成为主流的通信手段。几乎每个大公司都有自己的RPC框架:淘宝的HSF,58的SCF,还有很多优秀的开源框架:Dubbo,GRPC,节俭等等。国内也有很多使用dubbo的大公司:JD.COM、当当。

(法属)马提尼克岛(Martinique的简写)

RPC调用一般用于重耦合、同步调用的场景。MQ作为异步通信的另一种手段,也广泛应用于各种业务中。常用的有:ActiveMQ,RabbitMQ,卡夫卡,RocketMQ。前两种一般作为企业应用使用,它们的主要特点是支持很多特性和规范。后两者都是互联网级的,吞吐量更强,性能更高,但是牺牲了很多MQ特性。Mq通常用于需要连续性的场景,例如用户注册和信用发送。用户注册后,可以直接返回前台成功,然后向mq系统发送注册成功消息,发送信用动作订阅注册事件,消费mq事件信息。

MQ最大的优点是削峰和解耦。在RPC风格的同步调用场景中,如果A和B在同一个逻辑中被调用,那么在扩展的时候必须同时进行扩展。但消息有了之后,A给B发消息,暂时不能及时处理,或者B在A峰后继续处理,即使B短时间内无法匹配A的发消息能力。

数据库拆分

一般项目都会经历数据量从小到大的变化,所以数据库拆分也是根据不同的数据量和不同的阶段来处理的。

读写分离是大多数应用程序遇到性能瓶颈时应该做的第一件事。大多数互联网应用都是阅读占据道路90%以上的场景。因此,一个主机有更多的从机,一个主机写,另一个从机读。但是这种主从模式也有一些问题,比如有些数据需要及时,也就是需要写完就立即读取。因为主从同步是通过日志的异步复制,所以存在数据不一致窗口。这时候一定要强行读取主库,保证数据安全,开发的时候一定要注意。

垂直分裂,也就是分裂不会

同的业务放在不同的数据库中,这样就可以减少单一数据库的压力,提高整体性能。垂直分割要注意的是业务边界问题,边界问题就是有一个表,感觉放在A中和放在B库中都合适。这个就要靠经验了,不能过分的考虑,因为其实不论你在之前分得有多好,在应用的迭代中,总会出现更多的找不到明确边界的表。这个问题在业务模块划分中也是一样。

水平分割,一般就是说sharding。将同一个表中的不同字段,拆分成不同的表,或者将同一张表按照hash或者业务字段分成不同的分片。这种一般需要DAL框架的支持,其中有TDDL、Cobar、Mycat等。主要就是通过框架让程序编写者对数据库的拆分不可见,就像操作一个数据库一样。不过现在的DAL框架还不能达到这样的目的,尤其是在跨库事务的场景下,一般都需要其他方式处理。

佭ϴý Ѷ Media8ý

在线客服

外链咨询

扫码加我微信

微信:juxia_com

返回顶部