CAP定理、ACID模型、BASE模型

CAP 定理

在理论计算机科学中,CAP 定理(CAP theorem),又被称作布鲁尔定理(Brewer’s theorem),它指出对于一个分布式计算系统来说,不可能同时满足以下三点:

  • 一致性(Consistency):所有节点在同一时间具有相同的数据
  • 可用性(Availability):保证每个请求不管成功或者失败都有响应
  • 分隔容忍(Partition tolerance):系统中任意信息的丢失或失败不会影响系统的继续运作
    根据定理,分布式系统只能满足三项中的两项而不可能满足全部三项。

ACID 模型:

ACID,是指数据库管理系统(DBMS)在写入/异动资料的过程中,为保证交易(transaction)是正确可靠的,所必须具备的四个特性:

  • 原子性(Atomicity):要么整个事务成功,要么整个不成功
  • 一致性(Consistency):数据库在事务之间处于一个一致的状态中
  • 隔离性(Isolation):又称独立性,在其他事务结束之前,事务看不到被它们更改的数据
  • 持久性(Durability):一旦数据库系统通知用户事务成功,数据就永不丢失

BASE 模型

反 ACID 模型,完全不同 ACID 模型,牺牲高一致性,获得可用性或可靠性:

  • 基本可用(Basically Available):支持分区失败(e.g. sharding 碎片划分数据库)
  • 软状态(Soft state):状态可以有一段时间不同步,异步。
  • 最终一致(Eventually consistent):最终数据是一致的就可以了,而不是时时高一致。

BASE 思想的主要实现有:

  1. 按功能划分数据库
  2. sharding 碎片
阅读更多

golang函数参数传递详解

参数传递是指在程序的传递过程中,实际参数就会将参数值传递给相应的形式参数,然后在函数中实现对数据处理和返回的过程。比较常见的参数传递有:值传递、指针传递、引用传递。

阅读更多

MVC、MVP、MVVM联系和区别

MVC、MVP、MVVM 这些模式是为了解决开发过程中的实际问题而提出来的,目前作为主流的几种架构模式而被广泛使用。

阅读更多

panic和recover

在 Go 语言中,程序中一般是使用错误来处理异常情况。对于程序中出现的大部分异常情况,错误就已经够用了。

但在有些情况,当程序发生异常时,无法继续运行。在这种情况下,我们会使用 panic 来终止程序。当函数发生 panic 时,它会终止运行,在执行完所有的延迟函数后,程序控制返回到该函数的调用方。这样的过程会一直持续下去,直到当前协程的所有函数都返回退出,然后程序会打印出 panic 信息,接着打印出堆栈跟踪(Stack Trace),最后程序终止。在编写一个示例程序后,我们就能很好地理解这个概念了。

当程序发生 panic 时,使用 recover 可以重新获得对该程序的控制。

可以认为 panic 和 recover 与其他语言中的 try-catch-finally 语句类似,只不过一般我们很少使用 panic 和 recover。而当我们使用了 panic 和 recover 时,也会比 try-catch-finally 更加优雅,代码更加整洁。

阅读更多

JWT小记

Json web token (JWT), 是为了在网络应用环境间传递声明而执行的一种基于 JSON 的开放标准((RFC 7519).该 token 被设计为紧凑且安全的,特别适用于分布式站点的单点登录(SSO)场景。JWT 的声明一般被用来在身份提供者和服务提供者间传递被认证的用户身份信息,以便于从资源服务器获取资源,也可以增加一些额外的其它业务逻辑所必须的声明信息,该 token 也可直接被用于认证,也可被加密。

阅读更多

理解并发和并行的区别

并发是什么?

并发是指同一时刻只能处理一个任务,但一个时间段内可以对多个任务交替处理 。一个例子就能很好地说明这一点。

我们可以想象一个人正在跑步。假如在他晨跑时,鞋带突然松了。于是他停下来,系一下鞋带,接下来继续跑。这个例子就是典型的并发。这个人能够一下搞定跑步和系鞋带两件事,即立即处理多个任务。

并行是什么?并行和并发有何区别?

并行是指同一时刻可以处理多个任务 。这听起来和并发差不多,但其实完全不同。

我们同样用这个跑步的例子来帮助理解。假如这个人在慢跑时,还在用他的 iPod 听着音乐。在这里,他是在跑步的同时听音乐,也就是同时处理多个任务。这称之为并行。

MongoDB固定集合

MongoDB 固定集合(Capped Collections)是性能出色且有着固定大小的集合,大小固定,有点类似数据结构中的循坏队列,先进先出方式。满队列删除原来的元素!

阅读更多

JavaScript面向对象有感

面向对象程序设计(简称 OOP)是现在最流行的程序设计方法,JavaScript 的核心是支持面向对象的,Prototype 是 JavaScript 实现与管理继承的一种机制。最近在读《你不知道的 JavaScript》一书中了解到除了使用类实现外,还可以用一种“对象关联”(OLOO,objects linked to other objects)的编程风格

阅读更多

《你不知道的JavaScript》笔记-闭包

闭包就好像从 JavaScript 中分离出来的一个充满神秘色彩的未开化世界,只有最勇敢的人才能够到达那里。但实际上它只是一个普通且明显的事实,那就是我们在词法作用域的环境下写代码,而其中的函数也是值,可以随意传来传去。

当函数可以记住并访问所在的词法作用域,即使函数是在当前词法作用域之外执行,这时就产生了闭包。

阅读更多