所以如果上面这些公司觉得没问题,访问量搞的几个 Action 的情况

  • 栏目:基础 时间:2020-05-02 14:28
<返回列表

在 Rails 6.0 开发期间,GitHub 工程师递交了 100 多个 pull requests 去改进文档、修复 bug、增加功能和改善性能。

Rails 团队表示,虽然稳定版的发布日期比预期中晚了一些 —— 因为他们耗费了大量时间来检查 Rails 6 的可靠性,但它的预览版早已在 GitHub, Shopify 和 Basecamp 这些公司及其应用上的生产环境中运行了好几个月。在此期间,团队成员并未发现严重的问题,所以如果上面这些公司觉得没问题,相信 Rails 6 也不会对大家的使用产生重大影响。

首先给大家看一下 NewRelic 的报表

GitHub 称升级 Rails 6.0 到生产环境没有对客户造成任何负面影响,唯一的异常发生在测试期间,还是 bot 导致的。              

新功能简介

最近 24h 的平均响应时间

韦德体育 1      

Action Mailbox

韦德体育 2

相关文章:

Action Mailbox将收到的电子邮件路由到类似控制器的邮箱中,以便在 Rails 中进行处理。它还集成了 Amazon SES, MaiLGun, Mandrill, Postmark 和 SendGrid 的入口。我们还可以通过内置的 Exim, Postfix 和 Qmail 插件直接处理接收到的邮件。

流量高的那些页面 (Action)

Rails 6.0 稳定版发布 新增 Action Mailbox 和 Action Text 功能

Action Text

韦德体育 3

Action Text 为 Rails 6 提供了富文本内容展示及编辑功能,其中包括 Trix 编辑器,可处理从格式化到引用,到嵌入图像和库的链接等所有内容。Trix 编辑器生成的富文本内容保存在自己的 RichText 模型中,该模型与应用程序中的任何现有 Active Record 模型相关联。使用 Active Storage 可自动存储任何嵌入的图像(或其他附件),并与包含的 RichText 模型相关联。

访问量搞的几个 Action 的情况:

对多数据库的支持

TopicsController#show

通过此功能,开发者可方便地让一个单一的应用程序在同一时间连接到多个数据库。无论是希望将某些记录分段到自己的数据库中以进行扩展或隔离,或者因为正在使用副本数据库进行读/写拆分以提高性能,开发者均可以执行此操作。

韦德体育 4

对并行测试的支持

UsersController#show (比较惨,主要是 GitHub API 请求拖慢)

通过此功能,开发者可以利用计算机中的所有核心已更快地运行大型测试套件。每个被测试对象都有自己的数据库,并在自己的线程中运行 —— 因此不会出现一个核心干活,其他 9 个围观的情况(10 核的 iMac Pro 终于有用武之地了)。

韦德体育 5

另外要注意的是,Rails 6 现在要求 Ruby 2.5.0+。

PS: 在发布这篇文章之前我有稍加修改了一下,GitHub 请求放到后台队列处理,新的结果是这样:

更多内容请查看发布公告。

韦德体育 6

(文/开源中国)    

TopicsController#index

韦德体育 7

HomeController#index

韦德体育 8

韦德体育 ,从上面的报表来看,目前 Ruby China 后端的请求,排除用户主页之外,响应时间都在 100ms 以内,甚至更低。

我们是如何做到的?

Markdown 缓存
Fragment Cache
数据缓存
ETag
静态资源缓存 (JS,CSS,图片)
Markdown 缓存

在内容修改的时候就算好 Markdown 的结果,存到数据库,避免浏览的时候反复计算。

此外这个东西也特意不放到 Cache,而是放到数据库里面:

为了持久化,避免 Memcached 停掉的时候,大量丢失;
避免过多占用缓存内存;

class Topic
 field :body # 存放原始内容,用于修改
 field :body_html # 存放计算好的结果,用于显示

 before_save :markdown_body
 def markdown_body
  self.body_html = MarkdownTopicConverter.format(self.body) if self.body_changed?
 end
end
Fragment Cache

这个是 Ruby China 里面用得最多的缓存方案,也是速度提升的原因所在。

app/views/topics/_topic.html.erb

<% cache([topic, suggest]) do %>
<div class="topic topic_line topic_<%= topic.id %>">
  <%= link_to(topic.replies_count,"#{topic_path(topic)}#reply#{topic.replies_count}",
     :class => "count state_false") %>
 ... 省略内容部分

</div>
<% end %>

用 topic 的 cache_key 作为缓存 cache views/topics/{编号}-#{更新时间}/{suggest 参数}/{文件内容 MD5} -> views/topics/19105-20140508153844/false/bc178d556ecaee49971b0e80b3566f12
某些涉及到根据用户帐号,有不同状态显示的地方,直接把完整 HTML 准备好,通过 JS 控制状态,比如目前的“喜欢“功能。

<script type="text/javascript">
 var readed_topic_ids = <%= current_user.filter_readed_topics(@topics) %>;
 for (var i = 0; i < readed_topic_ids.length; i++) {
  topic_id = readed_topic_ids[i];
  $(".topic_"+ topic_id + " .right_info .count").addClass("state_true");
 }
</script>

再比如

app/views/topics/_reply.html.erb

 <% cache([reply,"raw:#{@show_raw}"]) do %>
<div class="reply">
 <div class="pull-left face"><%= user_avatar_tag(reply.user, :normal) %></div>
 <div class="infos">
  <div class="info">

    <%= user_name_tag(reply.user) %>


    <%= likeable_tag(reply, :cache => true) %>
    <%= link_to("", edit_topic_reply_path(@topic,reply), :class => "edit icon small_edit", 'data-uid' => reply.user_id, :title => "修改回帖")%>
    <%= link_to("", "#", 'data-floor' => floor, 'data-login' => reply.user_login,
      :title => t("topics.reply_this_floor"), :class => "icon small_reply" )
    %>

  </div>
  <div class="body">
   <%= sanitize_reply reply.body_html %>
  </div>
 </div>
</div>
<% end %>

同样也是通过 reply 的 cache_key 来缓存 views/replies/202695-20140508081517/raw:false/d91dddbcb269f3e0172bf5d0d27e9088

同时这里还有复杂的用户权限控制,用 JS 实现;

<script type="text/javascript">
 $(document).ready(function(){
  <% if admin? %>
   $("#replies .reply a.edit").css('display','inline-block');
  <% elsif current_user %>
   $("#replies .reply a.edit[data-uid='<%= current_user.id %>']").css('display','inline-block');
  <% end %>
  <% if current_user && [email protected]_liked_reply_ids.blank? %>
   Topics.checkRepliesLikeStatus([<%= @user_liked_reply_ids.join(",") %>]);
  <% end %>
 })
</script>

数据缓存

其实 Ruby China 的大多数 Model 查询都没有上 Cache 的,因为据实际状况来看, MongoDB 的查询响应时间都是很快的,大部分场景都是在 5ms 以内,甚至更低。

我们会做一些比价负责的数据查询缓存,比如:GitHub Repos 获取

def github_repos(user_id)
 cache_key = "user:#{user_id}:github_repos"
 items = Rails.cache.read(cache_key)
 if items.blank?
  items = real_fetch_from_github()
  Rails.cache.write(cache_key, items, expires_in: 15.days)
 end
 return items
end
ETag

ETag 是在 HTTP Request, Response 可以带上的一个参数,用于检测内容是否有更新过,以减少网络开销。

过程大概是这样

韦德体育 9

Rails 的 fresh_when 方法可以帮助将你的查询内容生成 ETag 信息

def show
 @topic = Topic.find(params[:id])

 fresh_when(etag: [@topic])
end

静态资源缓存

请不要小看这个东西,后端写得再快,也有可能被这些拖慢(浏览器上面的表现)!

1、合理利用 Rails Assets Pipeline,一定要开启!

# config/environments/production.rb
config.assets.digest = true

2、在 Nginx 里面将 CSS, JS, Image 的缓存有效期设成 max;

location ~ (/assets|/favicon.ico|/*.txt) {
 access_log    off;
 expires      max;
 gzip_static on;
}

3、尽可能的减少一个页面 JS, CSS, Image 的数量,简单的方法是合并它们,减少 HTTP 请求开销;

<head>
 ... 
 只有两个
 <link href="//ruby-china-files.b0.upaiyun.com/assets/front-1a909fc4f255c12c1b613b3fe373e527.css" rel="stylesheet" />
 <script src="//ruby-china-files.b0.upaiyun.com/assets/app-24d4280cc6fda926e73419c126c71206.js"></script>
 ...
</head>

一些 Tips

看统计日志,优先处理流量高的页面;
updated_at 是一个非常有利于帮助你清理缓存的东西,善用它!修改数据的时候别忽略它!
多关注你的 Rails Log 里面的查询时间,100ms 一下的页面响应时间是一个比较好的状态,超过 200ms 用户就会感觉到迟钝了。

NewRelic 的报表 最近 24h 的平均响应时间 流量高的那些页面 (Action) 访问量搞的几个 Action 的情况: TopicsController#show Users...

上一篇:没有了 下一篇:没有了

更多阅读

所以如果上面这些公司觉得没问题,访问

基础 2020-05-02
在 Rails 6.0 开发期间,GitHub 工程师递交了 100 多个 pull requests去改进文档、修复 bug、增加功能和...
查看全文

弹性元素可填充页面额外空间,属性不会

基础 2020-05-01
在最新的 Firefox 70 Beta 版本中,引入了一项名为“InactiveCSS”(非活跃CSS)的功能,DevTool 新工...
查看全文

在2.5版本以后开始支持注解的方式来配置

基础 2020-05-01
Spring Boot2.2.0.M6 已发布,可以从里程碑仓库获取。 看完本文你将掌握如下知识点: spring在2....
查看全文

友情链接: 网站地图

Copyright © 2015-2019 http://www.koi-bumi.com. 韦德体育有限公司 版权所有