作者归档:admin

关于复杂系统的思考:从语雀服务中断想到的

在 10 月 23 日,语雀服务出现了一次重大故障,中断时间超过 7 小时。具体来说,这次故障的起因是在执行系统升级操作期间,新的运维升级工具出现了 bug,导致华东地区生产环境的存储服务器被误下线。由于存储系统使用的机器类别过于陈旧,无法直接将其上线,这导致了恢复过程时间延长。尽管语雀的工程师们立刻进行了恢复工作,但由于数据量大,恢复方案有限,恢复过程耗时 4 小时,数据检验耗时耗时 2 小时。这次故障给用户带来了严重的影响,也让我们重新审视关于本次故障带来的思考。

我将整个复盘报告输入给到 chatGPT,其给我的回复如下:

从语雀的这次事故中,我们可以学到以下几个关键的教训:

  1. 重视运维工具的测试和质量保证:在这次事故中,新的运维升级工具的 bug 是导致故障的主要原因。这说明,即使是运维工具,也需要进行足够的测试和质量保证。在实际使用之前,应该在相似的环境中进行充分的测试,确保其稳定性和安全性。
  2. 灾备和恢复系统的重要性:即使有了数据备份,恢复仍然可能需要花费大量时间,这会导致服务中断时间过长。因此,除了定期备份数据外,还需要建立有效的灾备和恢复系统,以便在灾难发生时,能够快速恢复服务。
  3. 灾难恢复演练的必要性:定期的灾难恢复演练可以帮助我们在真实的灾难发生时,更快地恢复服务。通过演练,我们可以发现并解决恢复过程中可能存在的问题,提高恢复的效率。
  4. 高可用架构的重要性:高可用架构可以保证在部分系统组件发生故障时,整个系统仍能继续运行。在这次事故中,由于存储系统的故障,导致了整个服务的中断。如果有高可用架构,即使某个组件发生故障,也可以通过其他的组件提供服务,从而减少服务中断的可能性。
  5. 灾难通信的重要性:在灾难发生后,应该及时向用户通报情况,说明故障的原因,修复的进度,以及预计的恢复时间。这样可以增加用户的信任度,减少用户的不安。在这次事故中,语雀做了很好的灾难通信,及时向用户报告了故障的详情,以及修复的进度。
  6. 持续改进和学习的重要性:每次故障都是一次学习的机会。通过分析故障的原因,我们可以找出问题,改进系统,避免类似的故障再次发生。在这次事故中,语雀提出了一系列的改进措施,这表明他们有持续改进和学习的意识。

但是从复杂系统的角度来看这个事件:复杂系统的性质使得它们在面临故障时,能够以我们意料之外的方式表现出来。尽管我们可能已经在设计和实施阶段做了很多工作来确保系统的稳定性,但是在实际运行中,仍然会出现我们没有预见到的问题。

高尔在讨论复杂系统时提到:「具备故障防备能力的系统出故障的原因恰恰就是故障防备能力的失灵」。这是因为在设计防备系统时,我们往往会基于我们对系统的理解来设计,但是实际上,系统的行为可能会超出我们的理解范围。当系统的行为超出我们的预期时,我们的防备措施就可能会失效。

这与这次语雀服务故障的情况非常相似。尽管语雀设计了一套备份恢复机制,但是在实际的故障中,由于对系统的理解不足,这套机制并没有发挥出应有的效果,反而延长了恢复时间。

在许多情况下,一些复杂系统的故障并不是单一的、孤立的事件,而是由一系列的因素相互作用、相互影响的结果。这通常包括了系统设计、运维策略、人为错误等多个方面。

具备故障防备能力的系统,其设计和运营目标是提供连续、稳定的服务,即使在面临内部错误或外部攻击等影响时也能持续运行。这种系统通常包含冗余的组件、自动故障切换机制、灾难恢复策略等措施,以保证系统的正常运行。

然而,这些故障防备能力本身可能成为系统故障的源头,原因可能有以下几点:

  1. 复杂性故障防备能力会增加系统的复杂性,复杂性本身就可能带来故障。例如,冗余的组件需要保持同步,如果同步机制出现问题,可能导致数据不一致,进而产生故障。

  2. 人为错误故障防备能力的维护和操作需要人工参与,人为操作错误可能导致防备能力失灵。如语雀故障案例中,运维工具的 bug 就是人为因素导致的。

  3. 预期和实际的差距:故障防备能力的设计和实施都是基于对可能故障的预期,但实际发生的故障可能超出了预期,导致防备能力无法应对。

面对一个每天都在演化的复杂系统,我们应该做些什么呢?

面对复杂,我们第一个能想到的原则应该就是 KISS 原则了。

「KISS」 原则是 「Keep It Simple, Stupid」 的缩写,这是一种广泛应用于工程、设计和决策过程中的设计原则。其最主要的理念就是保持事物的简单性。

KISS 原则主张:

  • 避免不必要的复杂性
  • 优先选择简单、清晰和直观的解决方案
  • 不要添加不必要的特性或功能
  • 简单的设计更易于维护、理解和修改

这个原则并不是说所有的事物都必须以最简单的方式来完成,而是鼓励我们在设计和决策过程中,优先考虑最简单和最直接的方法,除非有充分的理由去选择更复杂的方案。

简单性是一个非常重要的设计目标,因为它可以降低错误的可能性,提高系统的可靠性,减少维护的难度,提高效率,以及其他许多好处。

我们如果应用了以下的一些建议,应该可以往 KISS 原则靠近一些:

  1. 明确需求:首先明确我们试图解决的问题是什么。这有助于避免在设计和实现过程中添加不必要的功能或复杂性。

  2. 简化设计:在设计过程中,始终问自己是否可以把事情做得更简单。避免过度设计,只实现真正需要的功能。

  3. 模块化:把大问题分解成小问题,每个小问题都可以用简单的方式解决。这样,每个模块都保持简单,而整个系统则由这些简单模块组成。

  4. 避免不必要的优化:过早的优化可能会增加复杂性。除非确定优化会带来显著的好处,否则最好先实现功能,然后再考虑优化。

  5. 使用已有的解决方案:如果有已经存在的工具或库可以满足我们的需求,那就使用它,而不是从头开始创建。这样可以降低复杂性,同时节省时间。

  6. 代码和设计的清晰性:代码应该易于理解,设计应该直观。这不仅提高了可维护性,也让其他团队成员更容易理解你的工作。

  7. 定期回顾和重构:随着时间的推移和需求的变化,我们可能需要调整或简化现有的设计。定期回顾我们的代码和设计可以帮助我们找出可以简化的地方。

作为一个技术管理者应该作些什么呢?我认为最应该做的是拒绝那些让系统变得复杂的不合理需求,守好技术实现的大门。

面对复杂系统,我们需要对系统有深入的理解,尽可能地简化系统,避免不必要的复杂性。通过模块化设计,将复杂系统分解为相对独立的部分,每个部分都可以单独理解和测试。并且设计出健壮的错误处理和恢复机制,同时也需要进行持续的监控和回顾。只有这样,才能提升系统的稳定性,减少服务中断的可能性。

最容易被忽视却意义重大的立项

我们经常会发现工作中会出现很多重点项目,很多事情忽然就来了,问就是老板需求,却没有一个过程来告诉大家前因后果和价值。这往往会导致大家感到迷茫,因为没有获得足够的信息和时间来理解和准备这些项目。这个过程从项目管理的角度来说是缺少立项,而立项往往是最容易被忽视的。

当没有明确的立项过程时,目标模糊、资源浪费、沟通困难、出现项目风险等问题都会时有发生,从而影响整个项目的实施效果和公司的业务发展。

1 什么是立项

立项是一个组织或公司决定开始一个新项目时的决策过程,这个过程涵盖了对项目需求的明确、项目目标的设定、可行性的评估、资源的分配和风险的识别及管理等关键步骤。通过立项过程,组织能确保每个项目有明确的目标、适当的资源分配、风险控制措施以及一个清晰的执行计划,从而提高项目的成功率和效率。

立项的本质是一个综合的决策过程,其中项目的各干系方对目标、方案、成本、风险和里程碑等重要预期进行对齐,以便做出是否启动项目并如何分配资源的决定。

2 立项的作用

立项就像是给项目开个「导航」,帮助我们明确要去的目的地,规划好路线,分配好需要的人和物,预防可能的风险,确认能否按计划到达,并让所有人都了解这个「旅行计划」,以提高我们的旅行效率和成功率。具体一些,包含以下六个作用:

  1. 明确目标:立项过程有助于明确项目的目标和期望结果,使所有参与者对项目的方向和目标有共同的理解。如我们在开发一个新的移动应用的立项过程中,项目组会明确这个应用需要解决的用户问题,预期的用户量,以及市场的目标定位等。

  2. 资源分配:立项过程可以帮助组织确定项目的所需资源,包括人力、物力、时间和资金,并有效地进行分配。如我们在进行一次大型的在线活动的立项过程中,会确定需要多少开发人员来构建和维护活动页面,需要的市场推广预算是多少,以及活动的时间表等。

  3. 风险管理:立项过程中的风险评估和管理,可以帮助识别和处理可能影响项目实施的风险,并提前制定应对策略。如在立项过程中,可能会识别到政策、数据隐私等风险,并提前规划相应的风险应对措施。

  4. 确保项目的可行性:通过立项过程中的可行性研究,可以确保项目在技术、收益、时间等方面的可行性,避免投入大量资源后发现项目无法实现。如最近比较火的 AIGC,在立项时会进行技术可行性分析,以确保所需的算法能力和数据在现有条件下可行。

  5. 提升效率和效果:有了明确的立项过程,可以提高项目管理的效率,减少不必要的错误和返工,提高项目的成功率。

  6. 增强沟通和协作:立项过程有一个关键动作是对齐,当目标对齐后,每个人都清楚自己的角色和任务,也明白项目的整体方向,这有助于增强项目各方的沟通和协作。

3 立项流程

立项流程可以分为三个阶段,准备阶段,决策阶段、对齐阶段。

3.1 准备阶段

准备阶段是立项中花费时间最长的阶段,是立项的主体工作。

在这个阶段,项目团队需要深入理解项目的需求,研究市场环境,评估项目的可行性,以及预测可能的风险。所有这些工作都需要大量的时间和精力。

这些工作最后落地的交付物是项目提案,可能是一份文档,也可能是一堆文档,项目提案中包括项目的目标、预期结果、工作计划、预算、资源需求等。

项目提案将为项目的后续执行提供清晰的指导,也将为项目的评估决策阶段提供关键的信息。准备阶段是整个立项过程中最为关键的阶段,也是决定项目能否成功的重要因素。

项目提案主要是用来回答下面的问题:

  • 为什么要做?可不可以不做?可不可以少做?可不可以晚点做?
  • 要做什么?
  • 有没有能力/资源做?
  • 什么样叫做好了?成功的标准是什么?
  • 怎么做?有哪几步?里程碑是怎样的?
  • 有什么风险?

一个提案可能是一个正式的文件、一份演示文稿 PPT、甚至是一封简单的电子邮件。但是提案结构一般都会包括以下几个主要部分:

  1. 概述:包括项目的名称、目标、主要利益相关者以及总体的项目描述。

  2. 背景:解释为什么提出这个项目,包括市场需求、商业机遇或问题解决等。主要明确现状、剖析问题并给出建议解决方向。

  3. 项目目标和范围:详细描述项目要达到的具体目标和定义项目的范围,包括项目要做的事情以及不包括的事情。落地过程一般是提炼需求、总结项目方向、项目可实现价值等。

  4. 调研及可行性分析:针对上面的问题,需求,结合组织内外的因素,评估项目的技术可行性、经济可行性、法律可行性和运营可行性等。

  5. 成功的标准:定义项目的成功标准。这可能包括在指定的时间和预算内完成项目,以及用户对新功能的满意度等。

  6. 项目计划:包括项目的主要阶段、关键里程碑、预期成果和详细的时间表。细节呈现可以有一个时间轴之类的图。

  7. 项目团队和资源:描述项目团队的结构和成员,以及项目所需的其他资源,如资金、设备和技术。

  8. 风险评估:识别和评估可能影响项目成功的风险,以及应对这些风险的策略。风险可能来自许多不同的来源,包括政策要求、法律法规、技术、预算、进度、人力等。

每个项目提案的内容可能会有所不同,具体取决于项目的性质和复杂性,以及组织的要求和偏好等。

3.2 决策阶段

在项目决策阶段,项目提案会被提交给负责决策的人或团队进行审查。根据组织结构或者提案的重要程度,这可能是公司的高层领导团队,部门领导团队或者是专门的审查团队。以下是在决策阶段可能涉及的内容:

  1. 项目提案审查:决策者会仔细阅读项目提案,理解项目的目标、计划、预期的收益和风险等。他们可能会寻求专家的意见,或者进行附加的研究以验证提案中的信息。

  2. 问题和澄清:决策者可能会对提案中的某些部分有疑问,或者需要更多的信息。这可能会通过与项目团队的会议、电子邮件或其他形式的通信来解决。

  3. 项目比较和优先级设置:如果有多个项目提案,决策者可能需要比较他们的优点和缺点,以决定哪个项目应该优先进行。这可能会涉及到对项目的潜在收益、风险、对公司策略的贡献等方面的评估。

  4. 决策:最后,决策者会根据提案和他们的评估做出决定。他们可能会批准项目,拒绝项目,或者请求更多的信息或修改。

  5. 反馈和沟通:无论决定如何,都应该把它及时和清晰地传达给项目团队和其他相关的利益相关者。如果项目被批准,那么就需要开始实施项目计划。如果项目被拒绝,应该提供反馈,以便项目团队可以了解原因并在将来改进他们的提案。

根据项目的重要程度,适用范围,决策通常涉及以下几个层次:

  1. 战略级决策:这是最高级别的决策,也可以称之为公司级决策,通常由公司的最高管理层进行。他们会评估项目提案是否符合公司的整体战略,是否有助于公司的长期发展,以及是否值得投资。可能会考虑一系列的因素,如市场趋势、竞争环境、公司的资源和能力等。

  2. 部门级决策:这些决策通常由部门的领导们进行。他们会评估项目提案是否符合部门的目标和计划,是否有助于部门的发展,以及是否符合部门的资源和能力。他们可能会考虑一系列的因素,如部门的策略、人力资源、预算等。

  3. 项目级决策:这些决策通常由项目经理或项目团队进行,属于常规决策。我们会评估项目提案的具体细节,如项目的目标、任务、计划、预算、风险等。也可能会需要修改提案的一些细节,以确保项目的可行性和成功率。

这些决策级别并不是严格的分割,而是相互影响和交织。如一个项目提案可能需要在战略级和部门级之间进行多次的审查和修改,以确保它既符合公司的战略,又符合部门的需求。同时,项目级的决策也会影响到项目提案的内容和形式,从而影响到上级的决策。

3.3 对齐阶段

对齐阶段是在项目提案被初步接受后,各相关部门或团队就项目的具体执行细节进行协调和确定的阶段,是一个信息同步对齐,节奏同步对齐阶段。

在项目立项过程中的对齐阶段,形式、内容、范围和后续机制的具体设定通常会因项目的特性和组织的需求而变化,以下是一些常见的实践:

形式

  • 会议:这可能是最常见的对齐形式,包括面对面的会议和在线会议。会议可以让所有相关的人员在同一时间讨论项目的各个方面,及时解决问题和疑问。

  • 邮件和文档:对于一些需要详细记录或者不需要立即回复的问题,邮件和文档可能是更好的选择。它们可以让人们有更多的时间来思考和回复,也可以方便地保存和查阅。

  • 即时消息(IM)群聊:使用企业微信,钉钉等工具创建的项目群组。这样的群组可以让团队成员进行实时的沟通,快速解决问题,同时也可以记录下来所有的对话,方便后期查阅。

  • 公司通知/公告:这是非常正式的方式,如果项目的内容需要通知到整个公司,或者特定的部门或角色,可以通过公司内部的通知系统来发布相关信息。这可以是公司的内部网站、邮件列表、公告板等。

  • 项目管理软件:如 Jira,Tapd 等可以用于管理项目的工具,可以让团队成员查看项目的进度,分配任务,跟踪问题等。

范围

  • 内部范围:涵盖公司内部所有相关的部门和团队,包括项目团队、销售团队、营销团队、财务部门等。
  • 外部范围:如果项目涉及到外部的合作伙伴或供应商,他们也可能需要参与到这个过程中。

内容

  • 项目目标和战略对齐:确认项目的目标和战略与公司的整体战略是否一致,是否有助于实现公司的长期目标。
  • 资源分配:讨论和决定项目需要的各种资源,包括人力、资金、设备等,以及这些资源如何分配和使用。
  • 风险评估:识别和评估项目可能面临的各种风险,以及如何预防和应对这些风险。

后续机制

  • 定期的跟进会议:为了确保项目的执行按照计划进行,可以设置定期的跟进会议,如每周或每月一次,让所有人都能及时了解项目的进展和可能的问题。
  • 评估和反馈机制:在项目执行过程中,需要一个系统的评估和反馈机制,以便及时发现和解决问题,调整计划和策略。这可以通过定期的项目审查、员工反馈、客户反馈等方式实现。

在对齐阶段,关键的一点是保持良好的沟通和协调,确保所有相关的人都明白项目的目标和计划,以及他们在其中的角色和责任。

4 立项常见问题

从上面立项流程的三个阶段来看,每个阶段都有可能会出现一些问题:

4.1 准备阶段常见问题

在这个阶段,应集中精力明确项目的目标、需求、预期结果和实施方式。其常见问题如下:

  • 需求定义不明确:在项目提案阶段,对项目的需求和目标应该有明确的定义。如果在这个阶段需求和目标定义模糊,可能会导致提案内容与实际需求不匹配,或在后续阶段引发混乱和效率低下。清晰、准确的需求定义是项目成功的关键。

  • 提案不完善:在项目提案阶段,提案应该充分考虑项目的所有关键方面,包括预期的时间表、预算、人力资源需求,风险等。如果提案中缺乏这些关键信息,可能会在项目评估决策阶段造成项目被拒绝。一个全面、详尽的提案可以帮助评估者更准确地理解项目的需求和潜在价值。

  • 项目产投不合理:指的是项目预期的产出(如产品、服务或其他结果)与投入(如时间、资金、人力等资源)之间的比例不合理。如果投入过大而产出有限,那么项目可能不会为组织带来足够的收益,这可能会导致项目在评估决策阶段被拒绝。

  • 项目资源投入不聚焦:指的是项目的资源被分散投入到许多不同的任务或活动中,而不是集中在关键的任务或活动上。这可能会导致项目的效率低下,或者关键任务因资源不足而延期。

  • 提案权错配:提案是整个项目立项的主体内容,它的权力错配严重时会导致整个项目的失败。提案权错配可以分为两种:跨部门的错配和层级的错配。跨部门错配一般发生在提案的制定和执行由不同的部门负责,如 A 部门负责制定提案,但 B 部门负责实施提案。这种错位可能导致沟通困难和理解差异,因为制定提案的部门可能对执行提案的部门的能力和限制了解不足,反之亦然。为了避免这种错位,可能需要更紧密的跨部门合作,或者建立一个跨部门的团队来共同提出和实施提案,或者执行类似于「谁主张主举证」的原则,谁提案谁执行,谁干活谁提案。层级错配一般发生在高层领导制定提案,而实际工作团队负责实施时。这可能导致提案与实际工作的脱节,因为高层领导可能对实际工作的具体细节和挑战了解不足。为了避免这种错位,可能需要更多的底层参与及权力下放。

4.2 评估决策阶段常见问题

在这个阶段,主要任务是评估项目提案是否可行、价值、收益、风险以及对资源的需求。可能出现的问题包括:

  • 评估标准不明确:在项目评估决策阶段,评估标准应该尽可能地清晰和公正。如果评估标准不明确或者不公正,可能会导致优秀的项目提案被忽视,或者不合适的项目被接受。此外,如果项目的评估标准不公正,可能会引发团队冲突,影响项目的整体执行和效果。

  • 决策过程不透明:在项目评估决策阶段,决策过程应该尽可能地透明。如果决策过程不透明,可能会导致团队成员或其他利益相关者对决策的公正性和合理性产生疑虑。这种疑虑可能会导致与项目相关的人员的信心下降,影响他们的工作效率和项目的最终结果。

  • 项目可行性评估不准确:在项目评估决策阶段,项目的可行性是一个重要的考虑因素。如果对项目的可行性评估不准确,可能会导致项目在实施阶段出现大量的问题,或者项目无法实现预期的收益。

  • 收益预期过高或者过低:在项目评估决策阶段,对项目的收益预期应该尽可能地准确。如果预期过高,可能会导致项目在完成后无法实现预期的收益;如果预期过低,可能会导致项目在评估决策阶段就被错误地拒绝。

  • 风险评估不足:在项目评估决策阶段,应该对项目可能出现的风险进行充分的评估。如果对风险的评估不足,可能会导致在项目实施阶段出现意外的问题,从而影响项目的成功。

4.3 对齐阶段常见问题

在这个阶段,主要任务是确保所有的利益相关者都对项目的目标、进度、责任和期望有相同的理解。其常见问题包括:

  • 沟通不足或者误解:在项目对齐阶段,所有的利益相关者都应该对项目的目标、进度、责任和期望有清晰的理解。如果在这个阶段没有进行充分的沟通,或者存在误解,可能会导致在项目执行阶段出现混乱和冲突。

  • 角色和责任不明确:在项目对齐阶段,应该明确每个团队成员和利益相关者的角色和责任。如果角色和责任不明确,可能会导致一些工作被遗漏,或者一些任务没有被正确地完成。

  • 期望管理不当:在项目对齐阶段,应该对项目的预期结果进行明确的设定和沟通。如果项目的预期结果没有被正确地理解或接受,可能会导致项目在执行阶段出现问题,因为实际的结果可能无法满足一些利益相关者的期望。

5 小结

前面我们全面地探讨了项目立项的重要性、含义、作用、流程,以及可能出现的问题。立项不单是一个项目开始的决策过程,而是一个综合性的决策过程,涉及目标设定、资源分配、风险管理等多个环节。立项的本质是项目各方对目标、方案、成本、风险和里程碑等重要预期进行对齐,以便决定是否启动项目并如何分配资源。

立项可以帮助明确目标,合理分配资源,提前识别和管理风险,确认项目的可行性,提升效率和效果,增强沟通和协作。立项过程包括三个阶段:准备阶段、决策阶段、对齐阶段。每个阶段都有其关键工作,并可能出现一些常见问题,如需求定义不明确、评估标准不明确、沟通不足或误解等。

总的来说,立项是确保项目成功的重要环节,需要得到足够的重视和正确的处理。

聊聊隔离:SaaS 业务技术架构中的核心要点

对于一个 SaaS 来说,隔离是一个非常重要的技术架构策略。当隔离的策略和业务不匹配的时候,往往可能会引发一些线上事故/问题,影响性能等等。

隔离的意义在于创建独立、安全的运行环境,以保护数据的私密性、保证服务的稳定性,并防止资源的竞争和滥用,从而为每个客户提供高质量且可靠的服务。

隔离的本质

隔离的本质在于实现独立性和安全性,通过这两者,为每个客户提供一个能够有效,安全使用共享资源的环境。

  1. 独立性: 隔离确保每个租户都有其自己的资源(如CPU时间、内存空间、磁盘空间等),数据,运行环境和网络通信,且这些都是互不干扰的。这使得每个租户都能在其自己的独立环境中运行,无需担心受到其他租户的影响。

  2. 安全性: 隔离也保护每个租户的数据,防止其数据被其他租户访问或修改。此外,隔离还能限制每个租户的操作权限,使其只能执行一些安全的操作,以防止其执行可能影响其他租户或整个系统安全的操作。

但是现实中我们往往做不到完全的独立性和安全性,需要根据实际的业务情况确定架构,从而有了不同层面的隔离策略。我们在实际工作中,对于隔离策略能感受到的最直接的影响是:一个良好的隔离策略可以在一定程度上改善服务的稳定性,减少因为某些不可预知的突发事件导致的线上问题影响范围。

隔离是一件系统工程,我们从其应用层面和基于租户的落地策略来看这个事情。

隔离策略的应用层面

隔离策略可以应用在多个层面,并且从落地的位置来看,可以分为以下几个层:

  1. 硬件层隔离:这是最底层的隔离,包括 CPU、内存、硬盘等硬件资源的隔离。例如,虚拟化技术可以在同一硬件平台上创建多个虚拟机,每个虚拟机都有自己独立的 CPU、内存和硬盘等硬件资源。每个租户的数据和应用都在独立的物理设备上运行,这为最高级别的安全性和隔离性提供了保障。然而,这种隔离方式成本高昂,且扩展性差。

  2. 操作系统层隔离:这是针对操作系统的隔离,包括进程隔离、文件系统隔离、网络隔离等。例如,容器技术如 Docker 和 Kubernetes 可以在操作系统层面提供隔离,每个容器都有自己独立的进程空间、文件系统和网络接口。这种隔离方式使用操作系统级别的技术(例如容器或虚拟机)来隔离不同租户的应用和数据。这提供了良好的隔离性和灵活性,但可能会对性能产生影响。

  3. 应用层隔离:这种隔离方式在应用层面实现租户隔离,通常通过在应用中实现特定的逻辑来区分不同的租户。这种方法灵活性高,但需要更多的开发工作,并可能复杂化应用的设计和维护。例如我们常常引入应用概念,针对不同的接入的应用控制用户请求频率或用户上传大小等。

  4. 数据库层隔离:这是针对数据存储的隔离,其为每个租户提供独立的数据库或数据库模式。这可以有效地隔离数据,但可能会对数据库性能和管理产生影响。因为数据库是应用程序使用的一种重要资源并且经常会成为业务的瓶颈,我们这里将数据库层隔离作为一个独立的层来区分。

  5. 网络层隔离:这是针对网络通信的隔离,包括 IP 隔离、端口隔离、流量隔离等。例如,虚拟私有网络(VPN)和网络命名空间等技术可以实现网络层面的隔离。使用网络技术来隔离不同租户的流量,可以有效地防止数据在传输过程中的泄露,以及应对流量突发导致的稳定性等问题。

以上这些不同层面的隔离策略通常会结合使用,以提供全方位的隔离保护。

基于租户的隔离策略

在设计一个基于租户的隔离策略时,有几种常见的模式可以考虑。这些模式可以根据应用程序的需求和复杂性,以及所需的数据安全性等级来选择。以下是几种基于租户的隔离策略:

  1. 单租户隔离:在这种模式中,每个租户都有自己的独立环境,包括服务器、数据库和其他基础设施。这种模式提供最高级别的隔离,但成本和复杂性也最高。

  2. 数据库级别隔离:每个租户都有自己的数据库,但可能共享相同的服务器或其它基础设施。这种模式的隔离性略低于单租户隔离,但成本和复杂性也相应减少。

  3. 模式级别隔离:在同一数据库中,每个租户都有自己的模式(schema)。这种模式的隔离性比数据库级别隔离低,但在设施和管理成本上进一步节省。

  4. 表级别隔离:每个租户在同一个数据库和模式中有自己的表。这种模式的隔离性比模式级别隔离低,但在大多数情况下,它仍然能提供足够的数据安全性。

  5. 行级别隔离:在这种模式中,所有租户的数据都存储在同一数据库、模式和表中,但每行数据都标有租户ID,以标示数据所属的租户。这种模式的隔离性最低,但在管理、扩展性和成本效益方面可能最优。

选择哪种模式取决于我们的特定需求和约束。例如,如果需要最高级别的安全和隔离,可能会选择单租户隔离。然而,如果应用程序需要处理大量租户并且希望保持较低的成本,行级别隔离可能会是更好的选择。

实际落地时可能是多种方式的混合体,比如有些业务是数据库级别隔离,有些是行级别,同时针对超大客户会单租户隔离。

需要考虑什么

在我们考虑隔离策略时,不是凭感觉,需要考虑多种因素来确定最佳策略,这些因素需要我们从实际的业务场景和需求,以及公司实际的情况出发,谨慎评估后再做决策。

以下是一些可能需要考虑的关键因素:

  1. 安全性:安全性是最重要的因素之一。根据实际的业务和数据类型,我们可能需要一个强大的隔离策略来保护敏感信息。例如,医疗和金融行业通常需要高级别的安全性和隔离。

  2. 性能:隔离策略可能会影响系统的性能。例如,如果每个租户都有自己的数据库,那么数据库操作可能会比所有租户共享一个数据库的情况慢。

  3. 成本:不同的隔离策略可能会导致不同的成本。例如,基于硬件的租户级隔离通常要比其他策略更昂贵,因为每个租户都需要自己的物理资源。

  4. 可扩展性:隔离策略应支持系统的扩展性。例如,如果预计租户数量会迅速增长,那么我们可能需要一个可以轻松添加新租户的隔离策略,比如应用层隔离策略。

  5. 复杂性:一些隔离策略可能会增加系统的复杂性。例如,如果每个租户都有自己的服务器和数据库,那么对于运维同学来说,管理和维护这些设备工作量可能会很大,并且需要有一个完善的系统来应对这个复杂性。

  6. 合规性:在某些行业或地区,我们可能需要遵守特定的隐私和数据保护法规,这可能会影响我们选择哪种隔离策略。

  7. 业务需求:隔离策略应符合实际的业务需求。例如,如果业务模型需要租户之间共享某些数据,那么我们可能需要一个支持这种共享的隔离策略。

在选择隔离策略时,我们可能需要权衡这些因素,并可能需要妥协。例如,我们可能需要在性能和安全性之间做出选择,或者在成本和可扩展性之间做出选择等等。

因此我们在考虑这些因素,在权衡不同的因素来确定适合我们的隔离策略时,可以参考一下下面的一些做步骤,非标准做法,但是建议至少在执行的时候都需要做到位:

  1. 确定业务需求:明确业务需求是我们一件事情的出发点,了解业务需求,了解业务模板等等。如业务模型是否允许数据共享?租户数量可能会怎样变化?需要处理哪种类型的数据?回答这些问题可以帮助我们确定需要哪种级别的隔离。

  2. 理解合规需求:合规是一个特殊的业务需求,单独拿出来说下:在某些行业,如医疗、金融和教育,可能存在严格的数据保护和隐私法规。确保我们了解并遵守这些规定,否则会对业务产生严重问题。

  3. 评估成本和资源:了解预算和可用资源是实施隔离策略的前置条件。例如,如果预算有限,可能需要选择一种成本效益高的策略,如基于数据库的隔离或行级别隔离。

  4. 考虑性能:选择的隔离策略应尽可能地最小化对性能的影响。需要对不同策略可能带来的性能影响进行评估。

  5. 预计增长:如果预计租户数量会迅速增长,那么需要选择一个可以轻松扩展的策略。例如,如果选择基于硬件的隔离,就可能需要考虑如何快速地为新租户提供硬件资源。

  6. 测试不同的策略:在确定策略之前,可能需要进行一些测试。这可以帮助我们理解不同策略在实际应用中的表现如何。当然如果之前已经做过类似的方案或者有成熟的逻辑,也可以不用测试。

  7. 获取专业建议:如果可能,获取 IT 顾问或合规顾问的建议可能是有帮助的,他们可能能提供关于如何权衡各种因素的专业建议。

请记住,选择隔离策略并非一次性决定,在业务发展过程中,我们可能需要根据业务的变化和技术的发展进行回顾和调整。

什么时候要特别注意隔离

最后我们聊一下在什么时候要特别注意隔离策略。

虽然隔离策略始终是一个重要的考虑因素,但是出现以下的一些情况或场景的时候时需要特别注意,因为这个时候可能因为隔离策略失效而导致一些问题或事故的产生,此时我们需要基于现况重新回顾隔离策略的有效性和合理性。

  1. 租户数量快速增加:随着租户数量的快速增加,可能会出现一些租户的行为影响到其他租户的情况。在这种情况下,我们需要确保隔离策略能够防止「坏邻居」问题。
  2. 租户的量级变化或者资源使用差异变大:如果租户之间在资源使用上存在很大的差异,或者某些租户的资源发生量级的变化,那么我们可能需要更严格的隔离策略,以防止资源使用高的租户影响到其他租户。
  3. 新业务或新模块上线:如果新业务与现有业务有很大的不同,可能需要新的隔离环境。这可以帮助防止新业务的问题影响到现有的业务,并提供一个更加灵活的环境来进行新业务的开发和测试。
  4. 新的合规性要求/性能要求…… 这个算是业务属性发生了变化,需要考虑新的合规性或性能要求能得到满足

其实上面的这些注意事项如果在出现的时候再考虑就已经晚了,正确的做法是在做隔离策略的时候就已经考虑好了这些点,并且有监控机制能快速发现这些问题或现象,直接执行准备好的预案或策略。

小结

隔离策略是一个复杂的主题,需要根据你的具体业务需求和约束进行定制。在确定隔离策略时,你应该考虑多种因素,包括性能、安全性、可扩展性、成本和复杂性等。

对 SaaS 企业来说,选择和实施正确的隔离策略是非常重要的。它不仅可以帮助企业提供更好的服务,还可以帮助企业满足合规要求,保护数据安全,提高客户满意度。