sql >> Databasteknik >  >> RDS >> PostgreSQL

Hur ställer man in en Ruby on Rails-applikation som körs på Heroku som använder produktionsnivån Heroku Postgres?

Jag kom särskilt på problemet.

Kom först ihåg min kod i vyn:

<% @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 %>

Här får jag varje avsnitt episode_image inuti min iteration. Även om jag har använt includes i min styrenhet var det ett stort misstag i mitt bordsschema. Jag hade inget index för episode_id i mina episode_images bord! . Detta orsakade en extremt lång frågetid. Jag har hittat det med hjälp av New Relics databasrapporter. Alla andra frågetider var 0,5 ms eller 2-3 ms men episode.episode_image orsakade nästan 6500ms!

Jag vet inte mycket om förhållandet mellan frågetid och applikationskörning, men eftersom jag lade till index till mina episode_images tabell, nu kan jag tydligt se skillnaden. Om du har ditt databasschema ordentligt kommer du förmodligen inte att möta några problem med skalning via Heroku. Men vilken dyno som helst kan inte hjälpa dig med en dåligt utformad databas.

För personer som kan stöta på samma problem, skulle jag vilja berätta om några av mina upptäckter av relationen mellan Heroku webbdynor, Unicorn-arbetare och Postgresql aktiva anslutningar:

I grund och botten ger Heroku dig en dyno som är någon slags liten virtuell maskin med 1 kärna och 512 MB ram. Inuti den lilla virtuella maskinen kör din Unicorn-server. Unicorn har en mästarprocess och arbetsprocesser. Var och en av dina Unicorn-arbetare har sin egen permanenta anslutning till din befintliga Postgresql-server (Glöm inte att kolla in det här ) Det betyder i princip att när du har en Heroku dyno med 3 Unicorn-arbetare som körs på den, har du minst 4 aktiva anslutningar. Om du har 2 webbdynor har du minst 8 aktiva anslutningar.

Låt oss säga att du har en Standard Tengu Postgres med en gräns på 200 samtidiga anslutningar. Om du har problematiska frågor med dålig db-design kan varken db eller fler dynos rädda dig utan cache... Om du har långa frågor har du inget annat val än att cache, tror jag.

Allt ovan är mina egna upptäckter, om det är något fel med dem, varna mig genom dina kommentarer.




  1. Är EXISTS effektivare än COUNT(*)>0?

  2. INSERT INTO tabell OM tabell finns annars SKAPA TABELL

  3. Kan jag be Postgresql att ignorera fel i en transaktion

  4. Lista alla funktioner i Oracle Database