您好,欢迎来到12图资源库!分享精神,快乐你我!我们只是素材的搬运工!!
  • 首 页
  • 当前位置:首页 > 开发 > WEB开发 >
    构建大型支付系统时学到的散布式体系结构概念
    时间:2018-09-12 08:01 来源:网络整理 作者:网络 浏览:收藏 挑错 推荐 打印

    9月15日技术沙龙 | 与东华软件、AWS、京东金融、饿了么四位大咖讨论精准运维!

    构建大型支付系统时学到的散布式体系结构概念

    两年前我作为一名拥有后台开发阅历的移动端软件工程师入职 Uber,并担任 APP 端支付功用的开发以及重构。后来我进入了工程师管理团队,并独立率领一个团队。由于我的团队担任很多后端支付相关的系统,因此我有更多的时机接触整个支付系统的后端知识。

    来 Uber 任务之前,我简直没有散布式系统的任务阅历。我的背景是一个传统的计算机迷信学位和十年的全栈软件开发。但是,虽然我可以画架构图并讨论折中方案,但我对散布式的相关概念(分歧性,可用性或许幂等性)了解的并不多。

    在本文中,我总结了一些我以为在构建大规模,高可用散布式系统(为 Uber 提供底层支持的支付系统)时必须学习和运用的概念。这是一个每秒负载高达数千个央求的系统,其中关键的支付功用必须可以正确的任务,即使整个系统的某些部分出现缺点。本文会是一个残缺的清单吗?应该不会。但假设我早点知道这些概念的话,我的任务和生活会轻松很多。因此,就让我们末尾来了解诸如 SLA,分歧性,数据耐久化,音讯耐久化,幂等性以及其他一些我在任务中需求学习的东西吧。

    SLA

    对大型系统来说,每天需求处置百万级别的事情,因此必可避免的会出现成绩。在深化设计一个系统前,我发现最重要的事情是确定什么是一个安康的系统。系统的安康度应该是可权衡的,常用的办法是 SLA:效劳等级协议(Service Level Agreements)。我见过的一些最常见的 SLA 有:

    可用性:效劳正常运转时间的百分比。虽然拥有一个 100% 可用的系统的想法很诱人,但完成这个目的是十分困难的,而且费用昂扬。即使像 VISA 信誉卡网络,Gmail 或许互联网提供商这样的大型和关键系统也达不到 100% 的可用性,多年来,它们也会停机几秒钟,几分钟或许几小时。关于许多系统来说,四个九的可用性(99.99%,即大约每年有 50 分钟的停机时间)就被以为是高可用的,通常为了到达这个水平就要破费不少的任务。

    准确性:表示在系统中能否允许某些数据不准确或许丧失?假设是,可接受的百分比是多少?关于我从事的支付系统,准确性要求是 100%,这意味着不允许丧失任何数据。

    负载才能:系统预期可以支持多少负载?这通常以每秒央求数来表示。

    延迟率:系统应该在多长时间内做出照应?95% 的央求和 99% 的央求的照应时间是多少?系统通常有少量的噪声央求,因此,P95 和 P99 的照应时间对理想系统而言愈加适用。

    构建大型支付系统时 SLA 为什么很重要呢?我们树立一个新系统,并用来取代现有的系统。为了确保我们构建了正确的系统,需求保证新细叱比旧系统更好。这时我们就可以运用 SLA 来定义希冀值。可用性是最高要求之一。一旦确定了可用性目的,我们就需求在设计架构时为了满足这一目的作出折中的选择。

    水平扩展和垂直扩展

    假定运用新系统的业务不断增长,负载会随着不断添加。在某个时间点,现有的配置将无法支持更多的负载,需求添加更多的系统容量。这时有两种最常用的扩展策略:水平扩展和垂直扩展。

    水平扩展指的是向系统中添加更多的机器/节点,以添加系统总体容量。水平扩展是最盛行的散布式系统扩容办法,尤其是向集群中添加(虚拟)机器通常复杂到只需求在网页上点击一下按钮。

    垂直扩展基本上就是经过购置配置更弱小的机器来完成的,无非是给(虚拟)机器添加更多的处置器内核,更多的内存等。关于散布式系统而言,垂直扩展通常不那么盛行,由于它比水平扩展费用更高。但是,一些重要的站点,例如 StackOverflow,曾经成功的完成垂直扩展以满足系统需求。

    为什么构建大规模的支付系统时,系统扩展策略至关重要呢?我们很早就决议树立一个可水平扩展的系统。虽然在某些状况下垂直扩展是能够的,但由于我们的支付系统曾经处于预估的负载,我们对单台昂贵的大型机在明天这种状况下能否支撑它持悲观态度,更不用说未来了。我们团队中也有工程师曾经在大型支付供应商任务过,他们曾试图在事先可以买到的大型机上停止系统的垂直扩展,但以失败告终。

    分歧性

    任何系统的可用性都是很重要的。散布式系统通常树立在具有较低可用性的机器上。假定我们的目的是树立一个有 99.999% 可用性的系统(大约每年 5 分钟时间不可用)。我们运用的机器/节点有平均 99.9% 的可用性(大约每年 8 小时时间不可用)。一个复杂的到达我们目的可用性的办法是把一批机器/节点添加到一个集群中。即使集群中一些节点出现缺点,也有其他的节点可用,系统总体的可用性将比单个节点的可用性更高。

    分歧性在高可用系统中是一个关键成绩。假设集群中一切节点同时看到并前往相反的数据,则系统是分歧的。回到之前的模型,我们经过添加一组节点来取得更高的可用性,这时确保细叱保持分歧性并不是一件微乎其微的事情。为了确保每个节点具有相反的数据,它们需求相互发送音讯,以保持之间的数据同步。但是发送到对方的音讯能够无法抵达,它们能够丧失,或许有些节点能够不可用。

    分歧性是我破费了少量时间去了解的一个概念。有几种分歧性模型,在散布式系统中最常用的是强分歧性,弱分歧性和最终分歧性这三种。Hackernoon 网站上这篇最终分歧性和强分歧性的比照文章对这些模型之间的权衡给出了很好的适用的概述。通常分歧性越弱,系统能够越快,但它也更有能够不会前往最新的数据集。

    为什么构建一个大型支付系统时分歧性很重要呢?系统中的数据需求保持分歧,但究竟多分歧呢?关于系统中某些部分,只要强分歧性的数据才行。例如知道用户付款操作能否曾经末尾是需求以强分歧性的方式存储上去的。关于其他不是关键业务的部分来说,最终分歧性被以为是合理的权衡。一个好的例子是列出最近买卖这个功用,这种可以以最终分歧性方式完成(也就是说,最近一次买卖能够只会在一段时间后才在集群中某些节点中显示出来,作为报答,查询操作将以较低的延迟或许消耗较少资源的方式前往)。

    数据耐久化

    耐久化意味着一旦数据成功添加到数据存储中,那么未来它将是不断可用的。即使系统中某些节点离线,崩溃或许数据损坏,也不影响数据的可用性。

    (责任编辑:admin)