构建高可用系统的常用招数

互联网等系统对于可用性都非常的重视,构建一个高可用的系统,有些常用的招数,在这里简单的说下,其实多数都是靠各互联网公司在实战中摸爬滚打积累出来的“血泪”经验。

1. 监控和报警
没有监控和报警的在线系统,就像是开着一辆没有仪表盘的车一样,因此如果没有监控和报警,其他一切都是浮云,这点说起来容易,做起来却是比较折腾的,例如监控点需要有哪些,怎么报警是合适的。

这个的评估比较容易,就是故障发生是不是都是监控和报警先发现的,故障发现率是衡量这件事做的咋样的一个不错的指标。

2. SPoF(Single Point of Failure)
这是高可用系统中最不允许的现象,应用如果只部署在一台机器上,就意味着只要这台机器出现问题,就不可用了,为了避免这个问题,通常会采用cluster、主备的方式,实在不好做的情况下才用主备,例如带状态的DB等,而对于不带状态的,最好还是用cluster的方式,因为主备方式实现较麻烦,另外不具备伸缩性。

单台机器这只是SPoF中的一个狭义的点,更放大看还会有单框机器(如果是刀框的话)、单个机柜、单个网络核心路由、单个机房、单个城市,可见一个真正的高可用系统要解决的技术问题是不少的,并且是要付出较高的成本的。

3. 解耦
业务逻辑在实现上总是会有很多关键的逻辑,还有一些附加的逻辑,例如在做完操作后要发个短信通知什么的,如果把这些逻辑也放到主逻辑过程中一起实现,可能会出现的问题就是这些边缘逻辑出问题,然后导致主逻辑挂了,因此在实现系统时需要做一定的解耦,关键的逻辑同步完成,而非关键逻辑则通过异步的消息系统来完成,这是在设计高可用系统时一个非常关键的点。

除了后端这种实现的解耦外,前端页面的构成其实也需要考虑好解耦,例如一个页面上,有些内容即使不显示也不会出什么问题的,对于这些内容应该通过ajax等方式来实现和主要内容解耦。

4. 隔离
一个业务系统,必然会涵盖多种多样的功能,而这些功能中必然会有重要的和不重要的,例如上面解耦后页面上有些不重要的内容会通过ajax来异步获取,而如果这个不重要的内容的生成和重要的内容生成是同一个系统的话,有可能会出现不重要的内容生成的代码处理慢,从而导致把共同的处理线程池的所有线程耗满。

为了解决这个问题,通常可以采用两种办法,一是拆分系统,直接把重要的和不重要的拆成两个应用,二是通过七层路由来分到不同的机器上,也可以是域名,这样系统仍然是同一个,七层路由对性能损害很大,慎用(除非是类似基于zk实现的软负载,然后在客户端执行的七层路由)。

除了重要功能和不重要功能外,还会出现耗资源和相对不怎么耗资源(包括很多种,例如DB连接..)、给重要用户和普通用户,对于这些情况,都需要采用上面的两种办法来做到隔离。

5. 容灾
一个在线运行的系统,不可避免的要面对各种灾难事件,而一个高可用的系统,必须做到在各种灾难事件面前坚挺的活着,为了做到这个,需要有N多的措施。

通常系统都会依赖到其他的一些系统,而这个时候首先要做的就是超时控制,看过N多的case,都是由于没有设置超时时间,从而在依赖的系统响应变慢的情况下,自己的系统的所有处理线程也被拖S的现象,因此所有的阻塞的wait的地方都一定要是带超时的,在线系统更能接受的是失败,响应慢绝对是在线系统的噩梦。

除了超时外,在代码的实现上需要做一些自动降级的策略,有些时候调用的这个后端系统可能不是那么关键的逻辑,那么在这种情况下,应支持自动的降级,当后端系统出现超时等问题的时候,直接忽略掉,例如很多应用都会有待读的消息数,当读不到的时候,其实不显示关系也不大,因此此时可以自动降级掉。

除了自动降级外,还需要有多种手动降级的策略,例如一个页面上的很多功能点都需要支持手工关闭的开关,这样可以在某些系统出现问题,或压力大时可以直接关闭掉,降低系统压力,一种典型的例子是例如高清晰的图片会消耗掉很多的带宽,如果带宽紧急的情况下,应该支持显示更低质量一点的图片,当然,这是有一定损害的降级,但相比系统全挂,显然是这个方式好。

自恢复能力也是系统设计时的重要考虑点,例如当依赖的系统出问题到恢复后,系统本身也要能自恢复,例如一个最简单的是依赖的一个系统挂了,不能说还得重启系统本身才能恢复。

自我保护能力是容灾中的重要点,例如需要处理的请求超过了处理能力,那这个时候应该拒绝,要做到这点,必须首先知道系统的处理能力到底是多少(小声的说一句:所有的模拟的压力测试都是无法反应系统的处理能力的,要拿到系统的处理能力必须是用真实的访问来测试,原因是数据、用户行为其实是无法模拟的或者说难度非常非常的高),除了处理能力的保护外,还应该做负载层面的保护,以避免某些情况下即使在处理能力范围内,负载出现飙高导致无法登陆机器处理故障的现象。

除了上面说的这些系统层面的策略外,容灾还需要考虑机房层面的容灾、地域的容灾。

从上面5点来说,要做到一个高可用的系统真心不容易,从编程技巧、系统设计以及基础设施(IDC)建设都需要作出巨大的努力,并且要付出巨大的成本,而对于一个高访问量的大规模系统而言,基本上所有认为不太可能发生的事其实都是会发生的,如果没有准备好的话,瞬间可用率就会大幅损失。

参考:http://www.etwiki.cn/java/5786.html

大型网站架构演进: http://www.blogjava.net/BlueDavy/archive/2008/09/03/226749.html



AI 代码审查Review工具 是一个旨在自动化代码审查流程的工具。它通过集成版本控制系统(如 GitHub 和 GitLab)的 Webhook,利用大型语言模型(LLM)对代码变更进行分析,并将审查意见反馈到相应的 Pull Request 或 Merge Request 中。此外,它还支持将审查结果通知到企业微信等通讯工具。 一个基于 LLM 的自动化代码审查助手。通过 GitHub/GitLab Webhook 监听 PR/MR 变更,调用 AI 分析代码,并将审查意见自动评论到 PR/MR,同时支持多种通知渠道。 主要功能 多平台支持: 集成 GitHub 和 GitLab Webhook,监听 Pull Request / Merge Request 事件。 智能审查模式: 详细审查 (/github_webhook, /gitlab_webhook): AI 对每个变更文件进行分析,旨在找出具体问题。审查意见会以结构化的形式(例如,定位到特定代码行、问题分类、严重程度、分析和建议)逐条评论到 PR/MR。AI 模型会输出 JSON 格式的分析结果,系统再将其转换为多条独立的评论。 通用审查 (/github_webhook_general, /gitlab_webhook_general): AI 对每个变更文件进行整体性分析,并为每个文件生成一个 Markdown 格式的总结性评论。 自动化流程: 自动将 AI 审查意见(详细模式下为多条,通用模式下为每个文件一条)发布到 PR/MR。 在所有文件审查完毕后,自动在 PR/MR 中发布一条总结性评论。 即便 AI 未发现任何值得报告的问题,也会发布相应的友好提示和总结评论。 异步处理审查任务,快速响应 Webhook。 通过 Redis 防止对同一 Commit 的重复审查。 灵活配置: 通过环境变量设置基
【直流微电网】径向直流微电网的状态空间建模与线性化:一种耦合DC-DC变换器状态空间平均模型的方法 (Matlab代码实现)内容概要:本文介绍了径向直流微电网的状态空间建模与线性化方法,重点提出了一种基于耦合DC-DC变换器的状态空间平均模型的建模策略。该方法通过数学建模手段对直流微电网系统进行精确的状态空间描述,并对其进行线性化处理,以便于系统稳定性分析与控制器设计。文中结合Matlab代码实现,展示了建模与仿真过程,有助于研究人员理解和复现相关技术,推动直流微电网系统的动态性能研究与工程应用。; 适合人群:具备电力电子、电力系统或自动化等相关背景,熟悉Matlab/Simulink仿真工具,从事新能源、微电网或智能电网研究的研究生、科研人员及工程技术人员。; 使用场景及目标:①掌握直流微电网的动态建模方法;②学习DC-DC变换器在耦合条件下的状态空间平均建模技巧;③实现系统的线性化分析并支持后续控制器设计(如电压稳定控制、功率分配等);④为科研论文撰写、项目仿真验证提供技术支持与代码参考。; 阅读建议:建议读者结合Matlab代码逐步实践建模流程,重点关注状态变量选取、平均化处理和线性化推导过程,同时可扩展应用于更复杂的直流微电网拓扑结构中,提升系统分析与设计能力。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值