4

我正在开发一个 asp.net 网站,该网站需要每天访问一些社交媒体网站以获取全面的朋友/关注者数据。我选择了 arvixe 商务舱作为我的主机。将来,如果我们发展壮大,我很想进入专用服务器并运行 Windows 服务,但是由于目前还没有这种可能性,我需要另一种可靠的方式来运行计划任务。我熟悉从 app_code(global.aspx) 运行线程计时器。但是,应用程序池回收会导致计时器出现一些问题。我从来没有使用过像quartz这样的任务调度,但是在stackoverflow上读过很多关于它的内容。我正在寻找一些关于如何实现我的目标的建议。我在使用这两种方法时遇到的一个大问题是,由于 api 调用限制,我需要爬虫线程定期休眠长达一个小时。我的第一个想法是使用数据库来保存工作的开始和结束。当应用程序池回收时,我会清除所有未完成的部分,只启动当天没有运行记录的部分。这里的专家怎么看?这种调度的示例架构有什么好的链接吗?

4

4 回答 4

1

使用哪种方法并不重要,无论您是自己滚动还是使用 Quartz。您受 ASP.NET/IIS 的支配,因为那是您想要托管它的地方。

您是否有一台可以运行计划任务并将数据上传到托管数据库的备用计算机?老实说,这样做可能更安全(取决于您的用例),然后尝试在 ASP.NET 中运行调度程序。

于 2012-06-19T20:56:28.933 回答
0

有点像布莱恩的帖子;

找一台备用电脑。

与其允许 DB 访问,不如让它在您的站点上调用 Web 服务。此服务调用应该是您尝试执行的过程的发起者。不要尝试将参数放入其中,就像“StartProcess()”之类的东西应该可以正常工作。

至于睡觉和稍后恢复,请查看Workflow Foundation。有一些很好的内置功能可以保持状态。

不要将您的数据库暴露给外界,而是暴露该页面或 Web 服务并围绕它进行一些安全保护。WCF 有一些很好的内置安全功能。

最好的部分是当您决定离开时,您可以保留您的 Web 服务并以相同的方式从 Windows 服务调用它。

于 2012-06-28T13:23:15.107 回答
0

只要您使用持久性作业存储(如数据库)并编写和安排作业,以便他们可以处理诸如中途被杀死的事情,让 IIS 回收您的进程并不是什么大问题。

更大的问题是,如果没有流量,IIS 会关闭您的站点。如果您可以保持您的网站正常运行,那么只需确保您适当地设置了失火策略,并且您的工作存储了从中断的地方恢复所需的任何状态数据,您应该能够完成它。

于 2012-07-05T18:25:05.783 回答
0

如果您与语言无关并且不介意用您最喜欢的 Linux 支持的语言编写“工作激活脚本”...

对我来说效果很好的一种解决方案是:

  1. 获得相对便宜、稳定的 Linux 主机(来自知名公司),
  2. 在您的 .Net 托管平台上创建一个 WCF 服务,该服务将包含您想要定期运行的逻辑(RESTfully 或 SOAP 或 XMLRPC ......无论哪个适合您),
  3. 通过 Linux 托管的cron 作业处理调用,使用您选择的语言编写(我使用 PHP)。

工作得很好,就像我说的。无 VPS 费用,可配置和外部激活。我有一个中心位置可以激活我的工作,正常运行时间为 99% 到 100%(从未发生过任何故障)。

于 2015-01-22T14:24:49.333 回答