.netcore 分布式事务CAP2.6 快速入门

640?wx_fmt=png

CAP介绍:

CAP是一个用来解决微服务或者分布式系统中分布式事务问题的一个开源项目解决方案。可以解决跨服务器的数据一致性问题。一个简单的列子,如:订单系统创建订单后需要通知邮件通知用户下单成功,解决方案有下面几种:

   1:创建订单时同步调用邮件发送,邮件发送失败则整个订单创建失败,这样保证了一致性,但性能和可用性有非常大的问题。或者不管邮件发送状态,失败了就算了,这样用户就可能收不到通知邮件了。

   2:创建订单时通过消息队列推送一个订单创建成功的事件,另外创建一个服务来监听消费此事件,并执行邮件发送的功能。这种方案存在往消息队列推送数据失败的可能,存在和方案1一样的问题。

   3:创建订单时同时往一个叫“订单创建成功”的事件表中插入相关数据,两者在同一事务中。另外创建一个服务定时查询此表,发现有待处理的数据时,执行邮件发送,成功后把此数据删除或更新为已处理。此方案保证了最终一致性和可用性,但得定时扫描,性能和及时性有问题。

   4:创建订单时同时往一个叫“订单创建成功”的事件表中插入相关数据,两者在同一事务中。并且通过消息队列推送此消息,如果推送失败,则定时扫描“订单创建成功”表将失败的数据重新推送。另外创建一个服务来监听消费此事件,这种方案集成了方案1和方案2的优点,即保证了最终一致性,也保证了可用性。

从上面来看最优的方案显示是方案4,我们这次的主角CAP也正是采用了此种方案来实现的,我们这里介绍的方案4还是比较简单的,CAP的实现要更加的严谨、更加强大,我们不需要建过程表,也不需要处理消息队列的问题,底层很多的细节都不需要我们考虑,只管用就好了。CAP数据库存储支持:Sql Server,MySql,PostgreSql,MongoDB。消息队列支持:RabbitMQ,Kafka,Azure Service Bus等。

各多CAP的介绍可以参考官网,详细的CAP理论可以参考其它文章。 官网 http://cap.dotnetcore.xyz/ ,开源地址:https://github.com/dotnetcore/CAP  ,作者blog https://www.cnblogs.com/savorboard/

快速开始

CAP2.6是2019-8-29发布的《CAP 2.6 版本发布通告》,目前官网上的文档快速开始已经无法使用,因为里面用了 Savorboard.CAP.InMemoryMessageQueue 组件,该组件还是2.51,不支持最新的CAP2.6版本,应该得过段时间才会修复文档,或者等 Savorboard.CAP.InMemoryMessageQueue组件更新。现在我们就在这开始我们的“快速开始”吧。我们将基于rabbitmq和sqlserver数据库来实现。

1:创建项目

打开VS创建一个名叫CapDemo的webapi项目,版本选择ASP.NET Core 2.2。CAP2.6不支持2.2以下的.net core

640?wx_fmt=png

2:添加CAP引用

在Nuget中添加 DotNetCore.CAP   DotNetCore.CAP.RabbitMQ  DotNetCore.CAP.SqlServer 的引用。

640?wx_fmt=png

3:配置CAP

在Startup.cs的ConfigureServices方法中添加以下代码

            services.AddCap(c =>
{
c.UseSqlServer(@"Data Source=.\sql2014;Initial Catalog=Test;User ID=sa;Password=sa"); //使用SqlServer数据库,连接地址请依实际修改
c.UseRabbitMQ( mq =>
{
mq.HostName = "192.168.150.134"; //RabitMq服务器地址,依实际情况修改此地址
mq.Port = 5672;
mq.UserName = "admin"; //RabbitMq账号
mq.Password = "admin"; //RabbitMq密码
});
});

640?wx_fmt=png

4:发布事件

将 CapDemo.Controllers.ValuesController中的所有方法全部删除。添加引用 using DotNetCore.CAP; ,并添加以下方法

        [HttpGet]
public async Task<string> Get([FromServices]ICapPublisher capPublish)
{
await capPublish.PublishAsync<string>("Order.Created", "hello,订单创建成功啦"); //发布Order.Created事件
return "订单创建成功啦";
}

5:订阅事件

在CapDemo.Controllers.ValuesController中添加以下方法:

        [NonAction]
[CapSubscribe("Order.Created")] //监听Order.Created事件
public async Task OrderCreatedEventHand(string msg)
{
Console.WriteLine(msg);
}

6:最后一步:启动测试

在OrderCreatedEventHand方法内打个断点,F5启动项目访问https://localhost:44304/api/values界面。因为此例中第一次访问时可能发布事件比订阅事件要快,导致还没订阅就把事件发布出去了,这样的事件会丢失,所以我们再F5刷新一下界面,可以看到程序就进入到了订阅事件里面。

640?wx_fmt=png

后记:

添加监控仪表盘监控CAP运行状况:

1:只需要在Startup.cs的AddCap方法中添加配置: c.UseDashboard(); 就万事大吉了,一个功能强大的事件管理界面就出来了,具体如下图:

640?wx_fmt=png

2:重新编译并启动项目,进入https://localhost:44304/cap  ,从打开的界面里可以看到CAP的各种事件和状态。

640?wx_fmt=png

数据库变化

我们再看看数据库里面的变化吧,从下图可以看出CAP自动创建了两个表,并且记录了发布的消息,和接收到的消息。这些数据会定时删除。这些都是不需要我们管的。

640?wx_fmt=png

本示例源码下载:https://pan.baidu.com/s/1fHXSW20JHSoaYPH748VRKg

原文链接:https://www.cnblogs.com/sunyuliang/p/11434985.html


.NET社区新闻,深度好文,欢迎访问公众号文章汇总 http://www.csharpkit.com 

640?wx_fmt=jpeg


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

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

相关文章

[SDOI2017]数字表格

[SDOI2017]数字表格 假定n<m∏i1n∏j1mf(gcd(i,j))∏d1nf(d)∑i1n∑j1m[gcd(i,j)d]∏d1nf(d)∑i1nd∑j1md[gcd(i,j)1]∏d1nf(d)∑k1ndμ(k)nkdmkd由于nd具有分块性质&#xff0c;并且n&#xff0c;m不大&#xff0c;所以我们可以先预处理出斐波那契数列的前缀积&#xff0c;…

#3601. 一个人的数论

#3601. 一个人的数论 首先这个转化还是很巧妙的&#xff0c;或者很套路的&#xff0c;直接莫比乌斯反演&#xff0c;然后看到了自然数幂之和的形式&#xff0c;那么我们就可以转化为多项式处理&#xff0c;项数就减少到了d1&#xff0c;然后看到题目给出的都是质因数分解结果&a…

2019-03-5-算法-进化(最长公共前缀)

题目描述 编写一个函数来查找字符串数组中的最长公共前缀。 如果不存在公共前缀&#xff0c;返回空字符串 “”。 示例 1: 输入: ["flower","flow","flight"] 输出: "fl"示例 2: 输入: ["dog","racecar","…

基于SQLite+EF6实现一套自己的Key-Value存储管理工具包(2)

上一篇里面整理了一下需求和思路&#xff0c;自定义了扩展的字典对象&#xff0c;这里我们再继续深入编码。BaseExtensions类&#xff0c;这个类作未来任何需要Key-Value形式扩展的基类1234567891011121314151617181920212223242526272829303132333435363738394041424344454647…

P4196 [CQOI2006]凸多边形 /【模板】半平面交

P4196 [CQOI2006]凸多边形 /【模板】半平面交 本来是个板子题&#xff0c;而且我这个板子之前在POJ写过一些题目了&#xff0c;但是这里一直让我RE。 后来解决办法竟然是&#xff1a;先读入第一个多边形不加边&#xff08;存下来&#xff09;&#xff0c;然后去读其他多边形&a…

自然数幂之和

自然数幂之和 https://blog.csdn.net/suncongbo/article/details/97622131 这个文章的整理非常全面。

kettle 空字符串 null问题解决

今天&#xff0c;在配置kettle同步mysql数据的时候&#xff0c;碰到了kettle把空字符串当成null的情况。 解决步骤&#xff1a; 找到配置文件&#xff1a;C:\Users\用户名.kettle目录中找到kettle.properties添加配置&#xff1a;KETTLE_EMPTY_STRING_DIFFERS_FROM_NULLY重启k…

从你的全世界路过—一群程序员的稻城亚丁游记

转眼之间又即将到九月&#xff0c;又到了这个适合去川西旅游的最佳季节。最近有一些朋友问我稻城亚丁的旅游情况&#xff0c;因此我将去年写的这一篇游记再次发出来&#xff0c;希望对那些有计划去川西旅游的朋友们有帮助&#xff01;温馨提示&#xff1a;本文图片较多&#xf…

Beauty Contest(凸包 + 旋转卡壳(模板))

Beauty Contest 直接跑一个凸包&#xff0c;然后跑一跑旋转卡壳&#xff0c;求最大值就行了。 /*Author : lifehappy */ #include <cstdio> #include <cmath> #include <cstring> #include <algorithm> #include <vector> #include <iostre…

P2303 [SDOI2012] Longge(数论/欧拉函数)

P2303 [SDOI2012] Longge 一道看似非常基础的数论题&#xff0c;但是蕴含了非常多的知识&#xff0c;求解 ∑i1ngcd(i,n)\sum_{i1}^ngcd(i,n) i1∑n​gcd(i,n) 这个东西我们轻松地就能化简成id∗φid*\varphiid∗φ的形式&#xff0c;然后考虑如何快速求解&#xff0c;那么可以…

2019-03-06-算法-进化(三数之和)

题目描述 给定一个包含 n 个整数的数组 nums&#xff0c;判断 nums 中是否存在三个元素 a&#xff0c;b&#xff0c;c &#xff0c;使得 a b c 0 &#xff1f;找出所有满足条件且不重复的三元组。 注意&#xff1a;答案中不可以包含重复的三元组。 例如, 给定数组 nums […

2019-03-06-算法-进化(最接近的三数之和)

题目描述 给定一个包括 n 个整数的数组 nums 和 一个目标值 target。找出 nums 中的三个整数&#xff0c;使得它们的和与 target 最接近。返回这三个数的和。假定每组输入只存在唯一答案。 例如&#xff0c;给定数组 nums [-1&#xff0c;2&#xff0c;1&#xff0c;-4], 和 …

P3345 [ZJOI2015]幻想乡战略游戏

P3345 [ZJOI2015]幻想乡战略游戏 带修改带权重心 这是经典的树上寻找关键点的题目&#xff0c;我们使用点分治处理这个问题&#xff0c;因为点分治的特性&#xff0c;就相当于在树上二分了。但是这与倍增不同&#xff0c;倍增只是在链上二分&#xff0c;而点分治则是在整棵树上…

莫比乌斯,欧拉函数题目练习(完结)

Starttime&#xff1a;2020/11/16Start\ time&#xff1a;2020/11/16Start time&#xff1a;2020/11/16 Lastupdatetime:2020/11/28Last\ update\ time: 2020/11/28Last update time:2020/11/28 AC22/22AC\ 22 / 22AC 22/22 解方程 ∑d∣nf(d)σp(nd)σq(n)f∗σpσq有σk∑d∣…

基于SQLite+EF6实现一套自己的Key-Value存储管理工具包(3)

前面两边的代码就是一套初步的工具包架构&#xff0c;基本底层通用&#xff0c;可以移植到任意项目实现类似的需求。接下来&#xff0c;再在我们特定的项目几微助手里面再实现一套基于自己项目的基类&#xff0c;根据项目需求抽象一下项目内的常用方法。理论上&#xff0c;这一…

2019-03-09-算法-进化(从排序数组中删除重复项)

题目描述 给定一个排序数组&#xff0c;你需要在原地删除重复出现的元素&#xff0c;使得每个元素只出现一次&#xff0c;返回移除后数组的新长度。 不要使用额外的数组空间&#xff0c;你必须在原地修改输入数组并在使用 O(1) 额外空间的条件下完成。 示例 1 给定数组 nums…

P6329 【模板】点分树 | 震波

P6329 【模板】点分树 | 震波 这是一道模板题&#xff0c;需要支持两个操作&#xff0c;操作一就是单点修改点权&#xff0c;操作二就是查询距离x不超过k的点权值和。 我们考虑建出点分树&#xff0c;然后对于每个点维护两个数据结构&#xff0c;一个处理当前分治范围到当前点…

基于SQLite+EF6实现一套自己的Key-Value存储管理工具包(1)

在项目中&#xff0c;经常会需要对一些特定的业务对象进行属性的扩展&#xff0c;而且这些属性的扩展还具备极不可预测性、相互关系松散等特点。大部分的开发人员是最讨厌这类涉及到数据字段扩展的需求变更。这种调整&#xff0c;轻则数据要加字段&#xff0c;重则程序代码要做…

2019-03-09-算法-进化(买卖股票的最佳时机 II)

题目描述 给定一个数组&#xff0c;它的第 i 个元素是一支给定股票第 i 天的价格。 设计一个算法来计算你所能获取的最大利润。你可以尽可能地完成更多的交易&#xff08;多次买卖一支股票&#xff09;。 注意&#xff1a;你不能同时参与多笔交易&#xff08;你必须在再次购买…

【C】Natasha V1.3.6.0 的升级日志

文章转载授权级别&#xff1a;C 预计阅读时间&#xff1a;8分钟开源库满足于个人&#xff0c;而完善于大众。Natasha 自稳定版发布之后&#xff0c;众多老铁参与增强改进&#xff0c;感谢如下老铁的反馈&#xff1a;1. 异常搜集在 wenjq0911 建议下&#xff0c;添加…