精华内容
下载资源
问答
  • react三级选择联级响应

    千次阅读 2016-05-18 18:02:47
    这个组件是对react技术的个部分技术的综合运用,运用的是react技术和webpack打包。完成了个省市区的三级联级响应的组件,如果称得上组件的话~

    又时隔多日没来博客里逛逛了,最近心血来潮用自己浅薄的react功底整了一个三级选择的联级响应,代码我自己看着都是很错综复杂的,不过作为一个新技术,我自己也还没有很深的理解,就只能先这样随意看看了,大家不要在意,只是做一个记录用~

    首先给出的是DOM结构的代码,我这里把样式也直接扔进去了。

    <!DOCTYPE html>
    <html lang="en">
    <head>
        <meta charset="UTF-8">
        <title>test</title>
        <style>
            *{padding: 0; margin: 0;}
            .pr{ position: relative; float: left; margin-right: 6px; width: 110px; height: 36px; border: 1px #666 solid;}
            .provide,.city,.town{ cursor: pointer;}
            .provide p,.city p,.town p{ padding-right:10px; text-align: center; line-height: 36px;}
            .provide i,.city i,.town i{ position: absolute; right: 4px; top: 15px; width: 0; height: 0; border-top: 6px #666 solid; border-left: 6px #fff solid; border-right: 6px #fff solid;}
            .locationList{ position: absolute; top: 100%; left: -1px; width: 110px; border: 1px #666 solid; border-top: none;}
            .locationList p{ text-align: center; line-height: 36px;}
            .locationList p:hover{ background-color: #aaaaaa;}
        </style>
    </head>
    <body>
        <div id="test"></div>
        <script src="bundle.js"></script>
    </body>
    </html>
    这个是DOM结构的代码,这里的bundle.js是用webpack打包工具打包以后的生成出来的。

    下面是主题的js代码:app.js

    'use strict';
    var React = require('react');
    var ReactDOM = require('react-dom');
    var ProvideList = require("./provideList");
    var CityList = require("./cityList");
    var TownList = require("./townList");
    const Test = React.createClass({
        getInitialState:function(){
            return {
                provideStatus:true,
                cityStatus:false,
                townStatus:false,
                provideListStatus:true,
                cityListStatus:false,
                townListStatus:false,
                provide:"请选择",
                city:"请选择",
                town:"请选择",
                provideList:[],
                cityList:[],
                townList:[]
            }
        },
        render:function(){
            return <div>
                <div>
                    <div className="pr" style={{display:this.state.provideStatus==true?"block":"none"}}>
                        <div className="provide" onClick={function(){this.handleClick("provide")}.bind(this)}>
                            <i></i>
                            <p>{this.state.provide}</p>
                        </div>
                        <ProvideList
                            info={this.state.provideList}
                            listStatus={this.state.provideListStatus}
                            onChange={function(val){this.handleProvideCallback(val)}.bind(this)} />
                    </div>
                    <div className="pr" style={{display:this.state.cityStatus==true?"block":"none"}}>
                        <div className="city" onClick={function(){this.handleClick("city")}.bind(this)}>
                            <i></i>
                            <p>{this.state.city}</p>
                        </div>
                        <CityList
                            info={this.state.cityList}
                            listStatus={this.state.cityListStatus}
                            onChange={function(val){this.handleCityCallback(val)}.bind(this)} />
                    </div>
                    <div className="pr" style={{display:this.state.townStatus==true?"block":"none"}}>
                        <div className="town" onClick={function(){this.handleClick("town")}.bind(this)}>
                            <i></i>
                            <p>{this.state.town}</p>
                        </div>
                        <TownList
                            info={this.state.townList}
                            listStatus={this.state.townListStatus}
                            onChange={function(val){this.handleTownCallback(val)}.bind(this)} />
                    </div>
                </div>
            </div>;
        },
    
        handleTownCallback:function(val){
            this.setState({town:val.title,townStatus:true,townListStatus:val.listStatus})
        },
        handleCityCallback:function(val){
            this.setState({city:val.title,townStatus:val.status,cityListStatus:val.listStatus},function(){this.setState({town:"请选择"})}.bind(this))
        },
        handleProvideCallback:function(val){
            this.setState({provide:val.title,cityStatus:val.status,provideListStatus:val.listStatus},function(){this.setState({city:"请选择",town:"请选择"})}.bind(this))
        },
    
    
        handleClick:function(type){
            var option={};
            if(type=="provide"){
                this.getLocation(option);
            }else if(type=="city"){
                option.provide=this.state.provide;
                this.getLocation(option);
            }else if(type=="town"){
                option.provide=this.state.provide;
                option.city=this.state.city;
                this.getLocation(option);
            }
        },
        getLocation:function(param){
            var locationList=[
                ["北京市",["北京市","东城区","西城区","崇文区"]],
                ["广东省",["深圳市","南山区","福田区","龙岗区","龙华区"],["广州市","天河区","海珠区","荔湾区"]],
                ["湖北省",["武汉市","汉口","武汉","武昌"],["潜江市","熊口","老新"]],
                ["江苏省",["南京市","江宁区","溧水区","高淳区","六合区"],["苏州市","吴江区","姑苏区","吴中区","虎丘区"]],
                ["四川省",["成都市","温江区","新都区","青羊区","金牛区"],["绵阳市","涪城区","游仙区"]]
            ];
            if(typeof param.provide=="undefined"){
                this.setState({
                    provideListStatus:true,
                    cityListStatus:false,
                    townListStatus:false,
                    provideList:["请选择","北京市","广东省","湖北省","江苏省","四川省"]
                })
            }else{
                var proIndex,cityIndex,cityList=["请选择"],townList=["请选择"];
                for(var i=0;i<locationList.length;i++){
                    if(param.provide==locationList[i][0]){
                        proIndex=i;
                        if(typeof param.city!="undefined"){
                            console.log(proIndex,locationList[proIndex])
                            for(var k=1;k<locationList[proIndex].length;k++){
                                if(param.city==locationList[proIndex][k][0]){
                                    cityIndex=k;
                                    for(var j=1;j<locationList[proIndex][k].length;j++){
                                        townList.push(locationList[proIndex][k][j]);
                                    }
                                    this.setState({
                                        townList:townList,
                                        provideListStatus:false,
                                        cityListStatus:false,
                                        townListStatus:true
                                    });
                                    townList=["请选择"];
                                    return;
                                }
                            }
                        }else{
                            for(var k=1;k<locationList[proIndex].length;k++){
                                cityList.push(locationList[proIndex][k][0])
                            }
                            this.setState({
                                cityList:cityList,
                                provideListStatus:false,
                                cityListStatus:true,
                                townListStatus:false
                            });
                            cityList=["请选择"];
                        }
                        return;
                    }
                }
            }
        }
    });
    console.log(document.getElementById("test"));
    ReactDOM.render(<Test />,document.getElementById("test"));
    这里引用了三个js,分别是省的展示、市的展示、区的展示。

    "use strict";
    
    var React = require("react");
    var Provide = require("./test");
    const ProvideList = React.createClass({
        render:function(){
            console.log(this.props.listStatus);
            return <Provide info={this.props.info} listStatus={this.props.listStatus} onChange={function(val){this.props.onChange(val)}.bind(this)} />
        }
    });
    module.exports = ProvideList;

    "use strict";
    
    var React = require("react");
    var City = require("./test");
    const CityList = React.createClass({
        render:function(){
            return <City info={this.props.info} listStatus={this.props.listStatus} onChange={function(val){this.props.onChange(val)}.bind(this)} />
        }
    });
    module.exports = CityList;

    "use strict";
    
    var React = require("react");
    var Town = require("./test");
    const TownList = React.createClass({
        render:function(){
            console.log(this.props.info);
            return <Town info={this.props.info} listStatus={this.props.listStatus} onChange={function(val){this.props.onChange(val)}.bind(this)} />
        }
    });
    module.exports = TownList;
    这三个js引用了同一个js文件,test.js,test.js里面才是对实际内容的渲染。

    "use strict";
    var React = require('react');
    
    const InfoList = React.createClass({
        render:function(){
            return <div className="locationList" style={{display:this.props.listStatus==true?"block":"none"}}>
                {this.props.info.map(function(result){
                    return <p onClick={this.handleClick}>{result}</p>
                }.bind(this))}
            </div>
        },
        handleClick:function(e){
            this.props.onChange({title:e.target.innerText,status:true,listStatus:false});
        }
    });
    
    module.exports = InfoList;


    这是第一次写react相关的技术,可能我跟新技术比较慢半拍,现在才开始写一个稍微全面一点的技术,由于对react了解有限,导致整个代码冗余还是比较严重的,交互也没有想象的那样友好,反正是一个相对来说比较失败的例子,但是对我来说初学这些,能写一个这样的demo让自己更好的整合知识,我已经很开心了。


    展开全文
  • 从 0 到 1,魅族网络架构经历了四个时代,也部署到异地机房,并成功服务几千万用户。将全国响应速度控制到 30ms,网络架构改造演进过程中积累的经验和教训?基础网络的监控是每个团队关心问题,看魅族做了哪四大...

    2015 年 12 月 21 日魅族副总裁李楠在年度媒体沟通会公布 2015 年总销量突破 2000 万台,同比去年增长 350%,增长率全球手机品牌第一;

    2015 年 12 月 29 日魅族副总裁杨颜公布,2015 年魅族 Flyme 注册用户数突破 3000 万,应用商店现有超过 100 万款应用,总下载量超过 100 亿,营收能力同比增长 12 倍。

    在业绩出现爆发式增长的同时,数据中心基础资源也出现大规模扩张,目前的一些数据如下。



    网络设备数量:200+

    • 服务器数量:2000+

    • 虚拟子机数量:2500+

    • 互联网带宽:4G+

    • 专线带宽:400M+

    • CDN 带宽:100G+


    运维问题


    在传统手机制造业向互联网方向转型,以及业务爆发式增长,基础网络运维遇到过什么问题、困难呢?




    • 架构:网络架构脆弱,故障不定时爆发。比如单点架构:IDC 与办公共用办公网珠海总部节点为中心,当中心节点需维护或故障时,将影响 IDC 节点可用性;

    • 硬件:硬件性能瓶颈,高峰期 CPU 高达 99%。比如广域网采用低端路由器跑公网 DMVPN,采用 CPU 进行封装、转发,耗设备设能,在晚上高峰期 CPU 经常会高达 99%左右,产生丢包影响;

    • 监控:监控覆盖率低,故障无法跟踪定位。比如机房内、机房间、公网的质量情况;

    • 运营商:运营商复杂,公网质量无法保障。比如公网链路丢包;


        数据中心演进的 4 个时代


    一、练级阶段(2010-2013)


    1、 2010 - 2011:架构:外网 1.5 个机柜;业务:魅族官网、社区;人力:开发兼运维;


    2、2011 - 2012:架构:5 个机柜,二层级联、机架式单系统服务器;业务:魅族官网、社区、商城、Flyme 官网;人力:成立业务运维、DBA 运维;


    3、2012 - 2013

    架构:二层 STP 网络架构、IBM 刀箱 + EMC 存储 + VMWARE 虚拟化

    业务:魅族官网、社区、商城、Flyme 官网、云服务

    人力:业务运维、DBA 运维


    二、英勇黄铜(2013 年):网络架构 V1.0


    “英勇黄铜,金字塔的塔基,就是那种挖坑的存在。如果你掉进去了,想爬上来没有一定的实力真心不容易啊!”



    伴随着魅族官网、社区、商城、Flyme 官网、云服务的发展,业务驱动诞生了魅族网络架构 V1.0 版本,主要特点:


    网络架构:传统二层 STP 网络架构,链路资源利用率低、可靠性性低、维护成本大;

    硬件设备:性能和稳定性不足,核心设备经常会出现 CPU 负载过高导致重启。


    典型机房代表:广州亚太 IDC ,已于 2015 年 12 月完成了裁撤。


    三、不屈白银(2014 年):网络架构 V2.0


    “不屈白银,大多数玩家都处在这个位置当中。”

            

    伴随着应用中心、游戏中心、O2O、大数据、flyme 云服务、魅族云等发展,传统的网络架构已经无法支撑满足,业务驱动诞生了魅族网络架构 V2.0 版本。


    主要特点:


    1、网络架构:1)引入 10G 万兆大流量区;2)大二层虚拟化网络架构;3)内、外、管理流量混合;


    2、硬件设备:引入数据中心级高密交换机,稳定支撑承载互联网业务。典型机房代表:华南 IDC、华东 IDC。


    四、荣耀黄金(2015 年):网络架构 V3.0


    “联盟里的中端玩家。”

        

    伴随着互联网业务的爆发性发展,传统的“人肉运维模式”已经无法支撑千万级用户,于是标准化驱动诞生了魅族网络架构 V3.0 版本.


    什么叫标准化?举个简单例子:商鞅变法前,秦国各地度量衡不统一。为了保证国家的赋税收入,商鞅制造了标准的度量衡器,意义:全国上下有了标准的度量准则,为人们从事经济文化交流活动提供了便利的条件。


    我们是怎么做的呢?我们通过架构设计、网络设备选型、IP规划、网络连接规划、网络配置脚本等制订一套标准规范。


    3.0 版本网络架构除标准化外,其它主要特点:


    1)三网分离:

    a) 结构逻辑清晰;

    b) 安全分级:内外网物理隔离,提高内网的安全级别,降低安全风险;

    c) 提高网络可用性、吞吐能力;

    d) 管理网带外管理,提高运维排错能力。


    2)流量可视化:

    a) 外网流量特性固定,基本是直上直下的南北流量;

    b) 内网流量复杂,属于东西南北穿透。

    内外网流量分开便于网络流量管控可视化。


    3)单组 TOR 升级:一组 TOR 容量提升 50% 以上。原来 V2.0 一组接入层交换机仅能覆盖 2 个机架(24 台服务器),而 V3.0 版本一组接入层交换机可以覆盖 3 个机架(36 台服务器起)


    4)逻辑分区:普通区、LVS 区、大流量区、安全管控区。


    5)安全方面:

    a) DDOS 流量清洗购买了 BAT 的云盾(腾讯叫宙斯盾)服务;

    b) 自研 WAF 平台;

    c) 出口 ACL 白名单


    V3.0 网络架构版本另外一个突出特点是 LVS 引入了 FULLNAT 模式,逐步淘汰 DR 模式,从而提高了数据中心的扩展性、健壮性。


    五、华贵铂金(2016 年后):网络架构 V4.0


    测试及进行中,请留意进展。


    六、IDC 网络架构介绍


    前面所提到的都是单个 IDC 的网络架构,大家都还记得 2013 年 7 月及 2015 年 5 月一些同行的光纤被挖断故障?单机房会存在扩展难、无法容灾、无就近接入等问题。针对单机房问题,我们的应对措施:


    1. 制定运营商、代理商服务 SLA 协议标准,比如 99.9%;

    2. 多线 IDC + 分布式数据中心部署,提高业务部署冗余性,提高业务部署冗余性。


    接下来将分享我们的 IDC 网络架构:


    先简单概述我们多机房业务的部署,目前我们通过 GSLB 已经实现了用户就近接入,提高了用户体验,即华东片区用户访问华东 IDC,华南片区用户访问华南 IDC。 关于异地多活的方案,我们正在演练阶段,计划今年将会实现。


        

    下面看 IDC 基础网络架构,IDC 由专线平面 A 、VPN 平面 B 双平面组成 ,其中专线平面为主,VPN 平面为备,当专线平面瘫痪后,流量会自动切换到 VPN 平面上。



    我们先来看看 VPN 平面,节点之间是建立电信、联通链路两条 VPN,路由协议跑的是 IPSEC + EBGP,BGP 具有灵活、稳定的特点,设备选型是 FT 的 1000D,VPN 吞吐量高达 30Gbps 以上,可用性相比 2015 年之前,有了一定的提升。

                    

    备注:

    99.9%(月中断时长:43.2 分钟)

    99.92%(月中断时长:34.56 分钟)

    99.95%(月中断时长:21.6 分钟)

    我们做过相关的测试:当电信线路发生中断故障,中断 10 - 12S 路由切换到联通链路。


    由于运营商网络错综复杂万变,运营商经常凌晨会进行割接或者链路经常出现堵塞,造成广东片区访问北京、华东片区网络丢包等现象,随着互联网业务日益壮大,对网络质量要求越来越高,于是我们在今年 1 月份搭建了专线平面,把可用性提高到至 99.92% - 99.95%,华南、华东、华北互联,构成一个“三角形”环状,当其中一条链路出现故障,流量可以自动切换到第二条链路上。举两个例子:


    a)专线平面(A):环保护


    比如:华南 ⇒ 华东,当主链路 a 发生异常故障中断,秒级切换至 b,即华南 ⇒ 华北 ⇒ 华东


    b)VPN 平面(B):公网冗余保护


    比如:华南 ⇒ 华东,当专线同时发生异常故障中断,秒级切换至 B 平面,即华南 ⇒ 华东走 A 链路


        

    七、办公网与 IDC 解耦


    数据中心的大概分享到这里,接下来将简单介绍一下办公网以及跟数据中心的互联互访。


    曾经踩过的坑:2015 年 7 月珠海总部办公大楼掉电,影响中断华南 IDC—华东 IDC 机房间网络的通讯。


    办公网与 IDC 解耦,IDC ⇒ FW ⇒ OA:通过 OA 边界墙实现办公网与 IDC 的隔离,默认只放通运维相关的端口,策略申请需要安全部门评估审批。


    网络监控的 4 大优化


    面对千万级用户的异地多点网络架构,魅族的网络监控是怎么支撑的呢?


    监控痛点


    我们监控曾经遇到痛点:


    1. 监控系统可读性差;

    2. 监控项告警重叠;

    3. 告警无法定位问题;

    4. 业务产品带宽使用。


    监控架构总体视图


    先来看看监控总体视图:

        

    监控对象分三块:


    1、设备监控:设备可用性、状态监控、性能监控

    2、链路监控:公网质量、专线质量、VPN质量、流量情况

    3、架构监控:路由邻居变化、路由下一跳变化


    监控工具主要是:Zabbix、Cacti、NetFlow、SmokePing、基调、博睿


    一、监控模板标准化的优化


    优化前:


    监控配置人手一个标准,名称、参数,等一切变量都存在随心而定的情况,导致监控系统的可读性以及准确性存在严重的问题。

        

          监控模块标准化(前)


    优化后:


    对设备的监控配置进行了标准化,比如:什么类型的设备用什么样的监控模板,模板需要包含什么内容,甚至是模板的命名也进行了标准化


                 监控模块标准化(后)



    二、告警收敛的优化


    优化前:



    每日会收到超过 100 条的短信和邮件的告警,很多是一些没有实际意义的告警,严重的干扰了正常的工作,经过对告警信息的分析,主要存在几个问题:

    1、告警的准确性;

    2、重复告警;

    3、通知类告警太多。


    优化后:



    对告警阀值进行研究,细化,提高告警的准确性,并形成一套告警体系,对重复事件进行关联,通知类事件每天只进行一次邮件通知,极大的优化了监控告警,实现了当收到短信告警时,肯定是发生异常了。


    三、公网/专线线路质量监控优化


            公网线路质量监控


        

    优化前:


    我们 IDC 经过二级运营商接入至一级运营商的网络,专线网络也是同样的情况,当发生故障时,我们只知道整条访问路径有问题,但不知道故障具体发生在哪个节点


    优化后:


    为了解决这个问题,我们把接入运营商网络时经过的所有关键节点(二级运营商机房的边界、一级运营商网络边界)均纳入到我们的监控系统中,在我们的监控系统中可以非常直观的看到某个运营商整条访问路径的链路质量。


    对于专线网络也是同样的做法,我们联合线路供应商,在线路的关键节点上配置了监控地址,整体链路的质量情况也尽在掌握当中。


                专线线路质量监控

        


    四、带宽可视化的优化

        
    网络架构演进及实践17.jpg



    为什么要做这事?主要是基于成本方面考虑,另外对业务的带宽使用情况进行可视化,推动业务优化架构等。


    宽容量分配体系可视化,产出带宽产品维度的营收报表,实现按需分配带宽和专线资源,并量化监控。


    数据中心的未来


    上面提到了网络架构的四个时代,魅族数据中心未来应该如何设计?目前来看有以下几个挑战。


    一、多机房 IDC 布署规划


    1、国内:分布式


    现阶段国内我们在华南、华东、华北均已部署了我们自已的数据中心,从第三方网络质量监测报告显示:覆盖西南、西北片区的用户网络质量较差,延时高达 50-60ms 之间。基于用户访问体验的考虑,将全国用户的响应时间控制在 30ms 以下,是我们优化的目标之一,所以下一阶段我们将会结合业务覆盖用户情况考虑在西南、西北片区部署数据中心节点。


    另外一个驱动力是基于业务高可用,下一阶段我们会考虑核心机房同城双活。


    2、海外:全球化


    国内手机市场利润率逐年降低,国产手机强大后走出国门是必然趋势。业务发展驱动数据中心延伸至海外布局,目前我们海外已完成香港机房布署,下一阶段将会匹配海外业务市场发展情况,进行全球发展部署。


    二、SDN + 魅族云


    什么叫 SDN?软件定义网络,给我们会带来什么收益?


    1、IDC 流量智能调度


    现阶段我们 IDC 网络遇到如下挑战:


    1)数据中心间网络链路带宽资源有限,难以满足业务临时性的大容量传输需求,对重点业务流量的 QOS 保障需要较长的时间扩容满足,业务部分经常抱怨基础运维侧行动缓慢、缺乏灵活性、响应速度慢。


    2)IDC 冗余链路利用率低。


    为了更好地满足业务的带宽需求,提升专线利用率及降低运营复杂度,我们下一阶段将会逐步实践 IDC SDN 解决方案


    2、云计算网络:


    1)租户隔离;

    2)网络配置自动下发;

    3)云业务的快速更变;


    最后,简单介绍一下我们团队:5 人,主要负责魅族移动互联网数据中心基础网络架构规划、建设、优化、运营等。

    展开全文
  • TiDB 是个开源的 MySQL 兼容的 NewSQL 混合事务/分析处理( HTAP)数据库,本文深入探讨TiDB如何在大量的数据上保持毫秒的查询响应时间,以及 如何为知乎提供支持获得对数据的实时洞察。 墨天轮平台(modb....

    TiDB 是一个开源的 MySQL 兼容的 NewSQL 混合事务/分析处理( HTAP)数据库,本文深入探讨TiDB如何在大量的数据上保持毫秒级的查询响应时间,以及 如何为知乎提供支持获得对数据的实时洞察。

     

    墨天轮平台(modb.pro)开设了TiDB数据库专栏,欢迎大家订阅:

    https://www.modb.pro/db?dbType=7(复制到网站中打开或者点击“阅读原文”)即可查看。


    知乎,在古典中文中意为“你知道吗?”,它是中国的 Quora,一个问答网站,其中各种问题由用户社区创建,回答,编辑和组织。
     

    作为中国最大的知识共享平台,我们目前拥有 2.2 亿注册用户,3000 万个问题,网站答案超过 1.3 亿。

     

    随着用户群的增长,我们的应用程序的数据大小无法实现。我们的 Moneta 应用程序中存储了大约 1.3 万亿行数据(存储用户已经阅读过的帖子)。

     

    由于每月累计产生大约 1000 亿行数据且不断增长,这一数字将在两年内达到 3 万亿。在保持良好用户体验的同时,我们在扩展后端方面面临严峻挑战。

     

    在这篇文章中,我将深入探讨如何在如此大量的数据上保持毫秒级的查询响应时间,以及 TiDB 是一个开源的 MySQL 兼容的 NewSQL 混合事务/分析处理( HTAP)数据库,如何为我们提供支持获得对我们数据的实时洞察。

     

    此文将介绍为什么我们选择 TiDB,我们如何使用它,我们学到了什么,优秀实践以及对未来的一些想法。 

     

    我们的痛点

     

    本节介绍了我们的 Moneta 应用程序的体系结构,我们尝试构建的理想体系结构,以及数据库可伸缩性作为我们的主要难点。

     

    系统架构要求

     

    知乎的 Post Feed 服务是一个关键系统,用户可以通过该系统接收网站上发布的内容。

     

    后端的 Moneta 应用程序存储用户已阅读的帖子,并在知乎的推荐页面的帖子流中过滤掉这些帖子。

     

    Moneta 应用程序具有以下特征:

    • 需要高可用性数据:Post Feed 是第一个出现的屏幕,它在推动用户流量到知乎方面发挥着重要作用。

    • 处理巨大的写入数据:例如,在高峰时间每秒写入超过 4 万条记录,记录数量每天增加近 30 亿条记录。

    • 长期存储历史数据:目前,系统中存储了大约 1.3 万亿条记录。随着每月累积约 1000 亿条记录并且不断增长,历史数据将在大约两年内达到 3 万亿条记录。

    • 处理高吞吐量查询:在高峰时间,系统处理平均每秒在 1200 万个帖子上执行的查询。

    • 将查询的响应时间限制为 90 毫秒或更短:即使对于执行时间最长的长尾查询,也会发生这种情况。

    • 容忍误报:这意味着系统可以为用户调出许多有趣的帖子,即使有些帖子被错误地过滤掉了。

     

    考虑到上述事实,我们需要一个具有以下功能的应用程序架构:

    • 高可用性:当用户打开知乎的推荐页面时,找到大量已经阅读过的帖子是一种糟糕的用户体验。

    • 出色的系统性能:我们的应用具有高吞吐量和严格的响应时间要求。

    • 易于扩展:随着业务的发展和应用程序的发展,我们希望我们的系统可以轻松扩展。

     

    勘探

     

    为了构建具有上述功能的理想架构,我们在之前的架构中集成了三个关键组件:

    • 代理:这会将用户的请求转发给可用节点,并确保系统的高可用性。

    • 缓存:这暂时处理内存中的请求,因此我们并不总是需要处理数据库中的请求。这可以提高系统性能。

    • 存储:在使用 TiDB 之前,我们在独立的 MySQL 上管理我们的业务数据。随着数据量的激增,独立的 MySQL 系统还不够。

      然后我们采用了 MySQL 分片和 Master High Availability Manager( MHA)的解决方案,但是当每月有 1000 亿条新记录涌入我们的数据库时,这个解决方案是不可取的。

     

    MySQL Sharding 和 MHA 的缺点

     

    MySQL 分片和 MHA 不是一个好的解决方案,因为 MySQL 分片和 MHA 都有它们的缺点。

     

    MySQL 分片的缺点:

    • 应用程序代码变得复杂且难以维护。

    • 更改现有的分片键很麻烦。

    • 升级应用程序逻辑会影响应用程序的可用性。

     

    MHA 的缺点:

    • 我们需要通过编写脚本或使用第三方工具来实现虚拟 IP(VIP)配置。

    • MHA 仅监视主数据库。

    • 要配置 MHA,我们需要配置无密码安全 Shell( SSH)。这可能会导致潜在的安全风险。

    • MHA 不为从属服务器提供读取负载平衡功能。

    • MHA 只能监视主服务器(而不是从主服务器)是否可用。

     

    在我们发现 TiDB 并将数据从 MySQL 迁移到 TiDB 之前,数据库可伸缩性仍然是整个系统的弱点。

     

    什么是 TiDB?

     

    TiDB 平台是一组组件,当它们一起使用时,它们将成为具有 HTAP 功能的 NewSQL 数据库。

    640?wx_fmt=png

    TiDB 平台架构

     

    在 TiDB 平台内部,主要组件如下:

    • TiDB 服务器是一个无状态的 SQL 层,它处理用户的 SQL 查询,访问存储层中的数据,并将相应的结果返回给应用程序。它与 MySQL 兼容并且位于 TiKV 之上。

    • TiKV 服务器是数据持久存在的分布式事务键值存储层。它使用 Raft 共识协议进行复制,以确保强大的数据一致性和高可用性。

    • TiSpark 集群也位于 TiKV 之上。它是一个 Apache Spark 插件,可与 TiDB 平台配合使用,支持商业智能(BI)分析师和数据科学家的复杂在线分析处理(OLAP)查询。

    • 放置驱动程序(PD)服务器是由 etcd 支持的元数据集群,用于管理和调度 TiKV。

     

    除了这些主要组件之外,TiDB 还拥有一个工具生态系统,例如用于快速部署的  Ansible 脚本,用于从 MySQL 迁移的 Syncer 和 TiDB 数据迁移。

     

    以及用于收集对 TiDB 群集进行的逻辑更改并提供增量备份的 TiDB Binlog。复制到下游(TiDB,Kafka 或 MySQL)。

     

    TiDB 的主要功能包括:

    • 水平可扩展性。

    • MySQL 兼容的语法。

    • 具有强一致性的分布式事务。

    • 云原生架构。

    • 使用 HTAP 进行最小提取,转换,加载( ETL)。

    • 容错和 Raft 恢复。

    • 在线架构更改。

     

    我们如何使用 TiDB

     

    在本节中,我将向您展示如何在 Moneta 的架构中运行 TiDB 以及 Moneta 应用程序的性能指标。

     

    我们架构中的 TiDB

     

    640?wx_fmt=png

    知乎的 Moneta 应用程序中的 TiDB 架构

     

    我们在系统中部署了 TiDB,Moneta 应用程序的整体架构变为:

    • 顶层:无状态和可伸缩的客户端 API 和代理。这些组件易于扩展。

    • 中间层:软状态组件和分层 Redis 缓存作为主要部分。当服务中断时,这些组件可以通过恢复保存在 TiDB 群集中的数据来自我恢复服务。

    • 底层:TiDB 集群存储所有有状态数据。它的组件高度可用,如果节点崩溃,它可以自我恢复其服务。

     

    在该系统中,所有组件都是可自我恢复的,整个系统具有全局故障监视机制。然后,我们使用 Kubernetes 来协调整个系统,以确保整个服务的高可用性。

     

    TiDB 的性能指标

     

    由于我们在生产环境中应用了 TiDB,因此我们的系统具有高可用性和易于扩展性,并且系统性能得到显著改善。例如,在 2019 年 6 月为 Moneta 应用程序采用一组性能指标。

     

    在高峰时间每秒写入 40,000 行数据:

    640?wx_fmt=png

    每秒写入的数据行(数千)

     

    在高峰时段每秒检查 30,000 个查询和 1200 万个帖子:

    640?wx_fmt=png

    每秒写入的数据行(数千)

     

    第 99 百分位响应时间约为 25 毫秒,第 999 百分位响应时间约为 50 毫秒。实际上,平均响应时间远远小于这些数字,即使对于需要稳定响应时间的长尾查询也是如此。

    640?wx_fmt=png

    第 99 百分位响应时间

    640?wx_fmt=png

    第 999 百分位响应时间

     

    我们学到了什么

     

    我们迁移到 TiDB 并非顺利,在这里,我们想分享一些经验教训。

     

    更快地导入数据

     

    我们使用 TiDB 数据迁移(DM)来收集 MySQL 增量 Binlog 文件,然后使用 TiDB Lightning 将数据快速导入 TiDB 集群。

     

    令我们惊讶的是,将这 1.1 万亿条记录导入 TiDB 只用了四天时间。如果我们逻辑地将数据写入系统,可能需要一个月或更长时间。如果我们有更多的硬件资源,我们可以更快地导入数据。

     

    减少查询延迟

     

    完成迁移后,我们测试了少量的读取流量。当 Moneta 应用程序首次上线时,我们发现查询延迟不符合我们的要求。为解决延迟问题,我们与 PingCap 工程师合作调整系统性能。

     

    在此过程中,我们积累了宝贵的数据和数据处理知识:

    • 有些查询对查询延迟很敏感,有些则不然。我们部署了一个单独的 TiDB 数据库来处理对延迟敏感的查询。(其他非延迟敏感的查询在不同的 TiDB 数据库中处理。)

      这样,大型查询和对延迟敏感的查询在不同的数据库中处理,前者的执行不会影响后者。

    • 对于没有理想执行计划的查询,我们编写了 SQL 提示来帮助执行引擎选择最佳执行计划。

    • 我们使用低精度时间戳 Oracle( TSO)和预处理语句来减少网络往返。

     

    评估资源

     

    在我们尝试 TiDB 之前,我们没有分析我们需要多少硬件资源来支持 MySQL 端的相同数据量。

     

    为了降低维护成本,我们在单主机 - 单从机拓扑中部署了 MySQL。相反,在 TiDB 中实现的 Raft 协议至少需要三个副本。

     

    因此,我们需要更多的硬件资源来支持 TiDB 中的业务数据,我们需要提前准备机器资源。

     

    一旦我们的数据中心设置正确,我们就可以快速完成对 TiDB 的评估。

     

    对 TiDB 3.0 的期望

     

    在知乎,反垃圾邮件和 Moneta 应用程序的架构相同。我们在用于生产数据的反垃圾邮件应用程序中尝试了 TiDB 3.0(TiDB 3.0.0-rc.1 和 TiDB 3.0.0-rc.2)的候选版本中的 Titan 和 Table Partition。 

     

    ①Titan 缩短了延迟

     

    反垃圾邮件应用程序一直受到严重的查询和写入延迟折磨。

     

    我们听说 TiDB 3.0 将引入 Titan,一种键值存储引擎,用于在使用大值时减少  RocksDB(TiKV 中的底层存储引擎)的写入放大。为了尝试这个功能,我们在 TiDB 3.0.0-rc.2 发布后启用了 Titan。

     

    下图分别显示了与 RocksDB 和 Titan 相比的写入和查询延迟:

    640?wx_fmt=png

    在 RocksDB 和 Titan 中编写和查询延迟

     

    统计数据显示,在我们启用 Titan 后,写入和查询延迟都急剧下降。这真是太惊人了!当我们看到统计数据时,我们无法相信自己的眼睛。

     

    ②表分区改进了查询性能

     

    我们还在反垃圾邮件应用程序中使用了 TiDB 3.0 的表分区功能。使用此功能,我们可以按时将表分成多个分区。

     

    当查询到来时,它将在覆盖目标时间范围的分区上执行。这大大提高了我们的查询性能。

     

    让我们考虑一下如果我们将来在 Moneta 和反垃圾邮件应用程序中实施 TiDB 3.0 会发生什么。

     

    ③Moneta 应用程序中的 TiDB 3.0

     

     

    TiDB 3.0 具有诸如 gRPC 中的批处理消息,多线程 Raftstore,SQL 计划管理和 TiFlash 等功能。我们相信这些将为 Moneta 应用增添光彩。

     

    ④gRPC 和多线程 Raftstore 中的批处理消息

     

    Moneta 的写入吞吐量超过每秒 4 万次交易(TPS),TiDB 3.0 可以批量发送和接收 Raft 消息,并且可以在多个线程中处理 Region Raft 逻辑。我们相信这些功能将显著提高我们系统的并发能力。

     

    ⑤SQL 计划管理

     

    如上所述,我们编写了大量 SQL 提示,以使查询优化器选择最佳执行计划。

     

    TiDB 3.0 添加了一个 SQL 计划管理功能,可以直接在 TiDB 服务器中将查询绑定到特定的执行计划。使用此功能,我们不需要修改查询文本以注入提示。

     

    ⑥TiFlash

     

    在 TiDB DevCon 2019 上,我第一次听说 TiFlash 是 TiDB 的扩展分析引擎。

     

    它使用面向列的存储技术来实现高数据压缩率,并在数据复制中应用扩展的 Raft 一致性算法以确保数据安全性。

     

    由于我们拥有高写入吞吐量的海量数据,因此我们无法每天使用 ETL 将数据复制到 Hadoop 进行分析。但是对于 TiFlash,我们乐观地认为我们可以轻松分析我们庞大的数据量。

     

    ⑦反垃圾邮件应用程序中的 TiDB 3.0

     

    与 Moneta 应用程序的巨大历史数据大小相比,反垃圾邮件应用程序具有更高的写入吞吐量。

     

    但是,它仅查询过去 48 小时内存储的数据。在此应用程序中,数据每天增加 80 亿条记录和 1.5 TB。

     

    由于 TiDB 3.0 可以批量发送和接收 Raft 消息,并且它可以在多个线程中处理 Region Raft 逻辑,因此我们可以用更少的节点管理应用程序。

     

    以前,我们使用了七个物理节点,但现在我们只需要五个。即使我们使用商用硬件,这些功能也可提升性能。

     

    下一步是什么

     

    TiDB 是一个与 MySQL 兼容的数据库,因此我们可以像使用 MySQL 一样使用它。

     

    由于 TiDB 的横向可扩展性,现在我们可以自由扩展我们的数据库,即使我们有超过一万亿的记录来应对。 

     

    到目前为止,我们已经在我们的应用程序中使用了相当多的开源软件。我们还学到了很多关于使用 TiDB 处理系统问题的知识。

     

    我们决定参与开发开源工具,并参与社区的长期发展。基于我们与 PingCAP 的共同努力,TiDB 将变得更加强大。

     

    作者:孙晓光

    简介:知乎搜索后端负责人,目前承担知乎搜索后端架构设计以及工程团队的管理工作。曾多年从事私有云相关产品开发工作,关注云原生技术,TiKV 项目 Committer。

    出处:http://itindex.net/

    展开全文
  • 为什么响应式(自适应)网站是个坑

    万次阅读 热门讨论 2018-02-26 15:57:08
    在2010年5月,Ethan Marcotte提出的响应式网站的概念,通俗的说,就是个网站可以兼容不同的终端,不用为每个分辨率设备做个特定的版本的网站。近年来,各种大屏幕移动设备的普及,响应式网站也受到了更人的...

    什么是自适应网站?其实自适应更专业的说法是响应式网站。在2010年5月,Ethan Marcotte提出的响应式网站的概念,通俗的说,就是一个网站可以兼容不同的终端,不用为每个分辨率设备做一个特定的版本的网站。近年来,各种大屏幕移动设备的普及,响应式网站也受到了更多人的青睐。甚至大多数的人认为,响应式网站是实现友好移动目标,更好、更快、更省的方案。

    但事实又是否这样呢?对热衷响应式或自适应的人,不难想象:网站适应了移动设备的显示,界面也非常美观,你可能觉得一切都很好,网站也实现了友好移动的目标。然而不要开心得太早,数据表明:这种响应式设计,会令你的用户和经济效益流失30-50%。

    想知道真相是什么?因为自适应和响应式根本就是一个坑!响应式网站有几个致命缺点:

    1.响应式设计仅是改善移动体验并没达到最优化。

    不管是自适应设计,还是响应式设计,它们的基本原则是:尽可能不要因为设备不同而导致显示不同的内容(比如在低分辩率的终端上会删减某些内容)。试想,显示在电脑1440x900分辨率屏幕上的内容,要在手机的320x240分辨率屏幕上显示,你会发现,可视区域变小,内容都挤一起,页面拉长,排版顺序错乱,使用困难度增加等等。所以自适应和响应式设计,都是选择性把内容隐藏,以适应小页面,减少上述的问题出现。但这样一来,页面的表现效果就没那么理想了,交互体验也达不到移动端的最优,把控不好网站就会给用户不伦不类的感觉。

    响应式网站 响应式设计 自适应布局

    某响应式网站在移动端上的显示缺陷(右侧为移动版)

    例如上面的响应式网站,右边移动端明显将在左边电脑端有展示的产品都隐藏了,这对从电脑端切换到移动端的用户是很不友好的。而且移动端的交互设计也不是我们熟悉的。还有很明显的一点是,同一个网站风格差异却如此大,感觉就是两个网站。如果是单独设计的移动网站,它就能避免像上面响应式网站那种显示上的突兀,例如下面的一些电脑端和移动端网站的对比:

    响应式网站 响应式设计 自适应布局

    腾讯网的电脑版和移动版对比

    响应式网站 响应式设计 自适应布局 

    天猫商城的电脑版和移动版对比

    响应式网站 响应式设计 自适应布局

    360官网的电脑版和移动版对比

    从上面腾讯、天猫、360等它们的做法看到:个性化的宫格布局,流行的移动端界面,合理地显示网站信息。显然这些才是我们所熟悉的移动端表现,交互上更贴近APP的UI风格,更好的用户体验。为什么他们能把网站在移动端的表现处理得如此好?因为他们都是专门做了一个移动版的网站,并没有采用自适应设计,因此,网站的设计没有受到自适应方案的限制。

    2.响应式设计并不利于百度的关键词优化和排名。

    因为用户在不同终端的搜索习惯不同,所以百度对移动网站和电脑网站的关键词处理策略也不相同。而对于响应式的方案,不同终端访问到的网页代码是一样的,这样就不能在电脑端和移动端设置不同的关键词。这无疑是给百度关键词优化增添了大大的阻碍。

    另外,百度的搜索排名也是有移动端和电脑端之分的。针对这方面,更适合使用独立的移动端网站专门做移动端的百度排名,这样不会影响电脑端的百度排名,两个版本的网站百度优化也可以独立进行。

    所以,如果你的网站需要进行商业推广的话,那还是独立做一个移动版网站更好,而不是使用响应式网站。

    3.响应式网站无法区分移动端,浪费带宽,加载耗时长。

    响应式(自适应)设计的实现方式,往往是缩小或者隐藏电脑版网站的内容,使之适应移动端的窄屏。但隐藏的内容依然会加载,低分辨率设备会加载高质量的图片或者视频,不分屏幕尺寸都提供相同大小的网页。这样的话,响应式网站加载的内容相比非响应式网站会增加20-50%。加载内容多,速度慢,浪费流量。在国内高流量费面前,用户是想都不用想就会放弃使用你的网站的。

    响应式网站相对非响应式网站的加载耗时,一般都会延长1-2秒,在2G、3G网络情况下更严重。而Google统计的数据是加载时间每延长0.4秒就会有0.59%的用户流失,电商类代表亚马逊则表示每延长0.1秒就会有1%的用户流失,资讯门户类的雅虎则是每延长0.4秒就会流失5-9%的用户。所以你的响应式网站每天流失了多少用户,你可以对号入座算一算。

    4.响应式对于ie6,7,8浏览器简直是悲剧。

    响应式或者自适应方案里,运用了很多html5新特性,而这些新特性只有高级的现代浏览器才支持,而在ie6,7,8来说几乎是看不了的,甚至在ie9,10的表现也只是差强人意。从cnzz数据中心统计的国内浏览器使用率来看,ie占比高达36.29%。请问你能承受36.29%的用户流失吗?

    响应式网站 响应式设计 自适应布局

    响应式网站在IE上体验或将失去36.29%的用户

    现在你是否已经察觉,不管是淘宝、天猫、京东、唯品会,还是腾讯、百度、新浪、360为什么都不用响应式了吧?我们丝毫不会怀疑:响应式或自适应仅仅是一个坑。而正确的做法是分开建设电脑端和移动端网站。专门建设一个移动版的网站才是可行的法则,这样才能更灵活,提供更专业、更优的移动体验和个性化、多样化的设计。

    我们可能会疑问为什么市场上响应式网站会那么火?真相是,响应式或自适应设计,仅是是设计师的主观决定,他们认为电脑网站界面不再适用移动网站界面,然后非作出相应的改变不可。甚至存在更可笑的情况,程序员为了卖弄技术而使用响应式,建站公司为了显得更高大上多骗点钱而抛出响应式等等。响应式的运用在很多情况下都是没必要的,也没什么值得大家去追棒。

    所以我们的建议就是:最好为你的电脑网站推出移动版本,将关注重点要放在网站信息展示、网站性能、用户体验、经济效益、用户留存等关键点上。

    这里或许还有一件事,可能你并不知道,响应式之父Ethan Marcotte还说过,“最重要的是,响应式网页设计的初衷不是要取代移动网页”。

    展开全文
  • (2)响应式流——响应式Spring的道法术器

    万次阅读 多人点赞 2018-03-07 09:21:32
    原因在于,若将其用于响应式编程中,是局限性的。比如如下两个需要面对的问题: Web 应用具有I/O密集的特点,I/O阻塞会带来比较大的性能损失或资源浪费,我们需要种异步非阻塞的响应式的库,而Jav...
  • 台风应急响应科普

    千次阅读 2019-08-09 16:13:02
    、台风警报响应等级划分 台风预警信号分为4种: A、台风蓝色预警信号:24小时内可能受热带低压影响,平均风力可达6以上,或阵风7以上;或者已经受热带低压影响,平均风力为6-7,或阵风7-8并可能持续。 B...
  • Window应急响应(四):挖矿病毒

    千次阅读 2018-08-05 15:17:00
    ​ 随着虚拟货币的疯狂炒作,挖矿病毒已经成为不法分子利用最为频繁的攻击方式之。病毒传播者可以利用个人电脑或服务器进行挖矿,具体现象为电脑CPU占用率高,C盘可使用空间骤降,电脑温度升高,风扇噪声增大等...
  • NISP一级参考题

    万次阅读 2020-06-06 17:32:32
    上个月刚考完NISP一级(已过),这里是参考题目,希望对大家帮助 1.与计算机硬件关系最密切的软件是( )。 A、编译程序 B、数据库管理程序 C、游戏程序 D、OS 答案:D \2. 系统的主要功能( )。 A、进程管理、...
  • 网络安全应急响应流程

    千次阅读 2019-12-05 18:28:10
    国家网信办6月27日印发《国家网络安全事件应急预案》(下称《预案》),包括勒索病毒在内的有害程序事件被明确为网络安全事件的种类之,针对事件的监测预警、应急处置、调查评估均设置了具体机制。 网络安全应急...
  • 如何提高AJAX客户端响应速度

    千次阅读 2016-10-10 00:47:48
    如何提高AJAX客户端响应速度原文转载自:http://dorado.group.iteye.com/group/topic/7229在原文基础上,本人(以下出现的笔者,均为原作者)做了一些内容修改和格式调整。AJAX的出现极大地改变了Web应用客户端的操作...
  • 正如a complete guide to grid的作者所说,在实际工作中运用grid布局只是个时间问题,而现在正是学习它的好时机。安卓和ios,desktop上ie11+都已支持grid布局。更细节可在caniuse查到。 网格布局的基础知识在...
  • MySQL的响应时间变慢

    千次阅读 2015-10-16 19:24:22
    关于查询缓存 默认关闭状态 query_cache_size太大,锁争用问题导致查询变慢(毫秒) 注意: 如果将query_cache_size的大小设置为0,也不会用到查询缓存. ...因为查询缓存有一个全局锁,它会阻塞所有查询缓存的查询.
  • ajax请求服务器的响应状态解析

    千次阅读 2013-12-18 09:45:01
    对于很 Web 开发人员来说,只需要生成简单的请求并接收简单的响应即可;但是对于希望掌握 Ajax 的开发人员来说,必须要全面理解 HTTP 状态代码、就绪状态和 XMLHttpRequest 对象。在本文中,Brett McLaughlin 将向...
  • 网络安全应急响应及其发展方向

    千次阅读 2007-03-11 17:07:00
    计算机信息系统和网络...自从CERT/CC成立以来,世界各地成立了各种类型的应急响应组,在我国应急响应也得到了各界的广泛关注。然而究竟什么是应急响应?它涉及到那些关键技术? 本文首先从三个方面讨论了应急响应
  • 引言今天我在参加csdn的英雄大会,上午听完了ibm位老大的讲话后睡了小觉,中午出来吃饭下电梯的时候遇到了熊节,打了招呼,他突然转过头来对我说,今天人骂我了,他帮我做了个回复。这弄得我一头雾水,骂我了...
  • 同域名下的项目谨防sessionid互相影响,造成严重后果,保持咱程序猿的优良传统,独立的命名空间,严格的洁癖症,处事不惊的顽强能力。转入正题 已我开发cctv项目为例,当然cctv愿意找我,我是很乐意效劳的,哈哈!...
  • NISP一级知识点学习笔记总结

    千次阅读 多人点赞 2019-04-24 01:04:33
    NISP一级学习总结 **第一章 信息与信息安全** 什么是信息:香农认为信息是是用来消除随机不确定的东西,事物运动状态,不确定性。 信息也是具体的,可被人,机器生物感知,识别,提取,储存,转换等。 信息...
  • 引言前天看到了张恂先生的回复,本来当天就想回复,可是下午忙,就忙过了时间,昨天有时天,今天才空儿,想起这是必须回复的,所以,赶快写下来,免得再拖延。文章来源报告原始文章中国软件开发工具应用状况...
  • 【Java面试】:第章:P6面试

    万次阅读 多人点赞 2021-03-23 18:50:51
    红黑树和二叉平衡树的区别,红黑树和B树,B+树的区别,Mysql二大引擎索引底层实现,HashMap在线程环境中为何出错?ConcurrentHashMap底层实现,CAS,原子引用,ABA问题,volatile,如何解决HashMap出现的OOM问题?...
  • JSP学习笔记——HTTP请求和响应

    千次阅读 2014-12-31 10:37:50
    个应用程序的基于TCP / IP协议,分布式,协作,超媒体信息系统(互联网)。http两个特点,无状态和短连接,短连接是指Web浏览器和Web服务器之间不需要建立持久的连接,这意味着当个客户端向服务器端发出
  • ​​​​​​​NISP一级考试题库

    万次阅读 多人点赞 2019-09-02 09:26:59
    NISP一级考试题库,本人以过考试,因为资料是图片转过来得,所有得地方乱码,不喜勿喷,仅送给需要得人。 与计算机硬件关系最密切的软件是()。 A、编译程序 B、数据库管理程序 C、游戏程序 D、OS ...
  • 大型企业的业务模式,涉及的产品也,特别是互联网业务讲究“小步快跑敏捷迭代”,往往忽视了安全检查或者来不及进行细致的安全检查,同时安全系统本身是程序也会存在各种遗漏,因为互联网业务的在线特性,使得...
  • Office2010 office2013 word2010 word2013 卡顿 无响应 反应慢的解决 办法 方法: 手动删除 Normal.dot(或 Normal.dotm)。 可点击开始-->运行-->输入“%userprofile%\Application Data\Microsoft\Templates”...
  • 关于HDD坏道(超时、无响应)和坏道附近低速磁道的修复方法 仅供参考(纯折腾),非常耗时,容量越大坏道越越耗时。并不能挽救物理损坏的硬盘。 数据恢复请使用数据恢复软件或找专业数据恢复公司。 尝试修复前...
  • 缺陷严重程度定级标准

    千次阅读 2010-11-19 17:43:33
    在测试项目实践中经过总结,制定了份供测试人员提交BUG时给BUG的严重程度定级的参考标准。 这里首先强调缺陷的严重程度与优先级的区别。严重程度是测试人员提交BUG时给BUG定性,以便给开发组个参考。而优先级...
  • NodeJS基础 ...每种解析器都是个运行环境,不但允许JS定义各种数据结构,进行各种计算,还允许JS使用运行环境提供的内置对象和方法做一些事情。例如运行在浏览器中的JS的用途是操作DOM,浏览器就提供了do
  • 线程,到底该设置多少个线程?

    千次阅读 2019-06-02 13:26:30
    作者:享学课堂老顾 微信公众号: 享学课堂online 、前言 “不好了,线上服务器超时严重,请求非常...严重误区,以为线程池设置太小了,调大点请求就会快了。 今天就带着小伙伴们沟通一下,线程池的大小应该...
  • 虽然这场被安排在了下午5点以后,但现场的观众们仍然很热情,同时很场外的观众们也大呼可惜,感叹自己没能请假来跟台上的讲师交流一番。 《购物狂欢节的运维故事》,站在台上的讲述者是刘勇,花名仲明,阿里...
  • 最近刚看完了《Objective-C高级编程 iOS与OS X线程和内存管理》这本书后,对线程了更为深入的理解,故在此做个总结与记录。这本书我已经上传至网盘 https://pan.baidu.com/s/1c2fX3EC ,这本书是iOS开发者...
  • android高级面试题(二)

    千次阅读 2019-05-06 14:53:43
    Android高级面试题 (⭐⭐⭐) 、性能优化 1、做过哪些性能优化?是怎么评测和具体优化的?...内存抖动是由于短时间内大量对象进出新生区导致的,它伴随着频繁的GC,gc会大量占用ui线程和cpu资...

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 79,949
精华内容 31,979
关键字:

一级响应有多严重