性能优化真言:队列缓存分布式  异步调优堆配置

前言:用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的学习和应用的更多相关文章

  1. Delphi GDI+ 安装方法

    [转]Delphi GDI+ 安装方法转自:万一博客(http://www.cnblogs.com/del/)GDI+ 是 Windows 的一个函数库, 来自 Windows\System32\GD ...

  2. redis深入学习(一)-----CAP、redis数据类型

    NoSQL数据库的四大分类 KV键值: memcache+redis 文档型数据库(bson格式比较多): MongoDB MongoDB 是一个基于分布式文件存储的数据库.由 C++ 语言编写.旨在 ...

  3. redis学习之——在分布式数据库中CAP原理CAP+BASE

    分布式系统 分布式系统(distributed system) 由多台计算机和通信的软件组件通过计算机网络连接(本地网络或广域网)组成.分布式系统是建立在网络之上的软件系统.正是因为软件的特性,所以分 ...

  4. CAP分布式事务 学习及简单demo

    完全参考 github的指导 demo地址, Pub使用 efcore , Sub 使用 dapper, mysql数据库 https://files.cnblogs.com/files/xtxtx/ ...

  5. Redis初识、设计思想与一些学习资源推荐

    一.Redis简介 1.什么是Redis Redis 是一个开源的使用ANSI C 语言编写.支持网络.可基于内存亦可持久化的日志型.Key-Value 数据库,并提供多种语言的API.从2010 年 ...

  6. Python爬虫学习(10):Selenium的好基友PhantomJS

    上一节中我们学习了selenium,用python来操作浏览器,在做网页自动化测试的时候最好不过了 .如果我们来做爬虫用一个带界面的浏览器似乎不太好吧,那可咋办呢?别着急,下来我们要介绍的就是一款不带 ...

  7. 分布式系统设计权衡之CAP

    写在最前: 1.为什么学习并记录分布式设计理念一系列相关的东西 在日常工作中系统设计评审的时候,经常会有一些同事抛出一些概念,高可用性,一致性等等字眼,他们用这些最基本的概念去反驳系统最初的设计,但是 ...

  8. 【2016-10-28】【坚持学习】【Day15】【MongoDB】【初识】

    其实公司产品一直有使用mongodb,只不过我一直没有接触这一块,也没有主动的了解.实在说不过去.于是,准备写几个文章,认真学习一下它. 今天花了几个小时学习了入门 定义: 非关系型数据库, NoSQ ...

  9. NOSQL数据模型和CAP原理

    NOSQL数据模型和CAP原理 http://blog.sina.com.cn/s/blog_7800d9210100t33v.html 我本来一直觉得NoSQL其实很容易理解的,我本身也已经对NoS ...

随机推荐

  1. DG常用运维命令及常见问题解决

    DG常见运维命令及常见问题解决方法 l> DG库启动.关闭标准操作Dataguard关闭1).先取消日志应用alter database recover managed standby data ...

  2. 客户端 SOCKET 编程

    建立客户端的 Socket: 客户端应用程序首先也是调用 WSAStartup() 函数来初始化 Winsock 的动态连接库,然后同样 调用 socket() 来建立一个 TCP 或 UDP Soc ...

  3. scipy.misc.toimage()出现toimage报错

    scipy.misc.toimage()出现toimage报错 自己被这个问题困扰了许久,其实最后发现其实toimage这个函数已经被取消了,或者说是没有这个函数了.有了新得函数与之代替,那就是Ima ...

  4. webpack——npm -i 与npm install -s与-d的区别

    在 package.json 文件里面的[devDependencies]和[dependencies]对象有什么区别呢? devDependencies  里面的插件只用于开发环境,不用于生产环境, ...

  5. C# 添加、修改、删除Excel图表数据标签

    图表中,图表数据标签以数据化形式表现图表中的特定数据,可增强图表的可读性.我们可以对图表添加数据标签,也可以对已有的数据标签进行修改或者删除,下面将通过C#代码形式来实现. 使用工具:Spire.XL ...

  6. SpringBoot系列教程之Bean加载顺序之错误使用姿势辟谣

    在网上查询 Bean 的加载顺序时,看到了大量的文章中使用@Order注解的方式来控制 bean 的加载顺序,不知道写这些的博文的同学自己有没有实际的验证过,本文希望通过指出这些错误的使用姿势,让观文 ...

  7. git 的一些指令

    作为一个前端,git的各种指令应该是需要掌握的,因为前一段时间遇到了一些问题,总觉得每次遇到点问题都去百度这样总归不大好,还是记录一下比较常见的一些指令吧.以后遇到新的再继续添加. 1. 新建本地分支 ...

  8. Shell进阶精品课程

    课程链接 Shell精品进阶教程:理解Shell的方方面面 课程目标 系统性的掌握shell相关知识,进阶shell脚本能力,对shell各方面了然于心 适用人群 具备shell基础但想深入.系统性掌 ...

  9. MyBatis(2)-- MyBatis配置mybatis-config.xml

    一.properties属性 1.可以在mybatis-config.xml中使用property子元素配置 <properties resource="jdbc.properties ...

  10. Ubuntu svn 安装 Rabbitvcs

    先添加源 sudo add-apt-repository ppa:rabbitvcs/ppa 必要的话在源清单里面也添加一下 sudo gedit /etc/apt/sources.list 内容是 ...