2011-11-11 11 views
5

Pracuję z XMPP i mam wywołanie zwrotne, które jest aktywowane w przypadku każdej wysyłanej wiadomości. Moim celem jest wysłanie danych przychodzących przez wiadomość do API w ramach wywołania zwrotnego i na podstawie odpowiedzi wysłać coś za pomocą klienta XMPP.Asynchroniczne metody wywoływania z Ruby jak z Ajaxem

  1. Typ użytkownika wiadomość (Przeglądarka Chat Client)
  2. wiadomość dotrze do serwera poprzez XMPP
  3. wiadomość zostanie wysłana do API
  4. Response otrzymania
  5. odpowiedź jest odsyłany do klienta czatu .

Mój kod to następująco

admin_muc_client.activate_message_callbacks do |m|    
    sender = m.from.resource 
    room_slug = m.from.node 
    message = m.body     

    r = HTTParty.get('http://example.com/api/v1/query?msg=message') 
    Rails.logger.debug(r.inspect) 
    admin_muc_client.send_message("Message #{r.body}") if m.from.resource != 'admin' 
end 

Moim problemem jest to, że ponieważ zwrotna jest i walczył, a wniosek do API byłoby wywołanie blokowanie to może stać się wąskim gardłem dla całej aplikacji . Wolałbym użyć czegoś takiego jak AJAX dla Javascript, który wystrzeliłby żądanie i kiedy odpowiedź jest dostępna wysyłać dane. Jak mogę to zaimplementować w Ruby?

Spojrzałem na delayed_job i backgroundrb, które wyglądają jak narzędzia do operacji ognia i zapomnienia. Potrzebowałbym czegoś, co aktywuje wywołanie zwrotne w sposób asynchroniczny z odpowiedzią.

Naprawdę bardzo doceniam pomoc w uzyskaniu asynchronicznego zachowania, które chcę. Jestem również zaznajomiony z kolejkami komunikatów, takimi jak RabbitMQ, który moim zdaniem byłby dodatkiem o znacznej złożoności.

Odpowiedz

5

Czy spojrzałeś na girl_friday? Z jego wiki -

girl_friday jest biblioteką Ruby do wykonywania zadań asynchronicznych. Często nie chcesz blokować odpowiedzi w sieci, wykonując pewne czynności, takie jak wysyłanie wiadomości e-mail, więc możesz po prostu użyć tego klejnotu, aby wykonać go w tle. Działa z każdą aplikacją Ruby, w tym z aplikacjami Rails 3.

Dlaczego nie użyć żadnej z miliardów innych rozwiązań asynchronicznych (Resque, dj itp.)? Ponieważ girl_friday jest łatwiejsze i bardziej wydajne niż te rozwiązania: girl_friday działa w twoim procesie Railsowym i używa wzorca aktora do bezpiecznej współbieżności. Ponieważ działa on w tym samym procesie, nie trzeba monitorować oddzielnego zestawu procesów, wdrażać oddzielnej bazy kodów, marnować setki dodatkowych MB w pamięci RAM dla tych procesów itd. Zobacz moje wprowadzenie do aktorów w języku Ruby, aby uzyskać więcej szczegółów.

Musisz napisać kod zabezpieczający wątek. Nie jest to trudne: wzorzec aktora oznacza, że ​​otrzymujesz wiadomość i przetwarzasz ją. Brak wspólnych danych, które wymagają blokad i mogą prowadzić do zakleszczenia w kodzie aplikacji. Ponieważ girl_friday używa Threads under the covers, musisz upewnić się, że Twoje środowisko Ruby może wydajnie wykonywać wątki. JRuby, Rubinius 1.2 i Ruby 1.9.2 powinny wystarczyć do większości zastosowań. Nie obsługuję języka Ruby 1.8 ze względu na słabą obsługę wątków.

Myślę, że to jest to, czego szukasz.

+0

Niesamowite da to strzał. Może to jest to. – Sid

+0

To, co znajduję, działa w konsoli, ale nie dodaje zadania do kolejki po uruchomieniu w aplikacji w trybie programowania. BTW Prowadzę pasażera i apache'a w trybie deweloperskim. – Sid

Powiązane problemy