我的应用程序正在使用windows和SQL数据库( azure )。在不久的将来,我们的SQL数据库的流量将接近5万事务/分钟。我正在使用5GB的Web数据库。
现在在SQL数据库中,每个分区的并发操作限制为400个:参考文献
克服这一限制的可能方法是什么?目前,我能想到的最好的解决方案是联邦。其他的方法是什么?哪一个是最好的?
编辑:事务将只写。我们每5秒从客户端系统收集性能数据,这些数据被发送到REST,后者最终将数据插入到SQL数据库。因此,没有UI和缓存是没有问题的。
发布于 2012-08-09 08:49:09
使用Windows数据库中的联邦是一种选择。但是我更喜欢将繁重的工作卸载到不同的数据存储区,比如表存储、Blobs或队列,因为它们是为处理沉重的负载而构建的,并且它们的分区要容易得多。将此与良好的缓存结合起来,您可以轻松地克服这一限制。
假设您的站点在主页上有一个前10名产品列表,并且每天有100,000名访问者。一种选择是每次查询SQL,但这可能会给SQL带来沉重的负担。但是您可以让一个工作进程(例如,每24小时运行一次)运行一次,并计算当时排名前10的产品,并将它们保存在表存储中(您可以在该表中创建几个分区,其中包含每个国家的前10个,每个类别,.)。您可以将此视为预先生成的视图。每次您想显示前10种产品时,您都会从表存储(表中的一个特定分区)中查询条目,这些条目的缩放效果要好得多。在那里添加一些ASP.NET缓存,您将拥有一个非常可靠的系统。
这是用来读取数据的。但是我想你也会期待一些用户的输入,其中用户可以创建一个订单,发送消息,.同样,如果您期望负载很重,那么SQL可能不是您直接交互的最佳选择(见其局限性)。在前端和后端之间使用队列可能是更好的解决方案。
当用户下订单时,您可以将消息写入队列(存储队列或服务总线队列)。工作人员将接收到这条消息,并在表中为该订单创建一个记录,包括时间、产品计数,甚至您将在用户的订单屏幕中显示的状态(如处理)。一旦完成了这一操作,您就有了完成订单所需的全部时间,一旦完成了订单,就可以在SQL中保存最终结果(并在表存储中更新订单记录)。在SQL中保存最终结果仍然可以使用报表等。
这将对您的应用程序产生重大影响。另一种解决方案是自己将Server托管在虚拟机中,但请注意,这仍在CTP:在Windows上提供Server虚拟机中。
发布于 2012-08-09 13:28:14
联邦当然是一种选择,因为它是一个没有共享的基础设施。但是,您可能需要首先考虑为什么需要如此大的事务量。您的事务将主要是读写操作吗?你们有中间层吗?可用于写入和读取操作的技术各不相同。下面是一些技巧,可以帮助您在中间层就位时最小化SQL数据库实例每秒的事务数:
当您的系统试图在读取场景(或去规范化)中向使用者提供数据时,缓存非常重要。我不会扩展缓存,只会说您有很多优点和缺点要考虑,例如数据新鲜度和节点间的同步问题。下面的其他两种技术是用于写作的。
在数据库系统中,基于集的事务绝对是关键。例如,如果您的系统每秒钟插入大量记录,您就会将insert请求放在一个队列中,然后在一个单独的线程上处理队列,然后将十个或二十个请求集中到一个数据库调用中。这需要基于数据库的异步处理和基于集的操作。但最终,对处理记录进行分组是SQL数据库成功的关键之一。我们现在正在设计一个系统,如果不是为了实现类似的模式,它将每秒产生超过500个事务。
最终一致性是另一个重要的概念,我之前提到过基于集合的方法。最终的一致性意味着数据库现在可能不包含所有记录,可能需要一些时间才能获得所有的记录。但最终唱片会成功的。上面我提供的示例(与队列一起)实现了基于集合的操作和最终的一致性模式。
https://stackoverflow.com/questions/11879431
复制相似问题