我有一个有趣的问题需要解决。我的一位客户让我开发了一个库存分析程序,该程序具有近千年符号的近50年库存数据。我已经开发了一系列过滤器,可以在任何一天使用,看看是否有什么东西可以用于交易。
我们希望为每个库存的每天数据运行此过滤器。基本上是您的开始和结束日期类型报告。但是,每个符号每周需要6分钟。我们计算大约40个小时左右来运行整个数据集的报告。
最重要的要求是我的客户可以在任何地方从任何计算机上做任何事情(他经常旅行),所以我们是基于浏览器的。
要解决此问题,我编写了一个运行此报告的异步方法,但应用程序池不活动计时器将终止该作业。我不想开始调整整个应用程序的超时以支持这一个报告(我们将会做很多这样的事情,因为每个库存场景都需要针对我们的整个数据集进行分析才能用于分析积极交易)。
有没有人对支持超长期异步过程的网络架构有任何一般想法或经验?
由于
答案 0 :(得分:17)
作为一般性建议,我建议使用独立的Windows服务,控制台应用程序或类似的非常小心的生命周期控制和日志记录,这将持续运行并检查(轮询)数据库中的“要处理的作业”,然后更新数据库结果和进度信息。
这可能不是最好的方式,但我多次使用过它,它可靠,可扩展且性能良好。
最好将网络请求保持一分钟或两分钟 - 它们从未设计用于繁重的处理时间。这样,您可以每分钟左右“登记”作业状态(使用Web服务)。
如果您对我有任何疑问或想法,请发表评论&我很乐意提供帮助,阐述或建议......
希望有所帮助!
(补充:我相信Windows服务未得到充分利用!所需要的只是一个快速的基类或可重复使用的帮助方法集合,您可以在您的服务下运行一个记录的,可靠的,自动的,可配置的,快速实现的流程控制。快速原型化!)
答案 1 :(得分:6)
是否有任何理由不在后台运行服务并将单个结果集存档到请求的只读结果表中?您需要实时运行查询吗?应用程序可以在服务生成结果时检索结果页面。
答案 2 :(得分:5)
听起来您正在直接针对这些数据进行SQL查询。您是否考虑过将数据加载到例如SQL Server Analysis Services并设置一个多维数据集(对于初学者)时间,股票和符号维度?根据查询的性质,您可能会进入相当合理的响应时间。关系数据库适用于在线事务处理(在某些负载和响应时间参数内),但分析工作有时需要数据仓库的方法和技术。 (或者,或许,关联数据库......还有替代方案。)
然而,考虑到墨菲,你可能会有一些长时间运行的查询。不同最终用户的数据是否有所不同?如果没有,为什么不预先计算答案呢?没有什么基于http应该花费超过一分钟来处理,如果在那 - 至少不是设计!
答案 3 :(得分:3)
根据过滤器的具体情况,这听起来像是可以从并行化中受益的任务 - 将查询拆分为在数据的子集(分片)上运行过滤器的多个计算节点。如果您的过滤器专注于分析大量时间数据中的一个库存,则可以拆分库存符号上的工作,并让多个计算节点同时处理不同的库存符号。如果您需要随着时间的推移研究股票代码之间的关系,那么按时间间隔分割工作并在操作之后合并结果(mapreduce)可能更有意义。这种情况下,在问题上投入更多硬件实际上可以大大提高响应时间。以Google搜索引擎为例。
通常的警告适用:首先检查当前的过滤器实现是否存在性能瓶颈。确保您正在击中的表格被适当地编入索引等。事先准确计算经常需要的计算的关系和摘要。如果节省时间,存储便宜。
您的Web请求可以启动分散/收集查询操作,将查询分发到云中的可用计算节点(Windows Azure,Google Apps,Amazon)。如果有足够的计算节点和适当的工作分配,您可以近乎实时地获得响应。
答案 4 :(得分:2)
通常,超长的异步过程不会在网上出现。
他的请求应该排队,另一个进程应该运行该作业并以用户将使用它的格式存储数据。
答案 5 :(得分:2)
过滤一周的数据需要六分钟?好像你的数据库需要正确的索引微调。
答案 6 :(得分:2)
我建议您阅读有关Asynchronous Procedure Execution的文章。如果逻辑是数据库绑定的(它肯定是这样),那么这就提供了一种完全可靠的方式来以异步方式启动计算任务,该方式对故障转移具有弹性。鉴于您的负载是高度可兼容的,您可以启动多个任务,例如。每个股票代码一个,请参阅后续文章Passing Parameters to a Background Procedure。
作为旁注,这种利用内置SQL Server异步激活的技术至少被我所知道的两家主要金融公司使用,与您的情况完全相同。
答案 7 :(得分:1)
我不知道为什么每个人都在这里回答要在数据库中完成所有工作,但是工作控制应该在外面。这就像把汽车的点火钥匙放在外面一样。实际上,我知道为什么。你用wcf标记了这个问题。
使用“计算节点”的建议刚刚完成了我的流行语宾果游戏,感谢dthorpe! 你不需要“计算节点”只是核心。大多数RDBMS都内置了PX(并行执行)。为什么要支付你每天使用的云计算,只需购买一台CPU足够的服务器,你就没事了......不需要“分散聚集”查询,只需打开PX ......
Pontus指出你正确的方向。对6分钟的表现感到满意,并担心如何安排这是你的问题。有许多策略可以将数据管理为可提高速度的格式。索引,分区,立方体,物联网。你可能会做两次传递排序而不是内存排序。您的统计数据可能已过时,导致计划错误。
我假设你没有从这个问题的主题中完成大量的数据库调优。你真的应该发布一个数据库调优问题并告诉我们你正在使用的RDBMS以及你已经调整了多远。
答案 8 :(得分:1)
麦克,
有很多方法可以回答这个问题,但我认为你应该问的更重要的问题是,为什么需要6分钟来过滤股票?
是的我知道你有50年的数据和大量的股票,但不应该花6分钟。更重要的是,我会查看特定的表结构,那里的索引和查询以及它正在做什么。
我曾经在一家类似的公司工作,每个表几乎都是100Gb。是表的大小,而不是整个数据库,经过一些微调后得到的查询过去需要15分钟+下降到3秒。
如果你在SQL Server上运行,我很乐意帮助你。给我发电子邮件ryk99 [at] hotmail [dot] com,我们会看到我们可以从那里做些什么。
答案 9 :(得分:0)
您是否考虑使用SSIS等ETL解决方案来预先填充数据?