SystemExit fréquente dans Ruby lors d'appels HTTP

J'ai un site Web ruby on Rails qui effectue des appels HTTP à un service Web externe.

Environ une fois par jour, je reçois un message d'erreur SystemExit (piletrace ci-dessous) où un appel au service a échoué. Si j'essaye alors exactement la même question sur mon site quelques instants plus tard cela fonctionne très bien. Cela s'est produit depuis que le site est entré en production et je n'ai pas eu de chance pour savoir ce qui le provoquait.

Ruby est la version 1.8.6 et rails est la version 1.2.6.

Quelqu'un d'autre a ce problème?

C'est l'erreur et stacktrace.

Un SystemExit s'est produit   /usr/local/lib/ruby/gems/1.8/gems/rails-1.2.6/lib/fcgi_handler.rb:116:in   Sortie'   /usr/local/lib/ruby/gems/1.8/gems/rails-1.2.6/lib/fcgi_handler.rb:116:in   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 appeler'   /usr/local/lib/ruby/1.8/net/protocol.rb:133:in sysread '   /usr/local/lib/ruby/1.8/net/protocol.rb:133:in rbuf_fill '   /usr/local/lib/ruby/1.8/timeout.rb:56:in timeout '   /usr/local/lib/ruby/1.8/timeout.rb:76:in timeout '   /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:in read_new '   /usr/local/lib/ruby/1.8/net/http.rb:1047:in request '   /usr/local/lib/ruby/1.8/net/http.rb:945:in request_get '   /usr/local/lib/ruby/1.8/net/http.rb:380:in get_response '   /usr/local/lib/ruby/1.8/net/http.rb:543:in start '   /usr/local/lib/ruby/1.8/net/http.rb:379:in get_response '

0
ajouté édité
Vues: 2

7 Réponses

Vous constaterez que c'est souvent le cas, lorsque vous essayez de construire quelque chose à partir de pièces standard qui reproduisent un produit existant, presque toujours les pièces coûtent plus cher que le produit existant. La raison en est qu'ils peuvent produire en masse leur produit, l'achat de pièces en vrac réduit les coûts, etc.

Regardez de près les 'cartes série sur Bluetooth', certaines d'entre elles supportent des profils différents. Ce que vous cherchez est un module qui supporte le profil Bluetooth HID (Human Interface Device, aka souris, clavier, joystick, télécommande Wii, etc).

Consultez cette question précédente , elle répertorie plusieurs modules Bluetooth, que vous pouvez acheter en single quantités pour des prix assez raisonnables, certains ou tous d'entre eux devraient soutenir HID.

11
ajouté
Pour trouver ceux qui sont spécifiquement: Cliquez sur chacun d'eux, et lisez la page et voir si elle dit "HID" n'importe où sur elle. Ensuite, si vous voulez savoir combien de travail ce serait: lisez la fiche technique du module et voyez combien vous avez à faire pour l'initialiser, envoyer des événements, etc. Beaucoup de modules avec lesquels vous pouvez communiquer via UART, qui est habituellement assez simple à partir d'un microcontrôleur, avec des commandes "AT", similaires à la façon dont les modems fonctionnaient dans les temps anciens. Encore une fois la fiche technique devrait énumé
ajouté l'auteur Marcel, source
D'accord. Mais lesquels, spécifiquement, et combien de travail est impliqué pour les amener à le soutenir?
ajouté l'auteur Lehane, source
Donc comme ça? sparkfun.com/products/10253
ajouté l'auteur Lehane, source

Ce n'est probablement pas la solution que vous cherchez, mais je pensais que c'était pertinent à la question:

https://serverfault.com/questions/ 43615/setup-a-linux-computer-to-act-as-a-bluetooth-clavier-souris

2
ajouté

Votre meilleur pari est de démonter une combinaison clavier/souris Bluetooth et de les désosser comme vous l'avez décrit. Placez une portée sur les lignes de souris avant de la détruire pour pouvoir voir ce que vous devez faire.

Le problème avec l'achat d'un module (dont la plupart feront des profils SPP/DUN prêts à l'emploi et agissent comme un port série) est que vous ne pouvez pas mettre la main sur les SDK nécessaires pour reprogrammer ces puces pour faire autre chose. Vous avez besoin d'un module avec un microprogramme HCI ("Host Controller Interface"). Cela exposera la pile Bluetooth à votre microcontrôleur via une interface série bien spécifiée. Vous aurez besoin d'une bonne compréhension de Bluetooth car, pour que le module fasse quoi que ce soit, il faudra interpréter les événements reçus via HCI et faire avancer la machine d'état en invoquant l'étape suivante via HCI. Les bonnes nouvelles sont qu'il existe de nombreux exemples à examiner car les interfaces Bluetooth côté hôte l'exposent au système d'exploitation.

Un module idéal (si une telle chose existe) serait un module Bluetooth 4.1 avec support BLE qui expose HOGP (HID sur protocole GATT) à un microcontrôleur. HOGP vous permet d'utiliser des descripteurs de rapport USB HID et est très proche d'être "USB sans fil". Malheureusement, le support de BT4.1/HOGP n'est pas intégré jusqu'à très récemment Android et Windows 8. Un module qui parlait à un microcontrôleur et le laissait définir des descripteurs de rapport et ensuite envoyer des rapports serait une chose très pratique.

2
ajouté

Utiliser fcgi avec ruby est connu pour être très buggé.

Pratiquement tout le monde est passé à Mongrel pour cette raison, et je vous recommande de faire la même chose.

0
ajouté

Je voudrais également jeter un oeil à Passenger . Il est beaucoup plus facile d'y aller que la solution traditionnelle d'Apache / nginx + Mongrel.

0
ajouté

Cela fait un moment que j'ai utilisé FCGI mais je pense qu'un processus FCGI pourrait lancer un SystemExit si le thread prenait trop de temps. Cela peut être le service Web ne répond pas ou même une requête DNS lente. Certains résultats Google montrent une erreur similaire avec Python et FCGI, donc passer à mongrel serait une bonne idée. Cet article est ma référence que j'ai utilisé pour configurer mongrel et je me réfère toujours à elle.

0
ajouté

J'avais l'habitude d'obtenir tout le temps sur Apache1 / fastcgi. Je pense que c'est causé par le raccrochage de fastcgi avant que ruby ait terminé.

Passer au bâtard est un bon premier pas, mais il y a plus à faire. C'est une mauvaise idée d'éliminer les services Web sur les pages en direct, en particulier à partir de Rails. Rails n'est pas thread-safe. Le nombre de connexions simultanées que vous pouvez prendre en charge est égal au nombre de métis (ou de processus Passenger) dans votre cluster.

Si vous avez un métis et que quelqu'un accède à une page qui appelle un service Web qui met 10 secondes à se terminer, chaque requête sur votre site Web expirera pendant cette période. La plupart des équilibreurs de charge passent à travers vos bâtons à l'aveuglette, donc si vous avez deux bâtards, toutes les autres demandes expireront.

Tout ce qui peut être imprévisiblement lent doit se produire dans une file d'attente. Le premier appel à / slow / action ajoute le travail à la file d'attente et / slow / action continue de rafraîchir via les actualisations de page ou les requêtes via ajax jusqu'à ce que le travail soit terminé, puis vous obtenez les résultats de la file d'attente. Il y a quelques files d'attente pour Rails de nos jours, mais la plus ancienne et probablement la plus utilisée est BackgroundRB .

Une autre alternative, en fonction de la nature de votre application, consiste à supprimer le service toutes les N minutes via cron, à mettre en cache les données localement et à faire lire votre page en direct depuis le cache.

0
ajouté