【问题标题】:Scheduling in Asp.net Mvc and web api在 Asp.net Mvc 和 web api 中调度
【发布时间】:2017-09-04 19:25:54
【问题描述】:

我正在使用 Asp.net MVC 5 和 web api 和 SQL Server 开发一个项目。我应该实现一个需要调度的功能。

我在这个系统中有一些用户,每个用户都可以注册一个订单,我将订单信息保存在数据库中。

问题:对于每个2分钟后在系统中注册的订单,我应该向他的所有者发送一条消息并通知他他的订单状态。

每个订单在注册2分钟后如何查看状态?

我应该为每个已注册的订单安排一个任务吗? (每秒可能超过 500 个订单,所以我认为这不是一个好的解决方案)

我想要一个性能良好的解决方案。

【问题讨论】:

  • @S.Akbari,@Peter Bons 我知道这些组件,但我应该为每个已注册的订单安排一个任务吗?

标签: c# asp.net sql-server asp.net-mvc


【解决方案1】:

您最好的解决方案是Hangfire

Hangfire 专为应对此类挑战而设计。你有多少工作真的不重要。配置 Hangfire 后,您可以简单地将方法传递给队列。您还可以使用 TimeSpan 延迟执行

BackgroundJob.Schedule(
() => Console.WriteLine("Delayed!"),
TimeSpan.FromMinutes(2));

如果您的订单流程中有多个步骤,您甚至可以链接作业,这非常方便:

BackgroundJob.Schedule(() => {

    SomeProcessToComplete();

},TimeSpan.FromMinutes(2));

static void SomeProcessToComplete(){

     //after code runs add another job to the queue
    BackgroundJob.Schedule(
    () => Console.WriteLine("Delayed!"),
    TimeSpan.FromMinutes(2));
}

【讨论】:

  • 我的应用程序不是控制台应用程序,它是一个 Web 应用程序,并且在 IIS 上运行,如果长时间没有请求到达应用程序,它可能会停止应用程序
  • 这就是它的用途:)。它会保持自己的生命。我已经使用了多年,从未错过任何任务
  • 您可以在 IIS 服务器上的应用程序池高级设置中将 IdleTimeout 设置为 0
【解决方案2】:

另一种解决方案是,每次保存订单时,将其写入服务器上的文本文件,同时添加 watch 通知您文本文件已更改,这将触发您的服务发送消息

【讨论】:

  • 使用数据库表来存储有关订单的信息会更加健壮和可扩展(想想当很多人几乎同时进行时),但是是的,卸载到单独的后台服务是实现此类功能的一种非常常见的方式。
猜你喜欢
  • 2017-01-27
  • 2021-09-16
  • 1970-01-01
  • 1970-01-01
  • 2021-10-27
  • 1970-01-01
  • 2023-03-22
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多