Używam producenta RabbitMQ do wysyłania długotrwałych zadań (30 minut +) do klienta. Problem polega na tym, że konsument wciąż pracuje nad zadaniem, gdy połączenie z serwerem zostanie zamknięte, a żądanie niepotwierdzone zostanie zażądane.RabbitMQ zamyka połączenie podczas przetwarzania długich zadań, a ustawienia limitu czasu powodują błędy.
Z badań Rozumiem, że albo heartbeat lub increased connection timeout może być użyte do rozwiązania tego problemu. Oba te rozwiązania powodują błędy przy próbie ich. Czytając odpowiedzi na podobne posty, dowiedziałem się, że wiele zmian zostało zaimplementowanych w RabbitMQ od momentu opublikowania odpowiedzi (np. Domyślny limit czasu pulsu zmienił się na 60 z 580 przed RabbitMQ 3.5.5).
Określając bicie serca i zablokowany limit czasu połączenia: wyświetlany jest
credentials = pika.PlainCredentials('user', 'password')
parameters = pika.ConnectionParameters('XXX.XXX.XXX.XXX', port, '/', credentials, blocked_connection_timeout=2000)
connection = pika.BlockingConnection(parameters)
channel = connection.channel()
następujący błąd:
TypeError: __init__() got an unexpected keyword argument 'blocked_connection_timeout'
Określając heartbeat_interval=1000
w związku Parametry podobny błąd jest pokazane: TypeError: __init__() got an unexpected keyword argument 'heartbeat_interval'
I podobnie dla socket_timeout = 1000
wyświetlany jest następujący błąd: TypeError: __init__() got an unexpected keyword argument 'socket_timeout'
Używam RabbitMQ 3.6.1, pika 0.10.0 i python 2.7 na Ubuntu 14.04.
- Dlaczego powyższe podejścia powodują powstawanie błędów?
- Czy można zastosować podejście pulsu w przypadku długotrwałego, ciągłego zadania? Na przykład czy można używać pulsu podczas wykonywania dużych połączeń z bazą danych, które trwają ponad 30 minut? Opowiadam się za podejściem opartym na biciu serca, ponieważ wiele razy trudno jest ocenić, jak długo potrwa zadanie takie jak dołączenie do bazy danych.
Czytałem poprzez odpowiedzi na podobne pytania
Aktualizacja: bieganie code from the pika documentation produkuje ten sam błąd.
Czy przed serwerem królika znajduje się saldo obciążenia? To, jak wygląda twoje środowisko, może być istotne przy odpowiadaniu na to pytanie. – mschuett
Maszyny producenta i konsumenta znajdują się w tej samej sieci prywatnej. – Greg
Problem polega na tym, że musisz przetwarzać dane podczas oczekiwania, nawet jeśli nie zużywasz wiadomości; connection.process_data_events(). W przeciwnym razie pika nie reaguje na bicie serca. – eandersson