【发布时间】:2012-01-16 20:58:15
【问题描述】:
大多数(如果不是全部)ASP.NET(或 MVC)的 NSB 示例都有 Web 应用程序使用 Bus.Send 发送消息并可能注册一个简单的回调,这基本上是我在应用程序中使用它的方式.
我想知道的是,在同一个 ASP.NET 应用程序中处理消息是否可能和/或有意义。
我问的主要原因是缓存。这个过程可能是这样的:
- 用户从网络应用发起请求。
- Web 应用向独立应用服务器发送消息,并将更改记录在本地数据库中。
- 对于来自同一用户的未来页面请求,Web 应用程序会知道更改并将其列为“待处理”状态。
- 后端发生了一堆事情,最终请求被批准或拒绝。引用原始请求发布事件。
- 此时,网络应用应该开始显示最新信息。
现在,在真正的 Web 应用程序中,几乎可以肯定的是,这个待处理的请求将被缓存,很可能会被缓存很长时间,因为否则应用程序必须查询数据库以获取待处理的更改 每次用户询问当前信息。
因此,当请求最终在后端完成时(可能需要一分钟或一天),Web 应用程序至少需要使此缓存条目无效并执行另一次数据库查找。
现在我意识到这可以通过 SqlDependency 对象等进行管理,但让我们假设它们不可用 - 也许它不是 SQL Server 后端,或者可能当前信息查询转到网络服务,随便。问题是,Web 应用程序如何知道状态的变化?
如果 可以在 ASP.NET 应用程序中处理 NServiceBus 消息,那么处理程序的上下文是什么?换句话说,IoC 容器将不得不注入一堆依赖项,但它们的范围是什么?这一切都在 HTTP 请求的上下文中执行吗?还是消息处理程序的所有内容都需要是静态/单例的?
对于此类问题是否有更好/推荐的方法?
【问题讨论】:
-
我不知道如何在 IIS 中处理事件,但无论何时引入异步进程,都必须处理最终一致性。 Web 应用程序是否需要立即更新,或者您可以每分钟、15 分钟、每小时刷新一次缓存吗?
-
@Ryan:我们能侥幸逃脱吗?大概。我对客户 POV 感到满意吗?并不真地。总的来说,我对 EC 没意见 - 例如,我意识到如果站点或应用程序池没有运行,直到它再次启动,并且 that 完全没问题,否则什么都不会被处理 - 但是信息应该在某些用户实际请求它的几分钟内是最新的,并且数据确实应该被缓存更长的时间。这种差异通常通过手动或基于依赖的缓存失效来解决。
-
对,这就是我在同步应用程序中所做的。对于 NSB,我每次都访问数据库,但我只有一个有几个用户的后台应用程序。
-
@Ryan:当然,对于小型应用程序,您根本不需要缓存,这将解决问题(尽管我确信您可能需要其他场景处理来自 ASP.NET 的消息)。这是一个面向客户的应用程序,虽然我们不是 Stack Overflow 规模,但假设一次至少有几百个用户在线 - 缓存绝对重要。
标签: asp.net asp.net-mvc nservicebus publish-subscribe