Η συχνή SystemExit σε Ruby όταν πραγματοποιείτε κλήσεις HTTP

ψήφοι
18

Έχω ένα Ruby on Rails ιστοσελίδα που κάνει τις κλήσεις HTTP σε μια εξωτερική υπηρεσία Web.

Περίπου μία φορά την ημέρα παίρνω μια SystemExit (stacktrace παρακάτω) email λάθους όταν έχει αποτύχει μια κλήση στην υπηρεσία. Αν ήμουν τότε δοκιμάστε το ίδιο ακριβώς ερώτημα για στιγμές ιστοσελίδα μου αργότερα δουλεύει μια χαρά. Είναι συμβαίνει επειδή η ιστοσελίδα πήγε ζουν και είχα καμία τύχη εντοπισμό τι το προκαλεί.

Ruby είναι η έκδοση 1.8.6 και ράγες είναι η έκδοση 1.2.6.

Έχει κανένας άλλος αυτό το προβλήμα;

Αυτό είναι το λάθος και stacktrace.

Μια SystemExit συνέβη /usr/local/lib/ruby/gems/1.8/gems/rails-1.2.6/lib/fcgi_handler.rb:116:in εξόδου»/usr/local/lib/ruby/gems/1.8/gems/ ράγες-1.2.6 / lib / fcgi_handler.rb: 116: στο exit_now_handler»/usr/local/lib/ruby/gems/1.8/gems/activesupport-1.4.4/lib/active_support/inflector.rb:250:in to_proc '/usr/local/lib/ruby/1.8/net/protocol.rb:133:in αποκαλούν' /usr/local/lib/ruby/1.8/net/protocol.rb:133:in sysread»/ usr / local / lib / ruby ​​/ 1.8 / net / protocol.rb: 133: στο rbuf_fill '/usr/local/lib/ruby/1.8/timeout.rb:56:in χρονικό όριο' /usr/local/lib/ruby/1.8/timeout. RB: 76: στο χρονικό όριο '/usr/local/lib/ruby/1.8/net/protocol.rb:132:in rbuf_fill' /usr/local/lib/ruby/1.8/net/protocol.rb:116:in readuntil '/usr/local/lib/ruby/1.8/net/protocol.rb:126:in Readline' /usr/local/lib/ruby/1.8/net/http.rb:2017:in read_status_line»/ usr / local / lib / ruby ​​/ 1.8 / net / http.rb: 2006: στην read_new '/usr/local/lib/ruby/1.8/net/http.rb:1047:in αίτημα' /usr/local/lib/ruby/1.8/ net / http.rb: 945: στο request_get»/usr/local/lib/ruby/1.8/net/http.rb:380:i n εντολή GET RESPONSE «/usr/local/lib/ruby/1.8/net/http.rb:543:in ξεκινήσει» /usr/local/lib/ruby/1.8/net/http.rb:379:in εντολή GET RESPONSE»

Δημοσιεύθηκε 02/08/2008 στις 18:26
πηγή χρήστη
Σε άλλες γλώσσες...                            


4 απαντήσεις

ψήφοι
8

Ήταν λίγο από τότε που χρησιμοποιείται FCGI αλλά νομίζω ότι μια διαδικασία FCGI θα μπορούσε να ρίξει μια SystemExit αν το νήμα έπαιρνε πάρα πολύ καιρό. Αυτό θα μπορούσε να είναι η υπηρεσία web δεν αποκρίνεται ή ακόμα και μια αργή ερώτημα DNS. Ορισμένα αποτελέσματα google δείχνουν ένα παρόμοιο λάθος με Python και FCGI τόσο συγκινητικό να μιγάς θα ήταν μια καλή ιδέα. Αυτή η θέση είναι η αναφορά μου συνήθιζα να μιγάς εγκατάσταση και εξακολουθώ να επανέλθω σε αυτό.

Απαντήθηκε 03/08/2008 στις 06:22
πηγή χρήστη

ψήφοι
8

Χρησιμοποιώντας fcgi με Ruby είναι γνωστό ότι είναι πολύ προβληματικό.

Σχεδόν ο καθένας έχει μετακινηθεί σε Mongrel για το λόγο αυτό, και σας συνιστώ να κάνετε το ίδιο.

Απαντήθηκε 02/08/2008 στις 18:50
πηγή χρήστη

ψήφοι
5

Θα χρησιμοποιηθεί για να πάρει αυτά όλη την ώρα για Apache1 / FastCGI. Νομίζω ότι προκαλείται από fastcgi ανάρτηση πριν γίνει Ruby.

Η στροφή σε μιγάς είναι ένα καλό πρώτο βήμα, αλλά υπάρχουν και άλλα να κάνει. Είναι μια κακή ιδέα να θανατώσουν από διαδικτυακές υπηρεσίες σε ζωντανή σελίδες, ιδιαίτερα από Rails. Ράγες δεν είναι νήμα-ασφαλή. Ο αριθμός των ταυτόχρονων συνδέσεων που μπορεί να υποστηρίξει ισούται με τον αριθμό των mongrels (ή διαδικασίες επιβατών) στο ταμπλό σας.

Εάν έχετε ένα μιγάς και κάποιος αποκτά πρόσβαση σε μια σελίδα που απαιτεί μια διαδικτυακή υπηρεσία που διαρκεί 10 δευτερόλεπτα για να time out, κάθε αίτημα για την ιστοσελίδα σας θα χρονικού ορίου κατά τη διάρκεια αυτού του χρόνου. Τα περισσότερα από τα balancers φορτίο μόνο τον κύκλο μέσα από mongrels σας τυφλά, οπότε αν έχετε δύο mongrels, κάθε άλλο αίτημα θα χρονικού ορίου.

Οτιδήποτε μπορεί να είναι απρόβλεπτα αργή πρέπει να συμβεί σε μια ουρά εργασίας. Το πρώτο χτύπημα στο / αργή / δράση προσθέτει την εργασία στην ουρά, και / αργή / δράση συνεχίζει να ανανεώσετε μέσω της σελίδα ανανεώνεται ή ερωτήσεις μέσω ajax έως ότου η δουλειά έχει τελειώσει, και τότε θα έχετε τα αποτελέσματά σας από την ουρά εργασιών. Υπάρχουν μερικές ουρές εργασιών για τις ράγες στις μέρες μας, αλλά το παλαιότερο και ίσως πιο ευρέως χρησιμοποιούμενα ένα είναι BackgroundRB .

Μια άλλη εναλλακτική λύση, ανάλογα με τη φύση της εφαρμογής σας, είναι να θανατώσουν την υπηρεσία κάθε N λεπτά μέσω cron, cache τα δεδομένα σε τοπικό επίπεδο, και να έχουν ζωντανή τη σελίδα σας να διαβάσει από τη μνήμη cache.

Απαντήθηκε 30/08/2008 στις 05:55
πηγή χρήστη

ψήφοι
1

Θα λάβει επίσης μια ματιά επιβατών . Είναι πολύ πιο εύκολο να πάρει τη μετάβαση από την παραδοσιακή λύση του Apache / nginx + Mongrel.

Απαντήθηκε 11/08/2008 στις 17:36
πηγή χρήστη

Cookies help us deliver our services. By using our services, you agree to our use of cookies. Learn more