Zejména jsem přišel na problém.
Nejprve si zapamatujte můj kód v zobrazení:
<% @episodes.each do |t| %>
<% if !t.episode_image.blank? %>
<li><%= image_tag(t.episode_image.image(:thumb)) %></li>
<% end %>
<li><%= t.episode_urls.first.mas_path if !t.episode_urls.first.blank?%></li>
<li><%= t.title %></li>
<% end %>
Zde dostávám jednotlivé epizody episode_image
uvnitř mé iterace. I když jsem používal includes
v mém ovladači došlo k velké chybě ve schématu tabulky. Neměl jsem index pro episode_id
v mých episode_images
stůl! . To způsobilo extrémně dlouhou dobu dotazování. Našel jsem to pomocí zpráv databáze New Relic. Všechny ostatní doby dotazu byly 0,5 ms nebo 2–3 ms, ale episode.episode_image
způsobilo téměř 6500 ms!
Nevím toho moc o vztahu mezi dobou dotazu a spouštěním aplikace, ale když jsem přidal index do svých episode_images
stůl, teď jasně vidím rozdíl. Pokud máte správně schéma databáze, pravděpodobně nebudete čelit žádnému problému se škálováním přes Heroku. Ale žádný dyno vám nemůže pomoci se špatně navrženou databází.
Pro lidi, kteří by se mohli setkat se stejným problémem, bych vám rád řekl o některých svých zjištěních týkajících se vztahu mezi webovými dynos Heroku, pracovníky Unicornu a aktivními spojeními Postgresql:
Heroku vám v podstatě poskytuje dyno, což je jakýsi malý virtuální stroj s 1 jádrem a 512 MB RAM. Uvnitř tohoto malého virtuálního stroje běží váš server Unicorn. Unicorn má hlavní proces a pracovní procesy. Každý z vašich pracovníků Unicorn má své vlastní trvalé připojení k vašemu stávajícímu serveru Postgresql (nezapomeňte se podívat na toto ) V podstatě to znamená, že když máte dyno Heroku, na kterém běží 3 pracovníci Unicorn, máte alespoň 4 aktivní připojení. Pokud máte 2 webové dyno, máte alespoň 8 aktivních připojení.
Řekněme, že máte standardní Tengu Postgres s limitem 200 souběžných připojení. Pokud máte problematické dotazy se špatným designem db, ani db, ani více dynos vás nemůže zachránit bez mezipaměti... Pokud máte dlouho běžící dotazy, nemáte jinou možnost než ukládání do mezipaměti, myslím.
Vše výše uvedené jsou moje vlastní zjištění, pokud je s nimi něco v nepořádku, prosím varujte mě svými komentáři.