场景:
我们有一个 Web 应用程序,我们站点中的每个用户都可以在其中添加一些其他社交网站(如 Facebook、Twitter 等)的多个帐户。
我们必须执行一些自动化工作(例如通过 API 从他们的帐户获取数据以为这些用户生成分析)
要点
用户可以启动或停止任何帐户的服务,以停止或开始收集数据进行分析。
当用户单击开始/停止时,我必须在调度程序中启动自动 Windows 服务/crone 作业/控制台应用程序。
需要解决的问题:
对于添加了
n
个社交帐户的用户x
,我应该为每个帐户启动线程,还是为每个用户启动线程,或者y
每个线程的用户数?Windows 服务的优化方法是什么?调度程序中的控制台应用程序?或者某种可以与 Windows 服务一起使用的数据库触发器?或一些第三方库,如
Quartz.Net
或hangfire
等?
Web 应用程序使用 ASP.NET MVC、MSSQL Server、c# 开发并部署在专用的 Windows 服务器上。
编辑
- 请记住,如果用户为一个帐户启动一项服务并且不会长时间停止它,我们需要该服务继续工作。
- 我们不希望在服务中立即操作,我们可以将用户操作延迟一两分钟。
就像我们可以在一两分钟后而不是每一秒后读取 Facebook 上的用户事件。
最佳答案
很难在没有任何细节的情况下给您建议,但对我来说,您似乎在谈论某种push
-具有大量后端计算的通知系统。控制台应用程序和调度程序对我来说不是个好主意,因为您必须为每个新用户启动另一个进程,最终您只会用新任务炸毁服务器。
线程也是如此——其中一个线程会占用您的内存,用于调用堆栈、本地存储等系统内容。如果您的用户群足够大,您的应用程序将获得线程饥饿而不是性能提升。您可能需要使用 TPL
将数据处理拆分为多个任务, 也许 write your own TaskScheduler
,但尽量避免长时间运行的程序,它们会不断轮询用户请求。
所以解决方案可以像一些基于事件的应用程序(例如 RabbitMQ
queue ),它为每个请求生成一些任务,尽可能细化,就像用户 A
想要的了解 Facebook
和 Twitter
更新,启动两个任务,并分别通知用户它们的完成,这样您就可以获得尽可能多的可扩展性。
要不要上云,这取决于您,您可能需要在这里使用分析器进行一些测量,但对我来说,这听起来像是您真的需要它。内部处理可以通过 TPL Dataflow
实现库,其中一个 block 表示一种处理类型,最后是某种聚合逻辑。
总而言之,基于事件的方法为您提供了一种以异步方式处理用户请求的方法,其中包含一些推送通知或客户端轮询。在处理引擎内部,创建大量小任务,这样您的应用就不会陷入一些贪婪的用户报告。
关于c# - 服务器上调度程序中的特定场景 : Windows Services vs Azure Job, 控制台应用程序?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/43556462/