沈阳网站网站建设,广东如何做企业网站设计,网页设计1920尺寸,保定seo管理前言本篇会继续讲解Sikiro.SMS.Job服务的实现#xff0c;在我写第一篇的时候#xff0c;我就发现我当时设计的架构里Sikiro.SMS.Job这个可以选择不需要#xff0c;而使用MQ代替。但是为了说明调度任务使用实现也坚持写了下。后面会一篇针对架构、实现优化的讲解。源码地址在我写第一篇的时候我就发现我当时设计的架构里Sikiro.SMS.Job这个可以选择不需要而使用MQ代替。但是为了说明调度任务使用实现也坚持写了下。后面会一篇针对架构、实现优化的讲解。源码地址https://github.com/SkyChenSky/Sikiro.SMSQuartz的简介Quartz.NET是一款功能齐全的开源作业调度框架小至的应用程序大到企业系统都可以适用。Quartz是作者James House用JAVA语言编写的而Quartz.NET是从Quartz移植过来的C#版本。Quartz.Net的作用Quartz.Net是多线程的允许多个JOB同时执行。Quartz.Net可以进行持久化结合管理后台可以进行可视化的监控Quartz.Net提供API进行远程操控结合管理后台可以进行运维管理在一般企业可以利用Quartz.Net框架做各种的定时任务例如数据迁移、跑报表等等。Cron表达式字段名是否必填值范围特殊字符SecondsYES0-59, - * /MinutesYES0-59, - * /HoursYES0-23, - * /Day of monthYES1-31, - * ? / L WMonthYES1-12 or JAN-DEC, - * /Day of weekYES1-7 or SUN-SAT, - * ? / L #YearNOempty, 1970-2099, - * /缺点Quartz.Net的缺点很明显没有自带的管理后台而同款的Hangfir调度任务框架则会有更加良好的易用性。但是在Github上有不少人开源了Quartz.Net的管理后台对此作为了弥补。其他其他Quartz.Net的信息可以看我之前记录的一篇文章《Quartz.NET的使用附源码》Quartz.Net DEMO:https://github.com/SkyChenSky/QuartzDotNetDemo.git业务流程从MongoDB持久化的数据查询出状态为待处理并且定时时间小于当前时间的数据。通过Mongo驱动提供的FindOneAndUpdate对文档进行原子性操作更新中间状态并查询出刚更新的文档。如果有数据则发送到MQ由Sikiro.SMS.Bus进行订阅发送因为本次有数据我认为可能还会有其他需要发送的数据因此立刻调用JOB自身方法进行下一条需要处理的数据进行发送。如果此次JOB的执行并没有数据那么认为接下来一段时间没有需要处理的数据这次调度结束。TimeSendSms示例Mongo的原子性原子性原子是物理概念指的是指化学反应不可再分的基本微粒。而计算机领域的原子性强调的对象是操作指令、事务。我们所说的指令组是原子操作意思要么一起成功要么一起失败。不允许2个指令里一个成功一个失败的情况存在。MongoDB 原子操作MongoDB的原子操作就是要么这个文档完整的保存到Mongodb要么没有保存到Mongodb不会出现查询到的文档没有保存完整的情况。MongoDB的文档的保存修改删除等操作都是原子性除此之外还提供了FindOneAndDelete、FindOneAndUpdate、FindOneAndReplace等原子操作。以FindOneAndUpdate为例对某文档FindOneAndUpdate可以文档B进行Update操作完成后返回出文档B的结果根据参数返回结果是更新前还是更新后一般我们需要更新后。而这FindOneAndUpdate的操作对于我们更新到中间状态的非常实用避免进行Update后无法良好的查询到刚Update的文档避免应用集群部署时批量更新后无法良好分配任务批量更新多个文档需要isolated标识隔离全局锁在大并发情况下性能并不乐观虽然以上可以通过更新时标识版本号进行解决这无疑增加实现难度。MongoDB锁机制Mongodb并发操作又读写锁来进行控制。简单来说当进行读操作的时候会加读锁这个时候其他读操作可以也获得读锁但是不能加写锁也就是说不能进行写操作。当进行写操作的时候会加写锁这个时候其他操作无法加任何锁也就是说不能进行其他的读操作和写操作。多个JOB的并发性综上所述落实到我们应用场景在部署多个调度任务服务或者JOB多个线程去跑时我们可以使用FindOneAndUpdate每个调度任务每次只处理一个文档Update操作的时候会进行写锁阻塞其他进程进程的写操作。那么就可以保证每个调度任务都可以只处理唯一一个有效的文档避免重复处理。下面是我的Sikiro.Nosql.Mongo的FindOneAndUpdate封装示例因为Update字段的不友好所以我封装了一下Lambda表达式ReturnDocument ReturnDocument.After标识响应数据是更新前还是更新后的文档。SQL Server的UpdateSelectSQL Server的操作也具有上述FindOneAndUpdate的功能我们公司成他为UpdateSelect下面是示例代码结尾本篇介绍了调度任务结合MongoDB原子操作的使用使得调度任务服务可以具有良好的伸缩性。如果有任何建议与问题可以在下方评论反馈给我。相关文章.net core实践系列之短信服务-为什么选择.net core开篇.net core实践系列之短信服务-架构设计.net core实践系列之短信服务-Sikiro.SMS.Api服务的实现原文地址: https://www.cnblogs.com/skychen1218/p/9621844.html.NET社区新闻深度好文欢迎访问公众号文章汇总 http://www.csharpkit.com