【问题标题】:Web Application with Background Job That Loops Forever具有永远循环的后台作业的 Web 应用程序
【发布时间】:2018-02-24 03:42:22
【问题描述】:

我正在尝试设计一个新的应用程序,但在最好的方法上有点卡住。

我想要做的是让一个机器人连接到一个 irc 通道,该通道从聊天消息中收集信息,然后我希望有一个 HTTP 端点,我可以从到目前为止收集的信息中获取结果。

我有一个正在运行的机器人,它收集我想要的信息,我可以创建端点,但我如何将其构建到 1 个应用程序中?我有2个应用程序吗? 1 输出到文件和端点只是读取文件并输出?我希望在 1 个应用程序中使用它,但到目前为止还没有找到这样的解决方案。

我目前正在使用 DotNet core 2.0 并部署到 Raspberry Pi。

【问题讨论】:

  • 这取决于您对“应用程序”的定义。一个“应用程序”可以是一堆可执行文件。你的意思是单个EXE?如果您看一下“面向服务的架构”,它会建议两个服务独立运行。 (两个exe文件)
  • 我在我当前的网络应用程序中使用了一个 WebHostBuilder,所以希望我能以某种方式将我的 irc 机器人集成到其中。我希望我可以使用参考,但它仍然只是一个网络应用程序。
  • 我不建议在 Web 服务器内运行后台作业。尽管实际上有很多人这样做(如前所述使用hangfire),但网络服务器不是作业服务器。
  • 我会这样做。这样,如果一个进程崩溃,它将与另一个进程隔离。如果您实际上可以单独查看单个进程(即两个收集器和结果端点没有在同一个 Web 服务器进程中混合),则对单个进程进行故障排除和性能调整会更容易。并且这两个进程不需要直接相互交谈——其中一个写入日志,其中一个从日志中读取。理论上,您可以将其扩展到两个单独的 pi,每个 pi 上运行一个进程(并且有两个微弱的硬件)
  • @SamJ 顺便说一句,想象一下您的服务是否遇到错误并引发异常。您是否希望您的 IRC 机器人能够因为遇到未捕获的错误而关闭您的网站?

标签: .net-core application-design web-application-design


【解决方案1】:

这取决于工作量。 如果应用程序定期收集信息而其余时间什么都不做,我建议将其作为 ASP.NET 服务启动:

public static void Main(string[] args)
{
    var host = new WebHostBuilder()
        .UseKestrel()
        .UseContentRoot(Directory.GetCurrentDirectory())
        .UseIISIntegration()
        .UseStartup<Startup>()
        .Build();
    host.Run();
}

为您当前的控制台应用程序安装所有依赖项(这将起作用)。 要收集数据,您可以使用 HangFire。它库来运行后台作业。 要像这样运行后台作业重复注册作业:

RecurringJob.AddOrUpdate(
    () => { //Gather data here },
    Cron.Daily);

【讨论】:

  • 目前我的控制台应用程序循环运行,不断检查要处理的新消息,我希望尽可能保持实时。添加 RecurringJob 是让它实时处理消息还是仅在我调用端点时处理消息?
  • 最小周期可以设置为 1 分钟。因此,如果您实时需要它,请在带有循环的新任务中创建循环。但它可能会占用过多的 CPU 或 O/I(取决于您收集数据的方式)。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2019-10-24
  • 1970-01-01
相关资源
最近更新 更多