c# - 服务器上调度程序中的特定场景 : Windows Services vs Azure Job, 控制台应用程序?

标签 c# asp.net-mvc multithreading windows-services console-application

场景:

我们有一个 Web 应用程序,我们站点中的每个用户都可以在其中添加一些其他社交网站(如 Facebook、Twitter 等)的多个帐户。

我们必须执行一些自动化工作(例如通过 API 从他们的帐户获取数据以为这些用户生成分析)

要点

用户可以启动或停止任何帐户的服务,以停止或开始收集数据进行分析。
当用户单击开始/停止时,我必须在调度程序中启动自动 Windows 服务/crone 作业/控制台应用程序。

需要解决的问题:

  1. 对于添加了 n 个社交帐户的用户 x,我应该为每个帐户启动线程,还是为每个用户启动线程,或者 y 每个线程的用户数?

  2. Windows 服务的优化方法是什么?调度程序中的控制台应用程序?或者某种可以与 Windows 服务一起使用的数据库触发器?或一些第三方库,如 Quartz.Nethangfire 等?

Web 应用程序使用 ASP.NET MVC、MSSQL Server、c# 开发并部署在专用的 Windows 服务器上。

编辑

  1. 请记住,如果用户为一个帐户启动一项服务并且不会长时间停止它,我们需要该服务继续工作。
  2. 我们不希望在服务中立即操作,我们可以将用户操作延迟一两分钟。

就像我们可以在一两分钟后而不是每一秒后读取 Facebook 上的用户事件。

最佳答案

很难在没有任何细节的情况下给您建议,但对我来说,您似乎在谈论某种push-具有大量后端计算的通知系统。控制台应用程序和调度程序对我来说不是个好主意,因为您必须为每个新用户启动另一个进程,最终您只会用新任务炸毁服务器。

线程也是如此——其中一个线程会占用您的内存,用于调用堆栈、本地存储等系统内容。如果您的用户群足够大,您的应用程序将获得线程饥饿而不是性能提升。您可能需要使用 TPL 将数据处理拆分为多个任务, 也许 write your own TaskScheduler ,但尽量避免长时间运行的程序,它们会不断轮询用户请求。

所以解决方案可以像一些基于事件的应用程序(例如 RabbitMQ queue ),它为每个请求生成一些任务,尽可能细化,就像用户 A 想要的了解 FacebookTwitter 更新,启动两个任务,并分别通知用户它们的完成,这样您就可以获得尽可能多的可扩展性。

要不要上云,这取决于您,您可能需要在这里使用分析器进行一些测量,但对我来说,这听起来像是您真的需要它。内部处理可以通过 TPL Dataflow 实现库,其中一个 block 表示一种处理类型,最后是某种聚合逻辑。

总而言之,基于事件的方法为您提供了一种以异步方式处理用户请求的方法,其中包含一些推送通知或客户端轮询。在处理引擎内部,创建大量小任务,这样您的应用就不会陷入一些贪婪的用户报告。

关于c# - 服务器上调度程序中的特定场景 : Windows Services vs Azure Job, 控制台应用程序?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/43556462/

相关文章:

c# - 从电子邮件字符串获取主机.net core

c# - 对数字中的数字求和的最快方法

c# - 遍历 MultiSelectList

jquery ajax调用重新加载页面

ios - CoreData多线程删除

objective-c - 在 objective-c 中在主线程上执行选择器的最佳方法?

c# - 无法更改 VS 2015 C++ 项目中的 .NET 目标框架版本

c# - 如何在 C# 中完成作用域变量重置?

c# - Rhino Mock 与 Debug模式?

C#线程图像处理