[转帖]高可用高并发系统设计概念学习 二

可用,并发,系统,设计,概念学习 · 浏览次数 : 0

小编点评

**系统设计隔离** * 进程隔离:使用进程池来管理进程,避免进程间通讯。 * 线程隔离:使用线程池来管理线程,避免线程间通讯。 *数据库连接池隔离:使用数据库连接池来管理数据库连接,避免数据库间通讯。 **超时与重连机制** * 异常处理:使用异常处理来处理异常,避免系统中断。 * 重连机制:使用重连机制来处理系统故障,避免系统停止。 * Future:使用Future来处理系统故障,方便处理异常。 **隔离机制** * 进程池:使用进程池来管理进程,避免进程间通讯。 * 线程池:使用线程池来管理线程,避免线程间通讯。 *数据库连接池:使用数据库连接池来管理数据库连接,避免数据库间通讯。 **异常处理** * 异常处理:使用异常处理来处理异常,避免系统中断。 * 重连机制:使用重连机制来处理系统故障,避免系统停止。 * Future:使用Future来处理系统故障,方便处理异常。 **重连机制** * 异常处理:使用异常处理来处理异常,避免系统中断。 * 重连机制:使用重连机制来处理系统故障,避免系统停止。 * Future:使用Future来处理系统故障,方便处理异常。 **数据库连接池隔离** * 使用数据库连接池来管理数据库连接,避免数据库间通讯。 * 数据库连接池:使用数据库连接池来管理数据库连接,避免数据库间通讯。 **其他** * 进程池:使用进程池来管理进程,避免进程间通讯。 * 线程池:使用线程池来管理线程,避免线程间通讯。 *数据库连接池:使用数据库连接池来管理数据库连接,避免数据库间通讯。 *异常处理:使用异常处理来处理异常,避免系统中断。 * 重连机制:使用重连机制来处理系统故障,避免系统停止。 * Future:使用Future来处理系统故障,方便处理异常。

正文


前言

本次学习是学习的隔离,超时与重试机制的知识点。


一、隔离术

隔离指的是将系统或者资源分割开。系统隔离是为了在系统发生故障时,控制影响范围,保证只出问题的服务不可用,其他服务不受影响。资源隔离是为了减少资源竞争,保障服务间数据相互不影响和可用性。比较常用的隔离有线程隔离、进程隔离、集群隔离、机房隔离、读写隔离、快慢隔离、动静隔离、爬虫隔离等。

线程隔离

线程隔离可以理解为不同业务的请求,使用不同的线程池处理,而不是全部统一一个线程池分配线程。这样做当某种业务出了问题,不会影响到其他业务的处理。
在这里插入图片描述

进程隔离

在公司发展初期,一般是先进行从零到一,不会一上来就进行系统拆分,这样就会开发出一些大而全的系统,系统中的一个模块/功能出现问题,整个系统就不可用了。首先,想到的解决方案时通过负载均衡多部署几台服务器。但是还是无法避免某个模块因BUG导出整个系统都不可用的奉先。因此可以通过系统拆分为多个子系统来实现隔离,通过进程隔离使某一个子系统出现问题时不会影响到其他子系统。
在这里插入图片描述

集群隔离

随着系统的发展,单例服务满足不了需求,就会需要服务化技术,通过部署多个服务形成服务集群,来提升系统容量,如下图所示。在这里插入图片描述
随着调用方的增多,秒杀服务会影响到其他服务稳定性。这时可以考虑将秒杀服务提供单独的服务集群,这样当某一个集群出现问题不会影响到其他集群的稳定性。如下图所示。
在这里插入图片描述

机房隔离

机房隔离也可以理解为分区隔离,多备份几个不同地区的集群,当某一个地区出现了问题,可以快速切换到正常的地区,保障系统的可用性。在这里插入图片描述

读写隔离

比如数据库,读写分离开来,当写入出现故障时,读还是正常读取的。
在这里插入图片描述

动静隔离

系统中是有许多js,图片,css等静态文件的,当某个时间点许多用户同时访问资源时,很有可能会访问量太大导致带宽被打满,从而休闲不可用。比如订单结算页,如下图所示。
在这里插入图片描述
此时就可以通过将静态资源放在CDN服务器上,进行节点缓存处理,如下图所示。
在这里插入图片描述

爬虫隔离

在实际业务中,系统可能因为爬虫访问量太大而导致服务不可用。一种办法是通过限流解决,另一种是在负载均衡上将爬虫路由到单独的集群,从而保证正常流量可用,爬虫流量也可用。
在这里插入图片描述

二、超时与重试机制

在实际开发中,有许多故障时因为没有设置超时或者设置得不对而造成的。而这些故障都是因为没有意识到超时设置的重要性而造成的。如果应用不设置超时,则可能会导致请求响应慢,慢请求累积导致连锁反应,甚至造成应用雪崩。所以才需要将每个节点合适的设置好超时。

代理层超时与重试

对于代理层我们以Nginx为案例进行学习。
Nginx主要有4类超时设置:客户端超时设置、DNS解析超时设置、代理超时设置,还有lua相关的超时设置。

客户端超时设置

client_header_timeout time

设置读取客户端请求头超时时间,默认60S。如果在这个时间内客户端没有发送完请求头,则响应408给客户端。

client_body_timeout time

设置读取客户端内容提超时时间,默认60S。此超时时间指的是两次成功读操作间隔时间,而不是发送整个请求的超时时间。

send_timeout time

设置发送响应到客户端的超时时间,默认60S。此超时时间指的是两次成功写操作间隔时间,而不是发送整个响应的超时时间。

keepalive_timeout timeout [header_timeout]

设置HTTP长连接超时时间。第一个参数timeout是告诉Nginx长连接超时时间,默认75S。第二个参数hearder_timeout用于设置响应头"Keep-Alive:timeout=time",即告知客户端长连接超时时间。Httpclient框架不设置响应头超时时,默认为永久,设置为0则表示禁用。

DNS解析超时设置

resolver_timeout

设置DNS解析超时时间,默认为30S。如果IP修改了Nginx配置的服务器列表不会自动更新,所以需要借助脚本进行IP更换,DNS解析超时时,会切换到新的IP中。

代理超时设置

在这里插入图片描述

proxy_connect_timeout time

与后端/上游服务器建立连接的超时时间,默认60S,此时间不超过75S。

proxy_read_timeout time

与后端/上游服务器读取响应的超时时间,默认60S,此事件只两次成功读操作间隔时间,而不是读取整个响应体的超时时间。

proxy_send_timeout time

与后端/上游服务器发送请求的超时时间,默认60S,此事件只两次成功写操作间隔时间,而不是读取整个响应体的超时时间。

proxy_next_upstream error | timeout | invalid_header | http_500 | http_502

配置什么情况需要请求下一台上游服务器进行重试。默认为"error_timeout"。error表示与上游服务器建立连接,写请求或者读响应头出错。timeout表示与上游服务器建立连接,写请求或者读响应头超时。invalid_header表示上游服务器返回空的或错误的响应头。http_xxx表示上游服务器返回特定的状态码。

proxy_next_upstream_tries number

设置重试次数,默认0表示不限制,注意此重试次数指的是所有请求次数(包括第一次和之后的重试次数之和)。

proxy_next_upstream_timeout time

设置重试最大超时时间,默认0表示不限制。
在这里插入图片描述
以上配置,表示当error/timeout时重试upstream中的下一台上游服务器,如果重试的总时间超过了6S或者重试了1次,则表示重试失败,Nginx结束重试并返回客户端响应。

max_fails和fail_timeout

配置什么时候Nginx将上游服务器认定为不可用/不存活。当上游服务器在fail_timeout时间内失败了max_fails次,则认为上游服务器不可用/不可活。并且接下来的fail_timeout时间内请求不会转发到该上游服务器。
在这里插入图片描述
如上图,在10S内失败了2次,接下来10S请求不会转发到该服务器中。
max_faild设置为0表示不检查服务器是否可用,表示永远不会被认为不可用,即一直都是可用的。

WEB容器超时

这里以tomcat为例子。

connectionTimeout

配置与客户端建立连接的超时时间,从接受到连接后,在配置的时间内没有接收到客户端的请求航,将被认定为连接超时,默认为60S。

socket.soTimeout

从客户端读取请求数据的超时时间,默认60S。

asyncTimeout

Servlet3异步请求的超时时间,默认30S。

disableUploadTimeout和connectionUploadTimeout

disableUploadTimeout默认为true,但设置为true时,文件上传则以connectionUploadTimeout作为超时时间。

keepAliveTimeout和maxKeepAliveRequests

keepAliveTimeout默认为connectionTimeout,配置为-1表示永不超时。maxKeepAliveRequests默认为100S。

数据库客户端超时

JDBC超时设置

在这里插入图片描述
connectTimeout:表示等待和MySQL数据库建立socket链接的超时时间,默认值0,表示不设置超时,单位毫秒,建议30000(30S)。

socketTimeout:表示客户端和MySQL数据库建立socket后,读写socket时的等待的超时时间,linux系统默认的socketTimeout为30分钟,可以不设置

连接池超时设置

maxWait:表示从数据库连接池取链接,连接池没有可用连接时的等待时间,默认值0,表示无限等待,单位毫秒,建议60000(60S)。

<!--等待获取连接池时间,不要太大 -->
<property name="maxWait" value = "1500" />
  • 1
  • 2

MyBatis查询超时

defaultStatementTimeout:表示在MyBatis配置文件中默认查询超时间,单位秒,不设置则无线等待。
在这里插入图片描述

业务超时

任务型

比如淘宝确认订单之后,未去支付,到了一定的时间,会自动取消订单。

服务调用性

比如某个服务的全局超时时间为500ms,单我们有多处服务调用,没出服务调用的超时时间可能都不一样,可以简单的使用Future来解决问题,Futrue是JAVA中多线程并发执行,并能收集所有并发线程执行结果的工具类。

前端Ajax超时

在请求时,带上timeout参数即可。
在这里插入图片描述

总结

今天在这里学习了系统设计的隔离,超时与重连机制,可以提高整个系统的可用性和稳定性,需要的时候可以使用。

引用《亿级流量网站架构核心技术-跟开涛学搭建高可用高并发系统》书籍

</article>

与[转帖]高可用高并发系统设计概念学习 二相似的内容:

[转帖]高可用高并发系统设计概念学习 二

高可用高并发系统设计概念学习 二 前言一、隔离术线程隔离进程隔离集群隔离机房隔离读写隔离动静隔离爬虫隔离 二、超时与重试机制代理层超时与重试客户端超时设置client_header_timeout timeclient_body_timeout timesend_timeout timekeepal

[转帖]Redis的高并发及高可用,到底该如何保证?

https://zhuanlan.zhihu.com/p/404481762 一、redis如何通过读写分享来承载读请求QPS超过10万+ 1、redis高并发跟整个系统的高并发之间的关系 redis,你要搞高并发的话,不可避免,要把底层的缓存搞得很好 mysql,高并发,做到了,那么也是通过一系列

[转帖]浅谈系统稳定性与高可用保障的几种思路

https://segmentfault.com/u/dewujishu 一、前言 高并发、高可用、高性能被称为互联网三高架构,这三者都是工程师和架构师在系统架构设计中必须考虑的因素之一。今天我们就来聊一聊三H中的高可用,也是我们常说的系统稳定性。 本篇文章只聊思路,没有太多的深入细节。阅读全文大概

[转帖]高并发系统中的尾延迟Tail Latency

开发和运维高并发系统的工程师可能都有过类似经验,明明系统已经调优完毕,该异步的异步,该减少互斥的地方引入无锁,该减少IO的地方更换引擎或者硬件,该调节内核的调节相应参数,然而,如果在系统中引入实时监控,总会有少量响应的延迟高于均值,我们把这些响应称为尾延迟(Tail Latency)。对于大规模分布

[转帖]新一代垃圾回收器ZGC的探索与实践

1. 引入 1.1 GC之痛 很多低延迟高可用Java服务的系统可用性经常受GC停顿的困扰。GC停顿指垃圾回收期间STW(Stop The World),当STW时,所有应用线程停止活动,等待GC停顿结束。以美团风控服务为例,部分上游业务要求风控服务65ms内返回结果,并且可用性要达到99.99%。

[转帖]细说Redis监控和告警

文章系转载,便于整理和归类,原文地址:https://blog.csdn.net/sD7O95O/article/details/78096956 对于任何应用服务和组件,都需要一套完善可靠谱监控方案。 尤其redis这类敏感的纯内存、高并发和低延时的服务,一套完善的监控告警方案,是精细化运营的前提

[转帖]redis主从+keepalived实现高可用技术(转)

https://www.jianshu.com/p/78f6dc30af7d redis主从+keepalived实现高可用技术keepalive+redis 主从高可用 Redis是我们当下比较流行使用的非关系数据库,可支持多样化的数据类型,多线程高并发支持,redis运行在内存拥有更快的读写。因

[转帖]删除数据后的Redis内存占用率为什么还是很高?

https://zhuanlan.zhihu.com/p/490569316 有时候Redis明明做了数据删除,数据量已经不大了,但是使用top命令的时候,还会发现Redis占用了很多内存? PS:关于 Redis的高并发及高可用,到底该如何保证?可以参考下这个帖子:httss://http://z

[转帖]高性能 -Nginx 多进程高并发、低时延、高可靠机制在百万级缓存 (redis、memcache) 代理中间件中的应用

https://xie.infoq.cn/article/2ee961483c66a146709e7e861 关于作者 前滴滴出行技术专家,现任 OPPO 文档数据库 mongodb 负责人,负责 oppo 千万级峰值 TPS/十万亿级数据量文档数据库 mongodb 内核研发及运维工作,一直专注于

[转帖]Redis 可以禁用的高危命令

https://cloud.tencent.com/developer/article/2064127 高危命令禁用 redis一款高并发的内存K-V数据库,提供了好多命令,但是其中有部分对于生产环境来说比较危险,需要禁用掉。 keys 命令 keys 命令执行的时候是需要进行全库扫描的,因为red