sql >> Database >  >> RDS >> PostgreSQL

Hoe stem je een Ruby on Rails-applicatie af die draait op Heroku en die gebruikmaakt van Heroku Postgres op productieniveau?

Ik heb het probleem vooral ontdekt.

Onthoud eerst mijn code in de weergave:

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

Hier krijg ik elke aflevering episode_image binnen mijn iteratie. Ook al gebruik ik includes in mijn controller was er een grote fout in mijn tabelschema. Ik had geen index voor episode_id in mijn episode_images tafel! . Dit zorgde voor een extreem hoge zoektijd. Ik heb het gevonden met behulp van de databaserapporten van New Relic. Alle andere zoektijden waren 0,5 ms of 2-3 ms, maar episode.episode_image veroorzaakte bijna 6500 ms!

Ik weet niet veel over de relatie tussen querytijd en toepassingsuitvoering, maar toen ik index aan mijn episode_images toevoegde tafel, nu kan ik duidelijk het verschil zien. Als u uw databaseschema correct heeft, zult u waarschijnlijk geen problemen ondervinden met schalen via Heroku. Maar geen enkele dyno kan je helpen met een slecht ontworpen database.

Voor mensen die mogelijk tegen hetzelfde probleem aanlopen, wil ik u vertellen over enkele van mijn bevindingen over de relatie tussen Heroku-webdyno's, Unicorn-werkers en actieve verbindingen van Postgresql:

Kortom, Heroku biedt je een dyno, een soort kleine virtuele machine met 1 kern en 512 MB RAM. In die kleine virtuele machine draait je Unicorn-server. Unicorn heeft een masterproces en werkprocessen. Elk van je Unicorn-werkers heeft zijn eigen permanente verbinding met je bestaande Postgresql-server (vergeet niet om dit ) Het betekent in feite dat wanneer je een Heroku-dyno hebt met 3 Unicorn-werkers erop, je ten minste 4 actieve verbindingen hebt. Als je 2 webdyno's hebt, heb je minstens 8 actieve verbindingen.

Stel dat u een standaard Tengu Postgres hebt met een limiet van 200 gelijktijdige verbindingen. Als je problematische vragen hebt met een slecht db-ontwerp, kunnen db en meer dyno's je niet redden zonder cache... Als je langlopende vragen hebt, heb je geen andere keuze dan caching, denk ik.

Al het bovenstaande zijn mijn eigen bevindingen, als er iets mis mee is, waarschuw me dan alsjeblieft door je opmerkingen.




  1. Selecteer woorden tussen komma's (exclusief dubbele aanhalingstekens) met regexp_substr

  2. Ontdek welk valutasymbool uw sessie gebruikt in Oracle

  3. PHP PDO - Er is geen actieve transactie

  4. MYSQL-trigger wordt automatisch verwijderd