附录E:可伸缩性

在深入讨论细节之前,最重要的是要知道DreamFactory是一个运行PHP的可配置LAMP堆栈。就服务器而言,DreamFactory看起来就像一个用WordPress或Drupal编写的网站。DreamFactory提供的不是HTML页面,而是JSON文档,但在其他方面,扩展需求是类似的。

DreamFactory不使用传统的会话管理(由服务器维护应用程序的状态),而是以无状态的方式处理会话管理,不需要服务器维护任何应用程序状态。这使得水平缩放变得轻而易举,正如您将在下面看到的那样。对于要求很高的部署,我们建议使用NGINX,稍后会详细介绍。

这一点很重要,因为你可以把你已经知道的关于简单网站扩展的所有标准东西直接应用到DreamFactory扩展上。这并非偶然。它使DreamFactory易于安装在任何服务器上,并易于大规模部署移动应用程序和物联网(IoT)设备。

垂直扩展

通过增加额外的处理能力、额外的内存、更好的网络连接和更多的硬盘空间,可以在一台服务器上垂直扩展DreamFactory。本节讨论垂直扩展和服务器配置如何影响性能。

通过提高服务器处理器速度、处理器数量和RAM,可以提高DreamFactory引擎的性能。处理器速度将特别提高往返响应时间。在我们的测试中,DreamFactory通常可以在100到200毫秒内响应一个服务请求。

另一个重要的特征是DreamFactory可以处理的并发请求的数量。在具有垂直扩展的单个服务器上,这将取决于处理器速度和可用RAM,以支持同时运行的多个进程。网络吞吐量对于往返时间和处理大量同时发生的事务都很重要。

默认SQL数据库

每个DreamFactory实例都有一个默认的SQL数据库,用于存储有关运行平台所需的用户、角色、服务和其他对象的信息。默认的Bitnami安装包包含一个默认的SQL数据库,但您也可以为此目的连接任何其他数据库。当这个数据库上线后,梦工厂将创建管理平台所需的附加系统表。

DreamFactory还在这个默认数据库中存储服务器端脚本。这些脚本可以用JavaScript或PHP编写,以自定义通过引擎运行的API调用的请求或响应。DreamFactory使用V8引擎来执行JavaScript。这允许开发人员在客户端和服务器端都使用JavaScript,并从栈的任何一端调用API。V8引擎包含在Bitnami安装程序中,服务器端脚本必须存在才能工作。

开发人员还可以在默认数据库上为自己的项目创建表。基于应用程序需求,移动项目可以以各种方式查询此数据库,而此活动会影响性能。DreamFactory用户记录也存储在默认数据库中。您为提高数据库性能所做的任何工作都将提高管理控制台和开发人员应用程序的速度。

本地文件存储

每个DreamFactory实例还需要一些HTML5 web应用托管的文件存储空间。每个应用程序都有一个文件夹,开发人员可以在其中存储HTML文件、图形图像、CSS样式表、JavaScript文件等。本地应用程序可能将其他文档或资源存储在本地存储中,以便简单下载。万博手机登录平台本地文件系统的大小和访问速度会像普通网站一样影响应用程序的性能。

持久存储

默认情况下,DreamFactory为两件事使用持久的本地存储:系统范围的缓存数据和托管的应用程序文件和资源。万博手机登录平台许多平台即服务(PaaS)系统(如Pivotal、Bluemix、Heroku和OpenShift)不支持持久本地存储。

对于这些系统,您需要配置DreamFactory以使用基于内存的缓存存储,如Memcached或Redis。您还需要创建一个远程云存储服务,如S3, Azure Blob, Rackspace等来存储您的应用程序文件。您可以通过配置文件轻松地将DreamFactory配置为使用基于内存的缓存。

PaaS的数据库需要是远程SQL数据库,如ClearDB或供应商推荐的任何数据库。如果您在运行时使用本地文件系统创建文件,当PaaS映像重新启动或扩展多个实例时,这些文件将消失。下面的云扩展部分将更详细地讨论如何使用PaaS。

外部数据源

您可以将任意数量的外部数据源连接到DreamFactory。DreamFactory目前支持MySQL, PostgreSQL, Oracle, SQL Server, DB2, S3, MongoDB, DynamoDB, CouchDB, Cloudant等。有些NoSQL数据库是专门为集群硬件上的大规模可伸缩性而设计的。您可以连接数据中心中运行的任何SQL数据库,以便调动遗留数据。您还可以连接云数据库,如DynamoDB和Azure Tables。

梦想工厂是这些外部系统的代理。DreamFactory将继承数据库的性能特征,并为每个REST API调用增加一些额外开销。DreamFactory添加了一个安全层、一个定制层、规范web服务,并为每个服务实现了基于角色的访问控制。这些外部数据源的可伸缩性将取决于与云供应商的服务水平协议、数据库集群背后的硬件以及其他因素。

DreamFactory vs. Node.js

我将在这里绕一个小圈子,讨论DreamFactory和Node.js之间的一些区别。这是非常有用的背景信息,可以帮助您理解如何使用多个服务器、负载平衡器和集群数据库来水平扩展DreamFactory。

我们考虑将Node.js用于DreamFactory引擎,但担心单个线程不足以支持大规模可伸缩的移动部署。复杂REST API平台中的工作负载与用Drupal或WordPress编写的HTML网站相当,后者需要多个线程来处理所有数据。

另一个问题是需要各种各样的SQL和NoSQL数据库的成熟接口。这是Node.js的一个挑战。相反,我们选择了PHP,因为这种语言被广泛使用,并且有很棒的框架,比如Laravel。我们最喜欢Node.js的地方是V8引擎。这允许开发人员在客户机和服务器上编写JavaScript。DreamFactory通过使用PHP的V8Js扩展来利用V8引擎的强大功能,除了为了可伸缩性,DreamFactory并行运行它。V8引擎也被沙盒化以保证安全性。

在运行DreamFactory的Apache服务器上,我们使用Prefork MPM创建一个新的子进程,每个连接有一个线程。您需要确保MaxClients配置指令足够大,可以处理您期望接收的尽可能多的同时请求,但又足够小,以确保所有进程都有足够的物理RAM。

有一种危险是,传入的请求超过了服务器的处理能力。在这种情况下,DreamFactory将发出一个指数回退消息,告诉客户端稍后再试。DreamFactory Enterprise提供了限制每秒调用的其他方法。但是,交易总量仍然是有限的。Node.js可以通过基于事件的回调处理大量并发请求,但在这种情况下,你只能用一个线程来处理所有的数据。在这种情况下,Node.js成为每个REST API调用的处理瓶颈。

如果你期望大量的传入请求,那么考虑在NGINX服务器上运行DreamFactory,使用PHP-FPM而不是Apache。NGINX可以最大化硬件每秒可以处理的请求,并减少每个连接所需的内存。这是一个“两全其美”的场景,允许传统的web服务器处理大量的事务,而没有Node.js的处理瓶颈。

水平扩展

本节讨论使用多台服务器来提高性能的方法。最简单的模式是在一台服务器上运行DreamFactory。当你安装Bitnami时,DreamFactory运行在一个LAMP堆栈中,带有默认的SQL数据库和一些本地文件存储。下一步是为默认SQL数据库配置一个单独的服务器。还有一些SQL数据库可作为托管的云服务。

多个服务器

您可以使用负载均衡器在多个服务器之间分发REST API请求。负载平衡器还可以执行健康检查,并自动从池中删除不健康的服务器。大多数大型服务器体系结构在整个基础设施的几个位置都包含负载平衡器。您可以集群负载平衡器以避免单点故障。DreamFactory是专门为负载平衡器和各种调度算法而设计的。

DreamFactory使用JWT (JSON Web令牌)以完全无状态的方式处理用户身份验证和会话。因此,REST API请求可以在任何时候发送到任何一个web服务器,而不需要跨多个服务器维护用户会话/状态。每个对DreamFactory实例的REST API调用都可以在请求头、URL查询字符串或请求有效负载中传递JWT。令牌使请求完全知道自己的状态,消除了在服务器上维护状态的需要。

共享本地存储

所有的web服务器都需要共享对同一个本地文件存储系统的访问权。在DreamFactory Version 1.9及以下版本中,您将需要一个共享的“存储”驱动器,并挂载NFS或类似的东西。DreamFactory 2.0及更高版本支持更可配置的本地文件系统。Laravel PHP配置文件指定了一个用于检索文件的驱动程序,可以是本地驱动器,NFS, SSHFS, Dropbox, S3等。这简化了多个服务器的设置和PaaS交付选项。

多个数据库

可以通过多种方式增强默认SQL数据库。您可以镜像数据库,创建数据库集群以增强性能,并利用故障转移集群进行高可用性安装。对这个主题的全面讨论超出了本文的范围。

性能基准测试

下面是用Apache Benchmark计算单个DreamFactory实例的垂直可伸缩性的一些结果。测试了五个不同的Amazon Web Services EC2实例。服务器是t2。小,t2。中、m4。xlarge, m4.2xlarge, and finally m4.4xlarge.

垂直扩展基准

对于这个测试,我们从DreamFactory REST API执行了1000个GET操作。有100个并发用户发出请求。每个操作从SQL数据库中搜索、排序和检索1000条记录。该测试旨在测试复杂REST API调用所需的服务器端处理。

看看这三台m4服务器,我们看到容量增加了一倍,与额外的处理器和内存相匹配。这确实显示了单个DreamFactory实例的垂直可伸缩性。复杂的GET场景突出了额外处理器能力的优势。

接下来,我们尝试了一个类似的测试,使用一个简单的GET命令,基本上只返回一条数据库记录5000次。有100个并发用户发出请求。在这种情况下,Internet带宽、网络交换和文件存储的固定成本开始占据上风,而额外的处理器的贡献减少了。

看看API中5000个简单get的结果。正如您所看到的,添加额外的处理器并不能使性能完全提高一倍。这证明了在不扩大其他固定资产的情况下增加处理器的收益递减。

顺便说一下,我们还研究了POST和DELETE事务。结果与您所期望的差不多,并且与上面测试的GET请求一致。

水平扩展基准测试

下面是用Apache Benchmark计算单个DreamFactory实例的水平可伸缩性的一些结果。四个m4。xlarge Amazon Web Services EC2 instances were configured behind a load balancer. The servers were configured with a common default database and EBS storage.

首先我们测试了复杂的GET场景。负载平衡m4。xlarge servers ran at about the same speed as the m4.4xlarge server tested earlier. This makes sense because each setup had similar CPU and memory installed. Since this example was bound by processing requirements, there was not much advantage to horizontal scaling.

接下来我们测试了简单的GET场景。在这种情况下,水平扩展似乎有一些优势。这可能是由于与垂直可伸缩性测试相比,更好的网络IO和其他固定约束的放松。

并发用户基准

我们还评估了并发用户同时调用平台上的REST API服务的效果。该测试使用了复杂的GET场景,其中搜索、排序和检索了1000条记录。测试是在三个不同的Amazon Web Services EC2实例中进行的。服务器为m4。xlarge, m4.2xlarge, and m4.4xlarge. We started with 20 concurrent users and scaled up to 240 simultaneous requests.

第一个请求完成的最短时间总是在300毫秒左右。这是因为一些请求立即执行并首先完成,而另一些请求必须等待执行。

最后一个请求完成的最长时间通常会随着并发用户总数的增加而增加。根据处理器的大小,最后一个请求的最大时间可能会急剧增加,超过某个临界阈值。8处理器示例说明了这一点,其中最大请求时间超过160个并发用户。

16个处理器的服务器从未经历过任何性能下降,一直到240个并发用户。这是Apache Bench测试程序支持的最大并发用户数。即便如此,最严重的往返延迟也不到1 / 2秒。想象一个现实世界的场景,有1万人登录到一个移动应用程序。如果其中10%同时提出服务请求,则预计往返延迟平均为1 / 2秒,最坏情况下为整整1秒。

你的里程可能有所不同

对于您的实现,我们建议获取完成平均服务调用所需时间的句柄。这可能取决于数据库速度、服务器端脚本、网络带宽和其他因素。接下来,尝试一些服务器配置,看看限制在哪里。然后将实现扩展到应用程序所需的性能特征。

在我的所有基准测试中,从来没有出现过任何无法解释的延迟或其他不能以可伸缩方式响应的性能特征。水平或垂直硬件的添加将以线性方式扩展DreamFactory 3.0,以满足您可能有的任何需求。

云扩展

大多数基础设施即服务(IaaS)供应商都有可以自动扩展web服务器的系统。例如,Amazon Web Services可以使用自动伸缩组和弹性负载均衡器来扩展EC2实例。微软Azure和Rackspace也内置了自动伸缩功能。如果您希望在云中部署,那么请向供应商查询他们支持的选项。

我们在前面讨论了平台即服务(PaaS)部署选项。这些系统不支持持久的本地文件存储,但是你的应用实例是高度可伸缩的。您可以简单地指定希望运行的最大实例数。随着流量的增加,会有更多的实例上线。如果服务器停止响应,则实例将简单地重新启动。

结论

DreamFactory被设计成一个简单的网站。DreamFactory支持使用额外的服务器功能进行扩展和使用额外的服务器进行扩展的标准实践。DreamFactory为所有主要的IaaS和PaaS云提供了安装程序或安装说明,其中一些供应商会自动为您处理扩展。


Baidu
map