2017-07-06 55 views
0

快速問題。我正在爲藝術家構建一個投資組合應用程序,目前有9個不同類型的項目(展覽,新聞,新聞,文本,攝影等)。作爲一名視覺藝術家,他希望他的網站能夠代表他的視覺。問:數據庫調用的Rails最佳實踐

背景:

編輯:信息從控制器最初加載,而不是從一個API調用。後來我將它改爲API調用,因爲我擔心控制器的9個調用太多了。

這意味着該網站是圖形和信息沉重。載入所有信息僅用於導航是15 MB(這是在需要時縮小圖像並通過tinypng運行它們之後)。我將所有的信息放到不同的佈局視圖中,只有在需要保持加載時間和抵消時纔會呈現,這有助於加快速度。但是這個設置無論哪種方式導致在每個頁面加載9個不同的數據庫調用。

我將後端重建爲API端點,因此只在需要時才從數據庫中提取信息。這雖然稍微增加了信息的加載時間,但如果這樣的話只有一秒多。我不會爲此感到困擾,但藝術家可能是。

實際問題

所以我一直在想,在過去的幾天裏,是9數據庫調用太多的一次,它會如何影響可擴展性? Postgres數據庫以供參考。正常的負載,我無法想象有太多的用戶會在任何時間查看網站,所以我不會擔心它。但是,當他舉辦展覽會時,有100-500人同時使用該網站,那900-4500數據庫會調用每個網頁加載。或者通過API路線,人們在找到他們想要的東西之前只能進行1或2個電話。我只是想按照行業最佳做法來處理這種情況,這似乎是問這個問題的好時機。

此外,目前它將託管在heroku上,並且想知道哪種方式(一次或API路由)對於處理postgres連接會更好,因爲免費層(這將足夠95%的時間)具有限制20個連接。儘管有幾個月他有一場演出,但我們可以將它提升到下一個級別的60個連線。

+0

第一次加載頁面時,每個API調用需要多長時間?對我來說九個看起來不是很多,但是聽起來每個電話都可能下載相當多的數據? – quicklikerabbit

+0

@quicklikerabbit所以,我添加了一個編輯,它沒有清楚。原來的9個調用來自應用程序控制器,它不是一個API調用。現在頁面需要1.19-1.63秒才能加載(在主屏幕上開始加載圖像之前)。所以9個電話現在都完成了。對於API版本,dom在<1秒內加載,並且API調用最多需要200毫秒才能加載(無節流),但長達96毫秒。但隨後圖像將開始加載* – user2303016

+1

聽起來像您將從緩存圖像和使用CDN中受益。除非你開始收到嚴重的n + 1數據庫調用問題,否則postgresql將成爲你係統中性能最高的部分。 –

回答

0

你所描述的聽起來不像一個動態網站。除非它有一個管理部分來修改內容,否則幾乎沒有理由將數據保存在數據庫中或使用Rails等Web應用程序。

我會建議使用Ruby靜態網站生成器。 Jekyll是最受歡迎的一個,但我建議Middleman,因爲它使得從Rails視圖模板和幫助程序遷移變得非常容易。

如果你真的想使用Rails,那麼你的視圖緩存就是教科書的用例。如果內容是靜態的,則沒有理由在每個頁面視圖中重複加載它。

此外,每個頁面視圖有9個DB查詢並不意味着太多。它可能很少,或者可能很多,這取決於查詢。

+0

有一個管理部分。每當添加新作品時,我都希望藝術家儘可能簡單地更新頁面,這樣我就爲它創建了一個CMS後端,這就是爲什麼我要動態地加載內容而不是靜態的。 – user2303016

0

看看這篇博客文章關於Rails Database Best Practices

不知道你的應用程序太多,看看你是否可以減少與範圍和/或查詢對象的數據庫調用的數量。將呼叫與.includes().join()結合起來也是一種降低負載的方法。查看數據是否可以與.group().having()彙總。如果每個調用都是必需的,那麼通過引入一些索引,您可能會增加查詢的速度。

根據我的經驗,我不會說有一個行業標準的頁面加載應該有最大數量的數據庫調用;它真的取決於正在返回的數據。

+0

好的,謝謝!我只是不想有一天發現該網站有問題,因爲他有一個藝術展覽,500人一次試圖使用這個網站,數據庫變慢或變得更糟,因爲太多的點擊一次都沒有進行優化對於。但如果它更多地關注正在加載的內容而不是命中,那麼我就不那麼擔心了。 – user2303016

0

我不是專家,但我一直在優化方面處理了很多問題,我給我自己的一些建議:

  • 通過CDN服務於所有靜態資產 - 除非你真的知道你在做什麼讓CDN手柄緩存

  • 你提到它有一個內置的CMS爲它 - 版本所有圖像上傳到不同的大小,所以你可以通過版本優化顯示(拇指拇指,中型(最大寬度1920 < - > 3840),只有保存/使用比這些尺寸更大,如果真的如此eded)

  • 瞭解JPG壓縮 - 您可以將其從通常的100%降低到70%左右(這取決於實際圖像),而不會丟失任何有意義的信息 - 這與軌道無關,應該按照優化所有圖像內容的步驟

  • 用於優化通過CMS添加的圖像,您可以使用RMagick或Minimagick。在RMagick您處理圖像時,有機會獲得self.quality - 除非影像具有透明膠片始終轉換爲JPG &質量下降到70 < - > 80%

  • 緩存查詢到DB自己 - heroku caching

我個人使用的技術僅HTML渲染

function loadPortfolios() { 
    var collections = $(".profile_collection"); 
    var imageObj = new Image(); 
    var image; 
    $.each(collections, function() { 
    image = $(this).data('source'); 
    imageObj.src = image; 
    $(this).css({ backgroundImage: 'url('+image+')', backgroundRepeat: 'no-repeat', backgroundSize: "cover", backgroundPosition: 'center' }); 
    }); 
    $.each($('.image_portfolio, .hover_image'), function() { 
    imageObj.src=$(this).data('url'); 
    }); 
} 

此工程由具有在各類「投資組合」的數據屬性後加載圖像。所以一旦這個網站被加載並且JS準備好了,這個函數就會被調用。實例化一個JS Image對象(new Image()),然後將URL歸屬到.src屬性使它開始加載圖像。我還沒有對它進行基準測試,但很快 - 不確定它是否真的起了作用,但如果你嘗試了,請告訴我。我之所以這樣使用它,是因爲減少外部元素請求的數量對於加載JS來說更重要,以便網站儘可能地正常運行。然後開始獲取圖像。

我相信還有很多其他的優化可以完成。 編輯:

如果您也陷入數據庫查詢陷阱,看看你在控制器和視圖中使用的輔助方法的數量(當你加載了很多東西,它可以真正呈現事情變慢)。然後看看你如何查詢事情。一些例子可以幫助。

+0

嘿謝謝你的回覆。 有人也提到了CDN,因爲我使用AWS的圖像,我會檢查出雲端,所以謝謝。此外,圖像已經優化和大小,但也感謝。我一直在鑽研自己,以便更好地瞭解網站加載速度(因此提出問題),所以始終是我一直在做的事情。 – user2303016

+0

Cloudfront太棒了。我自己一直在使用它,與從s3直接提供服務相比,它確實加快了速度。這其中大部分實際上與你正在服務的內容有關,而不是數據庫查詢本身。我還沒有深入到自己的研究中,僅僅因爲我還沒有得到它的需要。如果您有任何想要優化的樣本,最好提供 –