重载asp.net MVC + Web API应用和异步消息总线的设计注意事项

Ste*_*e B 5 asp.net-mvc asynchronous signalr message-bus asp.net-web-api

我计划构建一个相当大的应用程序(在并发用户/请求数量方面很大,而不是在功能方面)。

基本上,我将在某处提供服务,即等待命令执行它们,并在稍后确认完成。在发出确认消息之前,此服务将使用服务总线进行通信,从而使执行成为最终结果。

此服务的使用者可以是任何类型的应用程序(WPF、SL、...),但我的主要(也是第一个)客户端将是一个 asp.net MVC 应用程序 + WebApi (.Net 4.5) 或 MVC only (.Net 4.0) ) 与 ajax 控制器操作。

Web 应用程序将依靠 Ajax 调用来保持用户友好的响应式应用程序。

我对这种成熟的异步架构还很陌生,我有一些问题可以避免将来的头痛:

  • 我的 web api 调用可能需要一些时间。我应该如何正确设计 api 以支持长时间运行的操作(某种异步?)。我已经阅读了新的 async 关键字,但为了知识起见,我想了解背后的内容。
  • 我对服务的调用将包括发布一条消息并等待确认消息。如果我将它包装在一个方法中,我应该如何编写这个方法?我应该“阻止”直到收到确认(我想我不应该)?我应该返回一个 Task 对象并让消费者决定吗?
  • 我也想知道 SignalR 是否可以帮助我。使用signalR,我想我可以使用真正的“即发即弃”命令发出,并路由到客户端以确认消息。
  • 我是不是完全跑题了,我应该采取另一种方法吗?

在实现细节/框架方面,我想我会使用:

  • Rabbitmq 作为消息系统
  • Masstransit 抽象消息系统
  • asp.MVC 4 构建 UI
  • Webapi 隔离从 UI 控制器发出的命令,并允许其他类型的客户端发出命令

Den*_*elt 2

我的 Web API 调用可能需要一些时间。我应该如何正确设计 api 以支持长时间运行的操作(某种异步?)。

我不是 100% 确定你要去哪里。您提出了有关异步的问题,但也通过引入 RabbitMQ 和 MassTransit 提到了消息队列。消息队列默认是异步的。

您还提到执行命令。如果您指的是 CQRS,则将命令和查询分开。但我并不是百分百了解您在提到“长时间运行的进程”时所指的内容。

  • 当您查询数据时,数据应该已经存在。最好以当前问题所需的方式。
  • 查询数据时,不应启动长时间运行的进程
  • 当您执行命令时,可以启动长时间运行的进程。但这就是您应该使用消息队列的原因。指定一个任务来启动长时间运行的进程,为其创建一条消息,将其扔到队列中,然后完全忘记它。后台的其他一些进程将会拾取它。
  • 当执行该命令时,可以启动长时间运行的进程。
  • 当命令执行时,数据库可以更新数据
  • 如果有人请求数据,API 可以使用此数据

使用此模型时,长时间运行的进程可能需要长达 10 分钟才能完成,但这并不重要。我不会详细介绍单个线程实际上需要 10 分钟才能完成,包括数据库锁定,但我希望您能明白这一点。将消息放入队列后,您的 API 几乎会立即释放。那里不需要异步。

我对服务的调用将包括发布消息并等待确认消息。

我不明白这一点。.NET Framework 和您的排队平台会为您处理这个问题。为什么要等待 ack?

在公共交通中

Bus.Instance.Publish(new YourMessage{Text = "Hi"});
Run Code Online (Sandbox Code Playgroud)

在 NServiceBus 中

Bus.Publish(new YourMessage{Text = "Hi"});
Run Code Online (Sandbox Code Playgroud)

我也想知道 SignalR 是否可以帮助我。

我应该这么想吧!由于消息传递的异步性质,用户必须“等待”更新。如果您可以通过 SignalR 将更新“推送”给用户来提供此数据,那就更好了。

我是否完全脱离了主题,我应该采取另一种方法吗?

或许,我还是不确定你要去哪里。也许可以阅读以下资源。

资源:

http://www.udidahan.com/2013/04/28/queries-patterns-and-search-food-for-thought/ http://www.udidahan.com/2011/10/02/why-you-应该使用cqrs-almost-everywhere%E2%80%A6/ http://www.udidahan.com/2011/04/22/when-to-avoid-cqrs/ http://www.udidahan。 com/2012/12/10/面向服务的-api-implementations/

http://bloggingabout.net/blogs/dennis/archive/2012/04/25/what-is-messaging.aspx http://bloggingabout.net/blogs/dennis/archive/2013/07/30/partitioning-data -through-events.aspx http://bloggingabout.net/blogs/dennis/archive/2013/01/04/databases-and-coupling.aspx