专栏首页技术翻译如何构建可扩展的应用程序

如何构建可扩展的应用程序

所以你有一个很棒的主意。而且你有来自大学的朋友可以帮助你开始构建你的应用程序。您也可以从早期采用者那里获得很好的反馈。所以你做任何人都会做的事。启动你的应用!

前几周一切都很完美。经验很棒。你的观众坚持你。最重要的是,您的用户群呈指数级增长。

但后来发生了一些奇怪的事情。用户忠诚度开始下降。人们正在卸载您的应用。你仍然在快速成长,但是流失太高了!怎么了?

您查看分析报告并注意页面加载时间很长。请求正在超时。该应用程序不断崩溃,数据库非常火爆。不是你想要的点亮。

但你的测试是积极的。你曾计划好一切。出了什么问题?你的应用程序无法扩展!

可扩展性(从技术角度来看)经常被忽略。这就是开始造成诸如糟糕的用户体验,高维护成本等等问题的原因。因此,在我帮助您弄清楚如何使您的应用程序更具可扩展性之前,让我来定义实际的可扩展性。

什么是可扩展性?

在我看来,可扩展性是以经济有效的方式保持良好的用户体验,而不管用户的数量。

您可能已经注意到,可扩展性有3个部分。最重要的是保持良好的用户体验。当然,您的应用可以扩展到数百万用户。但如果经验不够好,你甚至可能达不到那个规模。整个可扩展性点是为了确保您的用户体验完好无损,因为在一天结束时,重要的是您的用户对您的应用感到满意。没有人关心技术。

第二部分确定了背景。无论活跃用户数量多少,您的应用都需要保持用户体验。如果此数字非常高,则会对后端系统造成相当大的负担。您的目标应该是让您的系统独立于此号码工作

最后,这是我们最关心的事情:金钱!因此,我们假设无论活跃用户数量多少,您都能保持用户体验。但是以什么代价?如果您的成本上升速度超过用户群,则无法将系统称为可扩展。理想情况下,您应该能够以更低的成本支持更多用户

棒!现在,我们已经清除了可扩展性的定义,让我们深入了解制作可扩展应用程序的技巧。

制作可扩展应用的提示

传统的扩展需求是通过增加服务器资源来处理的。这种方法称为“扩展”。这种方法有许多局限性。在这篇文章中,我将专注于“扩展”。也就是说,添加新的服务器和资源以适应负载的增加。

1)选择正确的技术

我很确定你看到了这一个。可伸缩性并不是事后的想法。它需要从最初的设计中包含在过程中。这从使用正确的技术开始。

编程语言

你做的第一个选择是编程语言。是的,您选择的语言对可伸缩性有很大影响。

例如,Elixir支持开箱即用的基于actor的并发。这意味着即使在不同的物理机器上,Elixir进程也可以相互通信。作为开发人员,您无需担心底层网络或用于通信的协议。多么酷啊?

对如何选择下一种编程语言感到困惑?这是一篇可以帮助你的文章

数据库

第二个选择是您的数据库。您使用的数据库是否考虑了可扩展性?有一整套新的NoSQL数据库,其唯一目的是扩展。

他们确实会进行权衡取舍。因此,您需要为作业选择正确的数据库。甚至可能为不同的工作负载使用不同的数据库。

通讯

随着微服务变得越来越流行,您需要确保服务之间的通信通道也是可扩展的。让他们直接对话可能不是一个非常可扩展的解决方案。

您可能不得不使用消息传递总线或类似的东西来构建松散耦合的系统。这有助于您独立扩展服务。

Nats.io是一个非常棒的系统,您可以采用它来构建微服务。它最近被CNCF接受了孵化项目

2)避免单点故障

单点故障意味着什么?让我通过问你一个问题回答这个问题。特定资源(例如服务器,网络资源)的故障会导致整个应用程序崩溃吗?如果运行数据库或后端代码的服务器失败会发生什么?您的应用仍然可用吗?如果没有,那就是你的单点失败。

所以你怎么避免这个?简单。拥有一切的多个副本。在多个服务器上运行数据库。许多支持开箱即用的复制。一个很好的例子是MongoDB。在多台服务器上运行后端代码。负载平衡器可以真正帮助你。

我知道说起来容易做起来难。我几乎没有触及表面。但总而言之,横向扩展资源是关键

3)将逻辑推送到客户端

等等,什么?不是那样吗?并不是的。所以你在后端编写的PHP,.Net或Nodejs代码就是实际的逻辑。这种方法的问题在于,每次客户端发出请求时,您的服务器都必须工作。当多个这样的客户开始一起提出请求时,我们遇到了问题。

但这里还有另一个问题。我们不能相信客户。如果客户端遭到入侵并覆盖您移植的逻辑,该怎么办?大问题吧?所以这里的诀窍是尝试取得平衡。只能移植您可以验证的逻辑。

有很多工具可以帮助你在这里。其中之一是像Space Cloud一样的后端即服务(BaaS)。BaaS还可以帮助您简化安全方面。您可以在这篇文章中了解有关前端,后端和BaaS的更多信息

将逻辑推送到客户端可以帮助您减少服务器负载。这反过来将有助于使您的应用程序更具可扩展性。记住每个CPU周期都很重要。

4)缓存结果

你如何执行客户端请求?每次客户要求时,您是否点击了主数据库?这不是一个可扩展的设计,特别是如果您的数据的某些部分经常被读取。

以Twitter为例。当名人推文时,人们会发疯。查看该推文的人数可能会使您的数据库崩溃。这里是缓存可以帮助您的地方。

Redis这样的专用内存数据库可以以闪电般的速度执行读写操作。因此,在Redis等商店中存储“热门数据” 可以帮助您在峰值负载期间保持这种规模

但这并不意味着您将缓存所有数据。这是因为RAM比磁盘空间更昂贵。这会增加您的成本。仅缓存热门结果或需要大量计算的结果。请记住,缓存会影响数据的新鲜度。

5)无状态

您需要保持您的API无状态。在每个请求中,客户端应提供满足该请求所需的所有信息。这就是REST API所基于的概念。

在所有情况下都可能无法做到这一点。有时您可能需要查询数据库和其他服务。没关系!

您可以开始删除您可能存储在服务器上的任何会话数据。这是有问题的,因为如果服务器出现故障,您将丢失该数据并且该客户端是孤立的。

人们可能会建议您使用Redis来存储会话,但这也会带来缩放限制。最好的选择是使用JWT令牌。这是迄今为止处理会话数据最具扩展性的方式。只需确保您的令牌不会变得太大。在这种情况下,Redis是你最好的朋友。

结论

因此,我们了解了可扩展性的含义以及它如何影响您的业务。希望我在这里提供的提示很有帮助。如果做得好,它可以为您节省数百万美元。

原文标题《How to Build Scalable Apps》

作者:Noorain Panjwani

译者:February

不代表云加社区观点,更多详情请查看原文链接

原文链接:https://dzone.com/articles/how-to-build-scalable-apps

原文作者:Noorain Panjwani

我来说两句

0 条评论
登录 后参与评论

相关文章

  • 11月29日 云头条:Chrome 与 Firefox 将取消对 FTP 的支持

    据 BleepingComputer 报导,Chrome 与 Firefox 将取消对 FTP 的支持。在即将到来的版本中,有一个关于如何在 Chrome 上加...

    February
  • 12月10日 云头条:中国正迎来AI弯道超车好时机

    如果我们去搜索引擎上搜“量子霸权”,然后把时间范围定在一年前的今天。会发现中外很多量子计算从业者,包括这个领域的顶级科学家,都言之凿凿预测了一件事:量子霸权将在...

    February
  • AI在测试自动化中

    如今,几乎所有IT项目都面临着以更快的速度和更准确的方式运营和部署软件和服务的挑战,为项目团队创造了一个无情的高压环境。要求每天都在变化,而且从来没有足够的工程...

    February
  • widows 程序无响应判断,程序假死状态

    sofu456
  • 好雨云帮一周问答集锦(2017.02.13-2017.02.19)

    Rainbond开源
  • 好雨云帮一周问答集锦(2017.02.13-2017.02.19)

    A: 应用的输出日志会按天保存在管理节点的 /grdata/downloads/log目录下。为方便从控制台 “日志” 标签页进行下载,管理节点的nginx提供...

    Rainbond开源
  • 性能测试 -- 内核调优

    /etc/sysctl.conf 这个文件加上以下这些参数,然后执行sysctl -p更新 net.ipv4.tcp_max_syn_backlog = 409...

    千往
  • Python参数传递,原来既不是传值也不是传引用

    面试的时候,有没有被问到Python传参是传引用还是传值这种问题?有没有听到过Python传参既不是传值也不是传引用这种说法?一个小小的参数默认值也可能让代码出...

    simpleapples
  • nginx防止DDOS攻击配置(二)

    我们用的高防服务器只防流量攻击不防CC,现在的攻击多数都是混合型的,而且CC攻击很多,防CC只能自己搞了,按照第一篇的配置,在实际的使用中效果并不理想。限制每秒...

    后端技术探索
  • Python数据分析基础之关联分析FP_growth

    上篇文章我们了解了关联分析的基本概念和应用场景,以及挖掘数据集中关联规则的Apriori算法,通过具体代码实现了一个Apriori算法,在上一篇文章的最后提到A...

    蛰虫始航

扫码关注云+社区

领取腾讯云代金券