在 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 中实行拍卖。它还合併了 亚马逊 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

(文/开源中国State of Qatar    

TopicsController#index

澳门新葡萄京官网注册 7

HomeController#index

澳门新葡萄京官网注册 8

从上边的报表来看,近些日子 Ruby China
后端的倡议,肃清客商主页之外,响适时间都在 100ms 以内,以致更低。

大家是何许达成的?

Markdown 缓存
Fragment Cache
多少缓存
ETag
静态财富缓存 (JS,CSS,图片卡塔尔国
Markdown 缓存

在剧情退换的时候便是好 Markdown
的结果,存到数据库,幸免浏览的时候一再总括。

此外那么些东西也专程不放松权利 Cache,而是放到数据Curry面:

为了持久化,幸免 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/一九〇六5-二〇一四0508153844/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…