克服SQL数据库(azure)中并发操作限制的方法

时间:2012-08-09 08:26:25

标签: azure azure-sql-database federation

我的应用程序使用的是windows azure和SQL数据库(Azure)。在不久的将来,我们将为SQL数据库提供接近50,000次/分钟的流量。我使用的是5GB的Web数据库。
现在,SQL数据库中每个分区的并发操作数限制为400 Reference

克服此限制的可能方法有哪些?目前,我能想到的最佳解决方案是联邦。其他方式是哪种?哪一个是最好的?
编辑:交易将只写。我们每隔5秒从客户端系统收集性能数据,这些数据将发送到我们的REST API,最终将数据插入SQL数据库。因此,没有UI和缓存是不可能的。

2 个答案:

答案 0 :(得分:3)

使用Federations in Windows Azure SQL Database是一种选择。但我更喜欢将繁重的工作卸载到不同的数据存储,如表存储,Blob或队列,因为它们是为处理繁重的负载而构建的,并且它们的分区更容易。将此与良好的缓存相结合,您可以轻松克服此限制。

想象一下,您的网站在您的主页上有十大产品列表,每天有100,000名访问者。一种选择是每次查询SQL Azure,但这可能会导致SQL Azure负担过重。但是你可以让工作流程每24小时运行一次,然后计算当前前10个产品,并将它们保存在表存储中(你可以在该表中制作一些分区,其中包含每个国家/地区前10名,每个类别,。 ..)。您可以将其视为预生成的视图。每次要显示前10个产品时,您都会查询表存储(表中的特定分区)中的项目,这些项目可以更好地扩展。在那里添加一些ASP.NET缓存,你将拥有一个非常可靠的系统。

那就是阅读数据。但我想你也会期待一些用户输入,用户可以创建订单,发送消息,......再次,如果你期望负载很重,SQL Azure可能不是你直接交互的最佳选择(看到了局限性)。在前端和后端之间使用队列可能是更好的解决方案。

当您的用户下订单时,您可以将消息写入队列(存储队列或服务总线队列)。工作人员将接收此消息,并在该表中为该订单创建一条记录,其中包含时间,产品数量,甚至是您将在用户订单屏幕中显示的状态(如处理)。完成此操作后,您将完成订单所需的所有时间,一旦完成,您将最终结果保存在SQL Azure中(并更新表存储中的订单记录)。将最终结果保存在SQL Azure中仍然可以使用报告等...

这将对您的申请产生重大影响。另一种解决方案是在虚拟机中自己托管SQL Server,但请注意,这仍然在CTP中:Provisioning a SQL Server Virtual Machine on Windows Azure

答案 1 :(得分:2)

联盟当然是一种选择,因为它是一个无共享的基础设施。但是,您可能希望首先反思您需要如此大量交易的原因。您的交易主要是读取还是写入操作?你有中间层吗?可用的技术在写入和读取操作方面不同。以下是一些技术可用于帮助您在具有中间层时最小化SQL数据库实例上每秒的事务数:

  • 缓存(如Sandrino所述)
  • 基于集合的交易
  • 最终一致性

当您的系统尝试在读取方案(或非规范化)中向使用者提供数据时,缓存很重要。我不会扩展缓存,除了说你有严肃的优点和缺点要考虑,例如跨节点的数据新鲜度和同步问题。下面的其他两种技术用于写入。

基于集合的事务在数据库系统中绝对是重要的。例如,如果您的系统每秒插入大量记录,您可以将插入请求放在队列中,然后在单独的线程上处理队列,然后将10或20个请求汇集到单个数据库调用中。这需要对数据库进行异步处理和基于集合的操作。但最终处理灌浆记录是SQL数据库成功的关键之一。我们现在正在设计一个系统,如果不是为了实现类似的模式,那么每秒可以进行500次以上的交易。

最终的一致性是另一个重要的概念,我之前提到过基于集合的方法。最终的一致性意味着数据库现在可能不包含所有记录,并且可能需要一些时间才能使所有记录可用。但最终,记录将成功。我在上面提供的示例(使用队列)实现了基于集合的操作和最终的一致性模式。