• 架构必备技能第一谈


    前言

    此系列将以精简的言语讲述技术人,必须掌握基础性IT知识技能,请持续关注,希望给大家都是一些精简的干货.

    第一部分:分布式事务

    事务的意义在于:保证所提交的事务(或者叫做任务)要么成功要么失败,且要保证数据的正确性.

    而在分布式架构之下,所有的服务运行在不同的环境不同的地域之下,各自做着不同的事情,而业务数据的处理逻辑的正确性至关重要,

    分布式事务就显得格外重要,也是分布式架构下必要考虑的一环.

    市面上流行的流行的解决方案有:2PC,3PC,TCC,本地消息表,带有分布式事务的MQ

    PS:设计到事务就必然想到了分布式的离散的问题的解决手段:依靠中心

    分布式避免中心,但离不开中心,有中心就应该有高可用做支撑.

    2PC

    在各个节点执行commit前,问问协调器,我可不可以提交?只有所有的相关节点都就绪了,所有的节点才能执行提交.

    也就是说:各个节点准备就绪后,都会各自告诉协调器,协调器知道了所有都准备就绪才会告诉大家可以commit了.

    先完成的要阻塞等待没有完成的,所以协调器不能出问题,且性能阻塞不好.

    3PC

    在2PC的机制上,添加了一个提交前的PreCommit的预提交阶段,也就说:大家收到了准备就绪,多确认一次;

    同时添加了再协调器和提交者双端添加超时机制,超时也表示失败;

    这两点增强了2PC的稳定性,但未解决性能问题;

    TCC(Try-Confirm-Cancel)又称补偿事务

    注意多了一个补偿机制,当有一个节点失败,此事务相关的节点就要执行补偿方法.性能还行,需要注意幂等.

    本地消息表

    所谓的本地消息表,就是把某一事务相关的系列数据,通过MQ放到一个中心数据库中.

    由一个中心扫描程序进行监控整个事务的执行情况,没有成功就重新提交MQ.失败数太多就最终放弃,并通知相关人:运维,运营,技术,业务发起人.

    第二部分:必须掌握的设计模式的6大基本原则

    23个设计模式,都是从这六大设计模式中演化而来,所以这六大原则是产生23个设计模式的原则,作为技术人,可以不知道23个设计模式,但不能不知道这六个原则,这是心法

    23个设计模式那是招式,所以基本原则比23个设计模式更为重要

    原则一:单一职责

    定义:一个类只负责一个功能领域中的相应职责;

    亦即:你定义的类就一个因素可以引起它的变化。

    简化理解:一个类单纯地干好一个活。

    思考:继承关系(IS-A)是否有些违背了这一原则,在以后软件生命周期中,编码人需要考虑:基类要对子类负责。是不是Has-A更好呢?

    原则二:开闭原则

    定义:一个软件模块(或类)仅对扩展开放,对修改关闭。

    亦即:不要想着修改现有功能,而是如何扩展现有功能。

    简化理解:修改现有的功能,就意味着一切从来,带来不稳定。

    思考:这一原则是对既有功能稳定性的维护,另一方面体现了面向抽象(接口)编程的重要性,接口不变,实现内容里面做调整。

    原则三:迪特米法则

    定义:最少知识原则

    亦即:软件模块(或类)间尽量避免相互影响,相互不该知道就不要暴露。

    简化理解:这是对安全和稳定性的维护

    思考:安全领域的一个思想就是:权限最小化。

    原则四:接口隔离原则

    定义:类所需的接口应该是最小的,是自己需要的。

    亦即:使用多个专门的接口,而不使用单一的总接口,即客户端不应该依赖那些它不需要的接口。

    简化理解:不要设计一个很大的接口,自以为包罗万象,带来的是冗余。

    原则五:依赖导致原则

    定义:抽象不应该依赖于细节,细节应当依赖于抽象。换言之,要针对接口编程,而不是针对实现编程。

    思考:为什么IOC大行其道?解决的问题是为了什么?

    原则六:里氏替换原则

    定义:使用的基类可以在任何地方使用继承的子类,完美的替换基类。

    思考:面向抽象编程,面向接口编程

    第三部分:数据在内存中的存储形式

    2.1 三码的表示方式

    计算机的二进制在内存中的存储形式:补码,且因CPU架构等不同采用了大小端存储在内存中,关于大小端大家自行阅读相关文章,至于有什么用,目前我能告诉你的是:

    当我们设计底层编程及对数据存储和通讯时,我们可以头脑清醒.

    正数的原码、反码、补码都是就是原码;提示,因为计算机采用补码,所以技术人脑子里面应该是补码,多转几圈没有必要.

    负数的反码=符号位不变,其他位取反;

    负数的补码=反码+1;

    [+1] = 0000 0001

    [-1] = 1000 0001

    [+1] = [00000001] = [00000001]

    [-1] = [10000001] = [11111110]

    [+1] = [00000001] = [00000001] = [00000001]

    [-1] = [10000001] = [11111110] = [11111111]

    2.1 为什么计算机内采用补码

    原因如下:

    1.原码不能表示减法:  1 - 1 = 1 + (-1) = [00000001] + [10000001] = [10000010] = -2

    2.反码出现+0,-0:   

    1 - 1 = 1 + (-1) = [0000 0001]原 + [1000 0001]原= [0000 0001]反 + [1111 1110]反 = [1111 1111]反 = [1000 0000]原 = -0

    3.所以出现补码

    PS:所以作为技术人,先记住你的数据在内存中是补码

    注意:有一个行规,最大的负数的补码用1000...00进行表示,111......11111表示-1

    所以:类似于int的取值范围用(2^-31 -->2^31-1)进行表示 (中间有一个0)

    先写道这里,下次继续。要喜欢请关注。

  • 相关阅读:
    C++ 多线程 (4) 互斥量(mutex)与锁(lock)
    C++ 多线程(3)std::thread 详解
    c++ 多线程(2)创建线程对象的方法
    CMake解决c++11的phread库问题:undefined reference to `pthread_create’
    生成对抗网络--Generative Adversarial Networks (GAN)
    语义分割(semantic segmentation)——U-Net
    目标检测SSD: Single Shot MultiBox Detector
    基于内容的图像检索(CBIR) ——以图搜图
    去噪自动编码器
    利用Chrome开发者工具功能进行网页整页截图的方法
  • 原文地址:https://www.cnblogs.com/thinkingmore/p/15915648.html
Copyright © 2020-2023  润新知