新足迹

 找回密码
 注册

精华好帖回顾

· 捣腾不完的院子----2011– 2016~~剧终 (2016-8-26) GardenOfDreams · 澳洲最有人脉的人物David Gonski和其八卦记事 (2011-8-7) patrickzhu
· 我所知道的墨大交换生的申请程序,选课,费用 更新2楼 (2014-9-3) 冬迹之樱 · 听说猫本的同学们比较懒。。。 (2014-11-14) TTYL
Advertisement
Advertisement
查看: 3995|回复: 18

[IT] .NET Scheduler 类型的app怎么做? [复制链接]

发表于 2015-8-14 16:15 |显示全部楼层
此文章由 fademark 原创或转贴,不代表本站立场和观点,版权归 oursteps.com.au 和作者 fademark 所有!转贴必须注明作者、出处和本声明,并保持内容完整
本帖最后由 fademark 于 2015-8-14 15:27 编辑

最近公司的业务,经常会需要做一些scheduler类型的app,有的是每分钟fire,有的是每天,每周或者每个月fire一次。如果遇到时间冲突,等上个job结束后才开始新的job,每个job一般涉及到以下类型的任务:

1. 从Remote FTP/SFTP 下载文件,或者API call得到数据, 导入SQL Server,
2. 从SQL server里面取data, Complex join between tables, aggregate 等等
3. 根据具体数据要求,API call 其他web service, 得到结果update result in SQL server
4. Log result, 发notification email, 如果出错,还要把被影响的数据重新放回queue, 这样等问题修复后才可以继续retry。

问题:

1. 现在我的做法是开发了windows service类型的app(不是windows form) 然后用Quartz.net library来设置好event trigger。 目前这种app不多感觉还可以应付,不过如果以后这类型的app多了,就要维护这些services, 每次改动要用installer 安装, 并且开发web/form app来看logs等
2. 处理Dataset里面Millions of records,特别是需要每条数据做API call的时候,除了for loop, while loop, 有没有更好的方法,感觉把一大堆logic, API call写在Loop里面特别的不好。 是不是可以做个listener之类的class?

有经验的同学,有什么好的方法来实现这些Job? 特别是需要长时间来处理大量数据,有indexing 也需要不少时间处理, 还要API call其他party的web service, 有些Web service还是SOAP XML call,还要分batch不然会timeout。感觉这种fault tolerance不是一般的难manage。

谢谢
Advertisement
Advertisement

发表于 2015-8-14 17:23 |显示全部楼层
此文章由 mengqing 原创或转贴,不代表本站立场和观点,版权归 oursteps.com.au 和作者 mengqing 所有!转贴必须注明作者、出处和本声明,并保持内容完整
本帖最后由 mengqing 于 2015-8-14 16:47 编辑

LZ做.NET的?工资还真高啊

I don't do .NET, but this is what I would do generally

1. persist the job queue with status
2. process each individual jobs in the background, concurrently if possible
3. schedule in crontab
4. create classes for handling different tasks, remember single purpose principle
5. create service object to process each task, remember to capture exceptions and logging, exit immediately after failure and update status
6. continue processing job queues that don't have a complete status
7. once all job queues complete, send result email

发表于 2015-8-14 17:33 |显示全部楼层
此文章由 fly02 原创或转贴,不代表本站立场和观点,版权归 oursteps.com.au 和作者 fly02 所有!转贴必须注明作者、出处和本声明,并保持内容完整
try service broker,
key points:
asynchronize your tasks;
loop checking

发表于 2015-8-14 17:52 |显示全部楼层
此文章由 fademark 原创或转贴,不代表本站立场和观点,版权归 oursteps.com.au 和作者 fademark 所有!转贴必须注明作者、出处和本声明,并保持内容完整
mengqing 发表于 2015-8-14 16:23
LZ做.NET的?工资还真高啊

I don't do .NET, but this is what I would do generally

对,开发主要用.NET,其他也用看项目需要,很多integration, 现学现用,小团队什么都要做要设计出Solution,压力大。

发表于 2015-8-14 17:54 |显示全部楼层
此文章由 fademark 原创或转贴,不代表本站立场和观点,版权归 oursteps.com.au 和作者 fademark 所有!转贴必须注明作者、出处和本声明,并保持内容完整
fly02 发表于 2015-8-14 16:33
try service broker,
key points:
asynchronize your tasks;

谢谢,粗略看了一下是SQL server的extension for Asynchronous processing? 可是我的app需要和其他系统有API call, 只是SQL server不够吧

发表于 2015-8-14 18:08 |显示全部楼层
此文章由 fademark 原创或转贴,不代表本站立场和观点,版权归 oursteps.com.au 和作者 fademark 所有!转贴必须注明作者、出处和本声明,并保持内容完整
mengqing 发表于 2015-8-14 16:23
LZ做.NET的?工资还真高啊

I don't do .NET, but this is what I would do generally

谢谢,你的应该是Unix system吧? 可惜我只能在 AWS windows 里面开发了,对Unix一窍不通  Quatz.net 就是用cron的基础的应用library,从scheduling 角度的确很好用,很少miss fire。 我的问题主要是基于应用层,想问一下其他.NET developer是如何设计scheduler类型程序的, 我的确对这方面了解不多。
Advertisement
Advertisement

发表于 2015-8-14 19:31 来自手机 |显示全部楼层
此文章由 浮云马 原创或转贴,不代表本站立场和观点,版权归 oursteps.com.au 和作者 浮云马 所有!转贴必须注明作者、出处和本声明,并保持内容完整
本帖最后由 浮云马 于 2015-8-14 18:37 编辑

如果是AWS的话,Docker+ECS解决deploy,SQS+lambda实现fault tolerance,scheduling就用marathon或helix吧

评分

参与人数 1积分 +1 收起 理由
fademark + 1 感谢分享

查看全部评分

发表于 2015-8-14 19:54 来自手机 |显示全部楼层
此文章由 mengqing 原创或转贴,不代表本站立场和观点,版权归 oursteps.com.au 和作者 mengqing 所有!转贴必须注明作者、出处和本声明,并保持内容完整
浮云马 发表于 2015-8-14 18:31
如果是AWS的话,Docker+ECS解决deploy,SQS+lambda实现fault tolerance,scheduling就用marathon或helix吧 ...

whats the benefit of using sqs+sns, and what are some of use cases.. im always wondering..

评分

参与人数 1积分 +1 收起 理由
fademark + 1 感谢分享

查看全部评分

发表于 2015-8-14 20:02 来自手机 |显示全部楼层
此文章由 阿乌卵 原创或转贴,不代表本站立场和观点,版权归 oursteps.com.au 和作者 阿乌卵 所有!转贴必须注明作者、出处和本声明,并保持内容完整
Console+windows scheduler

评分

参与人数 1积分 +1 收起 理由
fademark + 1 感谢分享

查看全部评分

发表于 2015-8-14 20:08 来自手机 |显示全部楼层
此文章由 NoChoice 原创或转贴,不代表本站立场和观点,版权归 oursteps.com.au 和作者 NoChoice 所有!转贴必须注明作者、出处和本声明,并保持内容完整
Windows task里面放console app
设定好时间,windows自动调用

评分

参与人数 1积分 +1 收起 理由
fademark + 1 感谢分享

查看全部评分

发表于 2015-8-14 20:08 来自手机 |显示全部楼层
此文章由 浮云马 原创或转贴,不代表本站立场和观点,版权归 oursteps.com.au 和作者 浮云马 所有!转贴必须注明作者、出处和本声明,并保持内容完整
mengqing 发表于 2015-8-14 18:54
whats the benefit of using sqs+sns, and what are some of use cases.. im always wondering..

queue就是设计出发点就是guarentee delivery,所以use case就是出错了需要retry的情况。sns则是用于系统之间decoupling,另外一码事了

评分

参与人数 1积分 +1 收起 理由
fademark + 1 感谢分享

查看全部评分

Advertisement
Advertisement

发表于 2015-8-14 20:18 |显示全部楼层
此文章由 qyz225 原创或转贴,不代表本站立场和观点,版权归 oursteps.com.au 和作者 qyz225 所有!转贴必须注明作者、出处和本声明,并保持内容完整
本帖最后由 qyz225 于 2015-8-14 19:22 编辑

直接ssis + sql agent 分分钟搞定

sftp要用一下wniscp,否则sftp 都是收费的,execute process task搞定
soap api和restful在data flow里面script component做data source
剩下的log和checkpoint都是ssis基本功能

评分

参与人数 1积分 +1 收起 理由
fademark + 1 的确在用winscp

查看全部评分

发表于 2015-8-15 22:02 |显示全部楼层
此文章由 炸鸡翅 原创或转贴,不代表本站立场和观点,版权归 oursteps.com.au 和作者 炸鸡翅 所有!转贴必须注明作者、出处和本声明,并保持内容完整
1. 现在我的做法是开发了windows service类型的app(不是windows form) 然后用Quartz.net library来设置好event trigger。 目前这种app不多感觉还可以应付,不过如果以后这类型的app多了,就要维护这些services, 每次改动要用installer 安装, 并且开发web/form app来看logs等


--- 你现在是有多个windows service/app么?如果是多个的话,维护以及升级太麻烦,实在没有这个必要。其实一个 Scheduling Service 足够了,这个Service就是起到触发event的作用。至于触发以后的业务逻辑可以放在这个Service里面或者另外写一个web api(Scheduling Service 调用这个api)。

另外特别要指出的是,Quartz.net 号称是可以被用在asp.net 里面的 (Quartz.net已经是一个scheduling library了,不一定要windows service 的),换句话说,你可以创建一个MVC web app, 里面安装Quartz.net,这样就可以在一个web app里面使用Quartz.net直接触发event,同时通过web 来显示log。这样升级维护起来也比windows service 方便的多。

2. 处理Dataset里面Millions of records,特别是需要每条数据做API call的时候,除了for loop, while loop, 有没有更好的方法,感觉把一大堆logic, API call写在Loop里面特别的不好。 是不是可以做个listener之类的class?


--- 每条record都要调用api 么?这个api 是你自己维护还是external的?如果是自己的,能不能改成bulk processing? 这样可以大量减少调用api 的次数。如果不喜欢用Loop,可以放到queue里面,然后慢慢处理? 个人觉得在loop里面调用api 不是什么大问题。


有经验的同学,有什么好的方法来实现这些Job? 特别是需要长时间来处理大量数据,有indexing 也需要不少时间处理, 还要API call其他party的web service, 有些Web service还是SOAP XML call,还要分batch不然会timeout。感觉这种fault tolerance不是一般的难manage。


--- 调用 web service 或者 api (特别是external的),报错以及timeout 都很常见,关键的是要做好处理,比如:错误后retry,以及log错误等等。


你给的信息还是不够详细,所以只能给这些建议了。另外,你可以看看Hangfire,你或许会对这个感兴趣,Hangfire和Quartz.net虽然看着有点类似,但是两者本质上有区别,运用场合也不太一样(虽然有些overlapping的地方)。一个是基于message queue的,一个是基于Scheduler 的。

评分

参与人数 1积分 +3 收起 理由
fademark + 3 谢谢奉献

查看全部评分

发表于 2015-8-16 16:45 |显示全部楼层
此文章由 浮云马 原创或转贴,不代表本站立场和观点,版权归 oursteps.com.au 和作者 浮云马 所有!转贴必须注明作者、出处和本声明,并保持内容完整
炸鸡翅 发表于 2015-8-15 21:02
--- 你现在是有多个windows service/app么?如果是多个的话,维护以及升级太麻烦,实在没有这个必要。其 ...

补充一点,idempotency很重要,尤其是API call没法回滚,所以能保证同样的call返回同样的结果,就省了很多麻烦

发表于 2015-8-17 12:36 |显示全部楼层
此文章由 fademark 原创或转贴,不代表本站立场和观点,版权归 oursteps.com.au 和作者 fademark 所有!转贴必须注明作者、出处和本声明,并保持内容完整
炸鸡翅 发表于 2015-8-15 21:02
--- 你现在是有多个windows service/app么?如果是多个的话,维护以及升级太麻烦,实在没有这个必要。其 ...

非常感谢,您的回复是最适用于我的开发环境和需要的。
1. 的确是多个services,不同类型的job, 您这个建议很好,一个scheduling app, 然后call 多个web service apps,这样解决了scalability 问题, 直接用web app来监控

2.第三方的web service 我是不能改的,有的只能每条处理,,没有bulk option,大数据量的job还是很容易出错的。

3. 当job多了,的确这个比较难,所以想设计一个master scheduling app 管理所有的报错, retry on demand 等

发表于 2015-8-17 12:37 |显示全部楼层
此文章由 fademark 原创或转贴,不代表本站立场和观点,版权归 oursteps.com.au 和作者 fademark 所有!转贴必须注明作者、出处和本声明,并保持内容完整
浮云马 发表于 2015-8-16 15:45
补充一点,idempotency很重要,尤其是API call没法回滚,所以能保证同样的call返回同样的结果,就省了很 ...

谢谢! 这个词都没听过,足迹高人多,学习了
Advertisement
Advertisement

发表于 2015-8-17 13:51 |显示全部楼层
此文章由 holman8581 原创或转贴,不代表本站立场和观点,版权归 oursteps.com.au 和作者 holman8581 所有!转贴必须注明作者、出处和本声明,并保持内容完整

发表于 2015-8-17 14:13 |显示全部楼层
此文章由 bookfish 原创或转贴,不代表本站立场和观点,版权归 oursteps.com.au 和作者 bookfish 所有!转贴必须注明作者、出处和本声明,并保持内容完整

发表于 2015-8-18 00:25 |显示全部楼层
此文章由 炸鸡翅 原创或转贴,不代表本站立场和观点,版权归 oursteps.com.au 和作者 炸鸡翅 所有!转贴必须注明作者、出处和本声明,并保持内容完整
fademark 发表于 2015-8-17 11:36
非常感谢,您的回复是最适用于我的开发环境和需要的。
1. 的确是多个services,不同类型的job, 您这个建 ...

没什么,不用那么客气。

关于第一点 Scheduling Service 调用 web api,web api 千万不能随随便便被调用,至少要做个简单的安全控制。简单的话,就用password/token就行了。复杂系统,需要专门架一个Auth Server/Service。这当然要根据你们公司的规模以及系统的复杂程度来决定使用不同的解决方案。

其实做这些系统设计和软件设计类似,都需要考虑single responsibility principle。当你有多个App/Service,都用到了相同的逻辑(比如说需要触发event),你就要考虑把它提取出来作为一个独立的Service。

发表回复

您需要登录后才可以回帖 登录 | 注册

本版积分规则

Advertisement
Advertisement
返回顶部