顾问:Bchen的引擎室 - 在顾问:Bchen增强了人们对火灾的

返回顾问:Bchen

性能和Rails日志

张贴于08年12月8日

对红宝石on Rails的优势之一是它的数据库访问抽象距离,让你不必担心有关SQL在编写应用程序。不幸的是,从发展商隐藏数据库访问,这会导致严重的性能问题。对这个问题的解决远没有那么Rails的日志。

考虑这个简单的技术顾问:Bchen十岁上下的应用程序,其中显示了故事的列表:

该控制器:
@stories = Story.find(:all, :conditions => "some condition")

认为:
<ul>
<% @stories.each do |s| %>
<li>"<%= s.title %>" by <%= s.submitter.display_name %>
with <%= s.comments.count %> comments
</li>
<% end %>
</ul>

(我要指出,杰森和Doug创造出比这更好的标记。这是你当一个像我这样的家伙写的后端为证明什么目的代码 - 我们不会使用任何此顾问:Bchen生产代码丑陋。)

似乎是相当合理的,对不对?但是随着名单上报道数量,性能迅速出现故障。让我们找出原因。

首先,样本量从运行此代码:

  • “奥巴马赢!由乔”有3个留言
  • “风暴肆虐世界各地的朱莉”,有0个评论
  • “顾问:Bchen克里斯发射的”有3个留言
  • “茄子农业由克里斯”有1个留言

接下来,看一看Rails的看日志时,这份名单是生成。这可以找到在日志中的应用程序目录/ development.log:
Story Load (0.000911) SELECT stories.* FROM stories
Rendering stories/show
User Load (0.000601) SELECT * FROM `users` WHERE (`users`.`id` = 176)
Comment Load (0.000391) SELECT count(DISTINCT `comments`.id) AS count_all FROM `comments` WHERE (`comments`.thingy_id = 545)
User Load (0.000441) SELECT * FROM `users` WHERE (`users`.`id` = 188)
Comment Load (0.000364) SELECT count(DISTINCT `comments`.id) AS count_all FROM `comments` WHERE (`comments`.thingy_id = 99)
User Load (0.000424) SELECT * FROM `users` WHERE (`users`.id' = 6)
Comment Load (0.000358) SELECT count(DISTINCT `comments`.id) AS count_all FROM `comments` WHERE (`comments`.thingy_id = 85)
User Load (0.000408) SELECT * FROM `users` WHERE (`users`.`id` = 6)
Comment Load (0.000269) SELECT count(DISTINCT `comments`.id) AS count_all FROM `comments` WHERE (`comments`.thingy_id = 18)

第一行是合理的 - 这是刚刚起步的故事清单。但是,看看会发生什么渲染认为:每个故事显示,有两个查询发送到数据库。难怪说故事的产生一长串需要很长时间,当您发出两个每个故事查询。

阿快速的代码还告诉我们发生了什么:表达式“s.submitter.display_name”得到了这个故事的提交者(这是在故事模式作为belongs_to属性)和从中提取显示名称。但是,这需要一个数据库检索(对用户表的查询)。而“s.comments.count”要求反对意见表查询。

可喜的是,有多种技术可以用来消除这些额外的查询。这些措施包括:

1。使用“包括:”指令时,提取数据。例如,更改上面的控制器代码如下:
@stories = Story.find(:all, :conditions => "some condition", :include => [:submitter])
和用户表查询以上所有取代了对用户表的单个查询。

(注意:从前时间:,Rails的可能是在其执行效率:include指令。令人高兴的是,这是在Rails 2.0固定的,因此不再有任何理由回避:包括。)

2。存储经常使用父表中的数据。诚然,这是一个数据库标准化原则的违反。根据这些原则,我们从来不想重复的数据库中的数据。但在某些情况下,性能提升,我们从非规范化得到的价值与潜在的问题有数据不同步。尤其是当有关数据不是关键。

在这种情况下,我们增加了一个comment_count字段表的故事。我们使用注释模型after_create和before_destroy行动,以保持comment_count字段更新 - 当我们创建一个新的评论,我们增加了其母公司的故事的comment_count价值。 (我们有意识地决定,虽然我们可以聪明和保持comment_count准确,如果我们能做到的,是不正确的一些故事。之后),我们可以利用的故事,而不是comments.count,因此comment_count领域避免需要获取的故事评论数查询。由此产生的意见如下:
<ul>
<% @stories.each do |s| %>
<li><%= s.title %> by <%= s.submitter.display_name %>
with <%= s.comment_count %> comments
</li>
<% end %>
</ul>

在变革与控制器一起在#1指出,查询日志现在看起来是这样的:
Story Load (0.006564) SELECT * FROM `stories` WHERE ( some condition )
User Load (0.000943) SELECT * FROM `users` WHERE (`users`.id IN ('127','193','6','249','216','239','91','240','196','37','93','176', '188','244','235','136'))
Rendering stories/show

过去费时9个查询(,很容易增长到作为报道数量增加,更多)现在要两个。

3。在某些情况下,你可以找到你的数据模型的属性的需要。如果你能,从而避免通过belongs_to或has_X关系的检索,那么这样做

没有一个在示例代码示例。然而,如果我们不想以显示在上面的例子中的实际提交者的故事,但我们要显示不同的,如果是由查看该网页的人提交的故事。 (在我们的情况下,在网页浏览器的用户模型总是包含在@用户变量。)我们可以使用下列方法之一来进行此测试:

if @user == story.submitter # bad! Requires database retrieval of submitter
if @user.id == story.submitter.id # bad! Also requires retrieval.
if @user.id == story.submitter_id # good! No retrieval required.

即使您使用:include指令获取提交者,前两种方法需要至少一个页面的数据库检索。

另一种常见的案件涉及通过belongs_to了相关的模型试验数据的存在。例如,假设我们要测试是否有一个故事在所有提交者。这里有两个做,方式:

if story.submitter # bad - retrieves submitter if present
if story.submitter_id # good - no retrieval required

总之,即使Rails的允许数据库访问抽象出来,如果你希望你的应用程序来执行,你需要知道它是如何使用该数据库。一个很好的方法,要注意是审查Rails的日志当您开发应用程序,并特别注意重复相同的查询实例(如上面的例子中,如果针对用户和意见表重复查询)。事实上,你应该经常检讨Rails的日志当你正在建立一个应用程序,表现良好。

添加到顾问:Bchen!

OpenID的为世界各地的

贾森发布于2008年10月6日

通过互联网历史上,有转折点,而新技术点击“群众”,真正起飞。几乎普遍,在快速扩展和技术的采用的共同点是一项重大突破,不是单纯的技术,但在设计突破。具体而言,在易用性的重大突破。

之前,谷歌创建了一个简单的搜索界面死,所使用的作为其互联网导航的主要方式浏览广大人民群众。通过前马赛克陈先生和维罗妮卡视觉浏览简单的文本为基础的导航是常态。苹果公司在线音乐消费与iTunes和iPod容易。美国在线提出“让网络”的爸爸妈妈容易。最近,YouTube通过互联网视频共享容易世界上每个高中生。

互联网的历史写满了技术的表现令人难以置信,但从未完全使主流。在顾问:Bchen,我们提出这样的OpenID的想法,我们要尽自己的力量,以确保OpenID是不是只能在历史书籍在爱的“可能”一章。

对于那些新的OpenID的,这个想法很简单。在创建一个OpenID提供商的帐户,您将得到一个唯一的标识符(自定义网址),您又在使用和注册登入网站支持OpenID(“消费者”,他们称之为)。在OpenID的目标是双重的。首先,你,亲爱的用户,可以创建一个帐户提供的OpenID的信任,并反过来,扩大信任的网站和您选择的服务。您不再需要交出电子邮件地址和密码,每一个新的(可能只做晚)Web应用程序出现时。第二,因为你通常有一个OpenID的,你就不必尝试和记忆的用户名和密码使用本网站或该网站。您只需记住,你使用OpenID的!

OpenID的,因为它创造了整个网络很大的发展。一些在这里的最大的服务提供商(美国在线,雅虎等)已成为OpenID的提供者,给予OpenIDs数百万,数百万人。每个星期,至少有一个OpenID的支持或与现有网站的网站推出OpenID的功能,增加了他们的登录或注册过程。麻烦的,正如我们所看到的是,尽管OpenID登录和注册正在迅速增加的网站,它的介绍缺乏设计爸爸妈妈要把握OpenID的权力。

今天, 我们隆重推出我们就OpenID的注册和登录。如果你的动作的登录注册的网页,你会看到新的东西。对于现有的Mixxers,在登录屏幕将上下文您当前的登录方式(用户名/密码或OpenID的)。

对于新Mixxers,你可以注册一个美国在线,雅虎,或Facebook帐户。 OpenID的注册标准也仍然可用。如果有些事有凑巧,你没有与第三方服务,我们目前支持任何一个帐户,您仍然可以登记您的电子邮件地址。虽然Facebook是不是OpenID的每本身,都AOL和Yahoo!注册和登录采用OpenID的覆盖下,不要求其OpenID网址的用户。在美国在线的情况下,我们要求您的AOL或AIM帐户名和shuffle您关闭到相应的登录页面。雅虎!登录和注册更简单,点击大热血“登录/注册与您的Yahoo! ID为“按钮,我们会完成其余的工作。

我们更进一步,并增加了一个伟大的功能,登陆:我们身边的登录使用和重新设计的,基于页面的最后一个方法跟踪。因此,如果您使用Facebook的登录,您将有大量Facebook的图标和按钮提交。没有通过我们的登录选项需要狩猎和点击!

最后一块拼图是管理您的帐户。浏览到您的帐户设置,然后按一下新的“帐户”标签。从那里,你可以添加和删除将您的第三方帐户。通过将与您的顾问:Bchen帐户整个网络的各个帐户,您可以使用这些方法的任何登录到顾问:Bchen。这是一个伟大的走向之间顾问:Bchen与您喜爱的网站和应用程序的互操作性目标的第一步。

我们把新的注册和登录体验大量工作,我们希望找到改善有益的,高于一切,容易。一如以往,我们感谢您的意见,并期待着听到你说的话!

〜贾森(其余的顾问:Bchen队)

添加到顾问:Bchen!

隐藏内容,普及,以及在OnLoad问题

张贴于08年9月15日贾森

自从我加入了顾问:Bchen队(1年,有些变化前),并开始摇动了的HTML,CSS和JavaScript,您看到和使用的每一天,我曾强调要建设辅助功能进行考虑。顾问:Bchen有一个由所有种族,颜色,信仰用户种类繁多,而且功能。这是(并且一直持续到天)对我们非常重要,我们为我们的用户的宝贵经验,同时不离开的人在寒冷了。

正如你们大多数人都知道,有一个互动的的Mixx吨投票,报告,提交与YourMixx互动,不胜枚举。这些内容都涉及到与应用程序和他们每个人不同的互动内容涉及操纵屏幕上使用了JavaScript和CSS的组合。

为了适应用户(或者,更直接,他们的浏览器选择)谁已关闭JavaScript,我们采取默认情况下显示所有内容,方法,然后使用JavaScript来隐藏有关内容。最简单的观察这个例子是永久链接的网页。随着最近的永久链接终极版 ,我们增加了一些新的“标签”(为更好的描述缺乏)低于项的信息及以上的评论:活动,关于这个网站,和相关。

当浏览到固定链接页面,这取决于如何比比和您的Internet连接,您可能会注意到,这三个选项卡expaned和互相最初堆叠。沉默片刻后,他们就会离开,他们单元,然后通过各自的按钮访问。这是最基本的,上述情况。网页内容的负载。 JavaScript并不隐藏的工作,适当的部分。

在完美的世界,这会发生在瞬间,没有人会注意到。在现实世界中,互联网连接是可变的,Web服务器打嗝,和外部资源(如谷歌分析)有副作用的本地脚本受阻射击的效果。最后一点上是我们所关心的问题开展讨论。史蒂夫Souders在他的优秀图书高性能网站 ,,去了解为什么会发生这种拖延到很详细。检查与脚本“的问题。指出第6章”

所以,我们怎么办?让我们先来看看如何顾问:Bchen当前工作。

正如我们所注意到的,我们的HTML和CSS在页面上的默认显示元素的样式一切。一旦一切都满载的顾问:Bchen JavaScript的(使用jQuery的 ,在另一职位的问题)使用$()。就绪()来把我们的onload火灾事件。适当位躲避,我们就大功告成了。这是很大的,至于“最佳做法”和所有方面,但低于大,从感性的角度。

罗伯特尼曼 ,在他的职位如何隐藏和显示的初始内容,取决于可用的JavaScript支持 ,概述了技术,可在其中添加一个<script>元素的<head>您的文件,调用一个匿名函数,进而,增加了一个CSS文件到您的网页。 CSS文件包含一个选择器(在他的案件的编号为基础的选择,单路),告诉一个元素不显示。

这是一个出色的解决方案,克服了的onload问题,介绍了远程资产。唯一的修订时,我会向他的例子是使用基于类的,而不是基于身份的选择。这样,您可以设置一个类(“。Alt”键,例如),并应用到所有元素您要隐藏。

这么简单,真的。罗伯特为我们提供了一个可扩展的解决一个问题的困扰开发商越来越多。那么,为什么,那么,你问,有顾问:Bchen没有执行呢? “时代”,主要是。我们是一个小团队的事情要做大名单这里!我向你保证,虽然,这将是我们实施的时间。

你找到这一问题的有效解决方法?如果是这样,让我们在评论中说明!

添加到顾问:Bchen!

语义或博士:我是怎样学会停止担忧爱的XHTML / CSS

发布于2008年8月22日

5键实现从视觉设计师网页设计师跳

因此,首先让我们定义,(我的定义在谈及网络)

可视化设计 :有人谁设计的图形,使网络上的方式。

一个网页设计师 :有人谁的视觉设计技能,而且也知道如何编写干净,语义,基于标准的HTML / XHTML和CSS。

后者理解帆布的墨水是怎么回事。前者知道如何混合油墨。

1。什么类型的学习吗?
我在我职业生涯中最大的失误是没有回答这个问题之前,我尝试学习“首次对方”。我会一直写标记年前我刚拿起材料的正确类型。黑色型的白皮书,偶尔的图形/图表是自我培训的方法。大的时候失败。如果有什么是害怕我回我的Photoshop只洞。

五年后,我拿起一书的杰弗里Zeldman。如果您正在阅读这个博客,你有机会听到这个消息:“ 与网络设计标准 ”。这本书救了我的职业生涯。这本书告诉什么可以和历史上应,利用电脑完成。它敞开了大门一度被关闭 - 赫克,死栓和主锁定。关键领域的书对我影响最大的是它取出单词“发展”恐怖因素“,”非但没有发展。在设计方式,语义和基于标准的设计成为标准。历史背景也发挥了关键作用。它帮助我明白什么是正确的,哪些是错误的,并解释了如何利用技术的局限性引起了很多的错误。

回首过去,这是在让我下一步的关键角色。每本书或其他培训的助手这以后购买了这一点。什么Zeldman的书给我带来了别人没有的图形和颜色。它以我的语言,并转达了对问题的回答我。

2。你真的相信这是你想要的生活?
有些人只是单位,都不能使开关的能力。我永远不会成为后端的开发,而我认为没问题。我的脑子就没有这样的功能。在这种情况下,没有什么,只有做视觉设计错误。对我来说是未来的方向我想去合乎逻辑的步骤。

3。谁你知道吗?因为他们将有所帮助。
如果大多数书籍记错的话,和类再也没有接近提供,是那些连接我在业界的真正帮助我在渡难关。参加会议,作为当地场景的一部分,还是一个随机的电子邮件发送到“weblebrity”总是带回了比任何书籍阅读或类返回出席了会议。所以不要害怕接触。

4。你会搞砸了,这没关系,只要确定你有合适的工具时你做。
您将要作出一些错误,我们都这样做。一些像一个段落标记结束愚蠢会使您想撕毁你的头发了。只要冷静下来,请确保您有任务的必要的工具和继续保留的。

推荐工具

  1. 火狐- 获取最新版本
    * Firefox的Firebug扩展
    * Web开发Firefox版工具栏
  2. 平行- 获取最新版本
    *喜欢还是不喜欢,IE6的仍然是最广泛使用的浏览器本身有1。 Mac用户,您将需要此进行测试。
  3. 歌剧- 获取最新版本
    *蜻蜓- 类似Firebug的,但歌剧 (谣言是,他们把它取名为蜻蜓等,因为吃firebugs)
  4. HTML和CSS参考- 的HTML狗
  5. 一个伟大的参考网站为我们带来的丹Cedarholm

5。请确保您获得乐趣。

做你的爱,你会爱上你做什么。这些家伙同意:

“选择一个你喜欢的工作,你将永远在你的工作生活中的一天。” - 孔子

“我从来没在我的生活一天的工作。这是所有的乐趣。“ - 托马斯爱迪生

添加到顾问:Bchen!

Ruby on Rails的与Java队荤队汇编

发布于08年8月10日

一大优势,花了一个行业很长的时间,您看到的某些模式随着时间的推移重复自己。这些模式的其中一人对我们的决定使用的顾问:Bchen on Rails的Ruby的重要影响。

我的第一份工作之一称为逻辑控制装置。逻辑控制装置的国防承包商曾与各情报机构的合同数目,其中有许多涉及处理收到的消息通过新闻专线故事,这些故事分类,并提供他们谁已登记的兴趣分析一个特定的主题。因此,例如,在俄罗斯分析师专业可以订阅所有上述Vladamir普京,俄罗斯和格鲁吉亚(但没有提到亚特兰大)的故事。

这个软件已经写在IBM的IBM大型机汇编语言。它只能被用来在这种环境中,并没有适用于其他系统。我的任务是采取技术,使之成为一种现成的,现成的商品,帮助包被他人利用。的希望是,我们可以出售给不同层面的客户,离开政府若即若离。

我们最大的挑战之一是早期获得许可写在C编程语言的新产品。我们当地的逻辑控制装置的副总裁,那个谁控制了绿灯,已汇编语言编程,具有系统上,我们是工作适应。他怀疑,我们可以得到出长(高性能必要的性能是这一产品,是为了处理一些对传入的故事,每千查询第二大卖点,与硬件的大问题时间。)他与C自己没有经验,所以他需要有说服力的。

我们建立了一个原型表明,尽管C语言的执行速度比不上原来的组装版本,它是速度不够快多为我们的目标市场。鉴于与C的其他优点相结合(更大的便携性和程序员的工作效率) ,足以说服他不错的项目。所以花了我一生的未来几年的建设和保持逻辑控制装置信息传播系统(LMDS),它最终被一家政府机构数目。而这直接导致我在美国在线被雇用,无论谁买了LMDS的,最终,我从逻辑控制装置。

(我不知道无线接入仍然在美国在线使用。但这是作为一个几年前,被用来作为系统的分类,为美国在线新闻源厂的一部分。不坏的一块,软件最初是20年前。)

这是我第一次遇到的新旧,设立语言和更新的语言,而不是在处理器速度上的高效率,是很多程序员在时间上有效的辩论。

闪光向前十年。C是根深蒂固,在美国在线,就像一但新的语言正变得越来越突出 - 爪哇。而出现的论点:应美国在线让Java语言的新应用的选择吗?

爪哇已超过C.它氏一个更加容易使用的语言很多优势,这是不容易的真正痛苦的错误,您可以创建在C部分(有一次,我看到了一个推迟了12人C项目上周由于错误的分号。)这一切转化成更大的程序员的工作效率。

但是,Java是永远不会像C的高效的机器资源。一些功能,使Java的安全也具有成本处理器周期。这是独立于所涉及的编译器,即使与世界上最好的编译器,Java程序:将不会在性能同等的C程序。

举一个例子:数组边界检查。在C中,你可以创建10项数组,然后高兴地请访问第十一项目。C使得本 - C的指导原则是,程序员知道自己在做什么,所以即使它看起来愚蠢的,只要做程序员说,该死!这可能会导致在长(为期一周的延迟,我上面提到的正是这样的错误。造成恶劣影响的各种)

但是,当你访问一个在Java,Java的检查数组元素,你将不会出界。试图进入第十一项目1 1 10项数组将在Java错误的结果,能够精确正是你去错了。这个漏洞将被发现在几分钟之内,而不是几天。

这样可以节省大量的编程时间。但是这样做的数组边界检查费用处理器时间 - 您每次访问一个在Java数组元素,它必须检查你的访问是在界内。处理时间是程序员的时间牺牲。

美国在线进行了一些基准,发现Java程序需时约尽可能多的CPU时间来运行C程序的等效两次。但是,尤其是考虑到对性能的限制因素通常是I / O和不是CPU,并考虑到程序员的时间他变得更昂贵的CPU时间而不断被越来越便宜,这是一个很好的权衡。因此,美国在线所采取的政策是新的发展,除非有一个很好的理由不这样做,应在爪哇。

现在我们到现在,不可避免的时刻,有一个在该区块,新的语言,Java的新挑战的孩子。更容易制定一个在Ruby on Rails的网站比在Java应用程序。是的,Ruby是不是高效的处理时间,但它更在时间上的程序员的效率。和处理时间并不在大多数应用中的限制因素无论如何。

换言之,正是由于同样的论点,因为我们有10年前,当决定是否继续使用C或切换到Java。而这又是完全一样的说法,因为我们收到了,在决定是否继续使用十年组装或切换到C.它是一种论点归结为:什么是在发展的限制因素是问题:CPU时间或编程时间。而在大多数应用中,答案将是程序员的时间。

(作为一个程序员时,我只想说,我很高兴,程序员超过CPU的。我希望继续在长远的未来与CPU越来越便宜,而程序员变得更昂贵,贵!)

显然,还有其他因素参与。我们不应该进入新的潜水技术,只是因为它是新的。,它可以证明这Ruby on Rails是不是未来的潮流的方式,即C和Java曾经是。

但有趣的是,看到同样的老调,并举行了结束,它的启发,而这些参数时,要记住他们如何变成了最后一次。

添加到顾问:Bchen!

红宝石珍闻:当救援不

比尔发布于2008年7月31日

我学到了宝贵的经验教训今天早上,我认为我会与你分享。为了处理错误条件,包括红宝石,其他语言一样,异常处理。这可以让你把所有的代码,可能会产生一个或多个块中的错误,并处理任何错误,不发生在另一个块。远远优于旧日子,我们要检查任何调用都可能产生错误的返回值,处理,就在现场,每一个独特的方式。异常处理非常干净,更易于管理:

begin
# Do stuff that may fail here
rescue
# Deal with those failures here
end

大多数物品使用Ruby异常处理时都会告诉你的方法捕获异常的“拯救”路线。但事实证明,这只是事实的一部分。在Ruby的内部评级控制台进行一个例子:

irb(main):001:0> begin
irb(main):002:1* raise "Haha, you missed me!"
irb(main):003:1> rescue
irb(main):004:1> puts "No I didn't!"
irb(main):005:1> end
No I didn't!

到目前为止一切顺利。但是,现在看这个:

irb(main):006:0> begin
irb(main):007:1* raise Exception.new("Haha, you missed me!")
irb(main):008:1> rescue
irb(main):009:1> puts "No I didn't!"
irb(main):010:1> end
(irb):7:in `irb_binding': Haha, you missed me! (Exception)

Woops!在这种情况下,救援真的错过它。但为什么呢?不“救”是拯救一切?我惊奇地发现,事实并非如此。一个例子应该可以了:

irb(main):016:0> begin
irb(main):017:1* raise "Better luck next time!"
irb(main):018:1> rescue => e
irb(main):019:1> puts("I caught a " + e.class.to_s)
irb(main):020:1> end
I caught a RuntimeError
=> nil
irb(main):021:0> begin
irb(main):022:1* raise StandardError.new("Better luck next time!")
irb(main):023:1> rescue => e
irb(main):024:1> puts("I caught a " + e.class.to_s)
irb(main):025:1> end
I caught a StandardError
=> nil
irb(main):026:0> begin
irb(main):027:1* raise Exception.new("Better luck next time!")
irb(main):028:1> rescue => e
irb(main):029:1> puts("I caught a " + e.class.to_s)
irb(main):030:1> end
(irb):27:in `irb_binding': Better luck next time! (Exception)

啊,哈!因此,尽管似乎“拯救”将与各种异常问题的最通用的方法,但实际上并非如此。这将赶上StandardError(其中RuntimeError是子),但却忽略了异常。最通用的异常处理程序轮流“拯救异常”:

begin
# Do stuff here
rescue Exception
# I will catch everything, even stuff that "rescue" misses
end

经验教训:除非你知道你唯一可能处理的是StandardError或其子类之一,它最好使用不仅仅是“抢救”拯救异常“”。 Nevermind文件表明,“抢救”捕获的异常,这是真的,但误导 - 它实际上只捕获其中某些种类。

添加到顾问:Bchen!

Rails的缩放

发布于2008年7月28日

顾问:Bchen是采用on Rails的框架的红宝石 。 (Rails是框架。红宝石是语言。)如果您很重视,互联网技术的世界,这很可能提出一个大问题:这是否意味着伸缩性问题?

不幸的是,Twitter的 's的缩放性和可靠性的各种问题,引发了周围的福德Rails的很多。毕竟,Twitter是在网络上著名的大型Rails应用程序的最好的,它都无可否认曾与缩放和稳定性问题。 (虽然有过的,Twitter的只是他们的Summize购买取得的优秀的工程师,我有信心,他们的问题将很快成为历史陈迹。)共同梅梅是,Twitter的问题是由于Rails和,因此它是不可能建立一个稳定的可伸缩的应用程序使用Rails。

因为我就是那个谁选择使用顾问:Bchen Rails的,当然我不同意。让我告诉你为什么。

(在说明中,我将讨论的性能和可扩展性。我知道这是不一样的。然而,他们密切相关,而且有两个相关的FUD左右Rails的,所以我认为值得支付这些双方在这次讨论中。)

  1. 80-90%的最终用户响应时间无关与服务器上的任何东西-它在设计和网页实现的。

    这是由雅虎做了研究的结果!,如史蒂夫Souders出色的高性能网站报道(我强烈建议-应该有这个网站的发展在各个商店书副本)。大多数性能问题联系在一起,如设置正确的图像缓存头减少物体的页码,和标记,CSS和JavaScript正确的设计。如果你想让你的网页加载速度快,期待您的标记。 (这是众多原因之一,第一个人,我雇了,当我来到船上的贾森加伯,顾问:Bchen的用户界面设计师。为什么我买他的副本后,尽快公布Souders书。)

  2. 服务器上的性能在很大程度上是对数据存储的设计问题,不应用程序代码。

    一个典型的Web应用程序涉及检索从一个或多个数据存储数据,在一些操作方式,和渲染的页面包含的数据这些步骤。,一个是最有可能导致性能问题,是从数据存储检索。不善的索引数据库可能导致的重大问题,在良好的书面申请,最大的性能提升将要涉及更快的数据存储和智能缓存策略。但这些问题并非只在Rails的 - 它们共同的问题,所有的web应用程序,什么语言正在使用的问题。

    (虽然我知道旁边,对Twitter的架构没有什么,我敢打赌,其伸缩性问题都与数据存储的设计,而不是应用程序代码。如果Twitter的是翻译成另一种语言的商店而无需重新设计,我希望它能将有同样的问题。大厦系统,这需要汇总的数据,从多个集合每个需要不同的数据集的用户,是一个棘手的数据设计的问题,不管什么语言。)

  3. Rails的支持通过应用服务器重复缩放。

    可以很容易地火了,作为应用程序和Web服务器,很多情况下,因为你需要在Rails。硬件缩放 - 投身到分区混合另一种产品 - 同样是使用Rails容易,因为它与其他任何现代的Web应用框架。

    限制因素这种缩放一种是你的数据库主机的大小 - 但是这将成为限制因素不管你的应用框架。而在其他语言中使用,以克服这些限制在Rails的工作相同的手法。

  4. Rails的支持通过应用程序分区缩放。

    另一个典型缩放方法包括分割成子应用程序,每一个单独设置的服务器上运行。这可以在Rails做一样轻松地在任何其他语言。

  5. 轨优化了编程时间,而不是处理器时间-这是正确的选择。

    我不是说Rails是要执行,以及诸如Java语言。但Rails是优化,使生活更轻松程序员,不是电脑。这是在历史的编程语言共同的主题 - 一种新的语言来一直that is easier for programmers, but less efficient in terms of processor time.  There's an entire blog post in that - and I promise to write it sometime soon.

  6. It is easy to write naive Rails code that performs poorly.  That's why we you shouldn't write naive Rails code.

    Clearly, any language can be used to write bad, inefficient programs.  But Rails, which abstracts out the database to make database access transparent to the programmer, probably makes it easier to write inefficient code.  It is easy to slap together a quick Rails application without worrying too much about the database - that's the great strength of Rails.  But to get performance, you need to pay attention to the details.  That isn't too difficult, and I'll blog sometime about how we've done it at Mixx.  But it is necessary.

    (I suspect that this is another cause of the bad reputation for performance that Rails has.  People throw together a quick Rails application, taking advantage of its ease in programming, and are then surprised when it doesn't perform.  But while building an application can be easy, we aren't yet at the point where building a complex and highly performant web application is easy.)

And there it is. At Mixx, we feel that Rails will serve us quite well as our application platform.  In fact, we have effectively bet the company's future on this belief.  I do not expect to be proven wrong on this - while Rails is not a perfect platform in terms of performance, and there are a number of improvements that could help (another fertile ground for a blog post), for our application it performs just fine.

Add to Mixx!

Welcome to the Engine Room

Posted by Joe on July 22nd, 2008

Welcome to the Mixx Engine Room, the blog of the Mixx engineering team. Over time, we'll be writing posts describing various aspects of Mixx technology - how things are built, challenges that we've encountered in scaling, the reasons behind some of our technical decisions, and other details about our systems that we feel we can share with the world.

At Mixx, we're strong believers in community. We've read The Cluetrain , and we believe in it. This blog will be the engineering team's car on the Mixx Cluetrain.

But this blog is not like the movies. Here we roll the credits first. And so, without further ado, I give you the Mixx engineering team, listed by Mixx longevity:

- Raghu Somaraju is a backend developer here at Mixx, building the server code for several of our subsystems. When you first registered for Mixx, and the last time you logged in, you used Raghu's code. In his pre-Mixx days, Raghu worked at Yahoo! in the News and Information group for three years, where he met Mixx CEO Chris McGill. After Yahoo!, Raghu worked at Juno Online in India and at an online ad agency start-up that, alas, did not make it.

- Joe Dzikiewicz (hey, that's me!) wears many hats at Mixx, so it's a good thing he has such a big head. As CTO, he manages the development and operations teams. As backend architect, he does overall architectural design of the backend systems. As a backend developer, he codes much of that design, including the initial work on the voting, submission, and categorization systems. Before Mixx, Joe was a systems architect at AOL for ten years, most of it spent in the Search and Community development teams. If you ever searched for something on AOL, chances are you used some of Joe's code. When not writing Mixx blog, Joe blogs at www.drdzoe.com .

- Like most of the crew at Mixx, Jason Garber wears many hats, all of them stylish. His job as User Interface Architect implies that he has some sort of working knowledge of blueprints, AutoCAD, and spackle. This couldn't be farther from the truth. Unless, of course, you think of HTML as a blueprint, CSS as spackling paste, and JavaScript as AutoCAD, but that's a rather weak analogy. Poor analogies notwithstanding, Jason spends a good deal of time working with the rest of the Mixx team to ensure that everything that goes out the door is functional, attractive, and easy to use.

Prior to joining up with Mixx, Jason worked at a small design and marketing firm in Bethesda, MD, and did some time at AOL, most notably working on Ficlets, which won an award for Best CSS at this year's South by Southwest conference. Between breaths, he is also involved in the local DC tech scene, organizing events, shooting photography, and playing in a rock and roll band.

- Nathaniel Collinsworth is Director of Operations for Mixx. His responsibility is the smooth running of all the technical infrastructure that the company needs. This umbrella covers a large number of disciplines; database, web server, mail, security, monitoring and alarming, business continuity, etc. It also includes the less challenging, but just as critical, needs of the office personnel. Nathaniel spends much of his days ensuring that Mixx can continue to scale to the needs of it's growing user base. The first half of his career Nathaniel managed technology operations groups for non-technology companies, including non-profits, mining companies and the US Federal Government. The second half he has focused on the scalability and distribution of community applications on the web for AOL and for Mixx. He enjoys working at Mixx because he gets to use his broad range of talents to serve both the Mixx employees and our users.

- Bill Kocik also joins us from AOL, where he spent several years working in both Systems Operations and Software Engineering disciplines. At Mixx, Bill spends most of his time writing code that runs on the servers. Of note, he designed and implemented the Mixx API, and is largely responsible for the Site Mail feature, as well as once-per-day email notifications and the Google AdSense revenue sharing functionality.

- Doug March is a Senior Web Developer at Mixx. He spends much of his time bringing product designs and ideas to life. On the side, he helps dream up new features and dabbles in Search Engine Optimization. Doug started his career in the world of government consulting. Later, he found his niche and honed his skills at Revolution Health. In his free time he is usually on the links trying to collect that elusive 5th hole-in-one. When not enlightening you via the engine room, Doug blogs at http://doug-march.com .

So that's us. Follow this space to learn more about the way we think, and the way we do technology.

Add to Mixx!

© 2010 推荐读物,公司的用户生成的内容授权下创作共用公共领域的许可证

mk.gd - Translate webpages in real-time

View this page in: Afrikaans, Albanian, Arabic, Belarusian, Bulgarian, Catalan, Chinese (Simp), Chinese (Trad), Croatian, Czech, Danish, Dutch, English, Estonian, Filipino, Finnish, French, Galician, German, Greek, Hebrew, Hindi, Hungarian, Icelandic, Indonesian, Irish, Italian, Japanese, Korean, Latvian, Lithuanian, Macedonian, Malay, Maltese, Norwegian, Persian, Polish, Portuguese, Romanian, Russian, Serbian, Slovak, Slovenian, Spanish, Swahili, Swedish, Swedish, Thai, Turkish, Ukrainian, Vietnamese, Welsh, Yiddish