[英]Scaling up a ruby, activerecord, mysql app
我有一個應用...
該應用程序對金融產品進行市場比較 - 對於給定的報價請求,它會聯系其他幾個網站以獲取報價。 然后它會向用戶提供結果 - 其詳細信息有幾個引號。
為了管理這些請求,他們將保存到MySQL,然后我的應用程序啟動,獲取待處理的引號並將這些引用到線程(所有相同的Linux框)以處理每個站點查找。
我使用JRuby,因為我有線程/數據庫相關的問題。 使用Java線程池來控制線程數。 使用當前的硬件/ VPS - 它可以處理大約200個線程。 很多限制似乎與每個線程抓住他們自己的MySQL連接有關 - 抓住報價細節並保存結果。 我們希望處理更多的並發線程,因此尋找擴展的方法。
想知道走哪條路......
從這個鏈接原因是沒有擴大規模與-out? - 看起來這個問題適合運行更多的機器來解決它。
所以,任何關於走哪條路的想法......
干杯,克里斯
我對此類問題的常用方法是密切關注您正在進行的數據庫查詢並積極地調整它們。 僅檢索您需要的內容,跳過未明確使用的列,並且非常謹慎地加載您完全不需要的內容。
您經常會發現,通過添加索引或策略性地對數據庫中的某些屬性進行反規范化可以獲得顯着的速度提升,以避免丑陋,耗時的JOIN
操作。
考慮緩存:最快的數據庫調用是從未進行過的。 利用Memcached之類的東西來保存適度耗時的記錄檢索結果並不難,如果仔細完成,即使通過幾種方法引導您的更新,也很容易使其失效並過期。
對於調度工作程序,可以在Redis中實現一個簡單的先進先出隊列,以從MySQL本身卸載大量處理開銷。 如果您按照示例添加,這通常非常簡單。
像Memcached這樣的緩存可以處理極高的流量,因此只要有可能,就要對其進行緩存,以避免因為最后的事情而訪問數據庫。
如果您已經用盡了這些選項,那么就需要更多的前端服務器和更多的數據庫容量,但只有這樣。
排隊是最容易實現的事情。 使用這樣的東西: http : //beanstalkd.github.com/beaneater/
基本上,您可以使用async.
前置方法async.
這將把它們放入隊列並執行它們。 他們排隊,工人可以是同一個服務器或不同的服務器。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.