2015-10-18 19 views
9

yapılandırılabilir bir zaman aralığı içinde bir Raylar isteğine cevap nasıl o neden oluyor çünküBen Zaman Aşımı modülün kullanımı olmadan benim kontrolörleri eylem aşağıdaki davranış elde etmek istiyorum

class AdminController < ApplicationController 
    def example 
    Timeout.timeout(params[:timeout].to_i) do 
     ... # try to process the request within params[:timeout] seconds 
    end 
    rescue Timeout::Error 
    render nothing: true, status: :gateway_timeout 
    end 
end 

Ben Zaman Aşımı kullanımını önlemek istiyorsanız veritabanı bağlantısı sızıntıları dahil olmak üzere benim uygulamada birçok hata. Rapor edilen diğer bazı sorunlar: http://www.mikeperham.com/2015/05/08/timeout-rubys-most-dangerous-api/

+0

Bu istekte gerçekten ne yapıyorsunuz? Zaman aşımı, daha büyük bir soruna kötü bir çözümdür - bu kodun bir kısmını önceden işleyebilir veya bir işin içine dönüştürebilir ya da bir talebi bir devlet makinesi ile birden çok aşamaya bölebilirsiniz. – court3nay

+0

@ court3nay İşlenecek 100 ms ile 30 saniye arasında sürebilecek işleri çalıştıran bir web hizmetidir. Her müşteri, istenen işler için kendi kabul edilebilir zaman aşımlarını belirtebilir. – barbolo

+0

@barbolo geçerli kodunuzda bir kusur var. Zaman aşımını bir 'başlangıç ​​'bloğunun içine sarmak en iyisi, ardından' rescue => e'. Neyi başarmaya çalışıyorsun? Sorgu çok uzun sürerse bir isteği durdurma? – onebree

cevap

4

Bunun için ruby ​​kullanmayın. Sorun, zaman aşımı modülünün kodun herhangi bir yerinde, yürütme kodunuzun herhangi bir yerinde, açık ve sarkan soketlere, bağlantılara ve dosyalara veya daha kötüye gitmesine neden olacak şekilde iptal edilmesidir. (Bu, her bir iş için dışarıdan bir komut dosyası veya bomba atıyorsanız, bu gerçekten bir sorun değil, sanırım, ama bu durumlarda sadece unix/linux native io zaman aşımını kullanın)

Bu bir hayli neden Ruby CI sunucuları asla çıkmadı (Jenkins, java). Bunu, bir API ile ping yapabileceğiniz işleri işleyen ayrı bir hizmetle tasarlarım; o zaman, görüşünüze göre, her birkaç saniyede bir ping yapın, böylece sürekli güncellemeleri görebilirler. Bu durumda raylar uygulamasının içinde herhangi bir kirletici zaman aşımı kodu olması gerekmez.

düzenleme: o blokta HTTP isteklerini yapıyoruz beri, sadece Tam için gem "rack-timeout"https://github.com/heroku/rack-timeout gereksinimi doldurmak kullanabilirsiniz

+0

Teşekkür ederiz, court3nay. Saf Ruby'de bir çözüm ile bir cevabı onaylamayı umuyorum. Bakalım ne aldım. – barbolo

+0

Bloğun içindeki kod nasıl görünüyor? – court3nay

+0

Bir web kazıyıcı gönderir. – barbolo

3

http kütüphanesinden (örn https://github.com/lostisland/faraday) yerleşik zaman aşımı ayarını kullanın. Bu size yardımcı olacaktır

# Gemfile 

gem "rack-timeout" 

# config/initializers/rack_timeout.rb 
Rack::Timeout.timeout = 5 # seconds 

Umut.

+0

Bu aslında oldukça iyi bir mücevher, ancak sorunumu çözmüyor. İstek başına zaman aşımı belirtmeme izin vermiyor. Uygulama başlatılırken belirtilen zaman aşımı için sabit bir değer bekler. – barbolo