CAP的学习和应用
性能优化真言:队列缓存分布式 异步调优堆配置
前言:用CAP有一段时间了,这里简单记录一下,这么好用的东西,小伙伴们赶紧上车吧

一.CAP使用场景?
平时工作中经常使用到MQ,如(kafka,rabbitmq...),用来简单的发布/订阅,经常会遇到以下几个问题
A.SQL执行成功了,消息发送失败了
B.SQL执行失败了,消息发送成功了
常用方案,把SQL放前面,MQ放后面,MQ执行失败了,我们把整个SQL进行回滚,这种方案在单应用下是可行的,它的回滚成本并不高
我们模拟一个简单的分布式场景:上游下单->中台分单->下游发货
我非要回滚

站在业务角度分析,客户满足下单条件,已经下单成功了,但是上游服务在给中台发送MQ的时候失败了,这种情况很明显是不允许回滚的
补救的办法,就是标记这个订单的状态,给客户一个假成功的状态,后台再写个任务调度去处理,每个发送消息的地方都得这样处理,非常的麻烦费事,而且业务跟MQ耦合在一起了
有没有更好的解决方案?
二.CAP是干什么用的?
CAP提供分布式事务的最终一致性解决方案
这里简单说下强一致性,与最终一致性
强一致性,数据库里的CAID就是强一致性,它们对外永远只有一个状态,要么成功,要么失败
最终一致性,能容忍应用部分成功,在一段时间后,能达到全部成功状态
很明显在分布式环境里,任何东西都有可能宕机,如数据库,缓存,MQ都有可能出现问题,任何一个组件出现问题,都不影响业务最终执行的结果,这就是系统的稳定性
三.CAP是如何实现最终一致性的?
CAP具备传统EventBus的全部功能,简单的发布/订阅非常好理解,CAP在此基础上持久化了消息(就是把每条消息保存到了数据库),我们还是拿下单场景来说明
当上游向中台发送消息失败时,CAP还是会标注该业务执行成功,但是持久化在数据库里的消息状态是失败的,它会执行重试策略,重试策略执行完后,还是失败,就不会重试了
这个时候很明显就是MQ挂了,修复MQ后,取出这些重试策略执行后任失败消息从新录入MQ即可
CAP是基于数据库的强一致性来实现最终一致性的,简单来说,就是执行业务的SQL,跟持久化消息的SQL在一个事务里
当中台接到上游订单后,执行分单的SQL错误了,怎么搞呢?
这个时候我们应该把这个异常告诉它的上游, 简单来说,就是当前服务已经GG了,请你不要给我再给我任务了,请把任务转给其他服务,如果没有任何服务能够执行任务,那么你帮我把消息缓存起来,等我修复好了,再执行这些任务
CAP 在发布/订阅的基础上新增了一个回调,中台会把任务的执行结果通知给上游, 回调相当于中台给上游发消息,上游根据回调的结果决定接下来怎么做
极端情况,中台的数据库挂了,至少上游缓存了所有发送的消息,我们也可以通过这些消息进行溯源,重新消费这些消息即可
作者原文博客地址(建议完整的看一遍,你品,你细品):
https://www.cnblogs.com/savorboard/p/cap.html
https://www.cnblogs.com/savorboard/p/cap-document.html
四.CAP简单入门?
做为一个萌新,怎么优(jian)雅(dan)的使用CAP呢
首先你得需要一个MQ,这里推荐rabbitmq,操作简单,可视化页面功能强大,其次就是一个数据库(sqlserver,mysql,postgresql,mongodb)
然后就简单的配置一下连接就可以用了,帮助文档写的非常详细,这里就不再赘述了,直接贴上地址
http://cap.dotnetcore.xyz/user-guide/zh/getting-started/quick-start/
五.CAP使用中遇到的问题?

我在使用过程中遇到的问题,大多数都很low,除了docker里装的kafka坑了我,其它基本上都没啥子问题
CAP使用过程中遇到问题,可以去github上先搜下issues,任无法解决可以提issues
CAP的学习和应用的更多相关文章
- Delphi GDI+ 安装方法
[转]Delphi GDI+ 安装方法转自:万一博客(http://www.cnblogs.com/del/)GDI+ 是 Windows 的一个函数库, 来自 Windows\System32\GD ...
- redis深入学习(一)-----CAP、redis数据类型
NoSQL数据库的四大分类 KV键值: memcache+redis 文档型数据库(bson格式比较多): MongoDB MongoDB 是一个基于分布式文件存储的数据库.由 C++ 语言编写.旨在 ...
- redis学习之——在分布式数据库中CAP原理CAP+BASE
分布式系统 分布式系统(distributed system) 由多台计算机和通信的软件组件通过计算机网络连接(本地网络或广域网)组成.分布式系统是建立在网络之上的软件系统.正是因为软件的特性,所以分 ...
- CAP分布式事务 学习及简单demo
完全参考 github的指导 demo地址, Pub使用 efcore , Sub 使用 dapper, mysql数据库 https://files.cnblogs.com/files/xtxtx/ ...
- Redis初识、设计思想与一些学习资源推荐
一.Redis简介 1.什么是Redis Redis 是一个开源的使用ANSI C 语言编写.支持网络.可基于内存亦可持久化的日志型.Key-Value 数据库,并提供多种语言的API.从2010 年 ...
- Python爬虫学习(10):Selenium的好基友PhantomJS
上一节中我们学习了selenium,用python来操作浏览器,在做网页自动化测试的时候最好不过了 .如果我们来做爬虫用一个带界面的浏览器似乎不太好吧,那可咋办呢?别着急,下来我们要介绍的就是一款不带 ...
- 分布式系统设计权衡之CAP
写在最前: 1.为什么学习并记录分布式设计理念一系列相关的东西 在日常工作中系统设计评审的时候,经常会有一些同事抛出一些概念,高可用性,一致性等等字眼,他们用这些最基本的概念去反驳系统最初的设计,但是 ...
- 【2016-10-28】【坚持学习】【Day15】【MongoDB】【初识】
其实公司产品一直有使用mongodb,只不过我一直没有接触这一块,也没有主动的了解.实在说不过去.于是,准备写几个文章,认真学习一下它. 今天花了几个小时学习了入门 定义: 非关系型数据库, NoSQ ...
- NOSQL数据模型和CAP原理
NOSQL数据模型和CAP原理 http://blog.sina.com.cn/s/blog_7800d9210100t33v.html 我本来一直觉得NoSQL其实很容易理解的,我本身也已经对NoS ...
随机推荐
- QR 码详解(下)
快速响应矩阵码(下) 书接上回,继续下半场. 纠错码 QR 码采用纠错算法生成一系列纠错码字,添加在数据码字序列之后,使得符号可以在遇到损坏时可以恢复.这就是为什么二维码即使有残缺也可以扫出来.没有残 ...
- 纯C语言写的按键驱动,将按键逻辑与按键处理事件分离~
button drive 杰杰自己写的一个按键驱动,支持单双击.连按.长按:采用回调处理按键事件(自定义消抖时间),使用只需3步,创建按键,按键事件与回调处理函数链接映射,周期检查按键. 源码地址:h ...
- Java的数组的作业11月06日
动手动脑 实验一:了解for循环得到棋盘结构 (1) 程序: import java.io.*; public class QiPan { //定义一个二维数组来充当棋盘 private String ...
- 网关服务自定义路由规则(springcloud+nacos)
1. 场景描述 需要给各个网关服务类提供自定义配置路由规则,实时生效,不用重启网关(重启风险大),目前已实现,动态加载自定义路由文件,动态加载路由文件中的路由规则,只需在规则文件中配置下规则就可以了 ...
- Mysql多数据库备份
备份数据脚本 #!/bin/bash # date是linux的一个命令 date [参数] [+格式] time=` date +%Y_%m_%d_%H_%M_%S ` # 备份输出路径 backu ...
- vue-cli 中stylus写样式莫名报错?
报错一: expected "indent", got "eos" 错误截图如下: 在确认stylus安装无误后,我们应该看看是否stylus代码不符合规范. ...
- powerCat进行常规tcp端口转发
实战中,我们也会遇到需要我们进行端口转发的情况,比如已经拿下的目标机1是在dmz区,而目标1所在内网的其他目标只能通过目标1去访问,这时候我们就需要端口转发或者代理来进行后渗透.这次就要介绍一个加强版 ...
- Cocos2d-x 学习笔记(21.1) ScrollView “甩出”效果与 deaccelerateScrolling 方法
1. 简介 “甩出”效果是当我们快速拖动container并松开后,container继续朝原方向运动,但是渐渐减速直到停止的效果. ScrollView的onTouchEnded方法会设置Timer ...
- Grid实现table表格布局
HTML <div class="table"> <div class="th"> <div>日期</div> ...
- 让button的文字换行和左对齐
btn.titleLabel.numberOfLines = 0; btn.contentHorizontalAlignment = UIControlContentHorizontalAlign ...