深圳定制网站制作报价/百度广告怎么推广

深圳定制网站制作报价,百度广告怎么推广,wordpress catchy,武汉婚纱摄影网站建设前言本篇会继续讲解Sikiro.SMS.Job服务的实现,在我写第一篇的时候,我就发现我当时设计的架构里Sikiro.SMS.Job这个可以选择不需要,而使用MQ代替。但是为了说明调度任务使用实现也坚持写了下。后面会一篇针对架构、实现优化的讲解。源码地址&a…

前言

本篇会继续讲解Sikiro.SMS.Job服务的实现,在我写第一篇的时候,我就发现我当时设计的架构里Sikiro.SMS.Job这个可以选择不需要,而使用MQ代替。但是为了说明调度任务使用实现也坚持写了下。后面会一篇针对架构、实现优化的讲解。

源码地址:https://github.com/SkyChenSky/Sikiro.SMS

Quartz的简介

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 W
MonthYES1-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

业务流程

640?wx_fmt=png

从MongoDB持久化的数据,查询出状态为待处理并且定时时间小于当前时间的数据。通过Mongo驱动提供的FindOneAndUpdate对文档进行原子性操作(更新中间状态并查询出刚更新的文档)。如果有数据则发送到MQ,由Sikiro.SMS.Bus进行订阅发送,因为本次有数据,我认为可能还会有其他需要发送的数据,因此立刻调用JOB自身方法,进行下一条需要处理的数据进行发送。如果此次JOB的执行并没有数据,那么认为接下来一段时间没有需要处理的数据,这次调度结束。

TimeSendSms示例

640?wx_fmt=png

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标识响应数据是更新前还是更新后的文档。

640?wx_fmt=png

SQL Server的UpdateSelect

SQL Server的操作也具有上述FindOneAndUpdate的功能,我们公司成他为UpdateSelect,下面是示例代码:

640?wx_fmt=png

结尾

本篇介绍了调度任务结合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

640?wx_fmt=jpeg

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/319960.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

Drainage Ditches POJ1273

Time Limit: 1000MS Memory Limit: 10000K Total Submissions: 93263 Accepted: 36174试题链接 文章目录Description题意:题解:代码:Dinic做法EK做法Description Every time it rains on Farmer John’s fields, a pond forms over Bessie’…

P2756 飞行员配对方案问题【网络流24题】

P2756 飞行员配对方案问题 文章目录题目背景题解:代码:题目背景 第二次世界大战期间,英国皇家空军从沦陷国征募了大量外籍飞行员。由皇家空军派出的每一架飞机都需要配备在航行技能和语言上能互相配合的两名飞行员,其中一名是英国…

大数据分析中使用关系型数据库的关键点

相当一部分大数据分析处理的原始数据来自关系型数据库,处理结果也存放在关系型数据库中。原因在于超过99%的软件系统采用传统的关系型数据库,大家对它们很熟悉,用起来得心应手。在我们正式的大数据团队,数仓(数据仓库H…

图论复习——最小生成树MST

知识点 MST的构造 Boruvka算法常用于解决这类问题:给你n个点,每个点有点权,任意两个点之间有边权,边权为两个点权用过某种计算方式得出,求最小生成树。动图 MST上的确定性和存在性问题 最小生成树的两个性质&#xf…

Ocelot简易教程(二)之快速开始1

Ocelot是为.net core量身定做的,目前是基于 netstandard2.0进行构建的。.NET Core 2.1中如何使用呢?安装NuGet package使用nuget安装Ocelot及其依赖项。您需要创建一个netstandard2.0项目并将其Package安装到项目中。然后按照下面的“启动”和“ 配置”节…

P2761 软件补丁问题

文章目录题目描述题解:代码:添加链接描述题目描述 T 公司发现其研制的一个软件中有 n 个错误,随即为该软件发放了一批共 m 个补丁程序。每一个补丁程序都有其特定的适用环境,某个补丁只有在软件中包含某些错误而同时又不包含另一些…

Xamarin中国技术社区及BXUG官网上线啦

Xamarin中国技术社区及BXUG官网为.NET开发者提供移动跨平台技术学习的园地,为Xamarin及.NET技术达人提供展示分享的舞台, 为企业CTO等技术负责人提供跨平台移动应用解决方案的交流平台!网址链接:http://bxug.bopoda.cn/Xamarin中国…

用python将图片转换成二值图像

大创项目是图像识别,第一个任务是将一个图片转换成二值图像 之前用过python的numpy和turtle,这次要用到图像库PIL的类Image,也算是刚刚从零开始学起 整体效果(用01串表示图像) 原理很简单:将图片中黑色…

.Net Core SignalR 初体验

前言Asp.Net SignalR已经出来很久了,但是一直没有静下心来好好看看。昨天花了几个小时的时间看了下。首先借鉴了官方文档,如何搭建一个SignalR的Demo。参考文章:https://docs.microsoft.com/zh-cn/aspnet/core/tutorials/signalr?viewaspnet…

CF1251F-Red-White Fence【NTT】

前言 刚开始看错题推了半天的生成函数 正题 题目链接:https://www.luogu.com.cn/problem/CF1251F 题目大意 nnn个白色木板,kkk个红色木板,给出这些木板的高度,木板排成一排形成栅栏。栅栏要求只有一个红色木板且在红色木板左边单调升&…

图论复习——dfs树,点双,边双,强连通分量

知识点 dfs树 对一个图运行 dfs 算法,每个点uuu的父亲定义为第一次遍历uuu时的前驱结点,若无则为根。 无向图的 dfs树 没有横叉边。 有向图的 dfs树 横叉边方向唯一,总是从后访问的点指向先访问的点。 dfs树详解 tarjan 点双 定义&#…

【点分治】Tree(luogu 4178/金牌导航 点分治-1)

Tree luogu 4178 金牌导航 点分治-1 题目大意 给出一棵树,问你书中路径长度小于等于k的点对个数有多少个 输入样例 5 1 2 3 1 3 1 1 4 2 3 5 1 4输出样例 8数据范围 1⩽N⩽41041\leqslant N \leqslant 4\times 10^41⩽N⩽4104 解题思路 对于该树&#xff0…

均分纸牌问题

均分纸牌有三种情况:线性,环形,二维 文章目录线性题目描述思路:代码:环形题目描述思路代码线性 题目描述 P1031 均分纸牌 有N堆纸牌,编号分别为1,2,…,N。每堆上有若干张,但纸牌总数必为N的倍…

.net core实践系列之短信服务-Api的SDK的实现与测试

前言上一篇《.net core实践系列之短信服务-Sikiro.SMS.Api服务的实现》讲解了API的设计与实现,本篇主要讲解编写接口的SDK编写还有API的测试。或许有些人会认为,SDK的编写可以不需要,既然已经用了RESTful web服务与Swagger提供的接口描述&…

[集训队作业2018] count(笛卡尔树,生成函数,卡特兰数)

传送门 什么情况下两序列同构 对于两序列A[1,n],B[1,n]A[1,n],B[1,n]A[1,n],B[1,n],设fA(1,n)pa,fB(1,n)pbf_A(1,n)p_a,f_B(1,n)p_bfA​(1,n)pa​,fB​(1,n)pb​, 若pa̸pbp_a\notp_bpa​​pb​,A,BA,BA,B一定不同构。若papbp_ap_bpa​p…

P4016 负载平衡问题

文章目录题目描述题解:方法一:代码:方法二:P4016 负载平衡问题题目描述 G 公司有 n 个沿铁路运输线环形排列的仓库,每个仓库存储的货物数量不等。如何用最少搬运量可以使 n 个仓库的库存数量相同。搬运货物时&#xff…

Ocelot简易教程(二)之快速开始2

为什么这篇的标题叫“Ocelot简易教程(二)之快速开始2”呢,因为很多朋友跟我说上一篇“ Ocelot简易教程(二)之快速开始1”内容太少了,只是简单介绍Ocelot的一些简单配置,让Ocelot能跑起来&#x…

.NET的前世今生与将来

笔者注谨以此文纪念我敬重的2016年9月17日去世的 装配脑袋 逝世两周年让大家久等了,前后花了1年的时间,几经改版,终于完成撰写了一万字长文,回顾和展望.NET这16年来的成功与失败。最终能成文是因为我给自己承诺必须赶在 装配脑袋 …

P4011 孤岛营救问题

P4011 孤岛营救问题 文章目录输入输出样例题意:题解:代码:输入输出样例 输入 4 4 9 9 1 2 1 3 2 1 2 2 2 0 2 1 2 2 0 2 1 3 1 0 2 3 3 3 0 2 4 3 4 1 3 2 3 3 0 3 3 4 3 0 4 3 4 4 0 2 2 1 2 4 2 1输出 14题意: (原题太长我就…

[NOI2014] 起床困难综合症(二进制,贪心)

#include<bits/stdc.h> int n,m,ans,x,a10,a2-1; //-1的补码:11111111111... char str[5]; int main(){scanf("%d%d",&n,&m);while(n--){scanf("%s%d",str,&x);if(str[0]A) a1&x, a2&x;if(str[0]X) a1^x, a2^x;if(str[0]O) a1|…