2011-11-11 21 views
5

ile Ruby gibi çağrıları çağırıyor XMPP ile çalışıyorum ve her mesajın gönderilmesi durumunda etkinleştirilmiş bir mesaj geri çağırma var. Amacım, mesajla ulaşan verileri geri aramada bir API'ye göndermek ve XMPP istemcisini kullanarak yanıtı geri vermek.Eş zamansız yöntemler Ajax

  1. Kullanıcı tipi mesajı (Tarayıcı Sohbet İstemci)
  2. İleti
  3. İleti
  4. Tepki sohbet istemcisi geri gönderilir
  5. Yanıtı alındığında API gönderilir XMPP aracılığıyla sunucuya ulaşır .

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 
aşağıdaki gibi bunun için benim kodudur

Buradaki endişe geri arama evented ve API isteği bir engelleme çağrısı olacağından tüm bu uygulama için bir darboğaz haline gelebilir olduğunu . Javascript için AJAX gibi bir şey kullanmayı tercih ederim, bu da isteği tetikleyecek ve yanıt verilebildiği zaman veri gönderecektir. Bunu Ruby'de nasıl uygulayabilirim?

Yangın ve boşaltma işlemleri için kullanılan araçlar gibi görünen delayed_job ve backgroundrb'ye baktım. Yanıtla senkronize olmayan bir şekilde bir geri bildirimi etkinleştiren bir şeye ihtiyacım var.

İstediğim eşzamansız davranışa nasıl ulaşılacağına ilişkin bazı yardımları gerçekten takdir ediyorum. Ayrıca, önemli karmaşıklıkların eklendiğini düşündüğüm RabbitMQ gibi mesaj sıralarına aşinayım.

cevap

5

girl_friday'a baktınız mı? Buradan wiki - asimetrik görevleri gerçekleştirmek için bir Ruby kütüphanesidir. Wiki -

girl_friday Çoğu zaman, bir e-posta göndermek gibi bir görevi yerine getirerek bir web yanıtını engellemek istemezsiniz, böylece arka planda bunu gerçekleştirmek için bu gemiyi kullanabilirsiniz. Rails 3 uygulamaları da dahil olmak üzere herhangi bir Ruby uygulamasıyla çalışır.

Neden diğer async çözümlerinden herhangi birini kullanmıyorsunuz (Resque, dj, vb.)? Girl_friday, bu çözümlerden daha kolay ve daha verimli olduğu için: girl_friday Rails işleminizde çalışır ve güvenli eşzamanlılık için oyuncu modelini kullanır. Aynı süreçte çalıştığı için, ayrı bir süreç grubunu izlemeniz, ayrı bir kod tabanı dağıtmanız, bu işlemler için RAM'a yüzlerce fazla MB harcamanız gerekmez. Daha fazla ayrıntı için Ruby'deki Aktörlere girişimi görün.

İplik güvenli kod yazmanız gerekiyor. Bunu yapmak zor değil: aktör kalıbı, mesaj aldığınız ve bu mesajı işlediğiniz anlamına gelir. Uygulama kodunuzda kilit gerektiren ve kilitlenmeye neden olabilecek hiçbir paylaşılan veri yoktur. Girl_friday kapaklar altında Threads kullanıyorsa, Ruby ortamınızın Threads 'ı verimli bir şekilde yürütebildiğinden emin olmanız gerekir. Çoğu uygulama için JRuby, Rubinius 1.2 ve Ruby 1.9.2 yeterli olmalıdır. Ben zayıf iplik desteğinden dolayı Ruby 1.8'i desteklemiyorum.

Bence bu aradığınız şey.

+0

Müthiş bir şans verecektir. Belki budur. – Sid

+0

Bulduğum şey, bu konsolda çalışır, ancak geliştirme modunda uygulamada çalıştırıldığında görevi sıraya eklemez. BTW Dev modda yolcu ve apache koşuyorum. – Sid