百度贴吧10亿量级LAMP架构分享

导读:天下武功,唯快不破。对日益激烈的互联网竞争你所拥有的利器就是快!本文来自百度贴吧的LAMP解决方案介绍,摘录至此旨在研究分享,看看其是如何全面支持快速迭代的。

文章内容如下:

贴吧是功能性产品,唯快不破是永恒的准则,这一特点决定了快速迭代是需要解决的关键性问题。快速迭代,分解开来有如下部分:开发阶段,快速开发;测试阶段,包含了环境快速搭建、自动化测试工具;运维阶段,包含了集群管理技术、自动化运维工具;同时,这三方面的工作需要一个整体性的解决方案衔接起来。

早期的贴吧,作为一个高性能社区,功能相对单一,全部采用C语言开发,系统可重用程度低,开发、测试效率低,运维方面的积累也很少。为了提高效率,开始尝试LAMP架构,经过几年的发展,贴吧已全部迁移到了LAMP。随着产品规模急剧膨胀,30+子系统,150+模块,500+机器,10亿+流量,在LAMP架构方面积累了很多经验,逐渐形成了快速迭代的一体化方案。如下图所示:

该解决方案由开发阶段、测试阶段、运维阶段组成。开发阶段又分成接入层、业务逻辑层、存储层。该解决方案支撑大规模的线上应用,同时保持了快速迭代的特性。基于该解决方案,开发人员能专注于业务逻辑开发,测试人员能专注于持续集成,运维成本能大大降低。

开发

开发方面分为接入层、业务逻辑层、存储层。

接入层处于浏览器和后端服务之间,用来解析http协议并组织成相应的协议格式,完成客户端和服务器之间的通信,还包括攻击防范、页面缓存、负载均衡等多种功能。Web server是其核心组成部分。接入层的目标是通过统一的方案提供简单可依赖的接入层架构,经过全面调研nginx具有通用性强、效率高、功能全面、配置灵活等特点,是webserver未来发展的主力军,确定采用nginx统一接入层。

业务逻辑层包含了PHP框架、业务逻辑、LIB库、交互层。业务逻辑层常常包含一些开发规范,这些规范就像法律一样,我们不仅要有法可依,还要有法必依。在我们的解决方案中,PHP框架=规范+库,规范比如目录部署规范、URL规范、配置规范等,这些规范通过相应的库实现,以达到有法必依的目的。 LIB库封装常用的功能。基于这个解决方案,开发者开发应用,只需完成业务逻辑部分。

中间层,如下图所示,包含在业务逻辑层中,对于业务逻辑层的快速迭代非常重要。中间层对下做交互抽象,支持各种协议屏蔽协议细节;通过资源定位屏蔽部署细节;通过负载均衡提高系统稳定性。中间层对上做接口抽象,支持服务整合、接口适配、公共逻辑。中间层首先建立系统–子系统–模块的体系,进行服务整合,图中的API-LIB就是根据子系统划分,将各模块的接口(MIDL: Module IDL)转化为子系统接口(SIDL: Service IDL);接口适配,SERVICE的接口通过SIDL描述,让接口描述、接口文档、线上代码等自动同步,可维护性大大提高,同时通过元数据规范保证全系统的接口一致,易用性大大提高;收敛公共逻辑,对于公共逻辑,比如权限逻辑,收敛起来可维护性大大提高。

存储层,提供各种通用服务、组件。其中的通用数据存储框架提供通用的数据存储和访问解决方案,以一种统一的设计模式来支持大多数数据存储模块的设计和实现;统一数据访问接口,对外部屏蔽数据拆分和存储的细节;做到数据存储的良好扩展性,通过通用的数据拆分模式来应对数据增长;将具有共性的需求抽象成通用服务或通用库,以简化设计和开发。

基于该解决方案,开发一个应用只需要:在接入层配置相应的分流,在业务逻辑层开发业务逻辑,使用存储层合适的服务或基于框架完成数据模块开发。能大大的提高开发效率,支持快速迭代。

测试

测试方面,为了支持快速迭代,必须提高自动化程度。而影响自动化的首要因素就是环境自动构建,常见的问题有:环境复杂,比如关联关系复杂;环境搭建代价过大;环境功能不完整等。采用基准环境能解决这一问题,项目上线后自动从scmpf更新到基准环境;测试环境/开发环境从基准环境同步。基于基准环境,系统级别的持续集成也成为可能,同时可以集中大量测试工具。

运维

运维方面面临着很多问题:服务迁移成本高,环境不一致带来各种回滚,机器利用率不均衡,运维自动化程度低。为了解决这些问题,提出PHP系统运维方案。环境同步方面,主要是代码同步的问题,采用运维规范+监控的方案;性能监控方面,基于交互层完成请求状态、交互性能监控,基于调度中心获取机器状态;机器调度方面,通过调度中心完成动态/半自动机器调度。如下图所示:

展望

通过该LAMP解决方案,在开发、测试、运维方面都能极大的提高效率。未来在LAMP架构方面,需要更多的在规范化、平台化上下功夫。规范之后才能开展这种自动化的工作提高效率;平台化可以把各种规范固化下来,提供自动化的支持。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/452031.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

python基础-PyYaml操作yaml文件

yaml语法 格式 它的基本语法规则如下 大小写敏感 使用缩进表示层级关系 缩进时不允许使用Tab键,只允许使用空格。 缩进的空格数目不重要,只要相同层级的元素左侧对齐即可 YAML 支持的数据结构有三种 1、对象:键值对的集合,又称为映…

N1CTF 塞题vote分析

N1CTF 塞题vote分析:这个题是一个uaf的漏洞题,我们先看看漏洞(如下图),这两部分是很明显的对比的啊。当单独的一个count数组的数据和堆里的数据相同时候,就会释放堆,堆释放后的count还会有指针指…

String.valueOf()方法与toString()方法的区别

前些天发现了一个巨牛的人工智能学习网站,通俗易懂,风趣幽默,忍不住分享一下给大家。点击跳转到教程。 1. 两者都是把ObJect对象转化为String 类型。 2.string.valueof()方法有作非空判断,在内部也是调用的toString()方法&#…

网络爬虫--11.XPath和lxml

文章目录一. XML1. XML 和 HTML 的区别2. XML文档示例3. HTML DOM 模型示例4. XML的节点关系二. 什么是XPath?1. 选取节点2. 谓语(Predicates)3. 选取未知节点4. 选取若干路径5. XPath的运算符三. lxml库1. 初步使用2. 文件读取四. XPath实例…

实体与属性间的划分原则

为了简化E-R图的处置,现实世界的事物能作为属性对待的,尽量作为属性对待。 两条准则: (1)作为属性,不能再具有需要描述的性质。属性必须是不可分的数据项,不能包含其他属性。 (2&…

编程开发之--java多线程学习总结(5)

4、对继承自Runnable的线程进行锁机制的使用 package com.lfy.ThreadsSynchronize;import java.util.concurrent.locks.Lock; import java.util.concurrent.locks.ReentrantLock;public class TicketSellSolution4 implements Runnable {private static int num 50;//创建一个…

软件测试不是一个功能

今天在工作中我对一个同事说,PyDev 2.5.0现在对TDD(测试驱动开发)提供了很酷的支持了。我并不是一个对TDD很痴迷的倡导者,对其它事物也一样,但仍不免激起了一场讨论。这个家伙,让我们暂叫他约翰&#xff0c…

Linux 操作系统基础知识

1.操作系统总体介绍 •CPU: 就像人的大脑,主要负责相关事情的判断以及实际处理的机制。查询指令: cat /proc/cpuinfo•内存: 大脑中的记忆区块,将皮肤、眼睛等所收集到的信息记录起来的地方,以供CPU进行判断…

Transaction 那点事儿,Spring事务管理

前些天发现了一个巨牛的人工智能学习网站,通俗易懂,风趣幽默,忍不住分享一下给大家。点击跳转到教程。 Transaction 也就是所谓的事务了,通俗理解就是一件事情。从小,父母就教育我们,做事情要有始有终&…

网络爬虫--12.【XPath实战】获取百度贴吧中的图片

用XPath来做一个简单的爬虫,我们尝试爬取某个贴吧里的所有帖子,并且将该这个帖子里每个楼层发布的图片下载到本地。 #codingutf-8 import requests from lxml import etree import jsonclass Tieba:def __init__(self,tieba_name):self.tieba_name tie…

合并分ER图产生的冲突

合并分E-R图 各个局部应用所面向的问题不同,各个子系统的E-R图之间必定会存在许多不一致的地方,称之为冲突。 子系统E-R图之间的冲突主要有三类: ①属性冲突 ②命名冲突 ③结构冲突①属性冲突 属性域冲突,即属性值的类型、取值范围…

8.类定义、属性、初始化和析构

类定义 类 是一个独立存放变量(属性/方法)的空间 封装: 类可以把各种对象组织在一起,作为类的属性,通过 . (点)运算符来调用类中封装好的对象 属性: 变量在类中称为属性,但是类中的属性不仅仅只包含变量&#x…

GPL以及Copyleft协议使用率下降明显

根据最新的协议数据分析,不光是GPL,另外一些copyleft(AGPL,LGPL 等等)协议的使用率在不断下降,并且下降的速度越来越快。 这结果是在意料之中的,因为GPL非常的复杂。越来越多的个人和企业将选择…

概念模型和关系模型

ER模型(逻辑模型) ER模型的基本元素是:实体、联系和属性 实体:是一个数据对象,指应用中可以区别的客观存在的事物。(ER模型中的实体往往是指实体集) 实体集:指同一类实体构成的集合…

iOS AutoLayout使用技巧

关于ContentCompressionResistance, ContentHugging运用 如下图效果图,两个Label并列在同一排上,左边label自适应,右边label(红色)要使得内容全部展示,如果左边label内容很少,那么右…

网络爬虫--13.数据提取之JSON与JsonPATH

文章目录一. 前言二. JSON三. json.loads()四. json.dumps()五. json.dump()六. json.load()七. JsonPath八. JsonPath与XPath语法对比九. 案例分析一. 前言 JSON(JavaScript Object Notation) 是一种轻量级的数据交换格式,它使得人们很容易的进行阅读和编写。同时…

vs2017生成sqlserver 2017项目出现.Net SqlClient Data Provider: Msg 10343

一、使用vs2017生成sqlserver 2017项目时由于添加的程序集(CLR集成,可以参考后面给出的链接进行理解) ,由于安全权限的配置不正确引发以下的问题: SQL72014: .Net SqlClient Data Provider: Msg 10343, Level 14, State 1, Line 1 针对带有 SAFE 或 EXT…

数据库系统常用的存取方法

1. B树索引存取方法 2. Hash索引存取方法 3. 聚簇存取方法

创建型模式二:工厂方法模式

1. 工厂模式介绍 工厂模式(Factory Pattern)的意义就跟它的名字一样,在面向对象程序设计中,工厂通常是一个用来创建其他对象的对象。工厂模式根据不同的参数来实现不同的分配方案和创建对象。 在工厂模式中,我们在创建…

spring 的4种事务管理(1种编程式+3种声明式)

见:http://blog.csdn.net/sinat_25926481/article/details/48208619 Spring的4种事务管理(1种编程式事务三种声明事务) 一、Spring事务的介绍 二、编程式事务xml的配置 注入后直接在service层调用模板的方法使用 三、基于AOP方式的声明式事务…