石家庄模板建站系统/什么是网络营销公司

石家庄模板建站系统,什么是网络营销公司,西宁房地产网站建设,四川展厅设计公司前言经过2个月的调整及测试,CAP 2.3 版本终于发布了,这个版本最大的特性就是对于 MongoDB 的支持,感谢博客园团队的keke同学对于 MongoDB 支持所提供的 PR,相信随着博客园的使用,CAP 会越来越多的帮助到更多的人。CAP …

前言

经过2个月的调整及测试,CAP 2.3 版本终于发布了,这个版本最大的特性就是对于 MongoDB 的支持,感谢博客园团队的keke同学对于 MongoDB 支持所提供的 PR,相信随着博客园的使用,CAP 会越来越多的帮助到更多的人。

CAP 是一个用来解决微服务或者分布式系统中分布式事务问题的一个开源项目解决方案(https://github.com/dotnetcore/CAP),目前已经将近2岁了,想对 CAP 更多了解的同学可以看下我的这篇文章。

背景故事

在 2.3 版本中,我们对 Api 做了一些调整,为什么做这些调整呢?我就来说一下这中间的过程

相信在用 CAP 的同学们都知道在2.2以及以前的版本中存在一个 Bug 就是在使用事务的情况下消息持久化到数据库后如果还没有提交事务,那么这个时候 CAP 就会开始向消息队列中发送消息,但是有一个问题就是如果接下来事务提交失败,这个时候其实消息已经被发送出去了,就会导致消费端接收到了消息,对应到 GitHub 的这个 issue。

这个 Bug 要说严重也严重,要说不严重也不严重,但是我们总要解决这个问题。怎么解决呢?有些同学可能会说把发送消息改到事务提交完成后不就行了,但是 CAP 是无法获取到业务端的事务执行结果的,因为在.NET中没有类似于Spring Transaction这种机制可以很容易的做一些扩展,所以如果想改到事务提交后,那么就必须提供一个 API 让用户手动来调用进行发送。这样看来可以很容易的解决这个问题,但是我觉得这样对于使用者来说就要多一行代码,需要增加学习成本以及要多理解框架内部做的一些事情,还有可能会忘记调用或者用错。

为了让 CAP 的使用者少写这一行代码,我思考了好几个月,说一下过程吧。

对于数据库底层驱动的代码做过了解的同学可能知道,数据库驱动在底层封装的特别死,特别是对于事务这块的处理,类都是 sealed 几乎没有办法进行扩展,我做了一些尝试都失败了,最后都想 fork 一个数据库驱动来修改发布自己的 Nuget 包了,但是这个方案最终被否定了,因为我自己都不愿意用自己编译的数据库驱动,最终这条路行不通。

另外一个方案就是对于 Diagnostics 有了解的同学可能想到了,可以利用这个特性来追踪事务提交的结果,然后在其中做一些处理就行了。但是有个什么问题呢?目前只有 SQL Server 的驱动才支持 Diagnostics,其他的 MySql,PostgreSql 均不支持,怎么办呢?不可能不去管使用 MySql,PostgreSql 的那些用户,毕竟我们自己也是使用的 MySql。

我和 Lemon 同学曾分别向 MySql 和 PostgreSql C#数据库项目提交了对 Diagnostics 特性支持的 PR(MySql PR, PostgreSql PR),但是由于微软对于 DiagnosticsSource API 设计的问题,导致社区对于这种 API 的方式比较反感,另外就是指导文档中的一些原则,微软在 SQLClient 的驱动中都没有遵守,所以这两个 PR 一直没有进行合并,有兴趣的也可以看下这里的讨论,这样等下去也不知道要等到什么时候。

还有一个原因是因为我们需要对接新的MongoDB,MongoDB对于事务的处理在API上有所不同,为了提供一致的用户接口,所以需要作出一些改变。

以上,我们需要对 API 做出调整,我们不能一直停滞不前。下面我们来看一下2.3版本做出的改变吧。

CAP 2.3 版本中的改变

1、移除了CAP 中间件注册

现在,你不需要再使用 app.UseCap() 手动添加中间件,我们将自动注册。

在 2.3 以前的版本中,需要在 Startup 中 Configure 中注册 CAP,现在我们已经自动的在启动的时候进行了注册你不再需要手动注册。

public void Configure(IApplicationBuilder app){app.UseCap(); //移除了,不需要再手动注册}

2、修改了消息表主键类型

为了适配最新的MongoDB以及某些场景下的数据表迁移,我们将消息表的主键Id由自增长的int类型改为了由雪花算法生成的long类型,这在一定程度上可以提高消息处理的性能以及逻辑的复杂性。

由 2.2 版本升级上来的同学,我们提供了数据库迁移脚本,你可以查看这里来获取数据库迁移脚本,然后在数据库执行即可。

https://gist.github.com/yuleyule66/0e5ec7a5046dc58fcf89d51e4820c5cd

3、修改了 Publish Api

我们添加了一个新的 ICapTransaction 接口,用来控制事务的处理,同时这也是为了处理跟踪不到事务处理接口的情况,同时我们封装了一系列扩展方法,方便开发者使用,下面我们看一下新的Api

  • MongoDB:

using (var session = _mongoClient.StartTransaction(_capBus, autoCommit: false))
{    var collection = _mongoClient.GetDatabase("test").GetCollection<BsonDocument>("test.collection");collection.InsertOne(session, new BsonDocument { { "hello", "world" } });_capBus.Publish("sample.rabbitmq.mongodb", DateTime.Now);session.CommitTransaction();
}

这里的 connection.StartTransaction 是一个扩展方法,这个扩展方法返回 IClientSessionHandle 接口,它代表的是MongoDB的原生事务对象,我们在做自己业务代码的时候拿到这个对象即可使用。

命名 StartTransaction 的原因是我们希望遵循MongoDB的命名规范,便于使用者理解

  • SQLServer:

using (var connection = new SqlConnection(""))
{    using (var transaction = connection.BeginTransaction(_capBus, autoCommit: false)){        //your business code sampleconnection.Execute("insert into test(name) values('test')", transaction);_capBus.Publish("sample.rabbitmq.sqlserver", DateTime.Now);                               transaction.Commit();}
}

这里的 connection.BeginTransaction 是一个扩展方法,这个扩展方法返回 IDbTransaction 接口,它代表的是数据库的原生事务对象,我们在做自己业务代码的时候使用这个对象传到Dapper或者Ado.net中即可。

  • MySql 和 PostgreSql:

using (var connection = new MySqlConnection(""))
{    using (var transaction = connection.BeginTransaction(_capBus, autoCommit: false)){        //your business code sampleconnection.Execute("insert into test(name) values('test')",transaction: (IDbTransaction)transaction.DbTransaction);_capBus.Publish("sample.rabbitmq.mysql", DateTime.Now);                               transaction.Commit();}
}

这里的 connection.BeginTransaction 是一个扩展方法,这个扩展方法返回 ICapTransaction 接口,接口包装的有 DbTransaction 属性,它代表的是数据库的原生事务对象,我们在做自己业务代码的时候使用这个对象传到Dapper或者Ado.net中即可。

4、增加了事务自动提交

有些情况下,为了精简代码,我们不想去手动调用 transaction.Commit() 方法希望CAP去帮助你提交事务,那么也是可以做到的,你只需要在 connection.BeginTransaction 的时候传递参数 autoCommit 为 true 即可。

需要注意的是,当使用事务自动提交功能时,你需要在你的业务逻辑执行完成之后再发送消息,也就是说 _capBus.Publish 这行代码需要放到最后执行。实例代码:

using (var connection = new MySqlConnection(""))
{    using (var transaction = connection.BeginTransaction(_capBus, autoCommit: true)){        //your business code sample_capBus.Publish("sample.rabbitmq.mysql", DateTime.Now);                               }
}

注意这里的 autoCommit: true,并且取消了transaction.Commit()

5、增加对 MongoDB 的支持

在微服务应用中,有时候我们的某些服务可能为了性能或者是其他原因考虑,使用的不是传统的关系型数据库,而且一些非关系型数据库,比如这其中MongoDB作为代表,使用的人也最多,然后就有需求希望在存储数据的时候也想保证数据的高一致性。

MongoDB 在 4.0 及以上版本中支持了ACID事务,这个特性使我们有理由对MongoDB提供支持,同时MongoDB的支持也是博客园的Keke同学提供的PR,再次感谢。

有些同学可能想尝试一下,那么下面就来简单的说一下,MongoDB 对 ACID事务的支持是需要集群才能使用,所以我们需要首先搭建一个集群,搭建集群的文章我已经写好了,大家可以参考这篇博客来搭建。

集群搭建完成之后,在 Startup.cs 文件中的 ConfigureServices(IServiceCollection services) 中配置下即可。

public void ConfigureServices(IServiceCollection services)
{services.AddSingleton<IMongoClient>(new MongoClient("mongodb://localhost:27017,localhost:27018,localhost:27019/?replicaSet=rs0"));services.AddCap(x =>{x.UseMongoDB("mongodb://localhost:27017,localhost:27018,localhost:27019/?replicaSet=rs0");x.UseRabbitMQ("localhost");x.UseDashboard();});
}

使用方法:

注意:MongoDB 不能在事务中创建数据库和集合,所以如果你集群创建好之后是空的,则你需要单独先创建数据库和集合,可以模拟一条记录插入就会自动创建了。

var mycollection = _client.GetDatabase("test").GetCollection<BsonDocument>("test.collection");
mycollection.InsertOne(new BsonDocument { { "test", "test" } });

然后

[Route("~/without/transaction")]public IActionResult WithoutTransaction(){_capBus.Publish("sample.rabbitmq.mongodb", DateTime.Now);    return Ok();
}[Route("~/transaction/not/autocommit")]public IActionResult PublishNotAutoCommit(){    //NOTE: before your test, your need to create database and collection at firstusing (var session = _client.StartTransaction(_capBus, autoCommit: true)){        var collection = _client.GetDatabase("test").GetCollection<BsonDocument>("test.collection");collection.InsertOne(session, new BsonDocument { { "hello", "world" } });_capBus.Publish("sample.rabbitmq.mongodb", DateTime.Now);}    return Ok();
}

总结

最近一两个月明显感觉到使用 CAP 的人越来越多了,博客园也出现了一些CAP的博客文章,我们很开心能够帮助到大家
。大家在使用的过程中遇到问题希望也能够积极的反馈,帮助CAP变得越来越好。:)

相关文章:

  • CAP带你轻松玩转ASP.NETCore消息队列

  • 分布式事务一致性解决方案

  • .NetCore Cap 结合 RabbitMQ 实现消息订阅

  • .NET Core微服务之开源项目CAP的初步使用

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

  • CAP 介绍及使用【视频】

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

原文地址: https://www.cnblogs.com/savorboard/p/cap-2-3.html


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

640?wx_fmt=jpeg

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

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

相关文章

.NETCore 实现容器化Docker与私有镜像仓库管理

一、Docker介绍Docker是用Go语言编写基于Linux操作系统的一些特性开发的&#xff0c;其提供了操作系统级别的抽象&#xff0c;是一种容器管理技术&#xff0c;它隔离了应用程序对基础架构&#xff08;操作系统等&#xff09;的依赖。相较于虚拟机而言&#xff0c;Docker共享的是…

记一次.net core 集成vue 实践

简介以前我们总是喜欢用服务端渲染前端&#xff08;虽然也有htmlajax这种做法&#xff09;&#xff0c;后来node诞生了&#xff0c;前端工具链&#xff08;不如说生态&#xff09;诞生了&#xff0c;大家都开始了前端的重构之路&#xff0c;本文将以一简单案例介绍下我们是如何…

AspNetCore中使用Ocelot之 IdentityServer4

前言&#xff1a;Ocelot网关是基于AspNetCore开发的可扩展的高性能的企业级Api网关&#xff0c;目前已经基于2.0 升级版本升级&#xff0c;在使用AspNetCore 开发的时候可以使用2.0版本了&#xff0c;开源项目Ocelot 张大队长是主力的参与人员&#xff0c;以前提起张大队前面都…

Nginx主配置文件详解【笔记】

1 Nginx配置文件目录结构 最近使用Nginx做负载均衡&#xff0c;顺便整理Nginx配置文件笔记如下所述&#xff0c;本文主要梳理主配置文件各属性的作用。使用yum安装好Nginx后&#xff0c;可以在默认路径&#xff08;/etc/nginx&#xff09;看到如下配置文件。 /etc/nginx/ ├─…

微服务介绍及Asp.net Core实战项目系列之微服务介绍

0、目录整体架构目录&#xff1a;ASP.NET Core分布式项目实战-目录一、微服务选型在做微服务架构的技术选型的时候&#xff0c;以“无侵入”和“社区活跃”为主要的考量点&#xff0c;将来升级为原子服务架构、量子服务架构的时候、甚至恢复成单体架构的时候&#xff0c;代价最…

【矩阵乘法】生成树计数(luogu 2109/NOI 2007)

生成树计数 luogu 2109 题目大意 有n个排成一列的点&#xff0c;把距离不超过k的点之间连边&#xff0c;问这个图的生成树个数 输入样例 3 5输出样例 75样例说明 样例对应的图如下&#xff1a; 数据范围 解题思路 因为n十分大&#xff0c;不能直接2^m暴力枚举&#x…

你需要知道的这几种 asp.net core 修改默认端口的方式

一般情况下&#xff0c;aspnetcore发布后的默认端口是5000&#xff0c;这个大家都知道&#xff0c;而且默认骨架代码中没有看到任何让你输入的ip地址和端口号&#xff0c;但作为程序员的我们&#xff0c;不希望被框架所管制&#xff0c;那如何实现默认端口的修改呢&#xff1f;…

牛客网【每日一题】5月18日 「土」秘法地震

链接&#xff1a; 文章目录题目描述题解&#xff1a;代码&#xff1a;时间限制&#xff1a;C/C 1秒&#xff0c;其他语言2秒 空间限制&#xff1a;C/C 262144K&#xff0c;其他语言524288K 64bit IO Format: %lld题目描述 帕秋莉掌握了一种土属性魔法 这种魔法可以在一片kk大小…

AspNetCore 中使用 InentityServer4(2)

基于上一篇文章 实现对IdnetityServer4 服务的使用1&#xff1a;添加接口解决方案&#xff0c;并且使接口受认证服务的保护&#xff1a;首先在解决方案中添加Api项目如下图所示&#xff1a;在API项目中添加Nuget 引用 如下图所示&#xff1a;Install-Package IdentityServer4.A…

Visual Studio 2017 15.8概览

Microsoft正式发布VS2017的第八次更新&#xff0c;即15.8。15.8提供了今年夏天预览的大量新特性&#xff0c;包括Code Cleanup、IDE支持多重查补&#xff08;Multiple Caret&#xff09;、Visual Studio Code和ReSharper快捷键设置等。各类开发人员均可受益于这些已供使用的新特…

利用.NET Core类库System.Reflection.DispatchProxy实现简易Aop

Aop即是面向切面编程&#xff0c;众多Aop框架里Castle是最为人所知的&#xff0c;另外还有死去的Spring.NET&#xff0c;当然&#xff0c;.NET Core社区新秀AspectCore在性能与功能上都非常优秀&#xff0c;已经逐渐被社区推崇和有越来越多的人使用。感谢柠檬同学的礼物&#x…

当我们谈高性能时,我们谈些什么?(送书活动)

网站越快&#xff0c;用户的黏性就越高&#xff1b;网站越快&#xff0c;用户忠诚度更高&#xff1b;网站越快&#xff0c;用户转化率越高。简言之&#xff0c;速度是关键。——《Web 性能权威指南》显然&#xff0c;高性能意味着“快”。但对快的定义&#xff0c;在不同的系统…

Asp.net Core 2.1新功能Generic Host(通用主机)深度学习

什么是Generic Host ?这是在Asp.Net Core 2.1加入了一种新的Host&#xff0c;现在2.1版本的Asp.Net Core中&#xff0c;有了两种可用的Host。Web Host –适用于托管Web程序的Host,就是我们所熟悉的在Asp.Net Core应用程序的Mai函数中用CreateWebHostBuilder创建出来的常用的We…

520 钻石争霸赛 题解

说好的钻石难度&#xff0c;结果本人菜的一地。。只有88分。。。。 文章目录7-1 考试周7-2 真的恭喜你7-3 平均成绩7-4 古风AB难度开始上升7-5 猜近似数字7-6 随机输一次7-7 阶乘的非零尾数7-8 三足鼎立前四题十分钟AC后两题二十分钟自闭第五题玄学卡点不知为何7-1 考试周 模拟…

.NET Core 跨平台物联网框架 ServerSuperIO.Core,一套设备驱动通吃嵌入式、上位机、云服务...

一、概述我们的大数据平台&#xff08;云&#xff09;平台的数据接收服务基于ServerSuperIO开发&#xff0c;因为集成的功能比较多&#xff0c;无法实现跨平台&#xff0c;现在跑在Windows下。但是云端体系化、标准化建设&#xff0c;跨平台是必走的技术路线。在ServerSuperIO基…

asp.net core添加全局异常处理及log4net、Nlog应用

一、介绍此篇文章将会介绍项目的全局异常收集以及采用log4net或者NLog记录。众所周知&#xff0c;一旦自己的项目报错&#xff0c;如果没有进行处理都是显示不友好的&#xff0c;有得甚至直接爆出错误页面&#xff0c;看的也是很奇怪。为了避免出现这样的错误以及在错误出现的时…

牛客网 【每日一题】5月20日题目 简单瞎搞题

比赛链接 文章目录题目描述题解&#xff1a;代码&#xff1a;题目描述 输入描述: 第一行一个数 n。 然后 n 行&#xff0c;每行两个数表示 li,ri。 输出描述: 输出一行一个数表示答案。 示例1 输入 5 1 2 2 3 3 4 4 5 5 6输出 26备注: 1 ≤ n , li , ri ≤ 100 题解&#xf…

ASP.NET Core 2.0利用MassTransit集成RabbitMQ

在ASP.NET Core上利用MassTransit来集成使用RabbitMQ真的很简单&#xff0c;代码也很简洁。近期因为项目需要&#xff0c;我便在这基础上再次进行了封装&#xff0c;抽成了公共方法&#xff0c;使得使用RabbitMQ的调用变得更方便简洁。那么&#xff0c;就让咱们来瞧瞧其魅力所在…

《通过C#学Proto.Actor模型》之 HelloWorld

在微服务中&#xff0c;数据最终一致性的一个解决方案是通过有状态的Actor模型来达到&#xff0c;那什么是Actor模型呢&#xff1f;Actor是并行的计算模型&#xff0c;包含状态&#xff0c;行为&#xff0c;并且包含一个邮箱&#xff0c;来异步处理消息。关于Actor的介绍可参考…

[XSY] 计数(DP,NTT,分治)

计数 考虑转化题目&#xff0c;变为网格上有若干个点&#xff0c;要从(0,0)(0,0)(0,0)走到(n,an1)(n,a_{n1})(n,an1​) &#xff0c;每一步只能往右走一步或往上走一步&#xff0c;且若当前在(i,j)(i,j)(i,j) &#xff0c;必须满足0≤j≤ai10\leq j\leq a_{i1}0≤j≤ai1​&…