精华内容
下载资源
问答
  • 创造性的把每个静态资源归为一个 module(模块)并能被其强大 loader 所加载这种方式,成功开辟了前端工程界另一大生态。基于其官网文档完善度较高,这篇文章就不对 webpack 主要内容做过多介绍,...

    前言

    webpack,作为一个处理模块加载、资源依赖管理、构建化的工具,已经逐渐成为了前端工程化领域的新贵。其创造性的把每个静态资源归为一个 module(模块)并能被其强大的 loader 所加载的这种方式,成功的开辟了前端工程界的另一大生态。基于其官网文档的完善度较高,这篇文章就不对 webpack 的主要内容做过多的介绍,而是回归到本文的主题,即通过介绍几款 webpack 相关的插件,来解决一个常见的工程问题:如何做到静态资源路径可以在不同的环境下自动切换。

    问题说明

    这到底是个怎样的问题?设想一下,在使用 webpack 打包编译之后,它会生成一个 js 文件,随后我们需要在 html 或者模板文件里指定这个文件的路径确保其被正确的引入,

    <script type="javascript" src="app.js"></script>

    对于开发环境下的单入口文件(稍后会介绍 webpack 打包到多个入口的解决方案 ),这个标签内的引入文件路径完全可以写死,而且在 webpack-dev-server 热替换机制的帮助下,我们也无须通过对打包生成的文件添加 hash 值来处理因浏览器缓存的缘故引起的引用不到最新资源。

    但在产品模式下,我们非常有必要在 webpack 的 output 属性里的 filename 里配置一个 chunkhash 来变向的为静态资源注入版本号,如下,

    output: {
     filename: [name].[chunkhash].js,
    }

    以便上线之后页面可以引入版本更新后的代码。chunkhash 是一个基于文件内容,通过摘要算法(如md5)生成的一个被称之为文件指纹的序号,即只有当文件内容发生改变的时候,这个值才会相应更改。

    通过给静态资源注入 hash 值来作为版本号的好处主要有两个:

    1. 实现 long term caching 策略。当发布新版本时,我们只需要更新更改了的资源。这比起将新版资源存放在例如/v1.3/xx.js这种带版本号的路径或文件夹下的部署方式会显得更科学一点:减少手动配置版本号的额外操作、已经缓存过且缓存尚未过期的浏览器只需请求更新过的资源,确保未变更过的资源可以依旧从缓存内读取。

    2. 实现非覆盖式发布策略。张云龙老师的原文中提到的这种平滑的版本升级方式更加完美的解决了静态资源部署至CDN出现的问题。

    这个时候我们再来看下线上的 script 引入,

    <script type="javascript" src="http://xxx.cdn.com/app.82076244596568c8c929.js
    "></script>

    Fine, 也许你会说我可以手动 copy/paste 这个版本号当你需要从开发切到产品环境,额额,单个入口文件这么处理虽是可以,但想象下当有多个入口文件的时候。。。(感觉我的左手大拇指肌腱炎又要犯了。。),这么经典的问题webpack早已准备好了它的解决方案。

    从 webpack 的编译数据里获取开发与生产的资源路径对应关系

    这一部分的工作可以说是解决这个问题的一个核心环节,即我们需要通过 webpack 来生成类似如下一张对应关系图:

    {
        'app.js': 'http://xxx.cdn.com/app.82076244596568c8c929.js'
    }

    像在 webpack 的 plugin 属性里配置如下,我们就可以通过返回 webpack 的编译数据里获取到带有 chunkhash 的文件信息:

    // webpack.config.js
    module.exports = {
      ...
      plugins: [
        function() {
          this.plugin("done", function(stats) {
            require("fs").writeFileSync(
              path.join(__dirname, "..", "stats.json"),
              JSON.stringify(stats.toJson()));
          });
        }
      ]
    }

    将 stats.json require 到项目中,通过读取 publicPath、 assetsByChunkName 属性,可以得到开发与线上环境资源路径的对应关系。

    webpack 官方也推荐了几个有同样效果,我个人觉得更好用的插件:assets-webpack-plugin 或者 webpack-manifest-plugin 来生成出一个 JSON 对应关系文件。

    切换资源路径

    接下来的工作基本上就是如何利用这个对应关系来切换对应环境下的路径。这个还要取决于你的页面是否会涉及到服务端的渲染。

    服务端渲染资源路径

    以 node 作为服务端语言,handlebars(或者ejs)为模板语言为例,我们通过编写模板语言的 helper 来读取由 assets-webpack-plugin 生成的 stats.json,在不同的环境下实现路径切换:

    stats.json -- webpack 跑开发配置

    {
        "app": {
            "js": "app.js"
        }
    }

    stats.json -- webpack 跑生产配置

    {
        "app": {
            "js": "http://xxx.cdn.com/app.82076244596568c8c929.js"
        }
    }

    example.handlebars

    <script type="text/javascript" src="{{app.js}}"></script>

    后台通过 require stats.json 数据并传入到模板即可实现根据环境动态渲染资源路径。

    如果你的后台是使用 Rails 来搭建的话,那么这篇文章更详细的介绍了处理这种情况下处理资源切换的问题

    前端渲染页面模板

    如果你的项目不依赖任何后端渲染,那么 html-webpack-plugin 这款插件可以为你动态生成一个带有 css、js 等资源路径的 html 文件。

    html-webpack-plugin 具体的用法可以点击这里,其中 inject 这个属性可以让你将 script 标签插入到 dom 的指定位置。为了能够更大权限的将 webpack 编译过的资源可以插入到 html 文件的任意位置,我们可以在 HtmlWebpackPlugin 里指定的 template 文件里写入如下代码:

      <% for (var css in htmlWebpackPlugin.files.css) { %>
      <link href="<%= htmlWebpackPlugin.files.css[css] %>" rel="stylesheet">
      <% } %>
    <% for (var chunk in htmlWebpackPlugin.files.chunks) { %>
    <script src="<%= htmlWebpackPlugin.files.chunks[chunk].entry %>"></script>
    <% } %>

    就可以同样实现静态资源的切换,所以对于前端渲染模板的这种情况,我们无须再生成一个 json 文件,对于使用诸如 react、vue 这种框架,仅使用这个插件也是极好的。

    htmlWebpackPlugin 具体还有哪些属性可以配置,可以参考下这个 default template 查看完整例子

    展开全文
  • 在实践中,这就意味着最大限度地减少瓶颈和关键资源的影响,同时在尽可能充分利用任务的内在并行性。 另一种方式则截然相反。您主要依靠某种硬件和软件组合的内置特性,而您的解决方案和创造性只发挥次要...

    可伸缩性带来的好处

    从理论上来说,我认为有两种基本方式可使得系统具有可伸缩性这种至关重要的属性。一种方式是,在设计级别逻辑优化系统。您可以独立于任何软件工具和基础结构元素来考虑系统,然后在物理上建立系统。在实践中,这就意味着最大限度地减少瓶颈和关键资源的影响,同时在尽可能充分利用任务的内在并行性。 另一种方式则截然相反。您主要依靠某种硬件和软件组合的内置特性,而您的解决方案和创造性只发挥次要的作用。基本上,您将可伸缩性和互操作性的责任留给为了完成此任务而选择的工具。 顺便提一句,在前互联网时代,多年来人们一直在使用前一种方法,那时,大家尤其关心性能和强大的功能,似乎忽略了可伸缩性问题。(如果没有大范围的 Internet 互连,这确实是一个相对次要的问题。) 几年前,由于缺乏功能丰富、价格适中的集成解决方案,人们主要考虑的是设计问题,将注意力放在了数据库结构和各种运算的计算成本上。 目前的情况是,由于出现了价格比较便宜并且功能强大的硬件,使得优化和设计有效性在项目的整体管理中已经退居次要地位,可伸缩性独立于硬件的这种观点似乎占据了主导地位。 计算复杂性的黄金法则是:只有最快的算法才能最充分地利用速度更快的硬件。考虑可伸缩性问题时应该牢记这一点。

    增长因素

    不过,可伸缩性也可以说是抽象的。遗憾的是,可伸缩性并非一个您可以通过编程方式来打开和关闭的系统属性,您也不能以某种方式直接进行控制。相反,这是一种系统特性,它是基于所有其他特性、整体设计和实现以及所选择交互模型的组合的。 我们不可能利用某种监视工具或分析工具轻松地检测出分布式系统内在的可伸缩性级别。另一方面,一些实现方面的因素(关键资源是否充足、设计瓶颈、冗长但必不可少的任务以及操作的过分序列化)构成了有限可伸缩性的某种客观理由。 但是,如果未在真实工作环境下对系统进行压力测试,您就不能判断某个特定的系统是否具有足够的可伸缩性。 可伸缩性在某种程度上与性能有关,如果系统结构严谨,并采用了合理而周密的架构,就不会存在可伸缩性问题。 看到像可伸缩性这样看不见摸不着的系统特性突然成为系统性能下降的主要罪魁祸首,真让人感到惊讶。在设计组件时,您应该适当地考虑运算的计算成本,而且无论系统未来将怎样发展,您都要作好最充分的准备。 可伸缩性一直是一个影响系统增长的因素。简而言之,当前性能无法满足预期数量用户需要的系统就是需要增长的系统。如何才能在结构上提高这种系统的性能呢?简单地说,只要使用更强大的硬件或更好的硬件和软件组合就可以。 如今,这两种方法都已经用更具迷惑力、更加市场化的措辞重新表达了。以硬件为中心的方法称为向上扩展 。巧妙地结合硬件和软件的方法称为向外扩展 。 要控制系统的增长,请确保进行向上扩展或向外扩展。但同时要确保系统的能力一直保持提高状态。 可伸缩性,美妙的可伸缩性。这就是最合适的定义吗?

    向上扩展

    基本上,向上扩展系统意味着将一切的一切都迁移到更强大的新硬件系统的保护下。一旦新系统就绪,您就可以备份表和应用程序,然后进行联机了。这样对现有代码和系统组织结构的影响最小。

    不过,不要以为向上扩展的过程很容易。向上扩展有不足的一面,其中有几个要点值得我们多加关注。首先最重要的一点是,向上扩展的系统存在单点故障,最终将受制于某种硬件限制。向上扩展通过使用更强大的计算机来提高服务器处理能力。单个硬件处理能力的增长有一个物理上限,虽然目前可能还无法预见,但总有一天会达到这个上限。

    其次,接近此上限无论在时间上还是金钱上都需要相当大的成本(超过某个限度之后,技术可能需要发展几年,才能成倍地提高处理能力)。最后,但是也是重要的是耗电量和办公室空间。

    这就是说,由于对现有结构的影响有限,向上扩展有理由成为首选方案。

    向外扩展

    与提高作为服务器的单个硬件的处理能力正好相反,向外扩展将提高系统的整体处理能力。向外扩展的系统本质上是模块化的,它由一个计算机群集构成。对这样的系统进行向外扩展,意味着向网络添加一个或更多额外的计算机。 在向外扩展的、高度分区的环境中,您应该使用一种更抽象的、独立于硬件的处理能力概念。总处理能力是由跨越各节点的数据和应用分区所调节的每个计算机的物理速度总和。 向外扩展对系统的增长没有任何限制,在这一点上,我们的确终将受益。不过,向外扩展在重设计和重实现方面需要投入大量精力。一直根据单服务器逻辑构建的系统必须经过重新考虑和重新组织,才能满足向外扩展的要求。 您必须确定如何对跨越多个 DBMS 服务器的数据进行分区。应用程序到数据的路径必须通过正确的执行计划周密地优化。对用户活动经常进行适当的、预防性的分析是在系统生命周期中优化系统的关键。 做到这些以后,您就拥有了一个几乎无限的系统,您可以在中间层以及数据层向系统添加处理资源,以满足不断增长的用户数量和工作负荷的需要。 注意,对于一个可伸缩的系统来说,问题的关键不在于期望的用户数量可以达到多高。真正要考虑的是,预期这个用户数量增长的速度有多快。用户数量的相对增长比绝对数量重要得多。 与构建一个目前有一百个用户、但预期用户数量将随时间的推移而急剧成倍增长的系统相比,为一个相对稳定的一亿用户群设计系统要容易得多。由此,您就可以理解为什么工业级电子商务 Web 应用程序对可伸缩性要求特别高了,这是因为这些类型的系统可能面临突发的大幅用户增长。

    SQL Server 2000 如何向外扩展

    可以肯定,向上扩展相对来说比较容易实现,至少对少量数据和用户来说成本相对较低,但从软件角度来看,到目前为止,向外扩展技术更有趣,更具有挑战性。如果没有在后端层运行的最新软件产品的帮助,您就不可能合理地进行向外扩展。 COM+ 和 Windows® 2000 中看到的群集模型就是一个向外扩展模型。业务层中的所有服务器都有完全相同的 COM+ 组件副本。然后,在后台运行的 Windows 2000 负载平衡服务根据各组件的工作负荷,负责将新的请求分配给这些组件。 从应用程序的角度来看,您看到的是一个实体 - 一组 COM+ 组件。您会基于这些组件来编写代码,而不必考虑运行这些组件的不同服务器的数量,并且可以忽略基础负载平衡器的作用。在这里,向外扩展就像添加一个安装了适当的组件集、配置齐全的新 Windows 2000 服务器一样简单。 在这个群集模型中,两个截然不同的实体互相合作:应用程序的组件和系统的负载平衡器。这样的模型不可能很容易地应用于数据层。实际上,您只有一个软件实体 - DBMS。 SQL Server 2000 支持另一个不同的群集模型,称为联合服务器 。这种网络使得应用程序可以看见所有正在运行 SQL Server 的一组服务器。所有这些 SQL Server 公共实例都是自治的、独立托管的,它们具有不同的表,甚至采用不同的设置。 DBMS 的主要工作负荷是数据。应用程序主要负责在多个服务器之间对数据进行均衡的分发。SQL Server 2000 本身提供内置功能,以支持跨多个服务器进行物理分区的可更新数据视图。 您可以决定使表分布在通过网络提供的多个 SQL Server 的实例上。您随时都可以根据需要将这些数据包装在一起。您可以通过分区视图 实现此目的,这是一种特殊的视图,它拥有 SQL Server 2000 运行时提供的特殊支持。

    分区视图

    分区视图适用于联合表 ,即跨越两个或多个服务器的关键表。联合表是通过一个名称为水平分区 的过程来创建的,这个过程将给定的表分为了更小表的联合体。从应用程序的角度来看,联合表就像一个单独的视图。 为了平衡工作负荷,成员表被放在各个不同的计算机中。它们的格式与原始表相同,但每个表只包含一部分行。成员表可以使用任意名称,但是为了增加位置透明度,建议您为这些成员表提供与原始表相同的名称。 构成表通常设计为包含相同大小的数据部分。这一特性是通过一个唯一的、不可更新的主键实现的。要确保完整性和一致性,您还必须确保没有重复的记录。为此,建议您对每个成员表执行 “检查” 约束。分区列不能为空也不能为计算列。 分区视图是包含分布式 “选择” 语句的普通视图,这些语句适用于结构相同的表,并通过 UNION ALL 子句将数据放在一起。

    CREATE VIEW MyView AS
    SELECT * FROM Server1.Database.Owner.MyTable
    UNION ALL
    SELECT * FROM Server2.Database.Owner.MyTable 
    UNION ALL
    SELECT * FROM Server3.Database.Owner.MyTable
    UNION ALL
    SELECT * FROM Server4.Database.Owner.MyTable

    这种分布式视图必须在相关的所有服务器上创建,并且每个服务器都必须对于其他服务器显示为链接服务器。最好应将它们的 lazy schema validation 选项设置为 true 。该属性会确定是否检查链接的远程表的架构。如果将其设置为 True,SQL Server 则会跳过检查,从而使得性能提高。但这种特定的情况下,设置为 lazy 不会有丝毫的副作用。 分区视图最初是随 SQL Server 7.0 引入的。不过,随着 SQL Server 2000 的推出和一些重要性能改善的出现,它发展成为了向外扩展系统的重要工具。 在 SQL Server 2000 中,可以更新分区视图并且可以通过查询优化程序进行特殊优化,查询优化程序的目标是,最大限度地减少对跨服务器处理的需要。联合表的主要优点在于平衡可用服务器之间的工作负荷。只要所有的服务器都能在本地完成分配的任务,这无疑就是一个优势。 在以下情况下,分区视图可自动更新:

    • 它是由使用 UNION ALL 子句将各个 “选择” 语句合并起来的结果而形成的。

    • 每个 SELECT 语句对单个表工作(即不允许使用 JOIN )。

    • 该表是本地表或链接表。

    • 该表不包含时间戳列。

    链接表必须使用以下任意一个可能条件进行引用:完全限定名(服务器、数据库、所有者、表名)、OPENROWSETOPENDATASOURCE 函数。

    针对可更新分区视图运行的 “插入”“更新”“删除” 语句必须符合一些约束才能生效。例如,如果表包含一个标识列,则不能插入新行。您必须指定所有列,其中包括那些带有 “默认” 约束的列。如果该视图是自联接或与任何其他成员表联接的,则不允许进行更新或删除。

    向外扩展的实践

    SQL Server 2000 提供的群集模型并非适用于所有人。它是为高端 OLTP 企业系统,尤其是一些消耗资源较高的 Web 应用程序而专门设计的。 为了获得更高效率,它需要进行数据分区,而且分区必须遵循逻辑架构。所有相关数据都必须位于同一服务器上,并且必须能够进行逻辑拆分。 对数据的深入理解是绝对必要的。另外,随着时间的推移,数据的形式不应有太多变化。如果您知道它将发生变化,则应该预先了解它将来的形式,然后在规划分区时考虑到这一点。 在同一个节点上存放相关数据是可行的,否则您将很快在网络滞后时间中丢失使用精心设计的负载平衡策略所得到的内容。 完成数据分区后,即使您已经做得非常成功并且聪明过人,也只是完成了一半。实际上,将数据真正移动到选择的群集、安排备份以及监视解决方案还要靠您来解决。 与向上扩展相比,向外扩展技术确实难以实现并且是一种麻烦得多的方式。设计问题造成了一些实际的障碍,例如,缺乏将向外扩展群集作为单个实体进行管理的特殊工具。其中一些工具预计将在下一版的 SQL Server 中提供,代码名称为 Yukon。 向外扩展可伸缩性看起来前景很光明也很诱人,但是,在单个服务器上进行向上扩展在多数情况下仍然是最保险的方式。

    向上扩展还是向外扩展?

    事实上,第三代 Web 服务在硬件方面可能存在严格的要求。您原则上需要解决的问题是:向上扩展还是向外扩展?

    向上扩展随着时间的推移会增强单个硬件系统的功能。而向外扩展则会使您的系统成为一个不断扩展的服务器场,该服务器场中包含的系统相互连接,但规模更小。

    向上扩展的系统更有可能出现故障,内在可靠性较差,并且在超过某个阈值后不能进行升级。从耗电量、空间和价格方面来看,它也比较昂贵。另一方面,对系统进行向上扩展就像备份和恢复一样简单而无缝。

    尽管处理单个机器总是比处理几十或成百个机器更好一些,但向外扩展的系统具有更高的内在可靠性和可扩展性,整体成本也更低。

    然而,这两种方式的利与弊在某种意义上都是相对的,并且完全特定于项目。

    向上扩展还是向外扩展取决于系统的性质。如果通过单个 SQL Server(可能在一个单独的多处理器计算机上运行)实例可以满足您的数据访问需要,向外扩展当然是首选方案。顺便提一句,这是 Web 场所使用的可伸缩性模型。

    但是,Web 场向外扩展模型只是考虑水平可伸缩性的一种方式。如果您需要处理大量并发数据(例如,OLTP 系统),则可能需要多个服务器来协同工作,这就体现了“化整为零”这句古老的格言。在这种情况下,必须适当地重新组织数据。这个工作量非常巨大,不能随随便便就开始。在着手开始这样的项目之前,请确保您的系统已准备就绪,能够胜任如此海量的工作。也就是说,请确保可以将其当作 OLTP 系统使用。

    做为一个一般的规则,尽管向外扩展看起来更有发展前景,但始终还是应该首先考虑向上扩展,只有在理由充分时才放弃向上扩展。

    可伸缩性是发展的趋势

    不管向上扩展和向外扩展技术的理论是怎样阐述的,有几点总是需要注意:

    • 可伸缩性与计算复杂性有关,并且间接地与性能有关。

    • 只有已经在任务的最佳计算复杂性和实现精力之间作出最佳协调之后,才能考虑是通过硬件进行向上扩展还是使用特殊的数据库服务进行向外扩展。

    然而,据我所知,与改进算法、优化查询执行计划以及找到并消除瓶颈相比,采用速度更快的硬件总是要来得快些。这样还有助于按时完成任务。

    对话栏:围绕 ADO 的争论

    我的老板曾经问我:“ADO 和 ADO.NET 之间有什么区别?”我当时是这样回答的,ADO.NET 是我们最终要使用的另外一个数据访问层,还不了解其利与弊。我知道 ADO 代码在 .NET 中可以正常运行,但您有关 ADO 的各种文章搞得我头昏脑涨,不知到底是怎样的了。

    我承认,乍看上去,很容易把 ADO.NET 想成“另外一个数据访问层”。但是再仔细看看,就不是那么回事了。对于在 .NET 下运行的数据处理应用程序,ADO.NET 是并且一直会是唯一建议使用的方法。

    最近几年,我发现人们争先恐后地盲目使用 ADO,而放弃了经过优化和精细调整的 RDO 代码。可他们获得的却只有异常的结果。而只有可怜的 ADO 倍受责难。

    同样,我敢说可怜的 ADO.NET 也将成为糟糕的迁移项目的替罪羊。虽说没有完美的代码,但系统代码几乎总是比你我的代码好。就是说,RDO 到 ADO 的升级可能有问题。为什么仅仅为了从 ODBC 升级到 OLE DB 以及更加丰富的对象模型,就要去更改那些运行良好的代码呢?

    有了 ADO.NET 以后,情况就完全不同了。一旦您选择了 .NET 作为服务器平台,ADO.NET 就是您理所当然的选择。ADO.NET 是您能用于处理数据的唯一的类集合。

    从技术上讲,您可以坚持使用 ADO,但您最终将在 .NET 到 COM 的转换上付出高昂的价格。ADO.NET 的关键在于,在开始真正的编码之前,您要学习这种技术并在一个受控制的环境中使用该技术。在迁移至 ADO 之前,有多少人这样做过?

    对于今天这个由 Web 驱动的世界来说,ADO.NET 相对 ADO 而言是一个更合适的模型。同时,ADO.NET 对象模型已经在适当的、合理的情况下尽可能多地与 ADO 的概念保持了一致。要迁移到 ADO.NET,那么就从现在开始吧,您会发现学习过程原来如此简单快捷,简直令人难以置信。开发人员不必为了使用 ADO.NET 而学习太多的新概念。

    但是,用户必须重置他们 ADO 式的思维框架,开始按照另一个模型进行思考。ADO.NET 绝不是“另外一个数据访问层”。您不必在 ADO 和 ADO.NET 之间进行选择。更大的决定是,您是否选择使用 .NET 平台。

     

    原文:http://hi.baidu.com/mr_indigo/blog/item/466b38037ac14f074afb5177.html

    展开全文
  • 其次是场馆质量状况太差,无开放条件,占50%在公共体育场馆开放利用中,人力资源是很重要因素,在经营六大要素中,第一要素就是“人”是场馆经营关键因素,特别是人能力、精神面貌及创造性等素质更为重要...
  • 研究结果:根据生态系统观点,通过利用价值共同创造的概念,认为可行系统和生态系统之间整合可以重新读取VSA挑战,从而成为挑战VSA复杂性的关键驱动力,因为这一过程可以促进共同进化。时间。 通过这种方式...
  • 每年的双11都是一个全球狂欢的节日,随着每年交易逐年创造奇迹的背后,按照传统的方式,我们的成本也在逐年上升。双11当天的秒级交易峰值平时的近10多倍,我们要用3-4倍的机器去支撑。但大促过后这批机器的资源利用...

    前言

    每年的双11都是一个全球狂欢的节日,随着每年交易逐年创造奇迹的背后,按照传统的方式,我们的成本也在逐年上升。双11当天的秒级交易峰值平时的近10多倍,我们要用3-4倍的机器去支撑。但大促过后这批机器的资源利用率不高,到次年的双11会形成较长时间的低效运行。试想一下,电商交易有大促峰值,而阿里云有售卖Buffer,如果能充分发挥云计算的弹性能力,让资源可以两边快速腾挪,就可以解决资源浪费的问题了。把我们的交易单元可以部署在云上面,那么大促的时候我们只需要按照压测模型去云上构建一个符合能力的新单元即可,用完马上释放掉,这样无疑是最优雅的。专有云+公共云 的混合云弹性架构成为一种自然而然的选择,不但可以资源合理利用,降低成本,同时也锻炼了阿里人的的技术能力,为用户提供更优质的服务。
    有了架构思路,实现起来似乎也没那么容易。阿里的交易涉及几百个系统,他们之间的依赖错综复杂,如果能够把他们快速的搭建在云上?这次系统之间的依赖如何复杂,如果把他们的容量估算好,快速调整他们的容量水位?这就不得不提到下面的两个秘密武器了:一键建站和弹性容量交付

    1. 一键建站

    1.1 背景

    一键建站是在底层基础设施交付的基础上,快速地在一个空机房部署交易单元,使新机房迅速具备对外提供服务的能力。一键建站的逆过程叫一键下站,即迅速切除单元流量,释放所有单元内应用的物理资源。
    从架构的层面看,一键建站的基础是阿里电商体系的异地多活。从运维的角度看,一键建站是运维产品的升华,更是运维效率的核心体现。
    一键建站第一次被提出是在2014年,但由于系统多,依赖复杂,加上中间件的复杂性,当时新建一个单元需要耗时近1个月的时间,更是需要所有单元链路上的运维同学参与。去年,DB实现了一次完整意义上的一键建站,中间件的建站实现了半自动化,但是应用的建站过程仍需要很多运维同学的支持。今年,一键建站进行了重构,并提出一天(8小时)一单元的目标,在几乎不用运维同学参与的情况下,顺利支持了3个云单元的建站工作,最快一次耗时6小时建站。

    1.2 挑战

    今年的双11单元架构是三地五单元,一中心四单元,也是第一次遇到同机房两单元。如何控制单元内的链路封闭,单元与单元、单元与中心的同步与可见性,是异地多活的大挑战,也是一键建站的难点。
    首先需要明确单元内部署什么。建站需要维护一份知识库,包括单元的数据库,中间件,统一接入,以及导购、商品、店铺、交易、会员等一百多个应用。需要知道每个产品的服务器配置,软件配件,容量需求,甚至是应用间链路依赖等相关信息。这份知识库会跟随日常运维操作,调用链路日志等不断更新。同时,一个完整单元不仅仅包含线上环境,还需包含预发环境与小流量(测试环境),每套环境都有自己的一份知识库。
    其次是需要明确部署的每个步骤实现。单元内的每个产品,都需要明确部署的操作细节,以及产品之间的前后依赖。今年,一键建站第一次在云上实施,面对全新的服务器资源(ecs),全新的网络资源(slb)以及全新的部署方式(docker)等,每个环节都需要技术落地。由此可见,一键建站是一个庞大的系统,几乎涉及所有的运维产品。
    在明确了建站数据与建站步骤的基础上,还需要有一套技术实现能将单元内所有产品相关的近四千个部署步骤串联起来,这就是建站系统。追求建站效率的同时,安全始终要铭记于心。建站的每个步骤,都需要考虑可能出现的突发情况以及应对策略。

    1.3 技术架构

    一键建站是一个体系的构建,是要在原有运维产品的基础上进行升华,将相关产品的原子性服务联动起来,最终凝聚成一个按钮。
    一键建站涉及的单元产品种类繁多,相关操作保罗万象,而且变化极为频繁。如果为每类产品写死操作流程,那建站只会疲于代码,即使完成了代码,也只会是一次性的玩物。因此建站需要更多的考虑灵活性,在最终的技术实现上,将系统架构分为四个层次,原子服务、功能组件、组件编排以及流程调度。系统架构如下图:

    0?wx_fmt=png

    1.4 原子服务

    建站平台的能力来源于周边的运维产品,接入相关系统的服务,将最小粒度的一次服务调用称为一个原子操作。服务网关包装一系列原子操作,以提供上层业务调用。
    作为唯一的外部系统调用入口,服务网关还需要做统一的日志记录,业务链路跟踪以及故障告警等。
    对建站平台的效率要求,很大一部分最终会落在外部系统服务上。最具代表性的是服务器资源申请与docker镜像,这两条链路的背后,凝聚着很多人努力的心血。

    1.5 功能组件

    功能组件,是将相关的原子服务进行整合,从而形成的一个个有业务含义的独立功能模块。比如创建服务器、添加帐号、创建vip、docker upgrade、应用启动、更新hsf路由等等,将近百个原子服务最终聚合成三四十个功能组件。组件的实现需要能保证幂等。
    功能组件需要遵循一定的规范,从而使得同一组件能被不同的应用,不同的流程复用。

    1.6 组件编排

    组件编排是建站灵活性的核心。建站平台支持在web页面动态编排功能组件,从而组装成一个个可以运行的流程。单元内的每类中间件或应用都可能存在部署上的差异,通过服务编排,使每一类产品都能对应到一类流程。
    建站需要涉及整套中间件以及一百多个单元应用,这些产品在部署启动上还存在先后链路依赖。去除弱依赖,将单元产品依赖描述成一张无环有向图,每个节点代表一个产品的部署流程。将整张图描述成一个流程,这个流程就是建站流程!

    1.7 流程调度

    流程调度是建站稳定性的有力保障。流程调度负责建站流程的分布式执行,是流程引擎的一个实现,至少需要达到下述几点要求:

    1. 高可用。服务器宕机不能影响流程执行;

    2. 系统容错。下游系统异常诊断,自动重试;

    3. 并发访问控制。流程节点不应该同时在多台服务器被调度;
      在结构上,流程调度可以分为流程实例管控、任务队列、任务调度、组件执行器与分布式协同组件等。每个节点按照自身的负载情况加载流程实例到本地任务队列,组件执行器负责每个组件的入參注入,出參收集以及反射调用,分布式协同保障同一时刻仅有一个节点在调度流程实例。
      一键建站流程是一个包含众多子流程的嵌套流程结构,建站时,流程调度需要同时执行上千个流程。

    一键建站只是完成了最小单元的建站工作,如果想让这个单元支撑好大促的流量,还需要对这个单元进行容量评估和扩容,如何快速的评估各个应用的容量并自动扩容呢?这时就需要弹性容量交付出场了。

    2. 弹性容量交付

    如下图:

    0?wx_fmt=png

    今年弹性技术在实时容量评估算法上作了一定的改良,期初主要出于提升效率,最大程度地降低实施成本,与保障集群稳定性的目的: 更加智能,使用在线机器学习实时测算应用性能变化,并可作出简单的故障原因分析, 通过算法对各个单元的应用集群进行自然水位拉平.
    1.如何用机器在无人介入的情况下,预测应用集群各个单元的性能;需要做很多事情:日常性能变化测量;应用发布性能变化测量;集群中单机的性能变化预测,与目标交易量下会有多少比例机器挂掉的预测,容量问题还是性能问题的判断等等等等。
    2.为支持XX笔交易的业务目标,需要多少资源;或者说,现有XX些资源,最高可以支撑多高的交易量?
    3.一个应用集群在什么样的物理资源利用率下稳定性与成本会是一个最佳配比?
    4.资源预算.

    我们先简单以一个在线web服务类应用进行分析,在线电商每天的流量波动与资源利用率是存在一定的关系的(当然也可以换成其它指标进行测算),我们将两项指标叠加,呈散点图形态

    0?wx_fmt=png

    现在假设,我们设定资源利用率阀值为70%的cpu利用率,预测该应用集群的服务能力,我们利用上面呈现的散点图做一次拟合,延长趋势线,呈以下形态:

    0?wx_fmt=png

    则求出,该应用极限能力在X%的资源利用率下的服务能力大致是Y.
    但实际场景中,情况要复杂得多,在不同压力下,随着物理机的利用率整体饱和度的上升,性能会有一定的损耗,将不同压力下测算的服务能力记录,并作一次回归,预测出目标压力下,大致损耗度,并用刚才计算好的服务能力减去目标压力下的损耗度即可,

    哪下一个问题来了,应用集群的资源利用率多少为极限值?这里只是一个假定,每个应用集群的极限能力都不相同; 首先前文已经提到,由于各个应用集群布署的物理机坑位不同,有可能超卖,也有可能会与资源占用多的应用布署在同一个物理核内,超线程会带来一定的影响,而一个物理核通常分为两个逻辑核,是否一个物理核的总能力/2则为两项占用该物理核逻辑核上的能力;假定100%的资源利用率为满负荷,则两个逻辑核各分50%的能力相对合理?

    但实际情况是,占用两个逻辑核的应用集群利用率,在容量层次不齐的宏观情况下,有的偏高,有的偏低,这就会出现资源抢占问题。

    如何识别某项应用集群合理的资源利用率是多少? 我们需要做一些事情,即除了对整个应用集群作上文中讲到的资源测算,还需要对每台单机作能力测算,这里我们随便拟定一个值,如单机负载如果超过80%是不可承受的,则我们在整体全链路压测时,会对每台单机做实时的负载预测,看在目标交易量下,多少比例的机器会超过最大的承受能力,该集群的总qps会有出现多少比例的损耗。 这里假定我们认为不允许有机器出现这样的情况,则当某台机器预测值达到最大承受能力时,则认为当前集群能力的合理负载应该在多少。

    根据上文的描述,我们可以直接拿到测算好的各个应用集群的容量配比进行在线备容即可.通过后续每次的压测,对各个应用集群的预期资源利用率进行逐步逼近,最终达到整体备容目标.

    正因为有了以上两个秘密武器,我们在双11之前就快速的做好了容量准备,同时双11一过,我们立刻对云资源进行一键下站,把资源归还到云的Buffer里,对公共云进行售卖。

    展开全文
  • 每年的双11都是一个全球狂欢的节日,随着每年交易逐年创造奇迹的背后,按照传统的方式,我们的成本也在逐年上升。双11当天的秒级交易峰值平时的近10多倍,我们要用3-4倍的机器去支撑。但大促过后这批机器的资源利用...

    4.1 17.5W秒级交易峰值下的混合云弹性架构之路

    前言

    每年的双11都是一个全球狂欢的节日,随着每年交易逐年创造奇迹的背后,按照传统的方式,我们的成本也在逐年上升。双11当天的秒级交易峰值平时的近10多倍,我们要用3-4倍的机器去支撑。但大促过后这批机器的资源利用率不高,到次年的双11会形成较长时间的低效运行。试想一下,电商交易有大促峰值,而阿里云有售卖Buffer,如果能充分发挥云计算的弹性能力,让资源可以两边快速腾挪,就可以解决资源浪费的问题了。把我们的交易单元可以部署在云上面,那么大促的时候我们只需要按照压测模型去云上构建一个符合能力的新单元即可,用完马上释放掉,这样无疑是最优雅的。专有云+公共云 的混合云弹性架构成为一种自然而然的选择,不但可以资源合理利用,降低成本,同时也锻炼了阿里人的的技术能力,为用户提供更优质的服务。

    有了架构思路,实现起来似乎也没那么容易。阿里的交易涉及几百个系统,他们之间的依赖错综复杂,如何能够把他们快速的搭建在云上?这次系统之间的依赖如何复杂,如果把他们的容量估算好,快速调整他们的容量水位?这就不得不提到下面的两个秘密武器了:一键建站和弹性容量交付。

     

    1. 一键建站

    1.1 背景

    一键建站是在底层基础设施交付的基础上,快速地在一个空机房部署交易单元,使新机房迅速具备对外提供服务的能力。一键建站的逆过程叫一键下站,即迅速切除单元流量,释放所有单元内应用的物理资源。

    从架构的层面看,一键建站的基础是阿里电商体系的异地多活。从运维的角度看,一键建站是运维产品的升华,更是运维效率的核心体现。

    一键建站第一次被提出是在2014年,但由于系统多,依赖复杂,加上中间件的复杂性,当时新建一个单元需要耗时近1个月的时间,更是需要所有单元链路上的运维同学参与。去年,DB实现了一次完整意义上的一键建站,中间件的建站实现了半自动化,但是应用的建站过程仍需要很多运维同学的支持。今年,一键建站进行了重构,并提出一天(8小时)一单元的目标,在几乎不用运维同学参与的情况下,顺利支持了3个云单元的建站工作,最快一次耗时6小时建站。

     

    1.2 挑战

    今年的双11单元架构是三地五单元,一中心四单元,也是第一次遇到同机房两单元。如何控制单元内的链路封闭,单元与单元、单元与中心的同步与可见性,是异地多活的大挑战,也是一键建站的难点。

    首先需要明确单元内部署什么。建站需要维护一份知识库,包括单元的数据库,中间件,统一接入,以及导购、商品、店铺、交易、会员等一百多个应用。需要知道每个产品的服务器配置,软件配件,容量需求,甚至是应用间链路依赖等相关信息。这份知识库会跟随日常运维操作,调用链路日志等不断更新。同时,一个完整单元不仅仅包含线上环境,还需包含预发环境与小流量(测试环境),每套环境都有自己的一份知识库。

    其次是需要明确部署的每个步骤实现。单元内的每个产品,都需要明确部署的操作细节,以及产品之间的前后依赖。今年,一键建站第一次在云上实施,面对全新的服务器资源(ecs),全新的网络资源(slb)以及全新的部署方式(docker)等,每个环节都需要技术落地。由此可见,一键建站是一个庞大的系统,几乎涉及所有的运维产品。

    在明确了建站数据与建站步骤的基础上,还需要有一套技术实现能将单元内所有产品相关的近四千个部署步骤串联起来,这就是建站系统。追求建站效率的同时,安全始终要铭记于心。建站的每个步骤,都需要考虑可能出现的突发情况以及应对策略。

     

    1.3 技术架构

    一键建站是一个体系的构建,是要在原有运维产品的基础上进行升华,将相关产品的原子性服务联动起来,最终凝聚成一个按钮。

    一键建站涉及的单元产品种类繁多,相关操作保罗万象,而且变化极为频繁。如果为每类产品写死操作流程,那建站只会疲于代码,即使完成了代码,也只会是一次性的玩物。因此建站需要更多的考虑灵活性,在最终的技术实现上,将系统架构分为四个层次,原子服务、功能组件、组件编排以及流程调度。系统架构如下图:

    1.4 原子服务

    建站平台的能力来源于周边的运维产品,接入相关系统的服务,将最小粒度的一次服务调用称为一个原子操作。服务网关包装一系列原子操作,以提供上层业务调用。

    作为唯一的外部系统调用入口,服务网关还需要做统一的日志记录,业务链路跟踪以及故障告警等。

    对建站平台的效率要求,很大一部分最终会落在外部系统服务上。最具代表性的是服务器资源申请与docker镜像,这两条链路的背后,凝聚着很多人努力的心血。

     

    1.5 功能组件

    功能组件,是将相关的原子服务进行整合,从而形成的一个个有业务含义的独立功能模块。比如创建服务器、添加帐号、创建vip、docker upgrade、应用启动、更新hsf路由等等,将近百个原子服务最终聚合成三四十个功能组件。组件的实现需要能保证幂等。

    功能组件需要遵循一定的规范,从而使得同一组件能被不同的应用,不同的流程复用。

     

    1.6 组件编排

    组件编排是建站灵活性的核心。建站平台支持在web页面动态编排功能组件,从而组装成一个个可以运行的流程。单元内的每类中间件或应用都可能存在部署上的差异,通过服务编排,使每一类产品都能对应到一类流程。

    建站需要涉及整套中间件以及一百多个单元应用,这些产品在部署启动上还存在先后链路依赖。去除弱依赖,将单元产品依赖描述成一张无环有向图,每个节点代表一个产品的部署流程。将整张图描述成一个流程,这个流程就是建站流程!

     

    1.7 流程调度

    流程调度是建站稳定性的有力保障。流程调度负责建站流程的分布式执行,是流程引擎的一个实现,至少需要达到下述几点要求:

    • 1. 高可用。服务器宕机不能影响流程执行;
    • 2. 系统容错。下游系统异常诊断,自动重试;
    • 3. 并发访问控制。流程节点不应该同时在多台服务器被调度;

    在结构上,流程调度可以分为流程实例管控、任务队列、任务调度、组件执行器与分布式协同组件等。每个节点按照自身的负载情况加载流程实例到本地任务队列,组件执行器负责每个组件的入參注入,出參收集以及反射调用,分布式协同保障同一时刻仅有一个节点在调度流程实例。

    一键建站流程是一个包含众多子流程的嵌套流程结构,建站时,流程调度需要同时执行上千个流程。

     

    一键建站只是完成了最小单元的建站工作,如果想让这个单元支撑好大促的流量,还需要对这个单元进行容量评估和扩容,如何快速的评估各个应用的容量并自动扩容呢?这时就需要弹性容量交付出场了。

     

    2. 弹性容量交付

    如上图,今年弹性技术在实时容量评估算法上作了一定的改良,期初主要出于提升效率,最大程度地降低实施成本,与保障集群稳定性的目的: 更加智能,使用在线机器学习实时测算应用性能变化,并可作出简单的故障原因分析, 通过算法对各个单元的应用集群进行自然水位拉平.

    • 如何用机器在无人介入的情况下,预测应用集群各个单元的性能;需要做很多事情:日常性能变化测量;应用发布性能变化测量;集群中单机的性能变化预测,与目标交易量下会有多少比例机器挂掉的预测,容量问题还是性能问题的判断等等等等。
    • 为支持XX笔交易的业务目标,需要多少资源;或者说,现有XX些资源,最高可以支撑多高的交易量?
    • 一个应用集群在什么样的物理资源利用率下稳定性与成本会是一个最佳配比?
    •  资源预算.

    我们先简单以一个在线web服务类应用进行分析,在线电商每天的流量波动与资源利用率是存在一定的关系的(当然也可以换成其它指标进行测算),我们将两项指标叠加,呈散点图形态

    现在假设,我们设定资源利用率阀值为70%的cpu利用率,预测该应用集群的服务能力,我们利用上面呈现的散点图做一次拟合,延长趋势线,呈以下形态:

    则求出,该应用极限能力在X%的资源利用率下的服务能力大致是Y.

    但实际场景中,情况要复杂得多,在不同压力下,随着物理机的利用率整体饱和度的上升,性能会有一定的损耗,将不同压力下测算的服务能力记录,并作一次回归,预测出目标压力下,大致损耗度,并用刚才计算好的服务能力减去目标压力下的损耗度即可,

    哪下一个问题来了,应用集群的资源利用率多少为极限值?这里只是一个假定,每个应用集群的极限能力都不相同; 首先前文已经提到,由于各个应用集群布署的物理机坑位不同,有可能超卖,也有可能会与资源占用多的应用布署在同一个物理核内,超线程会带来一定的影响,而一个物理核通常分为两个逻辑核,是否一个物理核的总能力/2则为两项占用该物理核逻辑核上的能力;假定100%的资源利用率为满负荷,则两个逻辑核各分50%的能力相对合理? 

    但实际情况是,占用两个逻辑核的应用集群利用率,在容量层次不齐的宏观情况下,有的偏高,有的偏低,这就会出现资源抢占问题。

    如何识别某项应用集群合理的资源利用率是多少? 我们需要做一些事情,即除了对整个应用集群作上文中讲到的资源测算,还需要对每台单机作能力测算,这里我们随便拟定一个值,如单机负载如果超过80%是不可承受的,则我们在整体全链路压测时,会对每台单机做实时的负载预测,看在目标交易量下,多少比例的机器会超过最大的承受能力,该集群的总qps会有出现多少比例的损耗。 这里假定我们认为不允许有机器出现这样的情况,则当某台机器预测值达到最大承受能力时,则认为当前集群能力的合理负载应该在多少。

     根据上文的描述,我们可以直接拿到测算好的各个应用集群的容量配比进行在线备容即可.通过后续每次的压测,对各个应用集群的预期资源利用率进行逐步逼近,最终达到整体备容目标.

    正因为有了以上两个秘密武器,我们在双11之前就快速的做好了容量准备,同时双11一过,我们立刻对云资源进行一键下站,把资源归还到云的Buffer里,对公共云进行售卖。

    转载于:https://www.cnblogs.com/hujiapeng/p/6235922.html

    展开全文
  • 在社会生产实践中,管理是对组织的资源进行有效整合和利用以达到组织既定目标的动态创造性活动。管理的核心就在于对现实资源的有效整合和利用。管理创新就应该是创造一种新的更有效的资源整合和利用的方式,以更好更...
  •  本书按照“发现问题→解决问题→实践与理论相结合”的方式进行介绍,首先对现实问题进行分析,然后提供合适的解决方案,最后自然地引出oracle中的理论知识点,这种讲解方法能够有效地降低阅读难度,帮助读者更好地...
  • 太阳能半导体制冷空调是根据太阳能光伏效应,即通过“光-电-冷”途径,并利用太阳能电池产生电能为驱动半导体制冷装置,以实现热能传递一种特殊制冷方式。太阳能光电转换电能不但可以与热电制冷直流供电模式...
  • 摘 要: 为提高学生自学能力、开发其创造力 , 增进师生之间沟通 , 设计了一种师生互动教学网 站。该网站充分利用学校教学资源 , 在设计上以学生为中心 , 体现学生需求并注重师生互动。作者利用交 互式设计方式 , ...
  • 丰富了英语课堂教学的方式和结 构。教师要充分利用现代信息技 术。开发英语教学资源.拓宽学生 的英语学习渠道.改进学生的学习 方式.丰富英语教学的内容和形 式.探索新的教学模式,努力提高 信息素养.开发并合理...
  • 太阳能半导体制冷空调是根据太阳能光伏效应,即通过“光-电-冷”途径,并利用太阳能电池产生电能为驱动半导体制冷装置,以实现热能传递一种特殊制冷方式。太阳能光电转换电能不但可以与热电制冷直流供电模式...
  • 太阳能半导体制冷空调是根据太阳能光伏效应,即通过“光-电-冷”途径,并利用太阳能电池产生电能为驱动半导体制冷装置,以实现热能传递一种特殊制冷方式。太阳能光电转换电能不但可以与热电制冷直流供电模式...
  • 本性-研究论文

    2021-05-20 05:25:40
    对我们的社会以及其中的所有组织而言,挑战是建立一种游戏规则,以增加而不是减少对我们稀缺资源的有效利用的方式来挖掘和引导人类的能量。 另请参阅詹森自利,利他主义,激励机制和代理理论的相关论文。
  • 共享经济背后

    2014-11-17 09:10:32
    共享经济背后(转)   共享经济病毒式蔓延   “共享经济”本身不是...这股创造性的颠覆力量被称为“共享经济”,这种经济模式重点是在于对闲置资源剩余价值利用。   其实,“共享”不是新概念...
  • 会展组织者以展会为媒体,为展商与贸易商提供有效的交流平台,客观上是以集群与时空结合的方式,为行为主体间创造交流的环境。在突发危机发生的情况下,这种方式受到了挑战。“网上会展”以其高效、灵敏的特点,表现...
  • 摘要:电力供应是整个社会生产、人民生活基本保证之一,也是全世界普遍能源形式,而且多数资源都被人类运用各种方式转换为电能而加以利用,经济高速运行也使各领域用电负荷急速上升,各种疏漏和故障层出不穷...
  • 理想,功能,资源和消除矛盾TRIZ概念被用来提出子系统功能的创造性解决方案。 TRIZ用于为设计空间中要制作各种子系统生成一组替代方案或可能解决方案。 随着项目执行以及有关组件更多清晰性,替代方案...
  • C、控制和管理系统资源的使用 D、高级语言和机器语言 6、在WindowsXP操作系统出现之前,(D)是微软公司所提供个人计算机操作系统中最稳定的。 A、Windows 95 B、Windows 98 C、Windows Me D、Windows 2000 7、...
  • 鉴于市场上用户的手机型号、种类、屏幕分辨率等参差不齐,传统方式根据主流系统分别开发相应的系统耗时又耗力,为了高效开发并节约开发项目成本,本文采用Android+HTML5相结合的方式进行移动端Web系统的设计研发工作...
  • 这一章在简要提到处理大数据集的额外资源的同时,它也道出了一系列常见的分析任务(人们期望分析师对任何数据都要进行的操作),以帮助一些人更好地过渡到R。, 第5章:探索数据:数据可视化中新崛起的业务。这一章...
  • 你将学会理解和评价现有以及将来各种QoS方案,而这些方案都存在于一个由流分类、调度算法、链路技术、路由协议、信令方式、计费和授权方式、健壮应对网络设备失效等技术构成框架中。 <br/> 本书讨论...
  • ERP系统集信息技术与先进管理思想于一身,成为现代企业运行模式,反映时代对企业合理调配资源,最大化地创造社会财富要求,成为企业在信息时代生存、发展基石。E即将企业内部所有资源整合在一起,对采购、...
  • 豆瓣作为一个工具的价值可以通过条目很好体现,但豆瓣作为一个独一无二的社区,只能通过它独有的、克制的、以人为本的方式才能维系。作为一个普通但也深爱豆瓣的用户,我希望豆瓣在这个方向上也不要失落,因为一个...

空空如也

空空如也

1 2 3 4 5 ... 7
收藏数 129
精华内容 51
关键字:

创造性利用资源的方式