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

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

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

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

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

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

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

什么是可扩展性?

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

您可能已经注意到,可扩展性有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 条评论
登录 后参与评论

相关文章

来自专栏杨建荣的学习笔记

Java和Python的编程对比

因为以前会点Java,现在来看当然是弱爆了。 学习Python的需求非常紧迫,所以我想快速学习掌握Python,有没有什么好的办法可以缩短学习周期。我觉得比较好...

4196
来自专栏Linyb极客之路

初识分布式架构

集群 小饭店原来只有一个厨师,切菜洗菜备料炒菜全干。后来客人多了,厨房一个厨师忙不过来,又请了个厨师,两个厨师都能炒一样的菜,这两个厨师的关系是集群。

1021
来自专栏Linyb极客之路

模块化与微服务比较

本文比较了微服务和模块化整体架构(modularized monolith )的区别。现在大家一股脑从整体单片monolith迁移到微服务,但是这种转变真的适合...

3713
来自专栏SDNLAB

浅谈VPC二三,秒懂秒透

VPC全称是Virtual Private Cloud,翻译成中文是虚拟私有云。但是在有些场合也被翻译成私有网络或者专有网络等。这里其实就有些让人迷惑,VPC究...

6776
来自专栏花叔的专栏

接口人小程序快速开发--知晓云体验

今天要分享一个好东西,花叔保证不是广告。 话说,有一天,爱范儿的运营经理Angela找到我,说他们做了一个叫“知晓云”的东东,想邀请我来体验一下。 我说好啊,他...

3597
来自专栏后端技术探索

电商平台搞秒杀背后的技术实现

每当电子商务平台搞活动,“秒杀”经常是提升网站活跃度的利器之一。比如活动日早上10点1元爱疯7秒杀7台,谁看到了估计都想去秒一把,万一秒中了呢。秒杀的典型特征就...

1043
来自专栏知晓程序

个人开发的小程序,有哪些限制? | 小程序问答 #34

那么, 具体是哪些接口和能力无法使用呢?知晓程序(微信号 zxcx0101)今天就来为你一一解析。

3510
来自专栏ThoughtWorks

系统级集成测试的断舍离|洞见

食之无味,弃之可惜 在企业级应用的“季度或月度发布”被认为是领域最佳实践的时候,在应用部署到生产环境之前维护一个完整的环境来进行集成测试是非常必要的。但是,集成...

2929
来自专栏bboysoul

浏览器推荐

Chrome Chrome是由谷歌开发的浏览器,由于各种变态的原因,导致中国大陆使用不了浏览器的插件商店,导致中国用户体验不到此款浏览器真正强大的地方。 开...

891
来自专栏罗超频道

Chrome支持Android应用,浏览器正在成为操作系统?

Google 日前已决定将ARC开放给所有开发者,并且ARC在Chrome OS和Chrome浏览器中均可以运行。ARC全称是App Runtime for C...

3244

扫码关注云+社区