はじめにBackboneJS と Rails バックエンドで構築され
た (ほとんどの) シングルページアプリケーションがあります。
ほとんどのインタラクションは Web アプリケーションの 1 つのページで発生するため、ユーザーが最初にそのページにアクセスしたときに、基本的に、深く結合された 1 つの大きなクエリでデータベースから大量の情報を引き出す必要があります。
これにより、この 1 つのページで極端な読み込み時間が発生しています。
NewRelic は、私の問題のほとんどは 457 の個別の高速メソッド呼び出しが原因であると言っているようです。
これで、実行できる熱心な読み込みをすべて実行しましたが ( Bullet gemで確認しました)、まだ問題があります。
これらのメソッド呼び出しは、バックボーンを初期化するためにページに埋め込むために大量の JSON をシリアル化するために使用するRabl シリアライザーで発生する可能性が最も高いです。このすべてを理解する必要はありませんが、最大 457 のメソッド呼び出しを追加できると言えば十分です。
object @search
attributes :id, :name, :subscription_limit
# NOTE: Include a list of the members of this search.
child :searchers => :searchers do
attributes :id, :name, :gravatar_icon
end
# Each search has many concepts (there could be over 100 of them).
child :concepts do |search|
attributes :id, :title, :search_id, :created_at
# The person who suggested each concept.
child :suggester => :suggester do
attributes :id, :name, :gravatar_icon
end
# Each concept has many suggestions (approx. 4 each).
node :suggestions do |concept|
# Here I'm scoping suggestions to only ones which meet certain conditions.
partial "suggestions/show", object: concept.active_suggestions
end
# Add a boolean flag to tell if the concept is a favourite or not.
node :favourite_id do |concept|
# Another method call which occurs for each concept.
concept.favourite_id_for(current_user)
end
end
# Each search has subscriptions to certain services (approx. 4).
child :service_subscriptions do
# This contains a few attributes and 2 fairly innocuous method calls.
extends "service_subscriptions/show"
end
だから私はこれについて何かをする必要があるようですが、どのアプローチを取るべきかわかりません。ここに私が持っている潜在的なアイデアのリストがあります:
パフォーマンス改善のアイデア
インターフェースの
ダムダウン おそらく、実際のデータの存在を必要としない、ユーザーに情報を提示する方法を思い付くことができます。なぜこれを絶対に行う必要があるのか わかりませんが、Trelloなどの他の単一ページアプリには信じられないほど複雑なインターフェースがあります.
コンセプトのページ付け コンセプト
をページ付けすると、毎回データベースから抽出されるデータの量が減ります。ただし、劣ったユーザーインターフェイスを生成します。
キャッシュ
現時点では、ページを更新すると、検索全体が DB から再度抽出されます。おそらく、アプリの一部をキャッシュして、DB ヒットを減らすことができます。私が扱っているデータの多くは静的ではないため、これは面倒に思えます。
複数のリクエスト
JSON をページに埋め込まずにページを提供するのは技術的には良くありませんが、データを取り込まずにページを読み込んでからデータをフェッチすると、ユーザーは処理が速くなったように感じるかもしれません。
インデックス
すべての外部キーにインデックスがあることを確認する必要があります。また、インデックス (お気に入りなど) があると役立つ場所についても考えて追加する必要があります。
メソッド呼び出しを DB に移動
おそらく、ビュー レイヤーで実行した反復の結果の一部を DB にキャッシュし、計算する代わりにそれらを引き出すことができます。または、読み取り時ではなく書き込み時に同期することもできます。
質問
私が何に時間を費やすべきかについて何か提案はありますか?