为Symfony2和Redis正名,基于PHP的10亿请求/周网站打造

news/2024/5/11 16:14:02/文章来源:https://blog.csdn.net/aw344/article/details/47001911
摘要:Octivi当下网站每周请求数已达10亿次,然而出人意料的是,他们仍然使用着Symfony2这个通常被认为低性能的PHP Framework。除此之外,他们更使用了Redis作为主要储存。

【编者按】如果你还在Symfony2和Redis使用中存在这样的错误观念——不能使用Redis作为主要存储;Symfony2的功能很多,以至于它的运行很慢,那么不妨看向Octivi的高请求网站打造。虽然没有底层细节,但详细展示基于两者应用的宏观特性,以及开发时的Symfony2特征。





以下为译文:


有人说Symfony2像其它的复杂框架一样,很慢,但是我们认为这一切都取决用户的本身。本文将介绍基于Symfony2,每周执行10亿多个请求的应用的软件架构细节。

下面将展示tweeting之后的社交反馈:


本文将介绍基于Symfony2和Redis的应用。在此不会有过多的细节描述,相反我们将给你展示这些应用的宏观特性,以及开发时的Symfony2特征。

对于低层次的Symfony2性能优化实践,我们写了专门的文章——掌握Symfony2性能系列—— Internals 和 Doctrine

首先是关于所描述应用的一些数据。

来自单个程序节点的性能统计:

  • Symfony2实例每秒处理700个请求,每个请求平均响应时间30毫秒
  • Varnish每秒处理12000多个请求(通过压力测试获得)

注意,如下面所描述的,整个平台包括许多这种节点

Redis度量:

  • 1.6亿多个键(其中98%是永久存储);
  • 89% hits—也就是说,只有11%的交易到达MYSQL服务器。

栈结构

应用

所有的流量都会流入HAProxy,HAProxy将流量分配给应用服务器。

应用实例前是Varnish Reverse Proxy。

我们保持Varnish在每个应用的服务器都保持高度可用性——没有单点故障。单个Varnish分配流量可能导致风险。分离的Varnish实例可能降低缓存hit,不过我们可以接受这个。我们对可用性的需求高于对性能的需要,不过你可以从这些数字中看到,性能也不是什么问题。

应用的服务器配置:

  • Xeon E5-1620@3.60GHz, 64GB RAM, SATA
  • Apache2 (我们甚至不用nginx)
  • PHP5.4.X以PHP-FPM运作,伴随APC

数据存储

我们使用Redis和MySQL存储数据,它们的数字还挺大的:

  • Redis
  1. 1.5万次撞击/秒
  2. 1.6亿个键

  • MySQL:

  1. 多于400 GB的数据
  2. 3亿份记录

我们即使用Redis作为永久存储(用的最多的资源),又使用Redis作为MySQL上的缓存层。与典型的缓存相比,Redis存储数据的比率很高——我们存储1.55亿多个永久类型键和仅500万个缓冲键。实际上,我们可以使用Redis作为主要的数据存储。

Redis配有主从设置。通过这种方式我们获得HA——如果发生运行中断我们可以很快的将主节点切换到某一个从节点。一些管理任务如升级也需要这些配置。在升级节点时,我们可以选择新的主节点,然后升级先前的主节点,最后交换两个节点。

我们仍在等待生产就绪的Redis集群,这些集群可以提供类似自动故障恢复(升级节点时即使是手动故障恢复也会方便的多)的功能。不过目前还没有任何关于官方发布日期的消息。

MySQL通常用作非耗尽资源的第三层缓存层(Varnish > Redis > MySQL)。所有的表都是InnoDB,最多的查询是简单的

SELECT ... WHERE 'id'={ID}
这个查询返回单个结果。我们还没有发现这么设置会有什么性能问题。

与Redis设置不同,MySQL运行在主配置上,除高可用性外,这还提供了更好的写性能(在Redis中这不是什么问题,因为我们不会耗尽性能特性。)


Application’s Architecture

Symfony2功能

Symfony有一些很棒的功能,这些功能使开发过程变得更容易,下面我们绍开发者最喜欢的一些功能:

注释

我们使用带注释的Symfony2标准分布:

  • 路由选择——路由定义了应用的URL—我们也测试了Apache的愚蠢的路由规则,但它没有任何的主要优化。
  • 服务容器——我们使用JMSDiExtraBundle的服务注释定义我们的DI容器—这加速了开发,允许我们用PHP代码处理服务定义,我们发现PHP代码更可读。

因为应用用作REST API,所以我们主要不使用模板(例如Twig)。我们保留模板主要是为了一些内部的仪表盘面板。

我们还没有发现不同的配置类型(YAML/XML)带来的性能影响。因为所有的注释都很好的存储下来了,所以没有什么令人费解的地方—最后所有的东西都是纯PHP代码。

下面是我们使用JMSDiExtraBundle获得的服务配置样例:

/*** Constructor uses JMSDiExtraBundle for dependencies injection.* * @InjectParams({*      "em"         = @Inject("doctrine.orm.entity_manager"),*      "security"   = @Inject("security.context")* })*/
function __construct(EntityManager $em, SecurityContext $security) {$this->em = $em;$this->security = $security;
}

通过这种方式,改变类依赖项只需要改变代码。

Symfony2监控—Monolog和Stopwatch

应用使用Monolog记录意料之外的行为,捕获错误信息。我们使用多个信道获取不同应用模块的分离的日志。

因为FingersCrossed handler使用较多内存(可能导致内存泄漏),所以我们不再使用它。我们选用适当的StreamHandler。使用这种方式时我们需要在单行日志信息添加冗余和额外的内容。

我们也在很多地方使用Stopwatch组件以控制一些典型的应用方法。通过这种方式我们可以发现客制化逻辑一些大块中的弱点。

例如,我们追踪一些外部网络服务的请求次数:

if (null !== $this->stopwatch) {$this->stopwatch->start('my_webservice', 'request');
}// Makes a CURL request to some my_webservice
$response = $this->request($args);if (null !== $this->stopwatch) {$this->stopwatch->stop('my_webservice');
}

控制台组件

开发和维护时,我们特别喜欢Symfony控制台组件,这个组件为创建CLI工具提供了很好的面向对象接口。应用大概添加了50%的新功能,这些新功能基于CLI指令,主要用作管理或分析应用内部构件。

控制台组件妥善的处理命令语句或选项—你可以设置默认值,可选值或所需的值。好的实践总是将这些恰当的记录为代码—你可以给命令和选项设置主要描述。命令通常是自我文档的,因为添加--help选项便能生成格式化的指令描述。

$ php app/console octivi:test-command --help
Usage:octivi:test-command [-l|--limit[="..."]] [-o|--offset[="..."]] tableArguments:table                 Database table to processOptions:--limit (-l)          Limit per SQL query. (default: 10)--offset (-o)         Offset for the first statement(default: 0)

我们必须牢记在准确设置的环境下运行指令。默认的dev可能会导致一些问题,如内存泄漏(因为更多冗长的日志存储和保存调试信息)。

$ php app/console octivi:test-command --env=prod

想要更好的信息显示,添加-v选项。

$ php app/console octivi:test-command --env=prod -vvv

进度条是一个很好的帮手。进度条甚至考虑了信息显示详细程度,当程度比较低时,只显示基本信息,程度比较高时,还可以显示运行时间,内存消耗等信息。

此外,我们还有一些耗时大约两天的迁移过程—0内存泄漏—没有进度条,监控它们将是灾难。

数据层

对于Redis,数据层我们使用PredisBundle。

我们拒绝Doctrine ORM,因为它将添加额外费用,而且我们不需要任何高级的面向对象操作。我们使用Doctrine DBAL代替,Doctrine DBAL特征如下:

  • 查询生成器
  • 预处理语句

使用PredisBundle和Doctrine Bundle也允许我们在大量使用分析工具的时候监控弱查询。

总结

多亏Symfony2,这种设置在保持高性能和高可用性的同时保持了友善的开发环境——可维持,稳定。实际上这是用作电商网站的关键子系统的关键业务需求。

因此本文的最后我们可以纠正一些错误观点:

  • 不能使用Redis作为主要存储——如我们先前所说的,当然是可以的!Redis是一项很稳定的技术,有一些持续性机制,你不会丢失关键数据。
  • Symfony2功能很多以至于它很慢——当你不使用例如ORM的一些耗时/内存的工具时,你可以获得和Silex(是的,我们测试过它)微框架类似的性能。

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

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

相关文章

自学改变一生,6个适合年轻人自学的网站,知乎超100万人推荐

在学校或者工作中,觉得自己的能力毫无提升,怎么办?在做好自己本职工作,不妨多去学习一些知识,让自己的技能更加强,收入更上一层,何乐不为? 第一个:慕课网 第二个&#x…

一些网站设计原型图

看到了一些非常棒的网站产品的原型图设计,分享给大家看看,任何一个伟大的互联网产品设计都是从这些看似简单,粗糙的线框图开始的。 有时候用纸和笔来进行快速的创意描绘会得到更迅捷的成果,你可以在一个简单的模式中速写你的结构设…

把HTTPS网站中的安全证书导入到java中的cacerts证书库

第一步:下载证书 第二步:导入证书 以管理员身份运行任务 C:\Windows\system32>keytool -importcert -alias COMODO_RSA_Extended_Validation_Secure_Server_CA -keystore "C:\Program Files\Java\jdk-11.0.8\lib\security\cacerts" -fil…

爱奇艺视频网站数据清洗整理和结论研究

1、数据清洗 - 去除空值import numpy as np import pandas as pd data pd.read_csv(C:/Users/HP/Desktop/爱奇艺视频数据.csv,engine python)def data_cleaning(df):for col in df.columns:if df[col].dtype object:df[col].fillna(缺失数据,inplace True) #fillna方法填充…

ASP.NET 2.0网站专案同时使C#与VB.NET之技巧

转自:http://blog.csdn.net/dotnetcool/archive/2006/09/07/1189291.aspx 在以往VS.NET 2002及VS.NET 2003的Visual Studio工具本身不支援多个组件档(Assembly),也就是专案编译后只会产生一个.dll组件,而一个组件只允许…

从零打造视频播放网站(2)-后端接口设计篇

后端接口设计篇 环境:接口文档:说明:测试: 环境: centos7系统php7.0框架:thinkphp5.0服务器:nginx 接口文档: http://39.106.207.193:8000/doc 说明: 返回类型均为 JSON数据格式 测试: http://39.106.207.193:8000/play/group/2337?fromkkm3u8 [{"id": 1, &q…

从零打造视频播放网站(1)-数据采集篇

数据采集篇 1.数据库设计:2.环境:3.创建项目:4. settings.py5.爬虫编写:6.增量式爬虫:7.启动爬虫:8.总结: 1.数据库设计: source表(播放源): idnamedescparseshow自增id播放源名称播放源描述解析url展示名 video表: idtitledesctypeareathumbyeardirectorintroductionactors…

黑马就业班(02.JavaWeb+项目实战\16.JavaWeb综合项目实战手把手学习)旅游网站项目(发现案例有问题!已修正)+浏览器页面代码调试(视频45-16.00)

本文对应项目:目录:G:\idea_java_project 下的travel项目本文参考资料《综合案例笔记》笔记 1、准备工作 项目导入 将资料的空travel项目导入IDEA中。(注意导入项目的方法,选择的是pom.xml文件,参考视频1-4.00&#…

缓存、动态页面静态化、网站优化

一、缓存 缓存(Cache)技术在软件开发过程中有着广泛的用途, 它对提升软件性能和改善客户体验有很大帮助. 所谓缓存, 是指将那些经常重复的操作结果暂时存放起来, 在以后的执行过程中, 只要使用前面的暂存结果即可. 缓存技术在日常生活中随处可见, 就拿排队买票来说吧: 买票时需…

vs2008开发wap网站(一)

http://www.cnblogs.com/3stones/archive/2009/01/05/1351969.html 首先新创建个项目,打开VS2008,新建个网站项目,我们添加新项时会发现以前在vs2003或vs2005中的“移动Web窗体”项没有了,下图为vs2003和2005中的。 vs2008中就没…

关于spring 获取不到网站上的xsd的处理记录

前两天做一个项目还好好的,今天突然报出这个错误 cvc-complex-type.2.4.c: The matching wildcard is strict, but no declaration can be found for element mvc:annotation-driven 应该是xml文件找不到相应的xsd了,这时候我的springmvc.xml的头部是这么…

创建网站快捷方式

直接托那个图标就可以了

网站网页通用底部

效果&#xff1a; 代码&#xff1a; <!DOCTYPE html> <html><head> <meta charset"UTF-8"> <title>标题名</title> <style>*{margin:0px;padding:0px;box-sizing:border-box}body{margin:0 auto;font-size:12px;font-fam…

Linux系统中搭建LAMP动态博客网站

在新Web2.0革命中&#xff0c;博客是最早出现的&#xff0c;也被更多的人所了解。博客的中文有两重含义&#xff0c;既指撰写个人网络日志的人(Blogger)&#xff0c;也指承载个人网络日志的网站(Blog)。用全球最大博客网站Blogger.com的解释&#xff1a;“blog 可以是个人日记、…

【哔哩哔哩播放器】2020最新版高仿哔哩哔哩视频播放器网站源码

【哔哩哔哩播放器】2020最新版高仿哔哩哔哩视频播放器网站源码 Lan 2020-05-12 10:06 190 人阅读 0 条评论 2020最新版高仿哔哩哔哩视频播放器网站源码&#xff0c;支持弹幕&#xff0c;演示链接&#xff1a;点击进入 可以用于视频cms使用 使用方法 &#xff1a;域名/?url 如…

给你的网站加上随机一句,一言API调用代码

给你的网站加上随机一句&#xff0c;一言API调用代码 Lan 2020-05-19 13:24 258 人阅读 0 条评论 这个接口由萌创团队开放的&#xff0c;文档地址&#xff1a;点击进入 引用代码&#xff1a; <div class"hitokoto" style"text-align: center;color: grey; …

大型网站架构演化过程(一)

1. 初始阶段的网站架构 小型网站访问量不大&#xff0c;所以一台服务器绰绰有余&#xff0c;这时网站架构如图1所示。 2. 随着网站的业务的发展&#xff0c;数据量越来越多&#xff0c;一台服务器不能满足需求的时候&#xff0c;越来越多的用户访问导致服务器的响应越来越慢&am…

大型网站架构演化过程(二)

本文接上篇文章&#xff1a;大型网站架构演化过程&#xff08;一 &#xff09; 3. 使用应用服务器集群改善网站的并发处理能力 使用集群是网站解决高并发&#xff0c;海量数据问题的常用手段。当一台服务器的存储空间不足hi抵抗并发压力时&#xff0c;不要企图去更换更强大的服…

大型网站架构演化过程(三)

上接:大型网站架构演化过程&#xff08;二&#xff09; 6.使用分布式文件系统和分布式数据库系统 我们都知道&#xff0c;任何强大的单一服务器都无法满足大型网站持续增长的业务需求。数据库经过读写分离后&#xff0c;从一台变成两台&#xff0c;但随着业务的发展依然无法满足…