宁波小程序开发_宁波软件开发_宁波网络公司【昱远信息】 15058005455
本文Wave:基于Postgres的单体应用是复杂结构的负面影响

简单软件架构的一些好处

本文首发于Wave官网,经原作者Dan Luu授权由InfoQ中文站翻译分享。

Wave 是一家价值 17 亿美元的公司,拥有 70 名工程师 开发app的软件公司 ,其产品是一个可以加减数字的 CRUD 应用程序。与此一致,我们的架构是标准的 CRUD 应用程序架构,基于 Postgres 的 Python 单体。从一个简单的架构开始,然后尝试以最简单的方式解决问题,这使我们能够扩展到这个规模,而工程师则主要专注于为用户提供价值。

Stackoverflow 以良好的结果(2013 年的架构/2016 年的架构)扩展了单体应用,最终以 18 亿美元的价格被收购。如果我们关注流量而不是市值,那么 Stackoverflow 是互联网上流量最多的 100 个网站之一(例如许多其他基于单体构建的有价值的公司,请参阅这个 Twitter 线程回复。我们没有很多web 流量,因为我们是一个移动应用程序,但 Alexa 仍然将我们的网站列在前 75,000 名中,尽管我们的网站基本上只是人们查找应用程序的一种方式,大多数人不会从我们的网站获得这些应用程序)。

一些应用程序的要求使得无法从一个枯燥的数据库中构建一个简单的单体应用程序,但对于大多数应用程序来说,即使是前 100 个网站的流量级别,计算机的速度也很慢。使用简单模式提供服务就足够了,这通常比复杂模式更便宜且更容易创建。

小程序定制团队_上饶小程序定制_开发定制小程序哪家好

尽管简单架构的效果不合理,但大多数新闻报道都围绕着复杂的架构展开。例如,在最近的通用技术会议上,有 6 场演讲是关于如何构建或处理基于复杂微服务的结构的负面影响,但没有一个关于如何构建简单单体的演讲。甚至还有关于量子计算的演讲。大型会议也是如此。最近在旧金山举行的一次面向企业的会议就处理复杂架构进行了两位数的演示;没有关于如何构建简单的单体。上次参加的会议给我留下了深刻的印象,许多公司的员工使用非常小的应用程序,这些应用程序可以用一个简单的架构来完成,他们正在使用会议圈和网络上流行的最新和最复杂的技术。

我们的架构非常简单,我什至懒得制作架构图。我将讨论我们如何使一切变得乏味。

我们目前正在使用繁琐的同步 Python,这意味着我们的服务器进程在等待 I/O(例如网络请求)时被阻塞。我们之前尝试过 Eventlet,一个异步框架,理论上可以让我们从 Python 中获得更高的效率,但是我们遇到了很多 bug,我们觉得等待事件的 CPU 和延迟成本不值得努力。承担处理 Eventlent 问题的运营痛苦。其他著名的 Python 框架也有类似的情况,但大规模使用它们的用户往往会报告大规模使用这些框架的严重后果。使用同步 Python 是昂贵的,因为我们为 CPU 付费,它除了在网络请求期间等待之外什么都不做,但是,现在,我们每个月只能处理几十亿个请求,所以,即使使用像 Python 这样慢的语言,为公共云支付零售费用也是低成本的。我们工程团队的成本完全决定了我们运营的系统的成本。

开发定制小程序哪家好_上饶小程序定制_小程序定制团队

我们没有承担使我们的单体异步化的复杂性,而是将长时间运行的任务(我们不希望响应阻塞)分配给队列。

我们不能像我们想象的那么无聊的地方是我们的内部数据中心。当我们只在塞内加尔和科特迪瓦运营时,我们完全在云中运营,然而,随着我们扩展到乌干达(以及未来更多国家),我们不得不拆分后端,部署到本地内部数据中心遵守当地的数据存储法律和法规。这不是一个简单的操作 app 制作 公司 ,但正如那些在复杂的面向服务架构中做过同样工作的人所知道的,这比使用复杂的面向服务架构要简单得多。

另一个方面是我们必须开发的软件,而不是购买。刚开始时,我们强烈倾向于购买软件而不是开发软件,因为一小部分工程师无法承担开发软件的时间成本。虽然“购买”选项通常会为您提供一些无效的工具,但它在当时是正确的选择。如果我们不能说服供应商修复对我们来说至关重要的 Showstopper 错误,那么构建更多我们自己的工具并在更多工具上保留内部专业知识真的很好 有道理,但它违反了标准建议公司只应选择“建立”其核心竞争力。这种复杂性在很大程度上是我们不想承担的,但对于某些类别的产品,即使做了相当多的研究,我们仍然可以' 找不到适合我们的供应商。公平地说,我们的供应商需要解决的问题比我们需要解决的问题复杂得多 做一app软件多少钱 ,因为我们的供应商承担了为每个客户解决问题的复杂性,而我们只需要为一个客户解决一个问题,那就是我们.

小程序定制团队_开发定制小程序哪家好_上饶小程序定制

注释:Showtopper 错误是导致执行停止并基本上变得无用的硬件或软件错误。必须修复此严重错误,以便开发过程继续进行。

在我们运营的最初几个月,我们犯了没有仔细划分数据库事务的错误,这在今天已经造成了损失。在 Wave 的代码库中,SQLAlchemy 数据库会话是一个请求全局变量;任何时候访问 DB 对象的属性,它都会隐式启动一个新的数据库事务,并且 Wave 代码库中的任何函数都可以在会话中调用 commit on 以使其提交所有挂起的更新。这使得难以控制何时发生数据库更新,增加了细微的数据完整性错误的可能性,并且难以依赖数据库来构建像幂等键或事务分期这样的工作流失。这样做还会增加我们意外持有打开的长时间运行的数据库事务的风险,这会使模式迁移操作变得困难。

我们不确定的一些选项(因为我们正在考虑更改,或者建议其他团队从头开始考虑另一种方式)是:使用 RabbitMQ(为了我们的目的,Redis 可能与任务队列一样好,只需要 Redis以减轻操作负担);使用 Celery(这对于我们的用例来说太复杂了,并且有过几次失败,例如版本升级期间的向后兼容性问题);使用 SQLAlchemy(它使开发人员难以理解自己的代码会生成哪些数据库查询 小程序好多钱 ,从而导致各种难以调试的情况,以及不必要的操作痛苦,尤其是涉及到上述数据库事务边界的观点) ); 并使用 Python(由于我们创始 CTO 的技术背景,最初这是正确的选择,但它的并发支持、性能和广泛的动态性让我们质疑它是否是大规模后端代码库的正确选择)。以上所有都不是主要错误,并且对于某些(例如 Python)已经很少错误,因此我们将花费更少的钱做更多的事情而不是投资于理论上更好的迁移维护,但如果我们要从头开始编写类似的代码库现在,那么我们会认真考虑他们是否是正确的选择。

开发定制小程序哪家好_上饶小程序定制_小程序定制团队

在某些方面,我们很高兴做出这样的选择,尽管这听起来不像是最简单的解决方案,就像我们的 API 一样,我们使用 GraphQL;我们的传输协议,我们一直在使用自定义协议;对于我们的主机管理,我们使用 Kubernetes。对于我们的传输协议,我们使用了基于 UDP 的自定义协议以及 SMS 和 USSD 回退,这就是本次演讲的性能原因。在 HTTP/3 发布之后,我们已经能够用 HTTP/3 替换我们的自定义协议,通常我们只需要 USSD 来解决最近马里互联网关闭等事件。

对于 GraphQL 的使用小程序定制团队,我们认为利大于弊:

优势:

小程序定制团队_上饶小程序定制_开发定制小程序哪家好

缺点:

对于 Kubernetes小程序定制团队,我们选择了 Kubernetes,因为我们知道小程序定制团队,如果业务成功(确实如此)并且我们不断扩展,我们最终会扩展到需要我们在该国运营服务的国家。具体法规因国家而异,但我们在非洲主要市场扩展了业务,这要求我们在那个国家运营我们的“主数据中心”,并且还有其他法规 app 制作 公司 ,例如要求我们能够进行故障转移到该国的数据中心。

电信集成是我们无法避免的复杂性的一个方面。理论上,我们会使用 SaaS SMS 提供商来完成所有这些工作,但是,非洲主要的 SaaS SMS 提供商并没有在整个非洲开展业务,因此使用这些服务的成本很高。如果我们使用 SaaS SMS 提供商来满足我们所有的 SMS 需求,那么之前关于工程师补偿成本如何支配我们系统成本的说法是站不住脚的;提供电信集成服务的团队为此付出了数倍的代价。

通过使应用程序架构尽可能简单,我们可以将复杂性(和人力)预算用于有利于业务的领域。如果没有足够的理由增加复杂性,那么我们可以本着做事尽可能简单的想法,用少量工程师创建一个相当大的业务,尽管我们经营的非洲金融业务通常被视为困难业务,我们将在以后的文章中讨论(我们早期和最有帮助的顾问之一,他为我们提供了对 Wave 成功至关重要的建议,最初提出 Wave 是一个糟糕的商业想法,创始人应该选择另一个,因为他预见到许多潜在的困难)。

原文链接:

返回列表

相关动态