CAP带你轻松玩转Asp.Net Core消息队列
CAP是什么?
CAP是由我们园子里的杨晓东大神开发出来的一套分布式事务的决绝方案,是.Net Core Community中的第一个千星项目(目前已经1656 Star),具有轻量级、易使用、高性能等特点。
https://github.com/dotnetcore/CAP
本博客主要针对易用性这一点,展开叙述,一起看看CAP如何结合EF Core和RabbitMQ带领小白轻松走入分布式消息队列的世界。
准备
首先,你需要搭建一套RabbitMQ系统,搭建过程在此不再叙述,如果大家觉得麻烦,可以用我搭好的。
HostName: coderayu.cn UserName:guest Password:guest (仅仅可用作实验,数据丢失不负责)
创建Asp.Net Core 项目,并引入Nuget包
你可以运行以下下命令在你的项目中安装 CAP。
PM> Install-Package DotNetCore.CAP
如果你的消息队列使用的是 Kafka 的话,你可以:
PM> Install-Package DotNetCore.CAP.Kafka
如果你的消息队列使用的是 RabbitMQ 的话,你可以:
PM> Install-Package DotNetCore.CAP.RabbitMQ
CAP 提供了 Sql Server, MySql, PostgreSQL 的扩展作为数据库存储:
// 按需选择安装你正在使用的数据库
PM> Install-Package DotNetCore.CAP.SqlServer
PM> Install-Package DotNetCore.CAP.MySql
PM> Install-Package DotNetCore.CAP.PostgreSql
创建DbContext
因为我采用的是EF Core,所以首先要创建一个DbContext上下文,代码如下:
public class CapDbContext:DbContext
{
public CapDbContext(DbContextOptions options) : base(options)
{
}
}
Startup配置
首先需要在ConfigureServices函数中进行相关服务的注入,对应的操作和功能解释如下:
public void ConfigureServices(IServiceCollection services)
{
//注入DbContext上下文,如果用的是Mysql可能还需要添加Pomelo.EntityFrameworkCore.MySql这个Nuget包
services.AddDbContext<CapDbContext>(options =>
options.UseMySql("Server=127.0.0.1;Database=testcap;UserId=root;Password=123456;")); //配置CAP
services.AddCap(x =>
{
x.UseEntityFramework<CapDbContext>(); //启用操作面板
x.UseDashboard();
//使用RabbitMQ
x.UseRabbitMQ(rb =>
{
//rabbitmq服务器地址
rb.HostName = "coderayu.cn"; rb.UserName = "guest";
rb.Password = "guest"; //指定Topic exchange名称,不指定的话会用默认的
rb.ExchangeName = "cap.text.exchange";
}); //设置处理成功的数据在数据库中保存的时间(秒),为保证系统新能,数据会定期清理。
x.SucceedMessageExpiredAfter = * ; //设置失败重试次数
x.FailedRetryCount = ;
}); services.AddMvc().SetCompatibilityVersion(CompatibilityVersion.Version_2_1);
}
最后还要再Congiure中启用CAP中间件
public void Configure(IApplicationBuilder app, IHostingEnvironment env)
{
if (env.IsDevelopment())
{
app.UseDeveloperExceptionPage();
}
//启用cap中间件
app.UseCap(); app.UseMvc();
}
利用EF Core生成CAP数据库
再程序包管理控制台中依此输入以下命令行
PM> Add-Migration Init
PM> update-database
如果成成功执行,那么打开数据库,就可以看到用来存储CAP发送和接收数据的表格了。

表格中每列的含义如下:

消息的发送和订阅
我们直接在ValuesController的基础上进行改造。
在 Controller 中注入 ICapPublisher 然后使用 ICapPublisher 进行消息发送
private readonly ICapPublisher _publisher;
public ValuesController(ICapPublisher publisher)
{
_publisher = publisher;
}
发送消息
[HttpGet]
public string Get(string message)
{
//"cap.test.queue"是发送的消息RouteKey,可以理解为消息管道的名称
_publisher.Publish("cap.test.queue",message); return "发送成功";
}
订阅消息
//"cap.test.queue"为发送消息时的RauteKey,也可以模糊匹配
//详情https://www.rabbitmq.com/tutorials/tutorial-four-dotnet.html
[CapSubscribe("cap.test.queue")]
public void HandleMessage(string message)
{
Console.Write(DateTime.Now.ToString()+"收到消息:"+message);
}
Run
启动程序后,首先看到CAP启动成功

紧随其后,消费者也就是我们的订阅方法在RabbitMQ服务器上注册成功。

发送消息,发送成功,如下

发送后,立即在控制台看到了订阅方法输出的结果。

消息的失败重试
在订阅方法中,如果抛出异常,那么CAP就会认为该条消息处理失败,会自动进行重试,重试次数在前方已经进行了配置。
我们把订阅方法做一个改动,打印接收的信息到控制台中,并抛出异常
//"cap.test.queue"为发送消息时的RauteKey,也可以模糊匹配
//详情https://www.rabbitmq.com/tutorials/tutorial-four-dotnet.html
[CapSubscribe("cap.test.queue")]
public void HandleMessage(string message)
{
Console.WriteLine(DateTime.Now.ToString()+"收到消息:"+message);
throw new Exception("测试失败重试");
}
可以看到,立即进行了三次重试

可是在前面,我们设置的失败重试次数是5次,为什么这里只重试三次吗?是不是要叫晓东过来改BUG了呢
?当然不是。
观察发现,CAP重试的前三次是立即进行的,而后面的重试,是每隔一段时间进行的,当在分布式通讯的过程中,可能出现了问题确实不会立即修复解决,可能过了一定时间,系统就自动恢复了,如网络抖动。
CAP仪表盘

发送成功了五条消息,成功接收处理了三条,两条处理失败,处理失败的任务,我们可以直接在面板中进行重新消费,可谓非常方便。

同时,处理失败的消息,点击消息的编号后,可以查看到消息的内容和异常原因。

CAP如此强大,让消息队列这种高大上产品操作So Easy,学会了CAP,也可以吹牛说,我也懂分布式任务处理啦
。
感谢晓东开发出如此强大的项目,同时感谢.Net Core Community。
参考 CAP Github wiki
https://github.com/dotnetcore/CAP/wiki
本博客Demo代码
https://github.com/liuzhenyulive/CAP.Demo
CAP带你轻松玩转Asp.Net Core消息队列的更多相关文章
- CAP带你轻松玩转ASP.NETCore消息队列
CAP是什么? CAP是由我们园子里的杨晓东大神开发出来的一套分布式事务的决绝方案,是.Net Core Community中的第一个千星项目(目前已经1656 Start),具有轻量级.易使用.高性 ...
- ASP.NET Core消息队列RabbitMQ基础入门实战演练
一.课程介绍 人生苦短,我用.NET Core!消息队列RabbitMQ大家相比都不陌生,本次分享课程阿笨将给大家分享一下在一般项目中99%都会用到的消息队列MQ的一个实战业务运用场景.本次分享课程不 ...
- 开发一个带UI的库(asp.net core 3.0)
在GitHub上有个项目,本来是作为自己研究学习.net core的Demo,没想到很多同学在看,还给了很多星,所以觉得应该升成3.0,整理一下,写成博分享给学习.net core的同学们. 项目名称 ...
- 玩转ASP.NET Core中的日志组件
简介 日志组件,作为程序员使用频率最高的组件,给程序员开发调试程序提供了必要的信息.ASP.NET Core中内置了一个通用日志接口ILogger,并实现了多种内置的日志提供器,例如 Console ...
- 微软Azure配置中心 App Configuration (一):轻松集成到Asp.Net Core
写在前面 在日常开发中,我这边比较熟悉的配置中心有,携程Apollo,阿里Nacos(配置中心,服务治理一体) 之前文章: Asp.Net Core与携程阿波罗(Apollo)的第一次亲密接触 总体来 ...
- 架构篇 | 带你轻松玩转 LAMP 网站架构平台(一)
作者 | JackTian 微信公众号 | 杰哥的IT之旅(ID:Jake_Internet) 转载请联系授权(微信ID:Hc220066)备注:来自博客园 1.什么是 LAMP 架构? LAMP 架 ...
- 新霸哥带你轻松玩转Oracle数据库
接触过软件开发的朋友可能都会知道oracle,在开发的过程中,数据存储都可能会用到oracle的,因为oracle具有处理速度快,安全级别特别的高.但是有一个缺点就是比较的贵,只有一个大型的公司才有可 ...
- 带你轻松玩转Git--图解三区结构
在上篇文章的结尾我们提到了Git 的三区结构,在版本控制体系中有这样两种体系结构,一种是两区结构一种是三区结构.接下来我们通过对Git三区的结构学习来帮助我们更好的去理解并运用Git. 两区结构是其他 ...
- 带你轻松玩转Git--瞬间创建本地仓库
在上一篇文章中我们对版本控制有了一个比较宏观的了解,同时也能够看到Git 所处在的历史地位.并且对版本控制系统的体系进行了一个宏观的对比,貌似让读者看起来挺复杂的样子. 笔者将会尽可能的简单向大家分享 ...
随机推荐
- Java RandomAccessFile用法 【转】
RandomAccessFile源地址:http://blog.csdn.net/akon_vm/article/details/7429245 RandomAccessFile是用来访问那些保存数据 ...
- ubantu和虚拟机tools 安装 小问题集结
一.虚拟机 就安装虚拟机而言,个人觉得还是比较简易的,毕竟VMware workstation pro 是一个开源的软件,只要在网上搜索即可,这里我提供一个虚拟机的资源: 链接:http://pan. ...
- vue 路由嵌套高亮问题
正常路由嵌套是没有问题的,但是如果你已经在当前主路由页面了,然后再次点击主路由就会出现页面数据空白的情况 看代码: //主路由通过v-for循环出来 <div class="list- ...
- sql server 高可用性技术总结
一. 复制Replication(快照.事务.合并) 应用场景: 负载均衡.提供副本读,写操作. 分区将历史数据复制到其它表中. 授权,将数据提供它人使用. 数据合并. 故障转移. 优点: 实现简单 ...
- Kali Linux安装Google中文输入法(只需5步)
前言: 之前我在kali上安装过中文输入法,并且写了一篇博文(Kali Linux安装中文输入法全纪录),这篇博文里的步骤是当时一边摸索一边记录下的,思路有点混乱,而且还同时安装了两种输入法.今天又安 ...
- 沉默的螺旋--digest
孤立的恐惧对名望的追求高度的和谐和共识是大部分人的幸福感.安全感的源头公开性能让某种行为具有社会可接受性 P5谈论和沉默决定了意见气候那些被新的东方政策说服的人,感觉自己所想的都是合理的.因此他们就会 ...
- 第七章 函数表达式和函数声明,关于this对象 ,私有作用域(function(){})() ,私有变量和特权方法
一:函数表达式和函数声明 1:函数声明和函数表达式的区别 ①函数声明不需要分号结尾 ②函数声明有函数提升的特点 ③函数声明后面不能跟圆括号直接调用,因为javascript将function关键字当作 ...
- 你不知道的JavaScript--Item23 定时器的合理使用
1.定时器概述 window对象提供了两个方法来实现定时器的效果,分别是window.setTimeout()和window.setInterval.其中前者可以使一段代码在指定时间后运行:而后者则可 ...
- 跟我学ASP.NET MVC之五:SportsStrore开始
摘要: 这篇文章将介绍一个ASP.NET应用程序SportsStore的开发过程. 开始 创建解决方案 创建工程 在New ASP.NET Project - SportsStore窗口中,选择Emp ...
- 关于Kafka配额的讨论(1)
Kafka自0.9.0.0版本引入了配额管理(quota management),旨在broker端对clients发送请求进行限流(throttling).目前Kafka支持两大类配额管理: 网络带 ...