.Net Core 商城微服务项目系列(十五): 构建定时任务调度和消息队列管理系统

一.系统描述sql

嗨,很久不见各位老哥,最近有点懒,技术博客写的太少了,由于最近在写小说,写的顺利的话说不定就转行了,哈哈哈哈哈哈哈哈哈。数据库

今天要介绍的是基于.Net Core的定时任务调度和消息队列管理系统。相信你们对这两个确定都已经很熟悉了,在开发过程当中,这两个组件扮演了不可或缺的角色:windows

消息队列帮助咱们进行 ”解耦“、”异步“、”削峰“架构

定时任务帮助咱们进行 "后台"、”监控"、“补偿"异步

定时任务调度系统你们都介绍过不少次了,园子里的不少文章我也都拜读过,我相信你们实际的工做中确定也都在频繁的使用它。目前主流的组件有 Quartz和Hangfire两种,在二者的选择上来讲建议你们熟悉哪一个用哪一个就能够,Hangfire是自带UI管理界面的,因此若是想直接接入系统而且不想再进行二次开发作UI,能够直接选择Hangfire。优化

由于我对于Quartz更熟悉,因此本系统的定时任务调度基于Quartz开发,消息队列基于RabbitMQ,同时有一套UI,用于可视化操做定时任务调度和管理消息队列配置。spa

本系统是开发自用的,原型是公司工做中使用的系统,私下里重写了一套后台代码,可是UI仍是公司的那一套,由于是自用,因此没法达到直接开箱即用的效果,写这篇的目的只是但愿分享二者的使用方式和场景,帮助各位在遇到相同应用场景的问题时可以有更多解决思路。插件

 

二.功能介绍设计

1.MQ界面化动态配置,对代码几乎无入侵。(固然你仍是须要引用nuget用来Publish消息的)3d

2.提供定时任务调度功能。(基于Quartz,能够精确到秒,执行方式包括接口、sql脚本、elk)

3.基于数据库脚本的异常数据监控。(经过定时任务调度系统执行监控的sql脚本)

3.自动补偿。(当异常数据经过sql脚本监控出来后,发送MQ到指定消费接口进行数据处理)

 

3、系统架构介绍

整个系统包括六部分:

1. MI.MessageQueue:消息队列基础组件,就是咱们用来操做RabbitMQ的一系列方法。

2.MI.MQStationServer:消息队列管理服务,提供包括消息队列的增删改查接口,消费MQ消息。

3.MI.Service.Blade:定时任务调度管理服务,提供定时任务相关的一系列操做接口。

4.MI.Biz.MQStation:消息队列windows服务,用于消费MQ,主要是创建相关的消息消费者,并转发消息到消息队列管理服务。

5.MI.Biz.Blade:定时任务windows服务,用于建立及转发相应的任务,真正的执行在MI.Service.Blade服务。

6.MI.Monitor.Web:UI管理界面,以上二者全部的增删改查都在这里。

 

如下是定时任务调度系统间的交互:

 

 

 

简单描述一下,用户在MI.Monitor.Web系统中经过界面化的操做建立定时任务,其会调用API接口也就是MI.Service.Blade服务,将操做的数据写入数据库,对于增删改,数据库写入完成后会发送一条MQ消息,Windows服务MI.Biz.Blade收到MQ消息后,根据消息中的数据添加或更改Quartz配置信息,对于定时任务Quartz彻底基于代码动态化建立和删除。这样交互的好处一方面是解耦,这个比较明显,这里解耦带来的一个好处是异常隔离,自己三者之间的分工不一样,对于发生问题的一方只在内部消化;第二点好处是方便横向扩展,不管是Windows服务仍是API均可以根据自身的负载动态加减机器。固然,对于WIndows服务咱们要作集群,经过Zookeeper能够实现,防止单点故障。

 

如下是消息队列系统的交互:

 

 

 看起来和上面的定时任务调度交互好像差很少,不过这个地方的麻烦点其实在于基础组件的编写,就是MI.MessageQueue里面的一系列RabbitMQ操做,目前支持单消息、批量消息、延时消息,延时消费须要借助RabbitMQ官方提供的 ”rabbitmq_delayed_message_exchange“插件,有须要的话能够去了解如下,官方的API支持该操做。

仍是照例描述一下消息队列的数据交互流程,用户在MI.Monitor.Web系统中经过界面化的操做建立或者更新消息队列,其会调用API接口也就是MI.MQStationServer服务,将操做的数据写入数据库,写入完成后会建立交换器(Exchange),而后发送MQ消息,Windows服务MI.Biz.MQStation收到消息后,将队列和RouteKey绑定到对应的交换器,同时建立消费者,绑定监听回调,该回调只是看成一个转发,收到消息后会经过接口将数据发送到MI.MQStationServer服务,根据在UI中配置的RouteKey和要消费的接口进行消费处理。

 

消息队列这样设计的好处之一是解耦,同时异常隔离,这个就不说了,你们都明白;固然最重要的好处就是能够动态扩展,消费压力大,多启动几个windows服务和API服务,就是多加些消费者,这个理解起来也比较简单。

 

 

4、优化和展现

对于消息队列系统目前还在开发中的功能是消息的数量统计,该系统是支持查看每一个队列未消费的消息量,可是还没开发完成,这边博文会一直更新的。

下面是系统的部分界面:

 

 

 

 

 

 

定时任务界面:

 

 

 

 

相关文章
相关标签/搜索