【问题标题】:Building a scalable ASP.NET MVC Web Application构建可扩展的 ASP.NET MVC Web 应用程序
【发布时间】:2010-10-29 07:39:42
【问题描述】:

我目前正在用 c# 构建一个 ASP.NET MVC Web 应用程序。

我想确保构建此应用程序,以便将来可以横向扩展,而无需进行重大重构。

我非常热衷于使用某种队列将任何写入发布到我的数据库库,并有一个进程异步轮询该队列以执行更新。一旦这些数据被发送回数据库,客户端就需要使用新信息进行更新。这意味着根据服务器上执行的业务规则,将数据写回数据库的过程可能需要很短的时间。

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

我正在考虑将数据发送回服务器并将其添加到队列中并立即向客户端发送响应,然后以某种频率轮询以获取更新的数据。任何有关这方面的最佳实践或模式将不胜感激。

此外,在从数据库读取数据方面,您是否建议使用任何特定技术,或者根据我的情况直接从数据库读取就足够了。

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

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

根据我们处理的数据类型,我们会通过电子邮件甚至静默方式通知用户。

【问题讨论】:

  • 我的第一个问题是,如果您让用户等待写入结果,为什么还要让您的数据库异步写入?
  • 我的问题是可能有一个业务规则在运行一段时间,类似于数据库触发器。虽然这对于少数用户来说可能没问题,但我认为这是一个瓶颈,可能会导致客户端上的用户请求超时,这是我想要避免的。

标签: c# asp.net asp.net-mvc queue scaling


【解决方案1】:

不确定这是否有帮助,但例如,为什么您不在页面上每 30 秒自动刷新一次。这就是体育网站上新闻提要的工作方式,即页面将每 x 分钟更新一次。

【讨论】:

  • 谢谢,我喜欢这样的声音。我会调查的。
  • 如果您担心服务器负载,最好不要这样做。
【解决方案2】:

为什么不让用户手动轮询请求的状态呢?这就是典型的电子商务应用程序的实现方式。当您在线购买商品时,订单会被提交到队列中等待完成。提交后,用户会看到一个“感谢您的订单”页面和一个他们可以检查订单状态的链接。用户可以随时访问链接查看状态,无需自动轮询机制。

你的场景和这个有那么大的不同吗?

【讨论】:

  • 谢谢,但我认为这不适合该应用程序。说这更像是一个业务线应用程序可能很有用,用户不会总是希望返回并检查某些东西的状态。一般来说,我更喜欢为用户尽可能地自动化。
  • @gsobocinski - 我认为 DSO 提出了一个很好的观点。如果您有用户期望的短事务,则让请求直接更新数据库,并立即更新 UI。但是,对于可能需要一段时间才能完成的事务,请让用户知道这一点,并指示他们定期检查结果。
【解决方案3】:

对不起,在我之前的回答中我可能误解了。我所说的“队列”是存储在 SQL DB 中的东西,但在再次阅读您的帖子时,您似乎在谈论一个单独的消息队列组件,如 MSMQ 或 JMS?

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

【讨论】:

  • 使用消息队列背后的想法是从任何潜在的阻塞 I\O 中释放 asp.net 工作进程,db 在我的例子中写道。我已经阅读了一些文章,这些文章建议使用这是扩展 Web 应用程序并消除 Web 前端和我的应用程序层之间的一些依赖关系的好方法。当然,您需要对 UI 做一些事情来否定事情正在排队以使其立即响应的事实,这可能会促使我更多地采用类似 AJAX 的方法。例如,在具有某种“请稍候”图形的帖子上。
【解决方案4】:

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

如需进一步阅读,请查看this Wikipedia article 了解 REST 的概念。

此外,您可以考虑Reactive Extensions for .NET 并在其中查看 RxJS 子项目,它有一些非常巧妙的方法来处理轮询问题,而不会导致您自己编写轮询代码。有趣的东西玩!

【讨论】:

    【解决方案5】:

    也许您可以在 UI 中添加“待处理交易”区域。当您对交易进行排队时,将其添加到用户的“待处理交易”列表中。

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

    您可以让已完成的交易保持在列表中,直到用户点击它,或在预定的时间长度内。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2013-06-26
      • 2011-01-17
      • 1970-01-01
      • 2010-09-21
      • 1970-01-01
      相关资源
      最近更新 更多