【问题标题】:Scenario specific: Windows Services vs Azure Job, Console app in Scheduler on server?特定场景:Windows 服务与 Azure 作业,服务器上调度程序中的控制台应用程序?
【发布时间】:2017-04-22 07:21:25
【问题描述】:

场景:

我们有一个 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 上的用户活动。

【问题讨论】:

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


    【解决方案1】:

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

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

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

    是否采用云计算取决于您,您可能需要在此处使用分析器进行一些测量,但对我而言,听起来您确实需要它。内部处理可以用TPL Dataflow库来实现,一个块代表一种处理,最后是某种聚合逻辑。

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

    【讨论】:

    • 感谢@VmAtm 的好建议。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-08-28
    • 2011-01-10
    • 2011-12-07
    • 2017-02-03
    相关资源
    最近更新 更多