CAP带你轻松玩转ASP.NETCore消息队列
CAP是什么?
CAP是由我们园子里的杨晓东大神开发出来的一套分布式事务的决绝方案,是.Net Core Community中的第一个千星项目(目前已经1656 Start),具有轻量级、易使用、高性能等特点。
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上下文,代码如下:
Startup配置
首先需要在ConfigureServices函数中进行相关服务的注入,对应的操作和功能解释如下:
最后还要再Congiure中启用CAP中间件
利用EF Core生成CAP数据库
再程序包管理控制台中依此输入以下命令行
PM> Add-Migration Init
PM> update-database
如果成成功执行,那么打开数据库,就可以看到用来存储CAP发送和接收数据的表格了。
表格中每列的含义如下:
消息的发送和订阅
我们直接在ValuesController的基础上进行改造。
在 Controller 中注入 ICapPublisher 然后使用 ICapPublisher 进行消息发送
发送消息
订阅消息
Run
启动程序后,首先看到CAP启动成功
紧随其后,消费者也就是我们的订阅方法在RabbitMQ服务器上注册成功。
发送消息,发送成功,如下
发送后,立即在控制台看到了订阅方法输出的结果。
消息的失败重试
在订阅方法中,如果抛出异常,那么CAP就会认为该条消息处理失败,会自动进行重试,重试次数在前方已经进行了配置。
我们把订阅方法做一个改动,打印接收的信息到控制台中,并抛出异常
可以看到,立即进行了三次重试
可是在前面,我们设置的失败重试次数是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.NETCore消息队列的更多相关文章
- CAP带你轻松玩转Asp.Net Core消息队列
CAP是什么? CAP是由我们园子里的杨晓东大神开发出来的一套分布式事务的决绝方案,是.Net Core Community中的第一个千星项目(目前已经1656 Star),具有轻量级.易使用.高性能 ...
- 玩转redis-延时消息队列
上一篇基于redis的list实现了一个简单的消息队列:玩转redis-简单消息队列 源码地址 使用demo 产品经理经常说的一句话,我们不光要有X功能,还要Y功能,这样客户才能更满意.同样的,只有简 ...
- 架构篇 | 带你轻松玩转 LAMP 网站架构平台(一)
作者 | JackTian 微信公众号 | 杰哥的IT之旅(ID:Jake_Internet) 转载请联系授权(微信ID:Hc220066)备注:来自博客园 1.什么是 LAMP 架构? LAMP 架 ...
- 新霸哥带你轻松玩转Oracle数据库
接触过软件开发的朋友可能都会知道oracle,在开发的过程中,数据存储都可能会用到oracle的,因为oracle具有处理速度快,安全级别特别的高.但是有一个缺点就是比较的贵,只有一个大型的公司才有可 ...
- 带你轻松玩转Git--图解三区结构
在上篇文章的结尾我们提到了Git 的三区结构,在版本控制体系中有这样两种体系结构,一种是两区结构一种是三区结构.接下来我们通过对Git三区的结构学习来帮助我们更好的去理解并运用Git. 两区结构是其他 ...
- 带你轻松玩转Git--瞬间创建本地仓库
在上一篇文章中我们对版本控制有了一个比较宏观的了解,同时也能够看到Git 所处在的历史地位.并且对版本控制系统的体系进行了一个宏观的对比,貌似让读者看起来挺复杂的样子. 笔者将会尽可能的简单向大家分享 ...
- 玩转redis-简单消息队列
使用go语言基于redis写了一个简单的消息队列 源码地址 使用demo redis的 list 非常的灵活,可以从左边或者右边添加元素,当然也以从任意一头读取数据 添加数据和获取数据的操作也是非常简 ...
- 目录---Asp.NETCore轻松学系列【目录】
随笔分类 - Asp.NETCore轻松学系列 Asp.NETCore轻松学系列阅读指引目录 摘要: 耗时两个多月,坚持写这个入门系列文章,就是想给后来者更好更快的上手体验,这个系列可以说是从入门到进 ...
- 【目录】Asp.NETCore轻松学系列
随笔分类 - Asp.NETCore轻松学系列 Asp.NETCore轻松学系列阅读指引目录 摘要: 耗时两个多月,坚持写这个入门系列文章,就是想给后来者更好更快的上手体验,这个系列可以说是从入门到进 ...
随机推荐
- MySQL性能诊断与调优
LAMP 系统性能调优,第 3 部分: MySQL 服务器调优http://www.ibm.com/developerworks/cn/linux/l-tune-lamp-3.html LoadRun ...
- SAP PI接口(RFC类型)在函数字段修改或增加后,出现字段映射错误问题
在解决标题所言问题之前,我们先回头看看RFC和sproxy这两种接口的优缺点. 关于PI接口的实现,目前我了解到的各大国企项目像中海油.中石化.国网等,普遍实现方式是RFC和代理类sproxy这两种. ...
- 安装Yapi时,出现json-schema-faker模块找不到问题
今天换了一台机器按以前的方式安装Yapi工具时,竟然出现了错误. 一 安装yapi时,出现了下面的报错,一开始以为没安装json-schema-faker模块.后面通过找资料,发现是权限问题, 使用c ...
- Maven快速入门--Idea版
目录 1.web项目的基本知识 1.1 项目构建 1.1.1传统的构建过程如下: 1.1.2 mavn构建项目 1.2 maven构建项目的优点: 2. 依赖管理 2.1 传统依赖管理 2.1.1 手 ...
- Linux管道及重定向
Linux管道及重定向 对shell有一定了解的人都知道,管道和重定向是 Linux 中非常实用的 IPC 机制.在shell中,我们通常使用符合'|'来表示管道,符号'>'和'<'表示重 ...
- 在vue里使用codemirror的两种用法
这是我自己做的一个左边点击对应的标题,右边显示相应代码的一个功能.代码显示这里用的是vue-codemirror插件. 第一种用法: 1.安装:npm install vue-codemirror - ...
- SQLi-LABS Page-2 (Adv Injections) Less30-Less35
Less-30 GET - BLIND - IMPIDENCE MISMATCH- Having http://10.10.202.112/sqli/Less-30?id=1" #false ...
- (转)Unity与3ds Max的单位关系(使用FBX文件)
版权声明:本文为博主原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明.本文链接:https://blog.csdn.net/a1780531/article/deta ...
- Linux磁盘信息查询及删除文件操作
查询磁盘容量 $df -hl 删除文件固定行数 (1)删除第一行 $sed -i '1d' a.txt (2)删除指定行数 $sed -i '1,100d' a.txt 删除末尾行 $sed -i ' ...
- spring的组件使用
源代码下载:https://www.lanzous.com/i5p4mvc * 组件扫描 * @Component:表示这个类需要在应用程序中被创建 * @ComponentScan:自动发现应用程序 ...