2017-02-28 62 views
0

我正在.NET核心编写一个MVC应用程序,它打算继续Azure。 在应用程序启动时,我添加了一个读取文件/ Db并创建集合的服务。 (这是一个沉重的任务并且不应当被重复) 这项服务将通过一个请求被调用,依赖于集合中的输入和数据,将被生成的输出。 我用下面的代码添加服务 -如果部署在Azure上,MVC服务如何工作?

services.AddSingleton<IServiceInterface, ServiceObject>(); 

我希望它不会调用构造函数不止一次,但它呼吁每个请求的构造。

这是一个问题,但更大的问题是 - 如何创建可并行处理的请求对象池? 或者我如何配置此服务并行接受多个请求?

我认为应该有一些属性,它会宣布这项服务线程安全

当然有我的MVC/Azure中是如何工作的理解一定的差距..

回答

0

如果您在Azure上运行,这是应该留给例如的那种东西WebJobs。

在Web层运行的长时间运行的作业的问题是,他们采取资源远离处理请求。如果有错误呢?你将如何重试?

在Azure中,你可以做这样的事情,而不是:

  1. Web层发送消息给服务总线队列/存储队列
  2. 连续WebJob听该队列拾取消息并处理它。

有几个好的方面这种方法:

  1. 的WebJobs可以放在一个完全不同的应用服务计划,减少了对Web层的工作量。他们也可以独立扩展。
  2. 连续WebJobs默认并行运行。至少从服务总线队列中,SDK一次收到8条消息进行处理,并且它也运行在应用程序服务计划中的每一个实例上,因此可以扩展。
  3. 如果你在处理过程中的异常,该消息不会从队列中删除。 WebJob将重试处理它。

服务总线队列的优点是它们可以保证消息排序并且消息只传送一次。存储队列更便宜,但不提供这些保证。你提到这个任务应该只运行一次,所以Service Bus会更适合你的情况。 但是,通常你确实希望你的WebJobs是幂等的。那么即使它没有完成任务,它也可以安全地重试。

你可以在这里找到样品:https://github.com/Azure/azure-webjobs-sdk-samples/blob/master/BasicSamples/ServiceBus/Functions.cs