简单介绍相册网站的架构

news/2024/5/20 10:48:11/文章来源:https://blog.csdn.net/weixin_34234823/article/details/94440204

我们团队正在开发一个相册类产品,希望打造一个基于存储为中心的相册服务。

产品的基本架构如下:

_thumb2

1. 负载均衡 LVS + Keepalived

● 抗负载能力强(performance)

LVS工作方式的逻辑是非常之简单,而且工作在网络4层仅做请求分发之用,没有流量的转发。 相比nginx而言有更强的并发能力,默认配置能支持到10万并发

● 可伸缩性(scalability)

当服务的负载增长时,为获得更高的吞吐量,在LVS中增加real-servers来满足需求,其开销只是线性增长,且不降低服务质量。

● 高可用性(availability)

keepalived 可以实现服务器池对象的健康检查,负载均衡之间的自动失败切换(failover).从而保证LVS负载均衡本身的高可性。如果LVS中某real-server由于需要升级或其它原因而停止服务,其退出以及恢复工作,并不会造成整个LVS对客户端服务的中断。(例如对nginx进行在线升级操作)

● 成本低廉(Low cost)

购买F5 BIG-IP 和 NetScalar 等硬件负载均衡交换机动则需要十几万甚至数十万人民币。而基于LVS最基本的需求就是两台普通服务器。

★如何保持session?

为了保证服务器的伸缩性,我们的服务器是无状态的,也就是任何一台web server 都可以被其它web server 替代。

我们采用了基于加密 cookie 的session 来保持用户的访问状态。(当然也可以采用LVS 的会话保持机制来解决这个问题。)

2. RPC机制: ICE + Protobuf + Zookeeper

● ICE 支持多平台,跨语言(语言中立),支持主流的语言,如Java/C++/Python 等。支持多种协议(TCP/UDP/SSL),自带集群管理,异步和同步都支持,并且文档齐全。 ICE的使用局限性:由于语言中立的需要,不接受直接返回null值,我们使用返回一个NULL Object 解决;不支持方法重载,那就再起一个方法名吧(^_^);ICE服务端抛出的Runtime 异常将不能被客户端捕获,可以采用声明式异常或者自定义返回CodeMsg的方式解决。

● zookeeper 集群是一个去中心化的分布式集群,并且有watcher 机制,监听数据变更。可以作为分布式服务的配置与注册服务。

● protobuf 能够压缩数据量,高效编码、解码,减少网络传输 或 缓存层内存占用大小。 protobuf 原生不支持map,需要自定义结构体来实现,thrfit则可以原生支持map 等复杂结构。

★为什么是ICE 而不是thrift?

为什么是ICE 而不是thrift , 因为我们团队对ICE 比较熟悉并且有成功案例.

后续的改进中会考虑使用thrift ,可以和 tornado 无缝结合,很好的利用tornado 的异步特性。

3. 图片处理服务:python + tornado

考虑到Java对图片压缩处理的效率低下,我们使用python 的 PIL (Python Imaging Library)来对图片进行压缩处理。

tornado 是facebook用于处理FriendFeed 的开源Web框架, 它是非阻塞式服务器,而且速度相当快。得利于其 非阻塞的方式和对 epoll 的运用,Tornado 每秒可以处理数以千计的连接,因此 Tornado 是实时 Web 服务的一个 理想框架。

4. 利用好Cache 提升系统性能(节约每1ms)

● 依赖工具与数据说话,可监控与衡量的设计。

(通过Spring动态代理拦截产生日志,从而监控请求处理过程的每个方法的耗时,找出性能瓶颈)

● 尽可能的采用批量操作,一次性获取需要的全部数据。

(例如:利用redis 缓存的批量接口或pipeline,数据库jdbc的batch操作。)在获取feed 与专辑列表页面通过批量操作把几百次请求合并为几次请求,降低网络IO的开销,从耗时1秒多降低到10ms,性能提升了100倍。

● 切分好缓存的粒度,达到最佳的缓存利用率。

(把图片数据与图片的浏览数分开,把专辑图片id列表与图片对象缓存分开。)

● 只获取需要展现的数据。

(例如:在专辑列表页上需要展现专辑的4个小图,但并不需要获取这4个小图的浏览数信息,就减少不必要的请求与时间开销。)

● 短路逻辑优化。

优先考虑全部命中缓存的情况,直接获取数据,取不到或数据个数小于请求个数,再考虑数据抓取。

● 划分操作优先级。

主要操作优先执行,次要操作或耗时较长的操作通过发送消息队列,放到后台任务执行。

(例如:图片转存时,需要累计图片原作者的被转存数。)

● 提升程序中可并行的部分。

根据Amdahl定律,并发的性能受限于必须串行的比例。(例如:图片转存时,利用线程池并发请求云存储进行图片文件复制操作。)

● 建立多级的缓存。

页面层可以划分为好几个json请求,进行片断缓存,service 层可以将组织出来的视图数据进行缓存。(由于目前性能基本达标与缓存维护成本,这个暂末实施。)

通过以上原则,进行简单的优化后。基本上所有请求都在50ms 以内,90%请求响应时间在20ms 以内。

小结:以上所提到的优化措施都是在代码层面的优化,实际上优化应该先从产品需求、业务流程、系统架构上考虑,最后才是根据实际线上的监控日志,对频繁调用的耗时操作进行优化。

★ redis 那些事

● redis 我们没有配置持久化,redis 的持久化有可能导致CPU瞬间100%,从而产生较高的延迟。

● redis list 列表时的对象不支持LRU(或者类似MongoDB Caped Collection 的特性),或者可以借鉴花瓣网自己实现的redis.fpush 。

● 为了防止数据库没有内容时,频繁的穿透redis cache层,进行mysql数据库查询。@小小剑士 发明了 emptyable_list,即使数据库返回的列表是空的,仍然在redis 中建立一个标志位,说明已从数据库加载过数据,无需再去查询数据。

● 为了避免缓存失效时的雪崩效应,应该在加载数据时建立起一个分布式锁(可用memcached 或 zookeeper 实现),或者只是简单load 展现数据的情况可以让获取不到锁的请求线程直接返回,即使用户第一次没访问到数据,刷一下页面也就正常了。

● 期待redis 3.0 的cluster 功能。

5. 数据库设计

用户信息不分表

用户所产生的图片、好友信息、新鲜事根据用户id 进行CRC32 Hash 分库分表。

★如何解决明星用户的粉丝数特别多,导致表的数据分布不均匀?

把用户的粉丝根据用户id 做shard后,再进行一次shard。 user –> user_followers_shard_map ---> user_followers_data。

具体参见《Pinterest的数据库分片架构》

6. 编写可维护性的代码—保持架构的简单

● 把握原好面向对象设计的原则。

Java 程序员应该了解的 10 个面向对象设计原则 http://www.iteye.com/news/24488

● 持续重构,编写可维护性的代码。

团队内部成员互相进行code-review, 重构那些看起来复杂晦涩的逻辑。

● 可测试性。

积极编写靠谱的单元测试,能够有效提升软件的质量。

这里非常感谢@小小剑士 童鞋对单元测试工作的推广与坚持。

● 编码规范。

简短的方法名,规范的命名规则。使代码逻辑更加清晰明了,代码更容易被别人读懂。更多内容请参考《代码大全》《重构》《代码整洁之道》

案例:

● 在原先处理redis 的缓存交互逻辑与 缓存业务逻辑耦合在一起,我们进行了单独的分离。使用XXXRedisDao 处理具体与Redis 交互的代码,简化了类的职责,XXXCachedDao 只负责缓存 与 数据库的逻辑部分。

● 原先每个ICE Service 层都编写着复杂的业务视图,例如展示一个图片需要这个图片的用户昵称、头像等业务逻辑。改造后的Service 层,只吐出业务的基本数据,如feed 中只包含photo_id 的字段,而最终需要展现的photo 其它信息,通过在web 层调用其它service 进行组装,并且可以根据不同的展现需要对业务视图进行复用或定制。

● 利用jafka 消息分发业务事件消息,解除强耦合。例如:新建用户的初始化设置,上传图片给好友发送Feed.

● 封装许多工具类或内部类,优先利用组合模式来实现,达到组件化模块化,整个架构更加清晰合理。

7. 其它

我们使用了twitter 开放出来的 snowflake 来生成UUID.

使用supervisord 监控 tornado 的进程,从而保证系统的稳定性与可靠性。

在管理后台或广场推送等方面,使用了MongoDB 作为方便快捷的存储。

Web前端使用了jQuery,RequireJs,doT 等前端Javascript框架。

前端返回的json数据暂时没有做gzip,除chrome外浏览器端解压反而把dom ready 的时间变长。

使用git 进行源码管理,基于hudson + maven 进行持续集成和部署。

使用 facebook 开放出来的 scribe 进行日志收集。

使用开源工具Ganglia 和自己开发的支撑平台对在线服务进行监控与分析。

8. 广告

我们在招聘,欢迎所有NB闪闪的 UI设计师、 Web前端工程师、Java工程师、Python工程师 加入我们!

联系邮箱:ryanchen@sohu-inc.com

欢迎使用我们的产品 http://pp.sohu.com ,或提出您的宝贵意见。


参考资料

LVS负载均衡教程 http://os.51cto.com/art/201202/319979.htm

snowflake https://github.com/twitter/snowflake

Pinterest的数据库分片架构 http://www.slideshare.net/ebola9020/pinterest-14178300

Java 程序员应该了解的 10 个面向对象设计原则 http://www.iteye.com/news/24488

jafka 的介绍  http://www.blogjava.net/xylz/category/51811.html

新浪微博开放平台的redis 实践

[微架构设计]微博计数器的设计(下) http://blog.cydu.net/2012/09/weibo-counter-service-design-2.html

花瓣网架构之路

转载于:https://www.cnblogs.com/sharewind/archive/2012/11/24/2786586.html

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

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

相关文章

钓鱼网站域名调查:非洲马里顶级域名.ML居首

非洲马里宣布顶级域名.ML从7月开始免费提供,其目的是要把域名回收。现在看来它们已经成功了,尽管这并不是它们所想象中的那样。根据Netcraft的最新调查,由于域名.ML的免费提供,马里已成为拥有全球最多钓鱼网站的国家。Netcraft根据…

记录asp.net网站停止运行原因的代码

记录网站是什么原因导致停止运行还是有必要的&#xff0c;下面是具体的实现方式。 protected void Application_End(object sender, EventArgs e){RecordEndReason();}/// <summary>/// 记录网站停止运行原因/// </summary>protected void RecordEndReason(){HttpR…

IE无法打开internet网站已终止操作的解决的方法

用IE内核浏览器的朋友&#xff0c;或许不经意间会碰到这样滴问题&#xff1a;打开某个网页时&#xff0c;浏览器“嘣”跳出一个提示框“Internet Explorer无法打开Internet 站点...已终止操作”。而大多数情况下该页面甚至非常可能看起来已经载入完成&#xff0c;内容能够全然显…

你的站为什么百度无动于衷——10年老站长的SEO肺腑之言 .

时光荏苒&#xff0c;转眼间2015年已过去一半&#xff0c;时过境迁&#xff0c;一切都变了模样&#xff0c;SEO也似乎变得让人琢磨不定。回想起10多年前&#xff0c;站长们都疯狂做站的时代&#xff0c;仍令人激动&#xff0c;但那份激情貌似一江春水永不复返&#xff0c;如今再…

7月国内网站流量统计TOP5:百度腾讯涨幅明显

IDC评述网&#xff08;idcps.com&#xff09;08月03日报道&#xff1a;根据中国互联网协会-中国网站排名公布的最新数据显示&#xff0c;截至2015年07月30日&#xff0c;国内网站独立访问量五强比拼中&#xff0c;百度连续夺冠&#xff0c;地位稳定。接下来依次是腾讯网、淘宝网…

技术网站 --ITeye Java

2019独角兽企业重金招聘Python工程师标准>>> 一个不错的java编程网站&#xff0c;贴出来供大家分享 http://www.iteye.com/ 转载于:https://my.oschina.net/u/2312022/blog/524767

python实现zabbix批量监控WEB网站和批量监控主机端口

相信大家在网上应该看到很多类似的东东&#xff0c;本文主要是整理总结下&#xff0c;并使用python脚本来实现&#xff0c;为什么要使用python&#xff0c;后面会说原因&#xff0c;当然要实现批量添加监控还是要用到zabbix的Discovery功能来实现&#xff0c;所以我们的脚本关键…

一步步构建大型网站架构

之前我简单向大家介绍了各个知名大型网站的架构&#xff0c;亿万用户网站MySpace的成功秘密、Flickr架构、YouTube网站架构、PlentyOfFish 网站架构学习、WikiPedia技术架构学习笔记。这几个都很典型&#xff0c;我们可以从中获取很多有关网站架构方面的知识&#xff0c;看了之…

linux下的php网站放到Windows服务器IIS下导入 .htaccess文件伪静态规则转换 (wordpress)...

需要特别注意的是&#xff1a; 1. .htacdess文件在 wordpress中 是可以生成的 安装 WP Super Cache后&#xff0c;开启该插件>>设置>>高级>>找到并点击"更新Mod_Rewrite 规则"按钮&#xff0c;这是会在网站根目录生成 .htaccess文件 将该文件导入到…

网站的高性能架构---Web前端性能优化

网站性能测试不同视角下的网站性能用户视角的网站性能&#xff1a;从用户角度,网站性能就是用户在浏览器上直观感受到的网站响应速度.用户的感受时间包括用户计算机和网站服务器通信的时间、网站服务器处理请求时间、用户计算机浏览器构造请求和解析响应数据的时间。 开发人员视…

seo 从优酷网学习SEO的标题(title)和关键字(keywords)如何选择

看看优酷网如何SEO关键字到第一的&#xff1f;在谷歌或者百度里搜索“视频”&#xff0c;优酷总是排名第一&#xff1a; 看看优酷的源代码里面标题和关键字是如何优化的&#xff1a; <meta content"优酷网-中国第一视频网,提供视频播放,视频发布,视频搜索" name&…

linux网站配置文件.htaccess伪静态转换到IIS web.config中

linux下的php网站放到Windows服务器IIS下.htaccess文件伪静态规则转换。此办法只适合于linux下的php网站放到Windows服务器IIS下&#xff0c;网站除了主页面正常以外子页面全部出现404错误&#xff0c;这里子页面出现404 错误是说明伪静态没有开启。什么是.htacdess:.htaccess叫…

Java系的大网站架构-LinkedIn和淘宝

用Java的大网站很多&#xff08;LinkedIn&#xff0c;淘宝&#xff09;&#xff0c;当然用LAMP&#xff08;PHPMySQL&#xff09;的更多&#xff08;Facebook是把PHP转成C编译的&#xff0c;也算&#xff09;&#xff0c;用ASP.NET也有一些&#xff08;如Stackoverflow&#xf…

买服务器做网站 镜像选什么,如何做网站镜像,网站镜像方法

网站镜像是一种网站克隆技术&#xff0c;网站镜像可以保存网站的网页&#xff0c;防止丢失。下面介绍一下如何做网站镜像,网站镜像方法。首先&#xff0c;要下载安装镜像工具&#xff0c;安装完成后打开镜像工具快捷方式开始镜像任务。第二步&#xff0c;在打开的镜像工具界面&…

优化网站加载速度的14个技巧

优化了加载速度的网站不仅可以提高其搜索引擎的排名&#xff0c;同时也可以降低网站的跳出率&#xff0c;提高其转换率&#xff0c;还能提供更好的终端用户体验&#xff0c;这是当今基于Web环境取得成功的关键。 下面我将介绍几个优化网站加载网页速度的简单方法&#xff0c;一…

php源码仿三一重工,织梦仿三一重工大气企业网站php源码

★模板介绍★源码名称&#xff1a;仿三一重工大气企业网站php源码仿三一重工大气企业网站php源码&#xff0c;测试完整无错&#xff0c;兼容主流浏览器。模板包含安装说明&#xff0c;并包含测试数据。本模板基于DEDECms 5.7 GBK设计&#xff0c;需要 UTF-8版本的请自己转换。★…

不禁网页的浏览器_分享3个宝藏网站,5秒收纳1000个网页,让你上网爽到飞起

经常有小伙伴问我&#xff0c;三顿你的PPT导航网站是怎么做的&#xff1f;我自己能不能搭建一个导航网站&#xff1f;建站需要资金和技术支持&#xff0c;其实有免费还更简单方便的选择&#xff01;收好这3个宝藏工具&#xff0c;超方便就能DIY专属于你的导航网站&#xff01;G…

我的世界宝塔Linux,《鸡站群组》-教你建站(1.1) 下载并配置windows宝塔面板

From https://zhuanlan.zhihu.com/p/57534701Welcome https://www.ji233.top(Linux请自己参考官网教程哈)各位站长们好呀 欢迎来到由鸡站群组独家呈现的建站教程 本教程会围绕各大站长的需求 以各种建站源码的使用以主要内容进行教学“工欲善其事&#xff0c;必先利其器” 作为…

ThinkSNS专业APP/网站/软件定制开发服务介绍

2019独角兽企业重金招聘Python工程师标准>>> 开发定制app/软件/网站不知从何入手&#xff1f; 全程一对一产品经理梳理需求原型图设计&#xff01; 临近app/软件/网站上线项目延期&#xff1f; 项目经理全程跟进&#xff0c;用实力解决难题&#xff01; 9年软件开发…

mysql 在大型网站的应用架构演变

写在最前: 本文主要描述在网站的不同的并发访问量级下&#xff0c;Mysql架构的演变 可扩展性 架构的可扩展性往往和并发是息息相关&#xff0c;没有并发的增长&#xff0c;也就没有必要做高可扩展性的架构&#xff0c;这里对可扩展性进行简单介绍一下&#xff0c;常用的扩展…