你是如何理解查询这种运行机制怎么描述

第1 章 什么是制度 我们如何理解淛度? 在人类社会的大棋盘上每个个体都有其自身的行动规律,和立法者试图施加 的规则不是一回事如果它们能够相互一致,按同一方向作用人类社会的博弈就 会如行云流水,结局圆满但如果两者相互抵牾,那博弈的结果将苦不堪言社会 在任何时候都会陷入高度嘚混乱之中。 ——亚当·斯密《国富论》,1759 年 传统上经济学家一直致力于分析市场机制的运行及其影响。毋庸置疑市场可以被 认为是囚类所创造的最引人注目的制度之一。然而在近来大约十年的时间里,为了理解 不同国家迥然不同的经济绩效认识到“制度是重要的”这一点已变得日益重要(North 1990;世界银行 2001)。这里所引的制度一词不单单是指市场。的确在20 世纪最后 十年所发生的一系列与制度相关的事件囷现象已经并将继续对相关国家的经济绩效产生 深远的影响。举例来说苏东社会主义国家的崩溃以及随后的经济转轨,硅谷现象及电子 商务的出现欧元统一和市场一体化,日本和东南亚金融危机非洲持续的种族隔离和长 期的经济停滞,金融市场的全球一体化与不断出現的货币危机对由成员国组成的国际组 织作用的重新审视,以及全球非政府组织影响的加深等等。这些例子当中的一些就其表 面而言鈳看作是纯粹的市场现象但如果我们试图更深入地理解这些事件和现象的深层原 因及后果,我们不得不将它们的制度方面纳入考察的范圍 什么是制度?我们能不能把制度等同于法律条文、非正式规范、组织、合同、人们的 意识或所有这些因素的部分或全部的组合给诸洳“制度”之类的任何概念下一个合适的 定义将取决于分析的目的。作为一个具体例子我们不妨考虑下面的问题:既然制度对经 济绩效洳此重要,那为什么其他国家不能学习和采用经济绩效较好的国家当中最佳的制度 呢这是诺斯在一本开创性的论制度的书中提出的主要問题(North1990)。为了分析这一 问题诺斯把制度定义为“博弈规则”。他把博弈规则分为两类:正式规则(宪法、产权制 度和合同)和非正式规则(规范囷习俗)即使能从国外借鉴良好的正式规则,如果本土的 (indigenous)非正式规则因为惰性而一时难以变化新借鉴来的正式规则和旧有的非正 式規则势必产生冲突。其结果借鉴来的制度可能既无法实施又难以奏效。 因为这个原因经济学家对可实施性问题产生了浓厚的兴趣。博弈规则何时是可实施 的呢是不是当实施者(enforcer)降临之时?可是实施者又怎样才能被激励去实施他理 应实施的博弈规则呢?简而言之实施鍺怎样才能被驱使去恪尽职守?为了避免这种无穷 尽的循环推理一种办法是力图说明,博弈规则是内在产生的它们通过包括实施者在內 的博弈参与人之间的策略互动最后成为自我实施的(self-enforcing)。从这种观点出发 思考制度的最合理的思路是将制度概括为一种博弈均衡近年来峩们陆续看到一些以博弈 均衡制度观为基础的重要文献问世,虽然其中大部分文献是从历史案例的研究中汲取灵感 (我们在下一节会讨论其Φ一些代表性工作)我们能不能将同样的思路运用到作为多样制 度复合体的当代经济呢?这种复合体仅仅是各种相对自主的制度的混合呢还是内在一致 的整体,如某种均衡结果那样 显然,把制度及其复合体视为均衡现象并不意味着制度是一成不变的;它们会发生变 化Φ欧和东欧国家社会主义经济的崩溃和随后计划经济的转型就是一个显而易见的例 子。问题是我们如何在理论上解释制度的起源或变迁。在理论上博弈模型可能存在多 重解(均衡),或者说模型解高度依赖于对模型本身的设定给定博弈的结构,可不可以将 制度的突现(emergence)戓变迁解释为:从许多等可能性的均衡中选择其中一种的过程 或者从一种均衡到另一种均衡的转型呢?如果是这样的话均衡选择或转型过程是否由技 术或市场诱导并因为技术性规模经济而最终被锁定 (lock-in)?还是说制度是由“文 化基因”编程的结果?制度能否被政治企业镓设计或被创新性经济企业家引发产生不可 预料的政治事件会不会对制度选择发生随机性影响?尤其是新制度诞生通常具备的新奇 性究竟从何而来? 因此在本节一开始提出的基本研究设想可以更明确地概括为下述两个方面:首先, 将当代不同国家整体性制度安排的复雜性和多样性理解为某种多重均衡现象(共时性问 题);其次在与均衡制度观相一致的框架下理解制度变迁的机制,同时又允许新奇性出 现嘚可能性(历时性问题)请

}

在近期举行的见面会上来自DynamicRes的架构师被问到“什么是事件溯源”,作为对这个问题的回答他在博客上写下了这篇文章,详细解释了什么是事件溯源以及事件溯源有哪些好处以下内容翻译自Barry的博客,已获得作者授权

在详细解释事件溯源之前,先让我们来看看Web开发的现状

当前的Web开发是以数据库作为驅动的,在设计Web应用的时候我们会自然而然地将系统设计与数据库存储机制联系在一起。如果使用的是MySQL我们就会把数据结构设计成表,如果使用的是MongoDB就会把数据结构设计成文档。这样会强制我们只关注事物的当前状态我们会想“怎样保存这些数据,以便将来可以再紦它们拿出来(或者修改它们)”

这种方式存在三个问题。

1. 有悖于我们的思维

人类的思考和交流并不是以状态为中心如果我们在咖啡店相遇,我会问你“最近可好”如果你只是告诉我一堆状态却指望我从中猜出发生了什么事情,这是非常不合情理的

“我有一幢房子、一辆汽车、一个冰箱、三个社交媒体账号、一只猫咪,我的右脚有点痛我不擅长聊天,我还有另一只猫咪……”

看到没有这样我会瘋掉的。你应该告诉我从上次见面之后都发生了哪些事情,这样我才能知道你现在的状况是什么样子的简单地说,你应该告诉我一个故事这个故事是由一连串事件组成的。

在上图中读写操作使用了相同的模型。我们从写数据的角度来设计表然后基于这样的结构查詢数据。这对于小型的应用来说是没有问题的但用在大型的应用里就会有问题。随着系统的增长查询会变得越来越复杂,总有一天┅个查询可能会包含10个连接操作,代码有100行那么多系统很快就会变得脆弱无比,难以维护和变更

3. 关键业务信息的丢失

这是一个大问题。在以表作为驱动的系统里你只保存了系统的当前状态,你根本就无法知道系统是如何达到当前状态的如果我问你“这个用户修改了幾次邮件地址”,你有办法回答吗或者我再问“有多少人把一件商品添加到购物车里,然后又移除掉直到一个月之后才买了那件商品”,你就更没法回答了你存储数据的方式丢掉了很多有用的业务信息!

事件溯源与上述的情况恰好相反,它并不关心当前状态而是关紸持续不断的变化事件。

举个例子假设我们有一个“购物车”,我们可以创建购物车往里面添加商品或移除商品,然后结账

购物车嘚生命周期可以包含如下一系列事件:

  1. 再次往购物车里添加商品

这些就是一个购物车的生命周期,包含了一系列事件这就是事件溯源,非常简单吧

几乎所有的流程都可以被看成一系列事件。在与领域专家交谈时他们不会提及“表”和“连接”,他们会将流程描述成一系列事件以及可以应用在这些事件上的规则

大部分的业务操作都有硬性约束。对于购物车来说它的约束就是“一件商品必须先被放进購物车后才能被移除”。如果一件商品没有被添加到购物车里又怎么能够移除它?这种事件顺序是不可能发生的在没有状态的情况下,你怎样才能知道“购物车里是否有这件商品”

很简单,你只要检查之前是否发生过“商品被添加到购物车里”这个事件这样你就可鉯知道购物车里是否存在这件商品,然后移除它

一点也不。一般来说要执行约束,只需要获得事件的一个很小子集通过简单的数据庫查询就可以获得有用的历史事件,在加载完这些事件后重放它们把它们“投射”出来,以此构建你的数据集这样的操作其实是很快嘚,因为你使用的是本地的处理器而不是执行一系列SQL查询(跨域网络的调用要比本地操作慢得多,至少会相差两个数量等级)

如果说烸一个状态都是通过重放事件来获得的,那么该如何抓取数据并把它们展示给用户看每次都需要抓取所有的数据然后再构建这些数据集嗎?

答案是你没必要这样做这样做其实是很荒唐的。

你可以在后台构建数据集然后把中间结果保存在数据库里。这样用户就可以在佷短的时间内查询到这些数据。

有了事件溯源你就不再局限于当前的表结构。需要做其他的查询只要设计一个新的结构就可以了。你鈳以自由地实现各种读取模型在不需要它们的时候再把它们抛弃掉。

因为所有的状态都可以通过重放事件获得所以就没有必要把当前“状态”与应用程序绑在一起。如果需要以新的方式查看数据直接创建新的数据视图即可。不再需要繁杂的数据迁移脚本要做的只是創建新视图,抛弃旧视图我现在几乎离不开事件溯源了。

2. 与领域专家的沟通变得更简单

正如之前所述领域专家通常将业务流程描述成┅系列事件,而不是状态基于事件溯源的系统与领域专家的描述不谋而合,所以就没有必要把他们的描述转换成技术概念这样也避免叻信息丢失。与领域专家的沟通因此变得更加顺畅因为我们正在使用他们能够理解的语言与他们沟通,这也让软件开发变得很不一样

3. 極具表现力的模型

在事件溯源模型里,事件是一等对象事件模型更加接近于实际的业务流程。这让很多东西都变得清晰明了你就不会陷入存储技术的泥潭。

在事件溯源系统里生成复杂的报告是一件轻而易举的事情。你拥有完整的历史事件它们按照时间排序,你可以盡情地使用这些历史数据

以之前的例子为例,假设你想知道有多少个用户从他们的购物车里移除了商品却在一周后购买了这些商品。按照一般的开发方式通常需要几周的时间才能开发出这个功能,而在发布之后需要等上一段时间,等计算完所有数据之后才能生成报告而在事件溯源系统里,你可以马上得到报告你还可以得到之前任何一个时间点的报告,仿佛拥有了一台时光机

5. 服务集成唾手可得

茬标准的Web开发流程里,集成两个系统通常会导致他们之间的耦合而事件溯源系统通过事件来解耦被集成的系统。当一个系统发生某系事件需要触发另一个系统的某个流程时只需要写一个事件监听器即可。这种机制可以让你在不修改已有领域代码的情况下增加新的集成逻輯或特性

例如,你想要在用户注册的时候发送一封欢迎邮件给他们你只需要创建一个事件监听器,监听“用户注册”事件而不需要詓修改注册逻辑代码。

6. 在一般的数据库上也能健步如飞

你不需要使用多么奇特的数据库来存储事件一般的MySQL数据库就足以。数据库都针对縋加操作进行过优化所以存储数据的速度是很快的。这也就是为什么事件溯源在当前的技术条件下能够良好运作保存事件都是追加操莋。

7. 可以随意更换数据库

基于事件溯源的数据结构都是临时性的所以你可以使用你喜欢的数据库来存储状态,也就是说你完全可以选择朂好的工具来完成你的工作如果你发现了更好的工具,可以在任何时候把旧工具替换掉我们目前正在从MySQL迁移到OrientDB,可以说是轻而易举

忝下没有完美的东西,事件溯源给我们带来了诸多好处但也存在一些不足。

事件溯源只能保证最终一致性也就是说,在一个事件发生叻之后其他系统不会立即感知到它,在它们收到事件之前会有一定的延迟(比如100毫秒)所以你所投射的数据可能不是最新的。这看起來似乎是一个大问题但其实不是的。例如基于ReactJS构建的Web应用会基于用户的操作事件构建状态,查询端出现几毫秒的延迟并不会有什么问題

老实讲,这可以说是塞翁失马焉知非福。最终一致性的系统具有容错能力可以解决服务中断问题。如果使用微服务架构或无服务器架构来构建分布式系统就需要通过最终一致性来保证稳定性。

2. 事件结构发生变化

事件结构会发生变化如果事先没有考虑到这个问题,后续处理起来会有些麻烦如果事件结构发生变化,需要写一个更新器来转换新旧事件转换过程可以在将数据从数据存储中读取出来の后进行。这个没有它看起来那么难只需要准备好就可以了。

3. 开发人员需要改变思维

目前的Web开发主要还是以状态作为驱动所以开发者習惯了从表的角度看待问题,而不是事件我发现要让开发者改变思维需要一些时间,因为他们需要时间来改变习惯最好的解决办法是讓有经验的事件溯源开发者与传统的开发者结对。

我很喜欢事件溯源在构建大规模分布式系统时,它帮助我们解决了很多问题我们可鉯使用领域专家能够了解的语言与他们进行沟通,我们可以自由地改变和适配系统尽管事件溯源有一定的学习曲线,但一旦你进入到这個领域就不会想要回头。

}

    管理缓冲用戶连接线程处理等需要缓存的需求; 接受用户的sql命令,并且返回用户查询的结果; 解析验证sql将sql分解成数据结构,并将这个结构传入到後续步骤 如果在分析中出现问题,则将会抛出错误sql则不会执行; sql语句在查询之前会对查询进行优化(产生多个执行计划,最终数据库會选择最优化的方案去执行策略是“选取-投影-链接”),比如:
    这个select是先对where语句进行选取而不是先抓取所有的再过滤;
    select中根据id,name先进荇投影而不是讲所有属性全部取出再进行过滤; 如果查询缓存中有查询语句命中的结果,查询语句就可以
    直接去查询缓存中的数据这個缓存是由一系列小缓存组成的,例如表缓存记录缓存,key缓存权限缓存;

数据库通常不会被直接使用,而是由其他编程語言通过SQL语句调用mysql由mysql处理并返回执行结果。那么Mysql接受到SQL语句后又是如何处理的呢?


当该请求从等待队列进入到处理队列管理器会将該请求丢给SQL接口(SQL Interface)。
SQL接口接收到请求后它会将请求进行hash处理并与缓存中的结果进行对比,如果完全匹配则通过缓存直接返回处理结果;否则需要完整的走一趟流程:

  1. 由SQL接口丢给后面的解释器(Parser),上面已经说到解释器会判断SQL语句正确与否,若正确则将其转化为数据結构
  2. 解释器处理完,便来到后面的优化器(Optimizer)它会产生多种执行计划,最终数据库会选择最优化的方案去执行,尽快返会结果。
  3. 确定最优執行计划后SQL语句此时便可以交由存储引擎(Engine)处理,存储引擎将会到后端的存储设备中取得相应的数据并原路返回给程序。

(1)如何緩存查询数据

存储引擎处理完数据,并将其返回给程序的同时它还会将一份数据保留在缓存中,以便更快速
的处理下一次相同的请求具体情况是,mysql会将查询的语句、执行结果等进行hash并保
留在cache中,等待下次查询
从上面的图可以看到,缓存那里实际上有buffer和cache两个那它們之间是否有什么不同呢?
简单的说就是buffer是写缓存,cache是读缓存

(3)如何判断缓存中是否已缓存需要的数据

这里可能有一个误区,觉得处理SQL語句的时候为了判断是否已缓存查询结果,会将整个流程
走一遍取得执行结果后再与需要的进行对比,看看是否命中并以此说,既嘫不管缓存中有没
有缓存到查询内容都要整个流程走一遍,那么缓存的优势又在哪里?
实际上并非如此,在第一次查询后mysql便将查詢语句以及查询结果进行hash处理并保留
在缓存中,SQL查询到达之后对其进行同样的hash处理后,将两个hash值进行对照如果一
样,则命中从缓存Φ返回查询结果;否则,需要整个流程走一遍

发布了2 篇原创文章 · 获赞 1 · 访问量 821

}

我要回帖

更多关于 运行机制怎么描述 的文章

更多推荐

版权声明:文章内容来源于网络,版权归原作者所有,如有侵权请点击这里与我们联系,我们将及时删除。

点击添加站长微信