Asp.net mvc 重载asp.net MVC+;webapi应用与异步消息总线
我计划构建一个相当大的应用程序(在并发用户/请求数量方面,而不是在功能方面) 基本上,我在某处会有一个服务,它在等待命令执行它们,然后确认完成。该服务将使用服务总线进行通信,从而在发出确认消息之前最终执行 此服务的使用者可以是任何类型的应用程序(WPF、SL等),但我的主(也是第一个)客户端将是asp.net MVC应用程序+WebApi(.net 4.5)或仅MVC(.net 4.0),并带有ajax控制器操作 web应用程序将依赖Ajax调用来保持用户友好的响应应用程序 我对这种成熟的异步体系结构非常陌生,我有一些问题要问,以避免将来的头痛:Asp.net mvc 重载asp.net MVC+;webapi应用与异步消息总线,asp.net-mvc,asynchronous,asp.net-web-api,signalr,message-bus,Asp.net Mvc,Asynchronous,Asp.net Web Api,Signalr,Message Bus,我计划构建一个相当大的应用程序(在并发用户/请求数量方面,而不是在功能方面) 基本上,我在某处会有一个服务,它在等待命令执行它们,然后确认完成。该服务将使用服务总线进行通信,从而在发出确认消息之前最终执行 此服务的使用者可以是任何类型的应用程序(WPF、SL等),但我的主(也是第一个)客户端将是asp.net MVC应用程序+WebApi(.net 4.5)或仅MVC(.net 4.0),并带有ajax控制器操作 web应用程序将依赖Ajax调用来保持用户友好的响应应用程序 我对这种成熟的异步体
- 我的web api调用可能需要一些时间。我应该如何正确设计api以支持长时间运行的操作(某种异步?)。我已经读过有关新的async关键字的内容,但为了了解更多信息,我想了解其背后的含义
- 我对服务的调用将包括发布消息并等待ack消息。如果我把它包装在一个方法中,我应该如何编写这个方法?我是否应该“阻止”直到收到ack(我想我不应该)?我是否应该返回一个任务对象并让使用者决定
- 我还想知道信号员是否能帮我。有了signar,我想我可以使用一个真正的“fire-and-forget”命令发出,并将消息路由到客户端以确认消息
- 我是否完全脱离了主题,我是否应该采取另一种方法
- Rabbitmq as消息传递系统
- Masstransit对消息传递系统进行抽象
- asp.MVC4来构建UI
- Webapi隔离从UI控制器发出的命令,并允许其他类型的客户端发出命令
public void NewsAsync(string city) {}
public ActionResult NewsCompleted(string[] headlines) {}
关于何时使用异步:
通常,在以下情况下使用异步管道
是真的:
- 这些操作是网络绑定或I/O绑定的,而不是CPU绑定的
- 测试表明,阻塞操作是站点性能的瓶颈,IIS可以使用
这些阻塞调用的异步操作方法 - 并行性比代码的简单性更重要
- 您希望提供一种机制,允许用户取消长时间运行的请求
- 查询数据时,数据应该已经存在。最好是以手头问题所需的方式
- 查询数据时,不应启动长时间运行的进程
- 执行命令时,可以启动长时间运行的进程。但这就是为什么您应该使用消息队列。指定一个任务来启动长时间运行的进程,为其创建消息,将其抛出队列,完全忘掉它。后台的其他进程将接收它
- 当执行该命令时,可以启动长时间运行的进程
- 执行命令时,可以使用数据更新数据库
- 如果有人请求数据,API可以使用这些数据
Bus.Instance.Publish(new YourMessage{Text = "Hi"});
在NServiceBus中
Bus.Publish(new YourMessage{Text = "Hi"});
我还想知道信号员是否能帮我
我想是的!由于消息传递的异步性质,用户必须“等待”