`

影响JavaScript应用可扩展性因素

阅读更多

引言:JavaScript 应用变得越来越庞大。这是因为使用JavaScript能做的事情远比我们大多数人所需求的要多得多。我们不能仅因为技术上可行,就去考虑软件系统的扩展问题。为一个不需要扩展的系统增加扩展性是不值得的,尤其对最终用户来说,这只会使系统显得更加笨重。 
本文选自《大型JavaScript应用最佳实践指南》。

  作为JavaScript 开发者和架构师,必须承认并了解影响扩展性的因素。虽然不是所有JavaScript 应用都需要扩展,但总有一部分是需要的。比如,我们很难确认某个系统不需要扩展,不需要为它的可扩展性花费时间和精力。除非我们开发的系统不需要后期维护,否则总会有对增长和成功的预期。 
  从另一方面讲,JavaScript 应用并非天生成熟的可扩展应用,而是逐步积累、进化成的可扩展应用。对于JavaScript 开发人员来说, “可扩展性的影响因素”是一个有效的工具。我们不希望一开始就过度设计,更不希望被早期设计绑住手脚,限制了可扩展性。

对可扩展的需要

 扩展软件是一种基于反应的活动。考虑可扩展性的影响因素可以帮助我们积极地做出准备。在应用后端等系统中,这种“扩展活动”通常是被自动处理的,可能是短暂的访问高峰。例如,激增的用户请求导致负载骤增,这时负载均衡器介入,将负载均匀地分派到后端服务器。在某些极端情况下,系统可能会在需要时自动准备新的后端资源来应对变化,当不再需要时将这些资源自动销毁。 
  但是前端不一样,前端的扩展活动通常发生的时间周期较长,而且更加复杂。JavaScript应用的独特一面在于,浏览器能获得的硬件资源就是它能使用的全部硬件资源,它从后端获取的数据可以很好地按比例增长,但这不是我们需要考虑的。随着软件的不断演进,我们要想成功做点什么,就必须关注“可扩展性的影响因素”。 
图片描述
  上图自上而下地展示了可扩展性的影响因素。首先是用户提出软件需要实现的功能,接着功能尺寸、与其他功能的关系等因素会直接影响开发团队的构成,沿着箭头自上而下影响相应地增长。

不断增长的用户

  如果构建的应用只服务于一个用户,就没有必要这么大费周章了。基于典型用户的需求来构建的应用将会为更多用户提供服务。所以在应用进化过程中,应该预见到用户的增长。尽管并没有确切的目标用户数量,不过,基于应用自身的特点,仍然可以使用http://www.alexa.com/这类工具作为基准,设定活跃用户数量的目标值。比如,如果我们的应用是任何人都可以访问的,就会希望有大量的注册用户;但如果仅针对个人安装,那么加入系统的用户数量的增长就会比较缓慢。但即使如此,我们还是希望部署数量不断增加,以提升软件的用户总量。 
  与前端界面交互的用户数量是扩展应用最大的影响因素。每增加一个用户都伴随着各种架构层面上指数级的增长。如果自上而下地看,用户决定一切。应用的存在终归是为了服务用户。JavaScript 代码越易于扩展,就越能取悦用户。

添加新功能

  也许能够取悦用户的功能就是用户基数庞大的成功软件最显而易见的附带产物。软件的功能会随着用户数不断增长,尽管新功能显而易见,但还是经常被忽视。明明知道增加新功能不可避免,但我们还是很少思考如何合理地在代码中实现源源不断的新需求。正是缺少这样的思考,阻碍了我们继续发展。 
  这在软件交付初期非常棘手。软件开发商会竭尽全力吸引新的用户,但由于初期阶段能够吸引用户的功能有限,导致收效甚微。没有足够多的成熟特性,没有庞大的开发团队,也没有机会去打破用户习惯。当没有这些限制条件时,比较容易能够实现一些功能让已有或潜在用户感到眼花缭乱。但是我们如何才能在早期决策时迫使自己考虑周全?如何才能在提供更多功能的前提下确保没有限制我们扩展软件的能力? 
  你也许会发现,不管是开发新功能还是增强已有的功能,都是可扩展JavaScript 架构始终需要考虑的问题。我们需要考虑的不仅仅是软件推广文案中罗列的各种功能,还要考虑这些功能的复杂度、各个功能之间的共性以及各个功能有多少“移动部件(MovingParts)”。当自上而下审视JavaScript 架构时,如果用户是第一层级,那么各个功能就是下一个层级。从这个层级开始扩展变得纷繁复杂。 
  使功能变复杂的,并不是某一个单独用户,而是一群需要这个功能的用户。从这个角度讲,我们不得不思考使用软件的用户的特征或者角色,以及哪些功能提供给哪些角色。对这种组织结构的需求在一开始并不明显。直到后期,我们先前的决策使得引入基于角色的特性难以实施时,它才会显现出来。并且,这还取决于我们的软件是如何部署的,有时可能需要支持多种不同的用例。比如,可能几个大机构用户,都有各自的部署方案,并且很可能有各自独特的用户结构上的限制。这是十分具有挑战性的,如果希望做到可扩展,架构就需要支持这些组织结构迥然不同的需求。

雇佣更多的开发者

  实现软件的各种功能需要可靠的JavaScript 开发人员,并且他们应该知道自己在做什么。能有一个这样的开发者团队是非常幸运的事情。团队组建不是自发的,在团队可以开发出优秀代码之前,需要在某种程度上建立起彼此之间的信任和尊重。一旦开始,我们就处于一个良好的状态。再看一下前面提到的自上而下的可扩展性影响因素,我们要开发的功能会直接影响团队的健康。这之间的平衡基本上是无法维持的,但是可以尽量接近。缺少人手但又有太多的功能要实现,这会让团队成员倍感压力。当如期交付毫无希望时,大家就不会努力尝试了。另一方面,如果开发人员过多,要开发的功能有限,就会带来更多的沟通负担,而定义职责又很困难,所以当大家对职责没有共识时,离失败就不远了。 
  相对于拥有太多的开发人员,开发人员不足反而更易于功能的开发。当面临巨大的功能开发压力时,是一个很好的时机来退后想一想:“如果我们有更多的开发者,会与现在有哪些不同呢?”这个问题经常被忽略掉,直接去招更多的开发者。而让大家惊讶的是,招聘到新人后功能的产出并没有立竿见影的效果。这就是为什么我们需要一个没有愚蠢问题、责任分配明确的研发文化。 
  团队组织结构和开发方法并没有定式,开发团队需要有针对性地处理开发中的情况,最大的问题无疑就是功能的数量、规模和复杂度。所以,这些才是我们在建立团队之初,以及团队成长过程用应该考虑的。后一点尤为重要,因为当功能大量增加后,初期的团队结构是无法适应的。 
  鉴于这些扩展影响因素会随着时间推移而改变,我们以架构的角度来调整设计或者修改产品,以应对扩展所面临的挑战。 
若要进一步讨论这些影响扩展的各项因素,深入了解它们并准备一个核对清单,以帮助我们实现可扩展的JavaScript 应用来响应这些事件,可见《大型JavaScript应用最佳实践指南》一书。 
  本文选自《大型JavaScript应用最佳实践指南》,点此链接可在博文视点官网查看此书。 
                    图片描述

  想及时获得更多精彩文章,可在微信中搜索“博文视点”或者扫描下方二维码并关注。
                 图片描述

分享到:
评论

相关推荐

    authmagic:可重用,可扩展的授权服务

    Authmagic有所不同,因为其架构设计时考虑了简单性和可扩展性。 为什么要分开资源服务和授权服务? 如果您有多个客户端应用程序,则无需重新实现授权逻辑。 关注点分离。 如果您可以选择简化架构和代码-请这样做...

    基于SpringBoot+vue的医护人员排班系统(源码+部署说明+演示视频+源码介绍).zip

    这是一个基于SpringBoot和Vue的医护人员排班系统。该系统的主要目标是帮助医疗机构更有效地管理...总的来说,这是一个功能强大、易用性好、可扩展性强的医护人员排班系统,可以大大提高医疗机构的工作效率和服务质量。

    3factor-example:建立3factor应用程式的典范范例

    从 : 如今,可以为允许快速迭代的应用程序构建后端,同时从一开始就具有弹性和高度可扩展性。 我们提出了一种由3个因素组成的架构模式: 实时GraphQL 可靠的事件异步无服务器这是将传统架构与3因子架构进行比较的...

    【卷一/共两卷】AJAX实战pdf高清版90M

    7.1 JavaScript与浏览器安全性 7.1.1 引入“来源服务器”策略 7.1.2 Ajax的相关考虑 7.1.3 子域问题 7.1.4 跨浏览器安全性 7.2 使用远程服务进行通信 7.2.1 代理远程服务 7.2.2 使用Web服务 7.3 保护机密数据 7.3.1 ...

    neighborhood-chef-fe

    RSVP开放活动 科技栈 前端使用以下方式构建: React包含基于JavaScript的编程通过JSX与DOM交互支持Redux强制执行的不变性 Redux 在状态管理中提供不变性以提高可靠性允许应用程序的可扩展性提供状态管理的结构化工作...

    工程硕士学位论文 基于Android+HTML5的移动Web项目高效开发探究

    W3C 万维网联盟,创建于1994年,是Web技术领域最具权威和影响力的国际中立性技术标准机构。主要的工作是发展 Web 规范,这些规范描述了 Web 的通信协议(比如 HTML 和 XHTML)和其他的构建模块。 NativeApp 使用...

    12-laptops-recommendation-app-js:用CodeSandbox创建

    12笔记本电脑推荐应用程序js 这是一个使用Vanilla js构建... 但是,如果小型企业只销售12种产品,或者用例是任何固定的预定数据,则这是一种合适的方法,特别是当开发速度是优先考虑的而不是可扩展性时。 这也演示了

    [完整][中文][WEB安全测试].(美)霍普.扫描版.pdf

    10.2 识别应用中的JavaScript 214 10.3 从AJAX活动回溯到源代码 215 10.4 截获和修改AJAX请求 216 10.5 截获和修改服务器响应 218 10.6 使用注入数据破坏AJAX 220 10.7 使用注入XML破坏AJAX 222 10.8 使用注入JSON...

    mvstar-compare:几个MV*前端框架的简单对比

    可扩展性 -扩展到潜在的巨大因素有多容易? 更新 -他们多久更新一次代码库,他们是否经常引入 API 更改? 测试 -设置测试有多容易? 路线图 -此框架将在多大程度上得到支持? 支持 -这个框架是否得到了信誉良好...

    PHP和MySQL WEB开发(第4版)

    5.2.1 文件扩展名和require()语句 5.2.2 使用require()制作Web站点的模版 5.2.3 使用auto_prepend_file和auto_append_file 5.3 在PHP中使用函数 5.3.1 调用函数 5.3.2 调用未定义的函数 5.3.3 理解字母大小写和函数...

    PHP和MySQL Web开发第4版pdf以及源码

    5.2.1 文件扩展名和require()语句 5.2.2 使用require()制作Web站点的模版 5.2.3 使用auto_prepend_file和auto_append_file 5.3 在PHP中使用函数 5.3.1 调用函数 5.3.2 调用未定义的函数 5.3.3 理解字母大小写...

    PHP和MySQL Web开发第4版

    5.2.1 文件扩展名和require()语句 5.2.2 使用require()制作Web站点的模版 5.2.3 使用auto_prepend_file和auto_append_file 5.3 在PHP中使用函数 5.3.1 调用函数 5.3.2 调用未定义的函数 5.3.3 理解字母大小写...

    intel-iot-edi-basic-info-home:此存储库将使用我的新 Intel Edison IoT 硬件分配第一个项目

    是的……虽然在一个房间里,传感器可能是无稽之谈,这个原型可以出口到房子的其他部分或使其更具可扩展性。视频演示您可以查看该视频中的简短演示: : 完整的说明、图像和步骤所有步骤都在该说明中进行了解释: :

    Getting-Started-Microservices:关于微服务和架构的所有信息

    与基础操作系统签订干净的合同,在执行环境之间提供最大的可移植性。 适用于在现代云平台上进行部署,无需服务器和系统管理。 最大限度地减少开发和生产之间的差异,从而实现连续部署以实现最大的敏捷性。 并且可以...

    amplify-marketplace:带有无服务器AWS后端的电子商务应用程序。 使用React.js和GraphQL构建

    高度可扩展。 多因素身份验证。 用于信用卡处理的Stripe API。 基于通过Clarifai API进行图像识别的自动建议标签(正在进行中)注意:要test@example.com创建市场和产品,可以使用test@example.com作为名称和密码。...

    服务器::cloud_selector:Nextcloud服务器,所有数据的安全之家

    :rocket: 可扩展数百种应用程序,例如,,,以及您可以在我们的找到的所有 :locked: 通过我们的加密机制, 和两因素身份验证安全性。 您想了解更多有关如何使用Nextcloud在家中和组织中访问,共享和保护文件,...

    MongoDB权威指南(中文版)高清

    存储文件 997.3.1 开始使用GridFS:mongofiles 997.3.2 通过MongoDB驱动程序操作GridFS1007.3.3 内部原理 1007.4 服务器端脚本 1017.4.1 dbeval 1017.4.2 存储JavaScript 1027.4.3 安全性 1037.5 ...

    外文翻译 stus MVC

    The page designer (or HTML developer) must understand colors, the customer, product flow, page layout, browser compatibility, image creation, JavaScript, and more. Putting a great looking site ...

    cuteEditor6.0

    除了其强大的功能和方便的使用, 这里还有一些顶尖的技术因素是CuteEditor编辑器成为你编辑和发布Web内容的最佳选择: 界面简洁加载速度快 <br/>由于才有了很多优化方法,所以CuteEditor非常简单、小巧、...

Global site tag (gtag.js) - Google Analytics