7

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

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

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

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

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

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

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

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

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

4

5 回答 5

2

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

<meta http-equiv="refresh" content="120;url=index.aspx">
于 2009-05-27T15:30:20.487 回答
1

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

您的情况与此有很大不同吗?

于 2009-05-27T23:16:53.103 回答
0

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

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

于 2009-05-28T17:49:54.700 回答
0

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

如需进一步阅读,请查看这篇关于 REST 概念的 Wikipedia 文章。

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

于 2010-11-09T02:21:34.693 回答
0

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

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

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

于 2010-11-09T02:57:13.957 回答