专栏首页松华说ARTS-14-分布式系统之一致性和数据复制

ARTS-14-分布式系统之一致性和数据复制

ARTS的初衷

Algorithm: 主要是为了编程训练和学习。

Review:主要是为了学习英文

Tip:主要是为了总结和归纳在日常工作中所遇到的知识点。学习至少一个技术技巧。在工作中遇到的问题,踩过的坑,学习的点滴知识。

Share:主要是为了建立影响力,能够输出价值观。分享一篇有观点和思考的技术文章

https://www.zhihu.com/question/301150832

一、Algorithm

Single Number

Given a non-empty array of integers, every element appears twice except for one. Find that single one.

Note:

Your algorithm should have a linear runtime complexity. Could you implement it without using extra memory?

Example 1:

Input: [2,2,1] Output: 1 Example 2:

Input: [4,1,2,1,2] Output: 4

class Solution {
    public int singleNumber(int[] nums) {
        //不需要额外内存,nums非空但是可能包括0
        //数值转换为二进制后进行运算,0^0=0, 0^1=1, 1^0=0, 1^1=0
        //异或满足交换律
        int ans =  nums[0];
        for(int i=1;i<nums.length;i++) {
            ans = ans^nums[i];
        }
        return ans;
    }
}
二、Review

1、一致性常见问题

这些问题离我们并不遥远,数据分散在多处会导致数据不一致,必须尽可能地解决此问题,才能保证良好的用户体验,最终的期望是任何人、任何时间、任何地点、任何接入方式、任何服务,数据都是一致的

2、一致性模式

1)、顺序一致性(Sequencial Consistency)

每个线程内部的指令都是按照程序规定的顺序执行的(单个线程的视角)。线程执行的交错顺序可以是做任意的,但是所有线程所看见的整体程序总体执行顺序都是一样的(整体程序的视角)

2)、弱一致性-因果一致性(Casual Consistency)

如果节点A在更新完某个数据后通知了节点B,那么节点B之后对该数据的访问和修改都是基于A更新后的值。于此同时,和节点A无因果关系的节点C的数据访问则没有这样的限制

3)、弱一致性-入口一致性(Entry Consistency)

入口一致性要求每个普通的共享数据都要与某种同步变量如锁(lock)或屏障(barrier)相关联

进程2在没有获取”y”数据的访问锁时,读取的值将为NIL(In the following figures, since Process2 does not hold the access right (= synchronous variable) to the data item “y”, the reading result becomes NIL)

4)、弱一致性-最终一致性(Eventual consistency)

5)、弱一致性-以客户为中心的一致性(Client-centric consistency model)

包括以下四种体现

(1)、单调读一致性(Monotonic reading)

如果一个进程从系统中读取出一个数据项X的某个值后,该进程对于X后续访问都不应该返回更旧的值(If a process reads data item x, any subsequent reads on x by that process will either reply with the same value or reply with a newer value)

例子:任何时候你登录邮箱服务,它都能保证你上次访问服务器时可以读取的邮件现在都可以查看

(2)、单调写一致性(Monotonic writing)

一个系统要能够保证来自同一个进程的写操作被顺序的执行,它类似以数据为中心的FIFO一致性,不过它强调的是在单一进程的顺序约束而不是并发进程集(A write operation by one process to a data item x is completed before any subsequent write to x by the same process)

(3)、写后读一致性(Read Your Writes)

进程更新一个数据后,它总是能访问到自身更新过的最新值,而不会看到旧值(The result of a write operation by a process to data item x is always observed by subsequent read operations by the same process)

例子:比如当你更新一个系统的管理密码时,必须保证更新后的密码无论你在任何地方登录时都有效

(4)、读后写一致性(Writes Follow Reads)

同一个进程对数据项X执行的读操作之后的写操作,保证发生在与X读取值相同或比之更新的值上(The result of a write operation by a process to data item x is always observed by subsequent read operations by the same process)

一致性模式描述的是严格一致性、因果一致性和顺序一致性,保证了系统不会出现脏写、脏读、不可重复读、幻读、更新丢失的坏账

3、解决思路-ACID

最常见的实现方式是WAL(write ahead loging)技术,它并不直接写入到系统文件中,而是写入到另外一个称为WAL的文件中;如果事务失败,WAL中的记录会被忽略,撤销修改;如果事务成功,它将在随后的某个时间被写回到系统文件中,提交修改

4、解决思路-CAP

ARTS-13-分布式系统入门和实践笔记

5、解决思路-BASE

基本可用、中间(软)状态、最终一致

6、常见解决方案

1)、两阶段提交-2PC

TM存在单点问题,而且会同步阻塞,产生资源锁定,并发低的情况

2)、补偿机制-TCC

针对每个操作,注册一个与其对应的确认和补偿(撤销)操作,对业务侵入性大,需要设计复杂的重试、幂行、日记记录模块

3)、补偿机制-Saga

流程:

(1)、订单服务创建最终状态未知的订单记录

(2)、订单服务创建一个CreateOrderSaga负责协调订单 (3)、CreateOrderSaga发送ReserveCredit指令至用户服务 (4)、用户服务接受到指令然后为此订单预扣款,同时回复一条表明结果的信息 (5)、CreateOrderSaga接受到信息后,发送通过或拒绝指令到订单服务 (6)、订单服务接受到指令后修改其状态

Saga可以看做是一个异步的、事件驱动的补偿事务,由Sage工作流引擎协调,其适用于无需立刻返回业务发起方最终状态的场景,但是它不保证隔离性

链接:https://github.com/eventuate-tram/eventuate-tram-sagas

4)、基于MQ-本地消息表

将分布式事务拆分成本地事务进行处理

5)、基于MQ-事务消息

6)、经典实现-seata

一个典型的分布式事务过程:

(1)、TM 向 TC 申请开启一个全局事务,全局事务创建成功并生成一个全局唯一的 XID

(2)、XID 在微服务调用链路的上下文中传播 (3)、RM 向 TC 注册分支事务,将其纳入 XID 对应全局事务的管辖 (4)、TM 向 TC 发起针对 XID 的全局提交或回滚决议 (5)、TC 调度 XID 下管辖的全部分支事务完成提交或回滚请求

链接:https://github.com/seata/seata

7、数据复制

1)、服务端Server Startup Replica

2)、客户端Client Startup Replica

缓存失效时长不宜过长

8、数据同步

需要数据多备份就意味着需要内容同步,常见的方式有

1)、 将更新通知传输到副本(Propagate only updates notifications) 2)、 将更新数据传输到副本(Transmit update data from one copy to another) 3)、 将更新操作传输到副本-推荐方式(Propagate update operations to other replicas)

比如mysql的主从复制过程

参考文章: https://medium.com/mold-project/consistency-e3e0fe41358d https://www.infoq.cn/article/G33hCC-QoSJPlkt4e64E

三、TIP

1、多module打包发现程序包不存在

使用maven-compiler-plugin替换spring-boot-maven-plugin插件

2、SpringBoot项目部署到非内嵌的tomcat容器

1)、移除(exclusions)默认的tomcat依赖包,因为springboot具有自动装配特性的,它取决于开发人员在应用的ClassPath下的JAR文件依赖,同时项目的src/main/resource目录下存在META-INF/spring.factories资源,并且配置EnableAutoConfiguration,那么SpringBoot会”尝试”将其装配 2)、引用tomcat依赖,推荐使用tomcat-servlet-api 3)、主类继承SpringBootServletInitializer抽象类并重写configure方法,SpringBootServletInitializer就是一个org.springframework.web.context.WebApplicationContext,它能让我们使用外部的Servlet容器,容器启动时会调用其onStartup(ServletContext servletContext)方法,首先配置各种servlet、filter、listener等,最后通过SpringApplicationBuilder构建并封装SpringApplication对象,并调用SpringApplication的run方法

@Override
    protected SpringApplicationBuilder configure(SpringApplicationBuilder application) {
        return application.sources(WebApplication.class);
    }

4)、修改pom.xml的packaging为war

5)、在application.properties中配置spring.main.web-application-type=none

本文分享自微信公众号 - 松华说(songhuasay),作者:松花皮蛋

原文出处及转载信息见文内详细说明,如有侵权,请联系 yunjia_community@tencent.com 删除。

原始发表时间:2019-06-16

本文参与腾讯云自媒体分享计划,欢迎正在阅读的你也加入,一起分享。

我来说两句

0 条评论
登录 后参与评论

相关文章

  • 梁老师小课堂|谈谈本地缓存

    本地缓存指的是单机实例的JVM内存数据。多个实例共享着同一个分布式缓存,组成了多级缓存架构。这种多级缓存的特点是,最外层读取速度快但是空间小,越内层速度慢但是空...

    公众号_松华说
  • 对开发人员有用的定律、理论、原则和模式

    这篇文章包含对一些定律、原则以及模式的解释,但不提倡其中任何一个。它们的应用始终存在着争论,并且很大程度上取决于你正在做什么。

    公众号_松华说
  • 秒杀系统技术解剖

    先来说说整体的设计理念,秒杀类的活动光靠水平扩展扩增机器只能是个备选方案,它的成本和收益不对等。那我们就应该尽量利用有效的资源最大化处理业务,可从限流、异步处...

    公众号_松华说
  • 产品之上的世界观

    image.png 推荐语: 虽然此前有Foxmail和QQ邮箱的成功,但是,因其天性低调,张小龙仍然可以说是一个默默无闻的人。虽然微信用户超过5亿...

    腾讯研究院
  • 分布式系统ACID中C与CAP定理中C的区别

    ACID和CAP定理中都有C,代表Consistent一致性,很多人容易将这两个C混为一谈,其实这两个一致性是有区别的。 事务的定义是一系列操作要么全部成功,要...

    小柒2012
  • 身价百亿姚劲波,极品域名赚不停

    江湖上流传着不少少年成名,靠着一门本事赚到人生百万的故事。今天就来说说广为流传关于大佬姚劲波的传说,“58同城CEO、身价百亿、年少成名、靠域名赚...

    躲在树上的域小名
  • 线上的某个SQL语句的执行计划分析​

    select C from table where A=1 and B>date_a and B<date_b group by C

    AsiaYe
  • js new一个function都发生了什么

    在ES5当中其实是没有类这个概念的,我们使用js的OOP编程其实是用function模拟了类的实现。

    无邪Z
  • 干货 | 酷客多CEO郝宪玮:微信小程序,新型营销变革

    嘉宾演讲视频 Guest Video ? 温馨提示 本视频时长25分29秒,建议在wifi下观看 4月23日,由上海技术力量和青创社发起,由中生代技术、浦软孵化...

    IT大咖说
  • 程序员业余时间写的代码也算公司的?Nginx之父被捕引发争议

    Igor Sysoev 15 年前任职于俄罗斯公司 Rambler(俄罗斯最大的搜索引擎和互联网门户之一「rambler.ru」的母公司),在此期间利用业余时间...

    机器之心

扫码关注云+社区

领取腾讯云代金券