架构师_程序员_码农网

 找回密码
 注册[Register]

QQ登录

只需一步,快速开始

查看: 27315|回复: 3

[ASP.NET] ASP.NET Core(五)基于 CAP 分布式事务

[复制链接]
发表于 2021-3-17 18:12:50 | 显示全部楼层 |阅读模式
CAP 原则

CAP原则又称CAP定理,指的是在一个分布式系统中,一致性(Consistency)、可用性(Availability)、分区容错性(Partition tolerance)。CAP 原则指的是,这三个要素最多只能同时实现两点,不可能三者兼顾


CAP原则的精髓就是要么AP,要么CP,要么AC,但是不存在CAP。如果在某个分布式系统中数据无副本, 那么系统必然满足强一致性条件, 因为只有独一数据,不会出现数据不一致的情况,此时C和P两要素具备,但是如果系统发生了网络分区状况或者宕机,必然导致某些数据不可以访问,此时可用性条件就不能被满足,即在此情况下获得了CP系统,但是CAP不可同时满足

回顾:

ASP.NET Core(四)之过滤器统一 ModelState 模型验证
https://www.itsvse.com/thread-9589-1-1.html

ASP.NET Core(三)使用 ActivatorUtilities 动态创建实例
https://www.itsvse.com/thread-9488-1-1.html

ASP.NET Core(二)通过代码自重启应用
https://www.itsvse.com/thread-9480-1-1.html

ASP.NET Core(一)使用 Redis 缓存
https://www.itsvse.com/thread-9393-1-1.html


DotNetCore.CAP

CAP 是一个在分布式系统中(SOA,MicroService)实现事件总线及最终一致性(分布式事务)的一个开源的 C# 库,她具有轻量级,高性能,易使用等特点。

GitHub地址:https://github.com/dotnetcore/CAP

Dotnet CAP 具有 Event Bus 的所有功能,并且CAP提供了更加简化的方式来处理EventBus中的发布/订阅。

MediatR是一款进程内的消息订阅、发布框架,提供了Send方法用于发布到单个处理程序、Publish方法发布到多个处理程序,使用起来非常方便。目前支持 .NET Framework4.5、.NET Stardand1.3、.NET Stardand2.0等版本,可跨平台使用。

ASP.NET Core 使用 MediatR 中介者模式
https://www.itsvse.com/thread-9272-1-1.html

架构预览

68747470733a2f2f6361702e646f746e6574636f72652e78797a2f696d672f617263686974656374.png

CAP 支持 Kafka、RabbitMQ、AzureServiceBus、AmazonSQS 等消息队列,CAP 提供了 Sql Server, MySql, PostgreSQL,MongoDB 的扩展作为数据库存储。

本文使用 RabbitMQ 和 SQL Server 作为消息队列和存储。

安装 RabbitMQ

具体安装教程略,请参考:

【实战】RabbitMQ在Windows下安装教程
https://www.itsvse.com/thread-4630-1-1.html

【实战】RabbitMQ安装Web管理插件
https://www.itsvse.com/thread-4631-1-1.html
添加账户也略,请参考:

【实战】rabbitMQ控制台添加账户信息
https://www.itsvse.com/thread-4655-1-1.html
我自己添加了 test 账户和 cap Virtual Hosts,如下图:

QQ截图20210317143354.jpg QQ截图20210317143405.jpg

否则会报错如下:

ACCESS_REFUSED - Login was refused using authentication mechanism PLAIN. For details see the broker logfile.

None of the specified endpoints were reachable

.NET Core 集成 CAP

首先,新建一个 ASP.NET Core 项目,它既是发送端又是接收端。使用 nuget 命令安装如下包:

在 startup 配置服务方法 ConfigureServices 配置如下:

可以访问网站 /cap 地址,查看仪表盘,如下图:

QQ截图20210317154350.jpg QQ截图20210317154459.jpg

数据持久化:Cap 会自动创建 "Published"、"Received" 两个本地数据库表

CREATE TABLE [cap].[Published](
        [Id] [bigint] NOT NULL,
        [Version] [nvarchar](20) NOT NULL,
        [Name] [nvarchar](200) NOT NULL,
        [Content] [nvarchar](max) NULL,
        [Retries] [int] NOT NULL,
        [Added] [datetime2](7) NOT NULL,
        [ExpiresAt] [datetime2](7) NULL,
        [StatusName] [nvarchar](50) NOT NULL,
CONSTRAINT [PK_cap.Published] PRIMARY KEY CLUSTERED
(
        [Id] ASC
)WITH (PAD_INDEX = OFF, STATISTICS_NORECOMPUTE = OFF, IGNORE_DUP_KEY = OFF, ALLOW_ROW_LOCKS = ON, ALLOW_PAGE_LOCKS = ON) ON [PRIMARY]
) ON [PRIMARY] TEXTIMAGE_ON [PRIMARY]
GO
CREATE TABLE [cap].[Received](
        [Id] [bigint] NOT NULL,
        [Version] [nvarchar](20) NOT NULL,
        [Name] [nvarchar](200) NOT NULL,
        [Group] [nvarchar](200) NULL,
        [Content] [nvarchar](max) NULL,
        [Retries] [int] NOT NULL,
        [Added] [datetime2](7) NOT NULL,
        [ExpiresAt] [datetime2](7) NULL,
        [StatusName] [nvarchar](50) NOT NULL,
CONSTRAINT [PK_cap.Received] PRIMARY KEY CLUSTERED
(
        [Id] ASC
)WITH (PAD_INDEX = OFF, STATISTICS_NORECOMPUTE = OFF, IGNORE_DUP_KEY = OFF, ALLOW_ROW_LOCKS = ON, ALLOW_PAGE_LOCKS = ON) ON [PRIMARY]
) ON [PRIMARY] TEXTIMAGE_ON [PRIMARY]
GO


HomeController 控制器方法如下:

当用户注册成功后,会发送3条不同主题的消息,然后由订阅者去消费。

当CAP启动的时候,它将创建一个默认的消费者组,如果多个相同消费者组的消费者消费同一个Topic消息的时候,只会有一个消费者被执行。 相反,如果消费者都位于不同的消费者组,则所有的消费者都会被执行

新建一个 .NET Core 的控制台项目,作为订阅端(消费端),还是引用刚才的包,仪表盘可以忽略。

如果是在Controller中,直接添加[CapSubscribe("")] 来订阅相关消息。

如果你的方法没有位于Controller 中,那么你订阅的类需要继承 ICapSubscribe,然后添加[CapSubscribe("")]标记。

代码如下:

开启订阅客户端,尝试访问 http://localhost:28116/Home/UserRegister 发送消息,效果图如下:

cap.gif

控制台和控制器的接收端都触发了,如下图:

QQ截图20210317170649.jpg

尝试在接收消息方法手动抛出异常,代码如下:

cap 会帮我们自动重试该方法,失败后的重试次数,默认50次,失败后的重拾间隔,默认60秒,如下图:

QQ截图20210317154416.jpg QQ截图20210317154328.jpg

框架无法做到100%确保消息只执行一次,所以在一些关键场景消息端在方法实现的过程中自己注意业务去重。


最后,附上源码:

游客,如果您要查看本帖隐藏内容请回复






上一篇:CSV 在线转换 Markdown 语法
下一篇:HttpClient 直接 POST 发送 byte 字节(gzip)压缩请求
码农网,只发表在实践过程中,遇到的技术难题,不误导他人。
发表于 2021-3-18 18:11:20 | 显示全部楼层
来看看,谢谢分享
码农网,只发表在实践过程中,遇到的技术难题,不误导他人。
发表于 2021-9-22 20:42:18 | 显示全部楼层
学习学习。。。
码农网,只发表在实践过程中,遇到的技术难题,不误导他人。
发表于 2021-12-31 15:08:21 | 显示全部楼层
学习中
很好,非常不错
码农网,只发表在实践过程中,遇到的技术难题,不误导他人。
您需要登录后才可以回帖 登录 | 注册[Register]

本版积分规则

免责声明:
码农网所发布的一切软件、编程资料或者文章仅限用于学习和研究目的;不得将上述内容用于商业或者非法用途,否则,一切后果请用户自负。本站信息来自网络,版权争议与本站无关。您必须在下载后的24个小时之内,从您的电脑中彻底删除上述内容。如果您喜欢该程序,请支持正版软件,购买注册,得到更好的正版服务。如有侵权请邮件与我们联系处理。

Mail To:help@itsvse.com

QQ|手机版|小黑屋|架构师 ( 鲁ICP备14021824号-2 )|网站地图

GMT+8, 2024-5-29 03:04

Powered by Discuz! X3.4

Copyright © 2001-2021, Tencent Cloud.

快速回复 返回顶部 返回列表