Web services 在WindowsAzure中扩展RESTAPI以处理数千个请求的合适方法

Web services 在WindowsAzure中扩展RESTAPI以处理数千个请求的合适方法,web-services,azure,scalability,Web Services,Azure,Scalability,我有一个RESTAPI,通过它我允许用户应用程序(azure应用程序)向我的数据库发送perfmon数据。现在,为了负载测试这个REST API,我构建了一个500 webrole的模拟器应用程序,每个应用程序有10个实例(总共5000个实例),每1分钟50000(大约)个请求将向REST API发布数据,因此我需要用最佳实践来扩展我的REST API,以处理这么多负载 下面是我用来扩展RESTAPI的测试用例 中等-6个实例=>可以处理300个实例的请求 超大-2实例=>可以处理300个实例的

我有一个RESTAPI,通过它我允许用户应用程序(azure应用程序)向我的数据库发送perfmon数据。现在,为了负载测试这个REST API,我构建了一个500 webrole的模拟器应用程序,每个应用程序有10个实例(总共5000个实例),每1分钟50000(大约)个请求将向REST API发布数据,因此我需要用最佳实践来扩展我的REST API,以处理这么多负载

下面是我用来扩展RESTAPI的测试用例

中等-6个实例=>可以处理300个实例的请求

超大-2实例=>可以处理300个实例的请求

现在我的问题是,这种负载可以通过水平缩放或垂直缩放来处理?意味着我应该增加中型或小型实例的数量,还是必须使用特大型实例

另外,这个RESTAPI将发布SQL Azure数据库(5 gb web版)的数据,所以在处理请求方面有任何限制吗


<> P>>在上述情况下,所有应用程序都考虑在同一区域>/P>> P>您的6个媒体实例=12个内核,而2个XL实例=16个内核。就价格而言,最好使用6种介质,而不是2 XLs

另外,如果您动态扩展,使用XL只能扩展8个内核,而使用medium可以扩展2个内核。我会使用中型实例,如果可能的话,甚至是小型实例。并将以水平扩展(也称为横向扩展)为目标—增加/减少实例数

在发送SQL之前,我也会考虑一些缓冲数据,而不是直接与Windows Azure SQL数据库(WASD)进行通信。对于这种类型的负载,WASD的每一秒命中都很可能会遇到由于重负载导致的瞬态误差。考虑将数据缓存到队列(Azure存储队列或Azure服务总线队列)中,并具有一个工作者角色(可能具有多个实例),以批处理队列消息。


在CQRS模式中,这种类型的量表很可能更具响应性和可靠性。您可以查看CQRS和Windows Azure上的更多信息和参考实现。

这是一条评论,但我没有空间了

如果您正在设计一个restapi来接收PERFMON数据的速度和规模,那么为什么要通过调用SQL而不是调用队列来降低API的速度呢

如果SQL无法处理单个队列,那么SQL也无法处理来自6个REST服务的调用。最后,SQL插入受到磁盘IO的限制。如果设计得当,单个进程向SQL发送数据的速度与SQL接收数据的速度一样快

每分钟50000次插入是非常多的,所以看看你是如何设计索引和插入的。当然,您不希望索引出现碎片。如果原始数据具有顺序键,则可以将其用作主键。否则使用Iden作为PK

如果对插入进行批处理,可以提高吞吐量。批处理不一定会增加延迟。如果它准备好进行下一次插入,并且队列中只有一个,则插入一批1。插入将有一个最佳点(比如100-1000)

我要做的是在前台构建插入,然后异步插入。如果可以比异步插入更快地构建插入,那么SQL将完全加载。由于您在内存中构建语法并将其插入磁盘,因此除非您有一些复杂的处理来构建语法,否则构建语法的速度会更快。是的,请查看federated以拆分磁盘IO,但首先要优化该插入。排水器很受欢迎。我经常使用表值参数。insert into table values()不是最快的选项,但它可能保持50000/分钟的速度

使用队列保护RESTAPI。然后优化处理该队列


我想说Azure表存储,但它限制为每秒5000个实体,以及每秒500个实体/分区。由于这些吞吐量限制,我认为您不能称ATS为高度可扩展的

这似乎更像是一个扩展存储的问题,您希望尽可能接近实时


在这种情况下,如果SQL federation不能解决这个问题,那么基于租户的方法可以使用多个数据库,每个数据库都为一个或多个用户应用程序保留。

SQL Azure中对并发请求有限制。每个分区只能处理400个并发请求。以下是参考url:@astaykov感谢您的帮助,但是如果我将使用队列,则无法通过我的应用程序显示实时数据。我想它会显示延迟数据(如果我理解错误,请纠正我)。我可以在这里使用sql azure联合体吗?是的,如果您使用队列,您将有延迟。这是对高性能的权衡。您可以使用联合,并将给您一些性能改进,但不是最终的。我仍然建议将SQL调用与重载队列解耦。即使使用联盟,您也无法平均分配负载,并且SQL Azure(暂时性错误)将面临许多问题,因为它将非常热。@astaykov我可以使用Azure表存储吗?因为我可以通过RESTAPI直接发布perfmon数据,也可以从中显示实时数据,所以我不再需要插入WASD。对于整合,我可以创建单独的工作者角色项目,该项目将整合表存储的perfmon数据中的数据并将其存储到WASD。感谢您的回复。然而,我不确定我是否100%地理解了以上内容。我认为批处理插入将无法工作,因为我们需要显示实时数据。什么是drapper?你想在这段话里说什么。坦率地说,我从那里得到的不多!但是如果一个应用程序用户有这么多实例,会发生什么呢?!我们正在努力实现解决方案。Arun,API本身可以很容易地扩展。储藏室是