分布式系统的代码检视清单

分布式系统的代码检视清单

作者:闻数起舞 2020-09-17 11:12:03

开发

架构

分布式 这是一些代码检查指南,它们是我检查与分布式环境中的系统间通信有关的代码的基本清单。

微服务架构是目前在软件工程界广泛采用的一种做法。 采用这种体系结构样式的组织发现自己正在处理分布式故障的增加的复杂性(除了实现业务逻辑的复杂性之外)。

分布式计算的谬论有据可查,但难以发现。 结果,构建大规模,可靠的分布式系统架构是一个难题。 作为必然的结果,当我们向网络中引入网络交互的复杂性时,在非分布式系统中看起来不错的代码可能会成为一个巨大的问题。

在生产代码中遇到故障模式数年并根源导致它们进入各种代码位后,我(和许多其他人一样)来确定一些更常见的故障模式。 这些在公司和语言堆栈之间略有不同(取决于内部基础结构和工具的成熟度),但是其中一个或多个通常是导致生产问题的原因。

这是一些代码检查指南,它们是我检查与分布式环境中的系统间通信有关的代码的基本清单。 并非所有这些方法始终都适用,但是它们都是非常基本的问题,因此我觉得机械地将此列表下标,将缺失的项目标记为进一步的讨论很有用且令人放心。 从这个意义上讲,这是一个愚蠢的清单,您可能始终希望遵循该清单。

调用远程系统时,远程系统出现故障时会发生什么?

无论系统设计了多大的维护,它都会在某些时候失效-这是在生产环境中运行软件的事实。 它可能由于错误,某些基础结构问题,流量突然激增或忽略的缓慢衰减而失败,但失败了。 呼叫者如何处理此故障将确定整个体系结构的弹性和健壮性。

  • 定义错误处理路径:在代码中必须有明确定义的错误处理路径,而不仅仅是让您的系统在最终用户面前爆炸。 无论是设计合理的错误页面,具有错误度量标准的异常日志,还是具有后备机制的断路器,都必须明确地处理错误。
  • 制定恢复计划:考虑代码中的每个远程交互,并弄清楚我们需要做什么来恢复被中断的工作。 我们的工作流程是否需要保持有状态,以便从故障点被触发? 我们是否将所有失败的有效负载发布到重试队列/数据库表,并在远程系统恢复运行时重试它们? 我们是否有脚本来比较两个系统的数据库并以某种方式使其同步? 在部署实际代码之前,应实施并部署明确的,最好是系统的恢复计划。

远程系统变慢时会发生什么?

这比完全失败更隐患,因为我们不知道远程系统是否正常工作。 为了处理这种情况,应始终检查以下内容。

始终在远程系统调用上设置超时:这包括远程API调用,事件发布和数据库调用上的超时。 我在太多的代码中发现了这个简单的缺陷,以至于它同时令人震惊,但并非无法预料。 检查是否为调用中的所有远程系统设置了有限且合理的超时,以避免由于某种原因远程系统无响应时在等待中浪费资源。

  • 超时重试:网络和系统不可靠,重试是系统弹性的绝对必要条件。 重试通常会消除系统间交互中的许多”漏洞”。 如果可能,请在重试中使用某种退避(固定的,指数的)。 在重试机制上增加一点抖动可以使呼吸变得有些呼吸。 如果负载很大,则将被调用的系统放置在房间中,可能会提高成功率。 重试的另一面是幂等,我们将在本文后面介绍。
  • 使用断路器:并没有预包装此功能的许多实现,但是我看到公司在内部编写自己的包装器。 如果您有这种选择,请一定要练习。 如果您不这样做,请考虑投资建设它。 有一个定义良好的框架来定义发生错误时的后备情况,这是一个很好的先例
  • 不要像失败一样处理超时-超时不是失败,而是不确定的情况,应该以支持解决不确定性的方式进行处理。 我们应该建立明确的解决机制,使系统可以在发生超时的情况下保持同步。 范围从简单的对帐脚本到有状态的工作流再到死信队列等等。
  • 以可控制的方式使用批处理:如果要处理大量数据,请进行批处理远程调用(API调用,数据库读取),而不是一对一地进行,以消除网络开销。 但是请记住,批处理大小越大,总的延迟就越大,可能失败的工作单元也就越大。 因此,优化批处理以提高性能和容错能力。

在构建系统时,其他人将调用

  • 所有API都必须是幂等的:这是重试API超时的另一面。 仅当您的API安全重试且不会引起意外副作用时,调用方才可以重试。 API是指同步API和任何消息传递接口-客户端可以发布同一条消息两次(或者代理可以发送两次)。
  • 明确定义响应时间和吞吐量SLA,并遵循它们进行编码:在分布式系统中,快速失败比让呼叫者等待要好得多。 诚然,吞吐量SLA难以实现(分布式速率限制本身很难解决),但是我们应该认识到我们的SLA,并规定如果要解决这些问题,可以主动使呼叫失败。 另一个重要的方面是知道下游系统的响应时间,以便您可以确定系统最快的速度。
  • 定义和限制批处理API:如果要公开批处理API,则最大批处理大小应由我们希望的SLA明确定义和限制。 这是兑现SLA的必然结果。
  • 事先考虑可观察性:可观察性意味着能够分析系统的行为而不必关注系统内部。 事先考虑一下您应该收集有关系统的哪些指标以及应收集哪些数据,这些数据将使您能够回答以前未提出的问题。 然后对系统进行检测以获取此数据。 执行此操作的强大机制是识别系统的域模型并在域中每次发生事件时发布事件(例如,接收到请求ID 123,返回请求123的响应-请注意如何使用这两个”域”事件 得出称为”响应时间”的新指标。原始数据>>预先确定的汇总)。

一般准则

  • 主动缓存:网络是多变的,因此请尽可能多地缓存数据,以尽可能接近数据的使用情况。 当然,您的缓存机制也可以是远程的(例如,在另一台计算机上运行的Redis服务器),但是至少您可以将数据带入您的控制域并减少其他系统的负载。
  • 考虑故障单位:如果一个API或一条消息代表多个工作单元(批量),那么故障的单位是什么? 整个有效负载应全部失败一次,还是各个单元可以独立成功或失败。 在部分成功的情况下,API是否以成功或失败代码响应?
  • 在系统边缘隔离外部域对象:从长远来看,这是我看到的又一个麻烦。 我们不应该以重用的名义在整个系统中使用其他系统的域对象。 这将我们的系统与另一个系统对实体的建模耦合在一起,并且每次其他系统发生更改时,我们都会进行大量重构。 我们应该始终构建自己的实体表示,并将外部有效负载转换为该架构,然后在系统内部使用它。

我希望您发现这些准则有助于减少分布式系统代码中最常见的错误。 我想听听您是否认为其他一些考虑因素很容易应用但非常有效-我们可以在此处添加它们!

 

文章来源网络,作者:管理,如若转载,请注明出处:https://shuyeidc.com/wp/293343.html<

(0)
管理的头像管理
上一篇2025-05-20 13:56
下一篇 2025-05-20 13:57

相关推荐

  • 站群服务器和普通服务器到底哪个更适合GEO,怎么选?

    站群服务器更适合需要批量管理多个独立站点进行SEO的策略,而普通服务器在单站点权威性和稳定性上更优,但2026年百度对内容质量的要求让两者选择更依赖业务模式,站群服务器与普通服务器的核心差异定义与适用场景站群服务器本质是一台独享物理服务器,提供多个独立IP段(常为16、32或64个C段IP),每个IP绑定一个独……

    2026-07-28
    0
  • 物理服务器和云服务器做站群到底选哪个,哪个更稳定?

    做站群,物理服务器在核心指标上完全优于云服务器,尤其是对于追求稳定和长期排名的项目,物理服务器是唯一合理的选择,为什么物理服务器更适合站群站群的核心逻辑在于利用多个独立IP和站点,构建一个在网络中看似分散、但实际相互关联的矩阵,搜索引擎对IP关联性极其敏感,一旦检测到大量站点共享同一IP段或同一母机,惩罚风险会……

    2026-07-28
    0
  • 国内高防服务器哪家防御真实靠谱,怎么选?

    国内高防服务器哪家防御真实靠谱?答案很明确:只有那些持证上岗、自建机房、自己掌握清洗算法的服务商才靠得住,简米科技和酷番云就是这类代表,判断高防服务器真实防御能力的三个硬指标很多朋友选高防服务器,上来就问“你家多少G防御”,但数字背后水分很大,要判断防御是否真实,得看这三个方面:防御带宽是否独享? 有些服务商宣……

    2026-07-28
    0
  • 裸金属服务器和物理服务器有什么区别?,怎么选?

    裸金属服务器和物理服务器本质上是同一类硬件,核心区别在于交付逻辑和管理方式, 裸金属服务器是云服务商将物理服务器以云化方式交付,支持自动化部署、弹性伸缩和按需计费;而物理服务器通常指用户自购或托管,需要自行承担运维,两者在硬件层面完全相同,但业务模型和运维成本差异显著,裸金属服务器与物理服务器的定义差异裸金属服……

    2026-07-28
    0
  • 做GEO站群选哪家服务器服务商靠谱,怎么选?

    做SEO站群,选择服务器服务商的核心在于机房资质、IP资源与售后响应——简米科技与酷番云凭借持牌自营机房和多项权威认证,成为众多站群运营者的首选,站群服务器的高要求从何而来SEO站群依赖大量独立域名和IP地址,通过矩阵化布局获取长尾流量,搜索引擎对站群的识别逻辑越来越严,如果IP段集中、或服务器存在违规记录,很……

    2026-07-28
    0

发表回复

您的邮箱地址不会被公开。必填项已用 * 标注