CAP理论实践

CAP 理论

在分布式环境中,C(Consistency)一致性 A (Avaliability) 可用性 P(Partition Tolerance) 分区容错 是不能同时满足的。

分区容错 【Partition Tolerance】

image-20220508212102380.png

ServerA(上海1)在访问 ServerB(北京1)的时候可能出现 网络瘫痪 服务故障等原因,导致之间无妨访问。

一致性 【Avaliability】

下面是银行模拟转账业务,用户A(工商银行) 给 用户B(中国银行) 发起一笔转账业务 100元, 用户A调用

工商银行(ServiceA)-100元,在调用 中国银行(ServiceB)给用户B +100,由于ServiceA 调用ServiceB有延时,这时候用户A账号已经少了100元,但是由于延时原因,用户B在立马查询的时候发现账号此刻并未到账100元。

image-20220508213138176.png
这个场景在 用户提现,支付宝提现,提示2小时到账

Partition Tolerance 【可用性】 收到请求必须相应

同样还是上面银行转账的例子,用户A在工商银行系统-100,在中国银行给用户B加100的操作中,如果要保证用户B已经收到了100元才能查询,那么次数可以把 这个整个操作当做一个整体,只有全部完成的时候才能够对外提供服务。这时候就牺牲了可用性。

所以在分布式环境中,CAP是不能够同时满足的。至于是选择CA CP AP,根据自己的业务需求

在银行系统中, 一致性最重要,数据不能错,CP
在微服务中,系统的可用性,尤其是分布式,可用性尤为重要,没有可用性是跑不起来的 AP
cap.png

一致性的探究

强一致性

任意时刻数据都是一致性的 2PC 3PC

2PC (two-phase commit protocol)

1 性能问题
2 单点故障—事务管理器
3 消息丢失问题
只是解决小范围,或者强制要求一致性,所以就
没有可用性
SQLServer+DTC—局限在Windows+.NET 
Framework,.NET Core目前没有解决方案
MySQL--XA协议—也没有DTC这种协调器,是
需要用代码实现XA,实现强事务--.NETCore也
没有---因为确实在分布式下用的少

3PC(three-phase commit protocol)

Ready-GO!
CanCommit—PreCommit--DoCommit
3PC只是数据库可以自动提交,避免调度
者超时问题,但是其他还在的,
1 性能问题
2 单点故障—事务管理器
3 消息丢失问题

弱一致性 TCC(Try-Confirm-Cancel)

允许某一时刻不一致,承诺在一定时间内变成一致的 Try-Confirm-Cancel 代码层面--Saga

image-20220508214624668.png

TCC的注意点

1 分段设计:try成功 就一定能Confirm
2 允许空回滚:重复cancel不能错
3 悬挂控制:try阻塞,先cancel,保证数据正确
4 幂等控制:TCC多少次,结果不变
5 可见控制:值的展示
5 并发访问控制
主要用在银行、阿里---钱必须保障-不能阻塞—设计负责,开发工作重
ByteTCC、Himly、TCC-transaction事务管理器—这些都是Java的 .NET
没有—所以解决方案也没有—除非自己写

最终一致性 (BASE理论)

—允许数据不一致,但是最终最终,数据还是得一致的 业务层面

Base理论:
1. Basically Available(基本可用)
2. (最终一致性)
3. Soft state(软状态)
4. Eventually consistent
微服务架构里面,可用性是最重要的
思想是最重要,指引方向
本地消息表分布式事务

MQ分布式事务--本地消息表--基于消息的一致性

  1. 上游投递消息

  2. 下游获取消息

  3. 上游投递稳定性

  4. 下游接受稳定性

image-20220508215644391.png
上游投递消息稳定性

如何保证数据一定能写入到队列,只有保障了投递的稳定性,才能保障流程的正常。

 上层应用在操作订单服务的时候,先将数据写入到临时数据表 Publisher中,另外一部分处理业务逻辑,这部分是一个事务。Publisher表中有一些软状态,成功和失败。表示是否成功写入到消息队列中。
队列数据可靠性

如何保证队列数据不丢失?RabbitMQ—集群&持久化

下游获取消息稳定性

如何保证下游一定获取到数据?Ack 就够了吗?

库存服务通过消息队列中拿到上游给的信息,但同时也有可能失败,比如库存服务宕机,或是网络超时等原因,这时候理应有从试、过期等机制,拿到数据后ACK将数据从消息队列中移除,避免消息队列有脏数据。

NCC CAP框架

CAP成熟的开源框架,完整实现了全套特性 使用最终一致性

.NET Core中安装使用安装。

DotNetCore.CAP            核心组件
DotNetCore.CAP.SqlServer  业务处理数据库
DotNetCore.CAP.RabbitMQ   消息队列 下游应用通过消息队列拿到上游应用传递的参数
DotNetCore.CAP.MongoDB    业务处理数据库

该组件可以支持多种数据库. git 地址:https://github.com/dotnetcore/CAP

image-20220508221150336.png
PM> Install-Package DotNetCore.CAP.Kafka
PM> Install-Package DotNetCore.CAP.RabbitMQ
PM> Install-Package DotNetCore.CAP.AzureServiceBus
PM> Install-Package DotNetCore.CAP.AmazonSQS
PM> Install-Package DotNetCore.CAP.NATS
PM> Install-Package DotNetCore.CAP.RedisStreams
PM> Install-Package DotNetCore.CAP.Pulsar

框架简单使用案例:

https://gitee.com/delaywu/neter.git

©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 202,980评论 5 476
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 85,178评论 2 380
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 149,868评论 0 336
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 54,498评论 1 273
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 63,492评论 5 364
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 48,521评论 1 281
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 37,910评论 3 395
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 36,569评论 0 256
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 40,793评论 1 296
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 35,559评论 2 319
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 37,639评论 1 329
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 33,342评论 4 318
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 38,931评论 3 307
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 29,904评论 0 19
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 31,144评论 1 259
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 42,833评论 2 349
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 42,350评论 2 342

推荐阅读更多精彩内容