精华内容
下载资源
问答
  • java中锁不可描述的事

    2020-10-05 21:04:47
    通过读写屏障去实现锁效果,就是我更新完数据,会强制去更新主缓存和各级缓存数据。 如果volatile变量修饰符使用恰当话,它比synchronized使用和执行成本更低,因为它不会引起线程上下文切换和调度。 ...

    java实现锁的三种方式

    1. volatile关键字

      volatile用于修饰的变量,属于JUC层面的锁,在多线程访问的情况下,不会出现脏读,所有读请求都能读到更新后的数据。它是通过读写屏障去实现锁的效果,就是我更新完数据,会强制去更新主缓存和各级缓存的数据。
      如果volatile变量修饰符使用恰当的话,它比synchronized的使用和执行成本更低,因为它不会引起线程上下文的切换和调度。
    	public static volatile int i = 1; 
    
    1. synchronize关键字

      这个同样属于JUC层面,编译时,会创建一个monitor,通过monitor去实现原子操作。灵活性更高。详情见我上一篇博客。

      https://blog.csdn.net/weixin_38608225/article/details/108912437

    2. Lock对象

      这个是属于JDK沉默提供的锁,有 ReentranLock(重入锁),ReentrantReadWriteLock(读写锁),FairLock(公平锁),UnfairLock(非公平锁)等供选择,且提供众多API供我们监视和影响锁的状态。

    可重入锁

    static class  ReenLock extends Thread{
        private Lock lock;
        private String name;
    
        public ReenLock(Lock lock,String name) {
            this.lock = lock;
            this.name = name;
        }
    
        @Override
        public void run() {
            lock.lock();
            System.out.println("ReenLock doing!" + name );
            try {
                TimeUnit.SECONDS.sleep(1);
            } catch (InterruptedException e) {
                e.printStackTrace();
            }
            lock.unlock();
        }
    }
    

    读写锁

    //读
        static class ReadLock  extends Thread{
            private ReentrantReadWriteLock lock;
            private String name;
    
            public ReadLock(ReentrantReadWriteLock lock, String name) {
                this.lock = lock;
                this.name = name;
            }
    
            @Override
            public void run() {
                lock.readLock().lock();
                try {
                    System.out.println("read lock succ! "+ name);
                    TimeUnit.SECONDS.sleep(2);
                } catch (InterruptedException e) {
                    e.printStackTrace();
                }
                lock.readLock().unlock();
            }
        }
    
        //写
        static class WriteLock  extends Thread{
            private ReentrantReadWriteLock lock;
            private String name;
    
            public WriteLock(ReentrantReadWriteLock lock, String name) {
                this.lock = lock;
                this.name = name;
            }
    
            @Override
            public void run() {
                lock.writeLock().lock();
                try {
                    System.out.println("write lock succ! "+ name);
                    TimeUnit.SECONDS.sleep(2);
                } catch (InterruptedException e) {
                    e.printStackTrace();
                }
                lock.writeLock().unlock();
            }
        }
    

    main方法 测试用

    public static void main(String[] args) {
            //重入锁
            Lock lock = new ReentrantLock();
            for (int i = 0; i < 10; i++) {
                new ReenLock(lock,"thread" + i).start();
            }
    
            System.out.println("==================================");
    
            //读写锁
            ReentrantReadWriteLock rwLock = new ReentrantReadWriteLock();
            for (int i = 0; i < 10; i++) {
                new ReadLock(rwLock,"thread" + i).start();
                new WriteLock(rwLock,"thread" + i).start();
            }
        }
    

    锁的实现原理

    专有名词

    CAS:全称(CompareAndSetState)原子性操作的思维,通过验证期望值和实际结果值的一致情况来确保原子性操作的成功性。入参两个,一个是实际参数用于程序运算出结果的依据;一个是期望值,希望程序算出那个结果才是有效的。如果结果和期望一致,才算执行成功,不一致则不成功。
    好比:你拿一块钱想买两个肉包子,结果老板一块钱卖给你4个,你就不干了。

    AQS:全称AbstractQueueSynchronizer,队列同步器,构建锁和处理锁的基础框架。用于存放竞争不到锁的线程队列,内部结构是个双向链表,且是FIFO。提供获取状态、设置状态、还有cas操作。
    当获取到同步器的元素,会成为链表的头元素,处理完会释放锁,由剩余的元素通过自旋去争抢,争抢到则变成新的头元素。

    Condition:简单来说就是一个执行队列,将AQS中获取到锁的进程放入Condition队列中去执行。

    在这里插入图片描述

    • 参考资料:

    https://www.cnblogs.com/barrywxx/p/8678698.html
    特别感谢这个大神的博客,很容易理解

    展开全文
  • 在Zookeeper 官网上这样介绍它:ZooKeeper is a centralized service for maintaining configuration information, naming, providing distributed synchronization, and providing group servic...

    Zookeeper

    一、什么是 Zookeeper

    在这里插入图片描述

    在Zookeeper 官网上是这样介绍它的:ZooKeeper is a centralized service for maintaining configuration information, naming, providing distributed synchronization, and providing group services。

    大概的意思就是说 Zookeeper 主要是一个分布式服务协调框架,实现同步服务,配置维护和命名维护等分布式应用,是一个高性能的分布式数据一致性解决方案。

    二、Zookeeper 能做什么

    ZooKeeper主要服务于分布式系统,可以用ZooKeeper来做:统一配置管理、统一命名服务、分布式锁、集群管理。为什么能做这些后面再说。

    三、Zookeeper 和 CAP

    1. CAP

    在这里插入图片描述

    CAP 有三部分:Consistency、Availability、Partition tolerance 这三个,最多只能同时满足其中2个(网络故障下)。

    选项 描述
    Consistency(一致性) 指数据在多个副本之间能够保持一致的特性(严格的一致性)
    Availability(可用性) 指系统提供的服务必须一直处于可用的状态,每次请求都能获取到非错的响应(不保证获取的数据为最新数据)
    Partition tolerance(分区容错性) 分布式系统在遇到任何网络分区故障的时候,仍然能够对外提供满足一致性和可用性的服务,除非整个网络环境都发生了故障

    什么是分区?

    在分布式系统中,不同的节点分布在不同的子网络中,由于一些特殊的原因,这些子节点之间出现了网络不通的状态,但他们的内部子网络是正常的。从而导致了整个系统的环境被切分成了若干个孤立的区域,这就是分区。

    CAP 定理表明,在存在网络分区的情况下,一致性和可用性必须二选一。当网络发生分区(不同节点之间的网络发生故障或者延迟较大)时,要么失去一致性(允许不同分区的数据写入),要么失去可用性(识别到网络分区时停止服务)。 而在没有发生网络故障时,即分布式系统正常运行时,一致性和可用性是可以同时被满足的。

    • Consistency(一致性)

      这里的一致性是强一致性,强一致性的意思就是例如节点A更新了数据,节点B能同时更新,这样客户端在每次读取获得数据都是最近更新的。但是在定理中是忽略掉我们平日里的网络延迟的。现实情况网络延迟在现在还是无法避免的,所以我们只能实现最终一致性,但是目标还是贴近强一致性,也就是尽力降低延时的时间。

    • Availability(可用性)

      可用性指的是非故障的节点需要在合理的时间返回合理的响应。合理的响应的意思也就是不能搞个报错,不能是超时失败。举个例子比如说节点A更新了数据,同时要发布到节点B上,但是中间传输的电缆被挖掘机挖断了,此时用户去访问节点B,此时节点B应该返回老的数据,而不应该报错。这就是可用性。让用户感觉系统还是能用的。

    • Partition tolerance

      分区容错性,指的是当网络分区了,系统还能正常的运行和响应。比如节点A和节点B无法通信,你要考虑这个时候系统如何应该解决。虽然网络分区的概率低而且时间短但是这种情况是会发生的。所以理论上是牺牲C或者A,P是一定要达到的。

    2. Zookeeper 和 CAP

    ZooKeeper是个CP(一致性+分区容错性)的,即任何时刻对ZooKeeper的访问请求能得到一致的数据结果,同时系统对网络分割具备容错性;但是它不能保证每次服务请求的可用性。也就是在极端环境下,ZooKeeper可能会丢弃一些请求,消费者程序需要重新请求才能获得结果。

    ZooKeeper是分布式协调服务,它的职责是保证数据在其管辖下的所有服务之间保持同步、一致;所以就不难理解为什么ZooKeeper被设计成CP而不是AP特性的了。而且, 作为ZooKeeper的核心实现算法Zab(后述解释),就是解决了分布式系统下数据如何在多个服务之间保持同步问题的。

    四、Zookeeper 节点特性及节点属性分析

    Zookeeper提供基于类似于文件系统的目录节点树方式的数据存储,但是Zookeeper并不是用来专门存储数据的,它的作用主要是用来维护和监控你存储的数据的状态变化。通过监控这些数据状态的变化,从而可以达到基于数据的集群管理。

    1. 数据模型

    与Linux文件系统不同的是,Linux文件系统有目录和文件的区别,而Zookeeper的数据节点称为ZNode,ZNode是Zookeeper中数据的最小单元,每个ZNode都可以保存数据,同时还可以挂载子节点,因此构成了一个层次化的命名空间,称为树。

    在这里插入图片描述

    znode树形结构图

    Znode 主要有以下几种类型:

    • PERSISTENT : 持久化节点,一旦创建这个Znode,存储的数据就不会主动消失,除非客户端主动delete;
    • EPHEMERAL : 临时节点,当客户端Client 和服务端Server断开连接后,这类型节点就会被删除(一个Session生命周期内);
    • PERSISTENT_SEQUENTIAL : 顺序自动编号的ZNode节点,这种znoe节点会根据当前已近存在的ZNode节点编号自动加 1,而且不会随Session断开而消失;
    • EPEMERAL_SEQUENTIAL : 临时自动编号节点,ZNode节点编号会自动增加,但是会随Session消失而消失。

    2. Znode 中都有啥

    在这里插入图片描述

    • data: Znode 存储的数据信息
    • ACL: 记录Znode 的访问权限,即那些人或那些ip能够访问本节点
    • stat: 包含Znode 的各种元数据,比如事务ID、版本号、时间戳、大小等等
    • child: 当前节点的子节点引用,类似二叉树的左右孩子

    注:Zookeeper 主要是为读多写少的场景设计,Znode 并不是用来存储大规模业务数据的,而是用来春初少量的状态和配置信息的,每个节点的数据一般最大不超过 1MB。

    五、Zookeeper 的基本操作和事件通知

    常见的有:

    • create 创建节点
    • delete 删除节点
    • exists 判断节点是否存在
    • getData 获取一个节点的数据
    • getChildren 获取节点一下的所有子节点

    以上的 exists、getData、getChildren 属于读操作。Zookeeper 客户端在请求读操作时,可以选择是否设置 Watch

    六、Watch 机制

    Watch 机制是它功能强大的强大辅助。我们可以理解为是注册在Znode 上的触发器。当这个Znode 发生改变时,也就是调用了create、delete等操作时,将会触发Znode 上注册的对应事件,请求 watch 的客户端会接收到异步通知。

    常见的监听场景有以下两项:

    • 监听Znode 节点的数据变化;
    • 监听子节点的增减变化

    以节点的删除举例:

    1. 客户端调用getData ,watch 参数为 true。服务端接到请求,返回节点数据,并且在对应的哈希表里插入被watch 的znode 路径,已经watcher列表

      在这里插入图片描述

    2. 当被watch 的Znode 被删除,服务端会查找哈希表,找到该znode 的所有watcher,异步通知客户端,并且删除哈希表中对应的key-value.

      在这里插入图片描述

    七、ACL

    Zookeeper内部存储了分布式系统运行时状态的元数据,这些元数据会直接影响基于Zookeeper进行构造的分布式系统的运行状态,如何保障系统中数据的安全,从而避免因误操作而带来的数据随意变更而导致的数据库异常十分重要,Zookeeper提供了一套完善的ACL权限控制机制来保障数据的安全。

    我们可以从三个方面来理解ACL机制:权限模式 Scheme、授权对象 ID、权限 Permission,通常使用"scheme:id:permission"来标识一个有效的ACL信息。

    八、Zookeeper 集群

    在这里插入图片描述

    Zookeeper 架构图

    Zookeeper Service 集群采取的是一主多从结构。

    Zookeeper三大角色

    • leader: Leader作为整个ZooKeeper集群的主节点,负责响应所有对ZooKeeper状态变更的请求。它会将每个状态更新请求进行排序和编号,以便保证整个集群内部消息处理的有序性(FIFO)。
    • follower: 了响应本服务器上的读请求外,follower还要处理leader的提议,并在leader提交该提议时在本地也进行提交。会参与选举.
    • Observer: 如果ZooKeeper集群的读取负载很高,或者客户端多到跨机房,可以设置一些observer服务器,以提高读取的吞吐量。不参与选举,不需要将事务持久化到磁盘。

    我们主要学习 Leader、Follower。

    在更新数据的时候,首先更新到主节点(这里的节点是指服务器,而不是Znode),再同步到从节点。写操作时,从节点接收到请求,就会把请求转发给主节点。读取数据时,直接读取任意从节点。

    为了保证主从节点的数据一致性,Zookeeper 采用 ZAB协议

    九、ZAB 协议

    1. ZAB 协议定义的三种节点状态

    • Looking : 选举状态
    • Following : Follower 节点(从节点)所处状态
    • Leading: Leader 节点(主节点)所处状态

    2. 最大 ZXID 概念

    最大ZXID 也就是节点本地的最新事务编号,包含 epoch 和计数部分。epoch 是纪元的意思。

    3. 崩溃恢复(选举。。。)

    如果 Zookeeper 主节点挂掉了,宕机了,集群就会进行奔溃恢复,ZAB 的崩溃恢复分为三个阶段:

    3.1. 选举阶段

    此时集群处于 Looking 状态,他们会各自向其它节点发起投票,投标包含自己的服务器id(SID)和最新事务id(ZID),即 (SID,ZID)。

    假设我们现在集群由5台机器组成,SID 分别为1、2、3、4、5,ZXID分别为 9、9、9、8、9,并且SID 为2的是 Leader,某时刻,1、2 所处机器出现故障,因此集群开始进行Leader 选举。

    • 第一次选举,每台机器都会将自己作为投票对象,于是SID为3,4,5的机器投票情况分别为(3, 9)、(4, 8)、(5, 8)。

    • 变更投票。每台机器发出投票后,也会收到其它机器的投票,每台机器根据一定规则来处理收到的其它机器的投票,并以此来决定是否需要变更自己的投票,这个规则就是整个Leader 选举算法的核心:

      • vote_sid:接收到的投票中所推举Leader服务器的SID。
      • vote_zxid:接收到的投票中所推举Leader服务器的ZXID。
      • self_sid:当前服务器自己的SID。
      • self_zxid:当前服务器自己的ZXID。

      每次对收到的投票进行处理,都是对 (vote_sid, vote_zxid)和(self_sid, self_zxid)对比的过程:

      • 规则一:如果vote_zxid大于self_zxid,就认可当前收到的投票,并再次将该投票发送出去。

      • 规则二:如果vote_zxid小于self_zxid,那么坚持自己的投票,不做任何变更。

      • 规则三:如果vote_zxid等于self_zxid,那么就对比两者的SID,如果vote_sid大于self_sid,那么就认可当前收到的投票,并再次将该投票发送出去。

      • 规则四:如果vote_zxid等于self_zxid,并且vote_sid小于self_sid,那么坚持自己的投票,不做任何变更。

      图解:

      在这里插入图片描述

    • 确认Leader。 经过第二轮投票后,集群中的每台机器都会再次接收到其他机器的投票,然后开始统计投票。如果一台机器收到了超过半数的相同投票,那么这个投票对应的SID 机器即为Leader。此时我们的例子 Server3 为 Leader。

    分析:通常服务器上的数据越新(ZXID会越大),其成为 Leader 的可能性越大,也就越能保证数据的恢复。如果 ZXID相同,则SID 越大机会越大。

    3.2. Discovery 发现阶段

    发现阶段,这个阶段用于在从节点中发现最新的ZXID 和事务日志。这是为了防止某些意外情况,比如因网络原因在上一阶段产生多个Leader 的情况。

    所以这一阶段,Leader集思广益,接收所有Follower发来各自的最新epoch值。Leader从中选出最大的epoch,基于此值加1,生成新的epoch分发给各个Follower。

    各个Follower收到全新的epoch后,返回ACK给Leader,带上各自最大的ZXID和历史事务日志。Leader选出最大的ZXID,并更新自身历史日志。

    3.3. Synchronization 同步阶段

    把Leader 刚才收集得到的最新历史事务日志,同步给集群中所有的Follower。只有当半数Follower同步成功,这个准Leader才能成为正式的Leader。

    4. 写入数据-Broadcast

    Zookeeper常规情况下更新数据的时候,由Leader广播到所有的Follower。其过程如下:

    1. 客户端发出写入数据请求给任意Follower。

    2. Follower把写入数据请求转发给Leader。

    3. Leader采用二阶段提交方式,先发送Propose广播给Follower。

    4. Follower接到Propose消息,写入日志成功后,返回ACK消息给Leader。

    5. Leader接到半数以上ACK消息,返回成功给客户端,并且广播Commit请求给Follower。

    十、Zookeeper 的应用场景

    1. 分布式锁

    2. 服务注册和发现

    利用Znode和Watcher,可以实现分布式服务的注册和发现。最著名的应用就是阿里的分布式RPC框架Dubbo。

    3. 共享配置和状态信息

    十一、2PC 和 3PC

    摘抄至:https://www.hollischuang.com/archives/1580

    1. 二阶段提交协议(2PC)

    二阶段提交协议主要分为来个阶段:准备阶段和提交阶段。

    在日常生活中其实是有很多事都是这种二阶段提交的,比如西方婚礼中就经常出现这种场景:

    牧师:”你愿意娶这个女人吗?爱她、忠诚于她,无论她贫困、患病或者残疾,直至死亡。Doyou(你愿意吗)?”

    新郎:”Ido(我愿意)!”

    牧师:”你愿意嫁给这个男人吗?爱他、忠诚于他,无论他贫困、患病或者残疾,直至死亡。Doyou(你愿意吗)?”

    新娘:”Ido(我愿意)!”

    牧师:现在请你们面向对方,握住对方的双手,作为妻子和丈夫向对方宣告誓言。

    新郎:我——某某某,全心全意娶你做我的妻子,无论是顺境或逆境,富裕或贫穷,健康或疾病,快乐或忧愁,我都将毫无保留地爱你,我将努力去理解你,完完全全信任你。我们将成为一个整体,互为彼此的一部分,我们将一起面对人生的一切,去分享我们的梦想,作为平等的忠实伴侣,度过今后的一生。

    新娘:我全心全意嫁给你作为你的妻子,无论是顺境或逆境,富裕或贫穷,健康或疾病,快乐或忧愁,我都将毫无保留的爱你,我将努力去理解你,完完全全信任你,我们将成为一个整体,互为彼此的一部分,我们将一起面对人生的一切,去分享我们的梦想,作为平等的忠实伴侣,度过今后的一生。

    上面这个比较经典的桥段就是一个典型的二阶段提交过程。

    首先协调者(牧师)会询问两个参与者(二位新人)是否能执行事务提交操作(愿意结婚)。如果两个参与者能够执行事务的提交,先执行事务操作,然后返回YES,如果没有成功执行事务操作,就返回NO。

    当协调者接收到所有的参与者的反馈之后,开始进入事务提交阶段。如果所有参与者都返回YES,那就发送COMMIT请求,如果有一个人返回NO,那就返送roolback请求。

    值得注意的是,二阶段提交协议的第一阶段准备阶段不仅仅是回答YES or NO,还是要执行事务操作的,只是执行完事务操作,并没有进行commit还是roolback。和上面的结婚例子不太一样。如果非要举例的话可以理解为男女双方交换定情信物的过程。信物一旦交给对方了,这个信物就不能挪作他用了。也就是说,一旦事务执行之后,在没有执行commit或者roolback之前,资源是被锁定的。这会造成阻塞。


    1.1. 2PC存在的问题

    下面我们来分析下2PC存在的问题。

    这里暂且不谈2PC存在的同步阻塞、单点问题、脑裂等问题(上篇文章中有具体介绍),我们只讨论下数据一致性问题。作为一个分布式的一致性协议,我们主要关注他可能带来的一致性问题的。


    2PC在执行过程中可能发生协调者或者参与者突然宕机的情况,在不同时期宕机可能有不同的现象。


    情况一:协调者挂了,参与者没挂

    这种情况其实比较好解决,只要找一个协调者的替代者。当他成为新的协调者的时候,询问所有参与者的最后那条事务的执行情况,他就可以知道是应该做什么样的操作了。所以,这种情况不会导致数据不一致。


    情况二:参与者挂了,协调者没挂

    这种情况其实也比较好解决。如果协调者挂了。那么之后的事情有两种情况:

    • 第一个是挂了就挂了,没有再恢复。那就挂了呗,反正不会导致数据一致性问题。
    • 第二个是挂了之后又恢复了,这时如果他有未执行完的事务操作,直接取消掉,然后询问协调者目前我应该怎么做,协调者就会比对自己的事务执行记录和该参与者的事务执行记录,告诉他应该怎么做来保持数据的一致性。

    情况三:参与者挂了,协调者也挂了

    这种情况比较复杂,我们分情况讨论。

    • 协调者和参与者在第一阶段挂了。
      • 由于这时还没有执行commit操作,新选出来的协调者可以询问各个参与者的情况,再决定是进行commit还是roolback。因为还没有commit,所以不会导致数据一致性问题。
    • 第二阶段协调者和参与者挂了,挂了的这个参与者在挂之前并没有接收到协调者的指令,或者接收到指令之后还没来的及做commit或者roolback操作。
      • 这种情况下,当新的协调者被选出来之后,他同样是询问所有的参与者的情况。只要有机器执行了abort(roolback)操作或者第一阶段返回的信息是No的话,那就直接执行roolback操作。如果没有人执行abort操作,但是有机器执行了commit操作,那么就直接执行commit操作。这样,当挂掉的参与者恢复之后,只要按照协调者的指示进行事务的commit还是roolback操作就可以了。因为挂掉的机器并没有做commit或者roolback操作,而没有挂掉的机器们和新的协调者又执行了同样的操作,那么这种情况不会导致数据不一致现象。
    • 第二阶段协调者和参与者挂了,挂了的这个参与者在挂之前已经执行了操作。但是由于他挂了,没有人知道他执行了什么操作。
      • 这种情况下,新的协调者被选出来之后,如果他想负起协调者的责任的话他就只能按照之前那种情况来执行commit或者roolback操作。这样新的协调者和所有没挂掉的参与者就保持了数据的一致性,我们假定他们执行了commit。但是,这个时候,那个挂掉的参与者恢复了怎么办,因为他之前已经执行完了之前的事务,如果他执行的是commit那还好,和其他的机器保持一致了,万一他执行的是roolback操作那?这不就导致数据的不一致性了么?虽然这个时候可以再通过手段让他和协调者通信,再想办法把数据搞成一致的,但是,这段时间内他的数据状态已经是不一致的了!

    所以,2PC协议中,如果出现协调者和参与者都挂了的情况,有可能导致数据不一致。

    为了解决这个问题,衍生除了3PC。我们接下来看看3PC是如何解决这个问题的。

    2. 三阶段提交协议(3PC)

    3PC最关键要解决的就是协调者和参与者同时挂掉的问题,所以3PC把2PC的准备阶段再次一分为二,这样三阶段提交就有CanCommitPreCommitDoCommit三个阶段。在第一阶段,只是询问所有参与者是否可可以执行事务操作,并不在本阶段执行事务操作。当协调者收到所有的参与者都返回YES时,在第二阶段才执行事务操作,然后在第三阶段在执行commit或者rollback。

    这里再举一个生活中类似三阶段提交的例子:

    班长要组织全班同学聚餐,由于大家毕业多年,所以要逐个打电话敲定时间,时间初定10.1日。然后开始逐个打电话。

    班长:小A,我们想定在10.1号聚会,你有时间嘛?有时间你就说YES,没有你就说NO,然后我还会再去问其他人,具体时间地点我会再通知你,这段时间你可先去干你自己的事儿,不用一直等着我。(协调者询问事务是否可以执行,这一步不会锁定资源

    小A:好的,我有时间。(参与者反馈

    班长:小B,我们想定在10.1号聚会……不用一直等我。

    班长收集完大家的时间情况了,一看大家都有时间,那么就再次通知大家。(协调者接收到所有YES指令

    班长:小A,我们确定了10.1号聚餐,你要把这一天的时间空出来,这一天你不能再安排其他的事儿了。然后我会逐个通知其他同学,通知完之后我会再来和你确认一下,还有啊,如果我没有特意给你打电话,你就10.1号那天来聚餐就行了。对了,你确定能来是吧?(协调者发送事务执行指令,这一步锁住资源。如果由于网络原因参与者在后面没有收到协调者的命令,他也会执行commit

    小A顺手在自己的日历上把10.1号这一天圈上了,然后跟班长说,我可以去。(参与者执行事务操作,反馈状态

    班长:小B,我们觉得了10.1号聚餐……你就10.1号那天来聚餐就行了。

    班长通知完一圈之后。所有同学都跟他说:”我已经把10.1号这天空出来了”。于是,他在10.1号这一天又挨个打了一遍电话告诉他们:嘿,现在你们可以出门拉。。。。(协调者收到所有参与者的ACK响应,通知所有参与者执行事务的commit

    小A,小B:我已经出门拉。(执行commit操作,反馈状态

    3. 3PC为什么比2PC好?

    直接分析协调者和参与者都挂的情况。

    • 第二阶段协调者和参与者挂了,挂了的这个参与者在挂之前已经执行了操作。但是由于他挂了,没有人知道他执行了什么操作。
      • 这种情况下,当新的协调者被选出来之后,他同样是询问所有的参与者的情况来觉得是commit还是roolback。这看上去和二阶段提交一样啊?他是怎么解决一致性问题的呢?
      • 看上去和二阶段提交的那种数据不一致的情况的现象是一样的,但仔细分析所有参与者的状态的话就会发现其实并不一样。我们假设挂掉的那台参与者执行的操作是commit。那么其他没挂的操作者的状态应该是什么?他们的状态要么是prepare-commit要么是commit。因为3PC的第三阶段一旦有机器执行了commit,那必然第一阶段大家都是同意commit。所以,这时,新选举出来的协调者一旦发现未挂掉的参与者中有人处于commit状态或者是prepare-commit的话,那就执行commit操作。否则就执行rollback操作。这样挂掉的参与者恢复之后就能和其他机器保持数据一致性了。(为了简单的让大家理解,笔者这里简化了新选举出来的协调者执行操作的具体细节,真实情况比我描述的要复杂)

    简单概括一下就是,如果挂掉的那台机器已经执行了commit,那么协调者可以从所有未挂掉的参与者的状态中分析出来,并执行commit。如果挂掉的那个参与者执行了rollback,那么协调者和其他的参与者执行的肯定也是rollback操作。

    所以,再多引入一个阶段之后,3PC解决了2PC中存在的那种由于协调者和参与者同时挂掉有可能导致的数据一致性问题。

    4. 3PC存在的问题

    在doCommit阶段,如果参与者无法及时接收到来自协调者的doCommit或者rebort请求时,会在等待超时之后,会继续进行事务的提交。

    所以,由于网络原因,协调者发送的abort响应没有及时被参与者接收到,那么参与者在等待超时之后执行了commit操作。这样就和其他接到abort命令并执行回滚的参与者之间存在数据不一致的情况。

    Zookeeper就是典型的2PC。

    展开全文
  • 黑马程序员视频库播妞QQ号:3077485083传智播客旗下互联网资讯、学习资源免费分享平台互联网圈子里,一直以来都流传着“删库跑路”段子。很多程序员会把“删库跑路”当做发泄工作压力...

    黑马程序员视频库

    播妞QQ号:3077485083

    传智播客旗下互联网资讯、学习资源免费分享平台

    互联网圈子里,一直以来都流传着“删库跑路”的段子。很多程序员会把 “删库跑路”当做发泄工作压力的口头禅。然而现实中,这两年程序员删库跑路的新闻层出不穷。

    删库对一个公司的影响不言而喻,可能会导致系统瞬间崩溃,所有相关功能瘫痪,接着就是公司无法估计的经济损失。跑路的程序员也被抓,可以说是两败俱伤。

    最近的一个“删库”事件发生在思科。

    思科前员工 Sudhish Kasaba Ramesh ,在他离职五个月后,Ramesh在未经许可的情况下,擅自访问思科托管在Amazon网络服务平台上的云基础设施。他使用个人Google Cloud Project 账户中部署了一段恶意代码,删掉了 456 台虚拟机,造成 16000 个 WebEx Teams 账户被异常关闭。

    这些WebEx Teams账户被关闭了长达两周的时间,为此思科向用户退款超过了100万美元,同时花费了140万美元来修复程序,总损失达到了约240 万美元(约合人民币 1652 万)。

    在国内,“删库”事件也屡有发生。

    今年2月份,微盟被自己的员工恶意删库,导致在线服务出现了故障,300万注册商家遭受牵连,生意近乎停摆。

    之后微盟历经了七天七夜终于恢复了被删库的数据,但依旧给2019年刚上市的微盟带来了巨大损失。微盟市值合计蒸发了20亿,同时还拿出了1.5亿元人民币对受影响的用户进行赔偿,其中公司承担1亿元,管理层承担5000万元。

    越来越多的“删库跑路”事件发生,在知乎上,程序员删库跑路是什么心态?删库跑路是怎样一种体验?如果百度、谷歌、腾讯、阿里这样的企业被删库跑路,会发生什么?等相关话题的讨论热度都很高。

    看看大家的评论,程序员表示:我压力很大呀!

    程序员删库的原因各有说法,其中的缘由作为路人我们也很难搞清楚。

    在这里想和大家讨论一下,如果是你,公司发生什么样的事情会把你逼到删库跑路?

    仅供闲暇讨论,大家不要做傻事哦

    peace and  love

     


    欢迎大家留言讨论

    点赞第一名包邮送“精美鼠标垫”

    活动截止日期:9月15日 12:00

    END

    - 推荐阅读 -

    重磅!华为鸿蒙OS 2.0 发布,开放源代码!关注已达4.7k

    2020-09-11

    独家首发,实力保障!3天快速入门大数据领域!

    2020-09-09

    最有望取代Java的“后浪”Kotlin,现在混的怎么样?

    2020-09-08

    抗疫代码入藏国博, 程序员的巅峰时刻!

    2020-09-07


    我就知道你“在看”

    展开全文
  • 春暖花开,万物复苏,又到了开发们撸代码...无论对产品经理还是开发来说,在互联网公司生态里,每一次追逐、围攻都对双方生存能力严格检验!每一次抵抗、反击都对双方软弱、过剩筛选! 本文转载自微信...

    春暖花开,万物复苏,又到了开发们撸代码的季节,他们的手指敲击在键盘身上,发出了酣畅的声音。

    突然!一只落单的青年程序员察觉到到了背后的一丝异样,他警觉地停下手中的活,慢慢转过身去,果然一个微笑的面孔站立在那里,开发的天敌——产品经理出现了!

    无论对产品经理还是开发来说,在互联网公司生态里,每一次的追逐、围攻都是对双方生存能力的严格检验!每一次抵抗、反击都是对双方软弱、过剩的筛选!

    本文转载自微信公众号“吓脑湿”

    产品经理のShow Time

    开发のShow Time

    罪状展示

    臆想时间

    第一回合:需求之战

    第二回合:时间之战

    第三回合:知识之战

    第四回合:嘴炮之战

    第五回合:数据之战

    第六回合:引诱之战

    第七回合:网络之战

    最终回合:大BOSSの现身

    第二天,老板办公室…

    开发家:

    某医院:

    晚上12:00

    结尾的话

    优秀的产品和技术,都是公司的灵魂。小小的摩擦,本质上是劳资关系与雇佣关系的矛盾,并非不可调和,需要大家上下一心,剑指外敌,以理服人,感化老板,争取少走一些弯路。

    企业中,产品和开发的关系,就像长者和记者,一时瑜亮,彼此缠斗、彼此成就。

    不能做到彼此理解,但至少能彼此尊重,更加顽强地捍卫自己的角色立场,直到硝烟散去后,共温一壶酒,互联网寒冬降至之际,坚定屹立在这片土地上继续厮杀。

    展开全文
  • 这个话题就要从上面的标题说起了,但是归根结底是,,,,,,,我特么没带充电器,还有十个电,我想哭,更关键的是我还要给手机充电,下课就要给老婆报告行踪,更何况,嘿嘿嘿,咱们还有不可描述的事情要讲,...
  •   在邮件里简单描述了自己工作经历以及**对这个岗位一些优势。**在投递了大概两三天之后,我就收到了简历通过筛选,让我一面通知。   面试官问我我看你简历上面写你发了文章,你发哪里?什么层次?...
  • 过去几个月里,优秀原型工具提供者摹客(Mockplus)团队于在端午节前,发布了国内独家设计系统,致力于定制设计规范。这对于国内产品设计行业而言...UI设计师总是要花费大量时间和精力向开发描述一大堆设计细节...
  • 对此,你怎么看?欢迎来留言。...“每日趣闻”程序人生新栏目,与你分享一些关于程序员、关于IT行业趣事,你喜欢这样形式吗? 往 期 趣 闻 中国高级AI专业人才不足5000!80w年薪招聘仍大量缺人 ...
  • 这并不是就说字符串描述重要,对咱们来说,字符串要比数字亲切的多,提供字符串描述符的设备也要比没有提供的设备亲切的多,不会有人会专门去记前面使用lsusb列出的04b4表示的是Cypress Semiconductor Corp....
  • 那四大设备必须得支持,而字符串描述符对设备来说则是可,类似于网球里马德里大师赛与四大满贯之间地位差异,四大满贯个碗儿都争着抢着爬着也要去,而号称第五大满贯马德里大师赛却动动就会被大碗儿们因...
  • 因为不可搜索电视节目,必然会死去。 如同我们在网上看视频,大家为一件所花时间越来越少。不可搜索视频或电脑节目必定没有了空间。 现在大多数电视节目有了文字描述,但还不支持搜索。 可能输入...
  • 接下来本文也会从这几个方面来进行说明描述,网友们通过对应情况,找到自己手机连接wifi上网速度慢原因。 1、 如果自己网络宽带拉时候签约宽带就是比较慢,这个时候只有提升宽带才有用。2、 如果报装...
  • 那四大设备必须得支持,而字符串描述符对设备来说则是可,类似于网球里马德里大师赛与四大满贯之间地位差异,四大满贯个碗儿都争着抢着爬着也要去,而号称第五大满贯马德里大师赛却动动就会被大碗儿们因...
  • 关于汇编那些

    2020-10-11 19:52:38
    **$ 和 $$**编译器NASM预留关键字,用来表示当前行和本section地址,起到了标号作用,他NASM提供,并不是CPU原生支持,相当于伪指令一样,对CPU来说,默认情况下,它们值相对于本文件开头...
  • 前段时间登陆国内某知名自动化品牌官网,查看旗下一款小型伺服产品,打开样本后一小心看到这样一段关于伺服反馈的描述。文中提到了这款伺服电机反馈性能几个“特点”:它采用了 23 位/圈绝对值编码器,...
  • 为什么有时候写入文件内容却没有?没什么printf打印在终端内容看到?这一切背后有着怎样早为人知秘密?...很明显read和write系统调用,它们花费时间将会更多,本文展开描述,可以参考《库函数和系统调...
  • 什么分布式事务?...原子性要求,事务一个不可分割执行单元,事务中所有操作要么全都执行,要么全都不执行。 一致性 一致性要求,事务在开始前和结束后,数据库完整性约束没有被破坏...
  • 1:没有雇主这回 求职者仅仅经过两次面试,就这样来下结论,“雇主们都不会要我,或者不会录用我这样背景人,也不会录用我这样有残疾人。”说出诸如此类荒唐话。我朋友,你说不是事实。 别因...
  • TCP和UDP那些事儿

    2019-01-30 18:08:48
    文章开始之前我们先抛出几个问题: ...我们都知道数据包的分片,为什么数据包的分片的任务没有交给传输层而是放在了网络层进行,其中难道有什么不可描述的交易? TCP的实现连接的建立要经过三次握手...
  • 二进制兼容那些

    2018-03-19 17:51:44
    所谓二进制兼容就是在做版本升级(也可能Bug fix)库文件时候,不必要做重新编译使用这个库的可执行文件或使用这个库其他库文件,同时能保证程序功能被破坏。 当然,这只是一个现象级描述,其实在一些简单...
  • nova-faas一个node.js库,帮助您实现基于Rabbitmq服务发现微服务和伸缩性。 阅读CHANGELOG.md 阅读PLUGINS.md 好处 想得更好! 想想吻! 面向配置框架 github中只有一个整体项目 仅需维护一个整体项目...
  • 描述:数据库中所有字段都是不可分割原子值。 字段值还可以拆分就不满足第一范式。当然,在实际开发中,要视情况而定,是否拆分更详细。 二、第二范式 2NF 描述:必须在满足第一范式前提下,除主键外每...
  • 原文:Artificial Intelligence Uses Less Than Two Minutes of Video...摘要:文章描述了佐治亚理工学院研究人员开发一种可以通过观看游戏过程以重建游戏引擎AI。AI系统看明白游戏怎么回以后,就可以复制
  • IND-CCA安全代表选择明文的不可伪造性。这样安全方案思想就是给定一个密文,攻击者不能说出给定密文什么样明文加密得到。在这个模型中,攻击者被允许使用加密问询和解密问询。问询既可以在第三步和第四步...

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 701
精华内容 280
关键字:

不可描述的是事