2016-02-16 40 views
10

Harici bir API'dan yaklaşık 20.000 istek ayrıştırmak için RabbitMQ kurdum ancak birkaç dakika sonra zaman aşımıyor. Toplam 20.000 istekten yaklaşık 2000'ini doğru bir şekilde ayrıştırır.RabbitMQ hata zaman aşımı

günlük dosyası diyor ki:

=INFO REPORT==== 16-Feb-2016::17:02:50 === 
accepting AMQP connection <0.1648.0> (127.0.0.1:33091 -> 127.0.0.1:5672) 

=ERROR REPORT==== 16-Feb-2016::17:03:21 === 
closing AMQP connection <0.1648.0> (127.0.0.1:33091 -> 127.0.0.1:5672): 
{writer,send_failed,{error,timeout}} 

Zaten kalp atışı değerini artırdık ama uğrayana neden çözemiyorum. Yapılandırma şöyledir: Ubuntu 14.04, NGINX 1.8.1, RabbitMQ 3.6.0

Zaman ayırdığınız için teşekkür ederiz!

+0

burada eksik bazı ayrıntıları var gibi? Bu günlük mesajı nereden alınır? Mesajlar * * RabbitMQ’ya yayınlanırken zaman aşımına uğruyor mu? Etiketleriniz PHP'den bahsediyor, yani bize gösterebileceğiniz bazı PHP kodları var mı? – IMSoP

+0

Cevap verdiğiniz için teşekkür ederiz! Gerçekten de, PHP'de yazılan bir tüketici, harici bir API'dan bazı JSON verilerini ayrıştırıyor. Günlük mesajları ana RabbitMQ kayıt dosyasından alınmıştır: /var/log/rabbitmq/[email protected] PHP kodunun hatayla ilgili olduğunu söylemem ama bir .txt dosyasına kısa bir çıktı yazıyor. – user927901

+0

Zaman aşımını tetikleyebilecek bir şey varsa, PHP kodunuzu göndermeye (veya bir [mcve] oluşturmaya) değer olabilir. Şu anda, "bir yerde bir zaman aşımı hatası var" dışında başka bir şeye ihtiyacımız yok. Benzer şekilde, mesajların yayınlanma şekliyle ilgili herhangi bir kod (muhtemelen API'dan öğeler toplayıp Rabbit'e bir şekilde koyarak bir şey var mı?) – IMSoP

cevap

18

Python'da benzer bir sorunu çözdüm. Benim durumumda, tüketici üzerindeki ön ödeme sayısını azaltarak çözüldü, böylece alma arabelleğinde daha az sayıda iletinin sıraya konması.

Benim teorim, tüketici üzerindeki alma arabelleğinin dolması ve daha sonra RMQ'nun tüketicinin soketine başka bir mesaj yazması ve tüketicinin soketinin dolu olması nedeniyle yapamaması. Bu soket üzerindeki RMQ blokları, ve zaman aşımına uğradı ve sadece tüketici üzerindeki bağlantıyı kapatır. daha küçük bir önceden getirme sırası olması soket tampon doldurulur almaz almak demektir ve RMQ onun yazma işlemleri zaman aşımı ne de bağlantıyı kapatmaz bunu yapmaya çalışıyor ve her neyse defter tutma mesajları yazabilir.

Bu sadece bir teoridir, ancak testlerimde tutulur.

+0

Mantıksal geliyor. Bunu kesinlikle test edeceğim, teşekkürler! – user927901

+0

subChannel.basicQos (10); Tüketici önceden getirme sayısının azaltılması bu –

9

@ tul cevabı fazlasını ekleyin.

Tüketici önceden alım sayısının azaltılması, bu zaman aşımı istisnasını ortadan kaldırır.
Varsayılan önceden getirme sayısı sınırsızdır. Ne "ayrıştırmayı" yapıyor:

+0

'u ortadan kaldırır. Kod snippet'i sağladığınız için teşekkürler, bu bugün beni kurtardı –