CAP原理按照定义,指的是C(Consistency)一致性,A(Availability)可用性,P(Partition tolerance)分区容错性在一个完整的计算机系统中三种特性不能同时得到完全满足。

CAP_docker

Consistency((强)一致性):指的是在同一时间点,所有的数据状态是否是一致的。对于一致性的理解,可以从关系型数据库的事务概念出发来进行理解。例如:一次银行账户的转账,双方账户

的金额必须同时增加,和减少。不能出现转账账户已经扣钱,而被转账账户未能增加金额的情况。

Availability((高)可用性):大并发请求的场景下对服务器的要求特别高,可以接受更多请求,响应更快,拥有非常高的非故障运行时间百分率。

Partition tolerance(分区容错性):指的是在整个系统拥有两台或以上数量的计算机单元提供服务,当其中部分分区节点故障时,整个系统依然可以向用户提供可靠的服务。

在保证分区容错性的前提下,同时只能满足 一致性或可用性

强一致性 --- 牺牲可用性 阻塞数据库 并发高的项目不适用

高可用性 --- 成本高

最终一致性 -- 通过本地消息表事务将一个大事务拆分成多个环节,基于消息 队列完成转发,每个节点单独处理,完成最终一致性

* 期间放弃了一致性 并且需要人去维护

BASE 理论 :

Basically Available 基本可用

Availability 一致性

Soft State 软状态(数据不一致 最终一致)

Eventually consistent - 最终一致

CAP_docker_02

Docker部署 RabbitMQ

使用 management版本 因为有管理页面

docker pull rabbitmq:management

docker run -d -p 5672:5672 -p 15672:15672 --name rabbitmq rabbitmq:management

 http://10.31.60.13:15672

账号 密码都是guest

dotnet run --urls=http://*:11111

Nuget包

DotNetCore.CAP

DotNetCore.CAP.RabbitMQ

DotNetCore.CAP.SqlServer

开源的 .NET 标准库,用于处理分布式事务

CAP_数据_03

CAP_docker_04

CAP_数据库_05

Appsettings 配置

CAP_数据库_06

Program

CAP_分布式锁_07

上游发布消息

CAP_分布式锁_08

Publish 之后 数据库会多两张表

RabbitMQ 上游往交换机里写 不关心队列

交换机下游有多个队列

根据规则将数据转发到不同队列

如果没有指定下游队列 数据会丢失

CAP_docker_09

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

CAP_数据库_10

在 xxxService中:

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

CAP_数据_11

注入

builder.Services.AddScoped<RecordService>();