2013-01-19 19 views
10

Yönlendirme komut dosyası için bir karşılaştırma testi yazıyorum.Yönlendirme yapmadan yöneltme URL'sinde Git

Programımı, AppStore'a yönlendiren belirli URL'leri sorgulamak için uyandırıyorum. Ancak AppStore sayfasını indirmek istemiyorum. Sadece yönlendirme URL'sini veya hatayı günlüğe kaydetmek istiyorum.

İkinci yönlendirme sorgusu olmaksızın, Sorgu URL'sine git bağlantısını nasıl anlarım?


GÜNCELLEME

Hem yanıtlarınız doğru ANCAK:

Her iki çözüm çalıştı. Ben kıyaslama yapıyorum. 10 - 500 adımlık rutin işlemlerle 1 veya daha fazla işlem gerçekleştiriyorum. URL'yi bir döngüde sorgular. Sunucum da yazılmıştır. Her saniye istek sayısını bildirir.

  • İlk çözüm: http.DefaultTransport.RoundTrip - Yavaş çalışıyor, hata veriyor. İlk 4 saniye iyi çalışıyor. 300-500 sorgu yaptıktan sonra performans saniyede 80 sorguya düşer.

Sonra saniyede 0-5 sorguya düşer ve senaryo ı kapalıdır yeniden kullanım bağlantısı tahmin

dial tcp IP:80: A connection attempt failed because the connected 
party did not properly respond after a period of time, or established 
connection failed because connected host has failed to respond. 

gibi alma hataları başlatmak queryies.

  • İkinci çözüm: CheckRedirect field sabit performansla çalışır. Bağlantıları yeniden kullanıp kullanmadığından emin değilim veya her istek için yeni bir bağlantı açar. Bir döngüdeki her istek için client oluşturuyorum. Gerçek hayatta nasıl davranacağıdır (her istek yeni bir bağlantıdır). Her sorgudan sonra bağlantıların kapatıldığından ve yeniden kullanılmadığından emin olmanın bir yolu var mı?

Bu yüzden, ikinci çözümü, sorumu yanıtlayacak şekilde işaretleyeceğim. Fakat araştırmam için her bir sorgunun yeni bir bağlantı olması çok önemlidir. İkinci çözümden nasıl emin olabilirim?

cevap

14

tamlık aşkına, bir http.Client kullanmak ve yönlendirmeleri takip edemez. http.Client'un bir işlevi olan CheckRedirect field vardır. Herhangi bir yeniden yönlendirmeyi takip etmeden önce çağrılır. Bu işlev bir hata verirse

, ardından httpClient.Do(...)değil (doFollowingRedirects() function in Go's source code bakınız) yönlendirmeyi takip edecek ve bunun yerine bir hata döndürür (onun somut tip url.Error olacak ve onun URL alan URL'ye yönlendirme-olacak Konum başlığı değeri, see this code).

Bu kullanımın somut bir örneği için gocrawl library sayfamı görebilirsiniz.

+0

Teşekkürler. Her bir talep sonrası bağlantının kapatıldığından emin olmak için mi var?Ajan başlığına dayalı olarak 1-5 dakika içinde yeniden yönlendirilmesi gereken sosyal ağdan büyük trafiği simüle etmek istiyorum. Yani her kullanıcı sadece bir kez sorgular ve yönlendirilmelidir. (bu bağlantı kapatılmalıdır) – Max

+0

Yük testi/kıyaslama aracı için özel bir istemci oluşturacağımı emin değilim. Apache Bench (ab, http://httpd.apache.org/docs/2.2/programs/ab.html) gibi bir şey kullanmanızı öneririm. – mna

+0

Biliyorum ab. Ama ben ağa gitmeyi daha iyi tanımak isterdim. Böyle bir önemsiz durum dersi çok soru var. Teşekkürler – Max

19

http.Client yerine http.Transport kullanmanız gerekir. Aktarım daha düşük düzeydedir ve yönlendirmeleri takip etmez.

req, err := http.NewRequest("GET", "http://example.com/redirectToAppStore", nil) 
// ... 
resp, err := http.DefaultTransport.RoundTrip(req) 
İlgili konular