2009-05-27 100 views
7

我目前正在使用c#构建ASP.NET MVC web应用程序。构建一个可伸缩的ASP.NET MVC Web应用程序

我想确保这个应用程序构建,以便它可以在未来进行扩展,而无需主要再保。

我在使用某种队列张贴任何写入我的数据库基础,并有一个过程,即排队投票异步执行更新相当激烈。一旦这些数据被发回数据库,客户端就需要用新的信息进行更新。这意味着将数据写回数据库的过程可能需要很短时间,这取决于服务器上执行的业务规则。

我的问题是从客户\浏览器的角度处理更新的最佳方式是什么。

我一起发布的数据传回服务器并将其添加到队列,并立即在某些频率发送到客户端的响应,然后查询以获得更新的数据线的想法。任何最佳做法或模式,将不胜感激。

另外在从数据库中读取数据方面会建议使用任何特定的技术或将读取直接从数据库足以给我的方案。

更新 以为我会发布更新,因为它已经有一段时间了。我们实际上已经结束了使用Windows Azure,但该解决方案适用于其他平台。

我们最终做的是使用Windows Azure队列发送消息\命令。这是一个非常快速的过程,并立即返回。然后我们有一个工作者角色在另一个线程上处理这些消息。这使我们能够最大限度地减少任何数据库写入\对Web角色的更新理论上允许我们更容易地扩展。

我们处理通过电子邮件取决于我们正在处理的数据类型通知用户,甚至默默。

+0

我的第一个问题就是为什么你想让数据库写入异步,如果你让用户等待结果写入? – 2009-05-27 15:29:06

+0

我的问题是可能存在一段时间内运行的业务规则,类似于db触发器。虽然对于少数用户来说这可能是好的,但我认为这是瓶颈,可能会导致用户请求在客户端超时,这是我想避免的。 – gsobocinski 2009-05-27 15:43:22

回答

2

不知道这是否帮助,但你为什么不有每30秒例如在页面上自动刷新。有时,新闻在体育网站上的工作方式有所不同,称该网页每隔十分钟更新一次。

 
<meta http-equiv="refresh" content="120;url=index.aspx"> 
+0

谢谢,我喜欢使用类似这样的声音。我会研究它。 – gsobocinski 2009-05-28 10:50:41

+0

可能最好不要这样做,如果你担心服务器负载。 – Luke 2012-05-07 03:00:40

1

为什么不让用户手动轮询请求的状态?这就是您典型的电子商务应用程序的实施方式。当你在网上购物时,订单会被提交到一个队列以满足需求。提交后,用户会看到一个“感谢您的订单”页面和一个链接,他们可以检查订单的状态。用户可以随时访问链接来检查状态,不需要自动轮询机制。

您的情况与此有何不同?

0

对不起,我以前的答案我可能会误解。我正在谈论一个“队列”作为存储在SQL DB中的东西,但它似乎在阅读您的文章时可能正在讨论像MSMQ或JMS这样的单独消息排队组件。

我永远不会在用户和后端SQL DB之间的前端放置消息队列。队列适合跨时间扩展,适用于后端组件之间,其中处理时间的差异是可以接受的(例如,订单履行)......在处理用户时,这种差异通常是不可接受的。

0

虽然我不知道我是否同意为什么的逻辑,但我知道像jQuery这样的东西会让你的生活更轻松。我会建议制作一个REST风格的Web API,以便客户端代码使用。例如,您想要向系统发布新订单并让客户端响应?向www.mystore.com/order/create发帖,让它返回新的URI作为URI访问订单(即订单号)(www.mystore.com/order/1234)。然后将该响应存储在客户端代码中,并设置jQuery call以轮询响应或停止轮询错误。

有关REST概念的更多信息,请参阅this Wikipedia article

此外,你可能会考虑Reactive Extensions for .NET,并在其中检查出RxJS子项目,它有一些漂亮的方法来处理轮询问题,而不会导致你自己写轮询代码。有趣的事情玩!

0

也许你可以添加一个“等待交易”区域到用户界面。当您将交易排队时,将其添加到用户的“待处理交易”列表中。

完成后,请在用户下一次请求新页面时显示该用户的“待定事务”列表中。

您可以使已完成的交易保持列出状态,直到用户单击它或预定的时间长度。

相关问题