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(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 = 24 * 3600; //设置失败重试次数
x.FailedRetryCount = 5;
}); 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发送和接收数据的表格了。

image

表格中每列的含义如下:

image

消息的发送和订阅

我们直接在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启动成功

image

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

image

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

image

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

image

消息的失败重试

在订阅方法中,如果抛出异常,那么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("测试失败重试");

}

复制代码

可以看到,立即进行了三次重试

image

可是在前面,我们设置的失败重试次数是5次,为什么这里只重试三次吗?是不是要叫晓东过来改BUG了呢转动眼睛?当然不是。

观察发现,CAP重试的前三次是立即进行的,而后面的重试,是每隔一段时间进行的,当在分布式通讯的过程中,可能出现了问题确实不会立即修复解决,可能过了一定时间,系统就自动恢复了,如网络抖动。

CAP仪表盘

image

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

image

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

image

CAP如此强大,让消息队列这种高大上产品操作So Easy,学会了CAP,也可以吹牛说,我也懂分布式任务处理啦大声笑。

感谢晓东开发出如此强大的项目,同时感谢.Net Core Community。

参考 CAP Github wiki

https://github.com/dotnetcore/CAP/wiki

本博客Demo代码

https://github.com/liuzhenyulive/CAP.Demo

作者:CoderAyu

出处:https://www.cnblogs.com/CoderAyu/p/9527012.html

dotnetcore/CAP的更多相关文章

  1. .NET Core 事件总线,分布式事务解决方案:CAP

    背景 相信前面几篇关于微服务的文章也介绍了那么多了,在构建微服务的过程中确实需要这么一个东西,即便不是在构建微服务,那么在构建分布式应用的过程中也会遇到分布式事务的问题,那么 CAP 就是在这样的背景 ...

  2. CAP 介绍及使用【视频】

    前言 很多同学可能对于CAP这个项目想有更一步的了解,包括她的工作原理以及适用的场景,所以博主就准备了一场直播给他家讲解了一下,这个视频是直播的一个录像. 由于我这次直播本来是没有打算对外的,所以也是 ...

  3. 分布式事务,EventBus 解决方案:CAP【中文文档】

    前言 很多同学想对CAP的机制以及用法等想有一个详细的了解,所以花了将近两周时间写了这份中文的CAP文档,对 CAP 还不知道的同学可以先看一下这篇文章. 本文档为 CAP 文献(Wiki),本文献同 ...

  4. .NET Core Community 首个千星项目诞生:CAP

    项目简介 在我们构建 SOA 或者 微服务系统的过程中,我们通常需要使用事件来对各个服务进行集成,在这过程中简单的使用消息队列并不能保证数据的最终一致性, CAP 采用的是和当前数据库集成的本地消息表 ...

  5. CAP带你轻松玩转Asp.Net Core消息队列

    CAP是什么? CAP是由我们园子里的杨晓东大神开发出来的一套分布式事务的决绝方案,是.Net Core Community中的第一个千星项目(目前已经1656 Star),具有轻量级.易使用.高性能 ...

  6. CAP 2.5 版本中的新特性

    前言 首先,恭喜 CAP 已经成为 eShopOnContainers 官方推荐的生产环境可用的 EventBus 之一. 自从上次 CAP 2.4 版本发布 以来,已经过去了几个月的时间,关注的朋友 ...

  7. CAP 2.4版本发布,支持版本隔离特性

    前言 自从上次 CAP 2.3 版本发布 以来,已经过去了几个月的时间,这几个月比较忙,所以也没有怎么写博客,趁着2019年到来之际(现在应该是2019年开始的时候),CAP也发布了2018年的最后一 ...

  8. 如何在你的项目中集成 CAP【手把手视频教程】

    前言 之前录制过一期关于CAP的视频,但是由于当时是直播时录制的视频,背景音比较杂所以质量有点差.这次的视频没有直播,直接录制的,视频质量会好很多,第一遍录制完成之后发现播放到一半没有声音,所以又重新 ...

  9. CAP 2.3版本发布,支持 MongoDB

    前言 经过2个月的调整及测试,CAP 2.3 版本终于发布了,这个版本最大的特性就是对于 MongoDB 的支持,感谢博客园团队的keke同学对于 MongoDB 支持所提供的 PR,相信随着博客园的 ...

随机推荐

  1. SQLite保存报错sqlite.SQLiteConstraintException: UNIQUE constraint failed: ······ code 1555

    往数据库里保存数据的时候报错,用的afinal框架,明明在save操作之前执行了一遍deleteAll操作,还是报错. 百度了一下说报这种错有两种情况:一是定义的字段为not null ,插入时对应的 ...

  2. Android EditText自定义样式

    第一步:为了更好的比较,准备两个一模一样的EditText(当Activity启动时,焦点会在第一个EditText上,如果你不希望这样只需要写一个高度和宽带为0的EditText即可避免,这里就不这 ...

  3. Chrome_浏览器开发人员工具

    Google Chrome 浏览器开发人员工具,让网页开发变得更轻松 无论是 IE 6/7 的 Internet Explorer Developer Toolbar 或者是 IE 8 自带的 Dev ...

  4. Spark线性回归实现优化

    import org.apache.log4j.{Level, Logger} import org.apache.spark.ml.feature.VectorAssembler import or ...

  5. oracle FLASHBACK TABLE

    闪回表 -- 开启行迁移 ALTER TABLE employees_test ENABLE ROW MOVEMENT; UPDATE employees_test SET salary = sala ...

  6. Python基础知识:测试代码

    1.Python标准库中的模块unittest提供了代码测试工具. 单元测试用于核实函数的某个方面没有问题: 测试用例是一组单元测试,这些单元测试一起核实函数在各种情形下的行为都符合要求. 通俗的理解 ...

  7. Cocoapods的安装和使用(2018-08-07更新)

    一.Cocoapods的安装 第一步:打开终端 第二步:修改ruby镜像引用 gem source --remove https://rubygems.org/ gem sources -a http ...

  8. if语句(初学者)

    用if语句可以构成分支结构.它根据给定的条件进行判断,以决定执行某个分支程序段.C语言的if语句有三种基本形式. 1.基本形式:if(表达式)语句 其语义是:如果表达式的值为真,则执行其后的语句,否则 ...

  9. Java实现数据库的读写分离

    引言 1.读写分离:可以通过Spring提供的AbstractRoutingDataSource类,重写determineCurrentLookupKey方法,实现动态切换数据源的功能:读写分离可以有 ...

  10. 接上篇elasticsecrchi 进行搜索及时提示,数据库以及后台代码

    -- ------------------------------ Table structure for articles-- ----------------------------DROP TA ...