Kiedy klient Apache Kafka wyrzuca wyjątek "Batch Expired"?

Używając Apache Kafka Java client (0.9), Próbuję wysłać długą serię rekordów do brokera używając Kafka Producer class.

Asynchroniczna metoda send powraca natychmiast na jakiś czas, a następnie rozpoczyna blokowanie każdego wywołania na krótki okres czasu. Po około trzydziestu sekundach, klient zaczyna rzucać wyjątki (TimeoutException), z Komunikatem "batch expired".

Jakie okoliczności powodują, że wyjątek ten jest wyrzucony?

Author: James Thomas, 2016-01-14

6 answers

Ten wyjątek wskazuje, że kolejki rekordów są szybsze niż mogą być wysyłane.

Gdy zadzwonisz do wyślij metoda, ProducerRecord będzie przechowywany w wewnętrznym buforze do wysłania do brokera. Metoda zwraca natychmiast po buforowaniu ProducerRecord , niezależnie od tego, czy została wysłana.

Zapisy są pogrupowane w partie do wysłania do brokera, w celu ograniczenia transportu na wiadomości i zwiększyć przepustowość.

Gdy rekord jest dodawany do partii, istnieje limit czasu na wysłanie tej partii, aby upewnić się, że została wysłana w określonym czasie. Jest to kontrolowane przez parametr konfiguracyjny producenta, request.timeout.ms, domyślnie 30 sekund.

Jeśli partia została ustawiona w kolejce dłużej niż limit czasu, wyjątek zostanie wyrzucony. Rekordy w tej partii zostaną usunięte z kolejki wyślij.

Zwiększenie limitu czasu, za pomocą parametru konfiguracyjnego, pozwoli klientowi na dłuższe kolejki partii przed wygaśnięciem.

 42
Author: James Thomas,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2016-01-15 08:53:59

Mam ten wyjątek w zupełnie innym kontekście.

Skonfigurowałem mini klaster maszyny wirtualnej zookeeper, maszyny wirtualnej maklerskiej i maszyny wirtualnej producenta / konsumenta. Otworzyłem wszystkie niezbędne porty na serwerze (9092) i na zookeeperze (2181), a następnie próbowałem opublikować wiadomość od maszyny wirtualnej konsumenta/wydawcy do brokera. Dostałem wyjątek wymieniony przez OP, ale ponieważ do tej pory opublikowałem tylko jedną wiadomość (a przynajmniej próbowałem), rozwiązaniem nie mogło być zwiększenie timeoutu lub wielkość partii. Więc szukałem i znalazłem tę listę dyskusyjną opisującą podobny problem, który miałem podczas próby wykorzystania wiadomości z maszyny wirtualnej konsumenta / producenta (ClosedChannelException):http://grokbase.com/t/kafka/users/152jsjekrm/having-trouble-with-the-simplest-remote-kafka-config Ostatni post na tej liście dyskusyjnej opisuje, jak rozwiązać problem.

Krótko mówiąc, jeśli napotkasz zarówno ChannelClosedException, jak i Batch Expired wyjątek, prawdopodobnie będziesz musiał zmienić tę linię na w pliku server.config i uruchom ponownie brokera:

advertised.host.name=<broker public IP address>

Jeśli nie jest ustawiona, wraca do właściwości host.name (która prawdopodobnie również nie jest ustawiona), a następnie wraca do kanonicznej nazwy hosta klasy InetAddress Java, co w końcu nie jest oczywiście poprawne i w ten sposób dezorientuje zdalne węzły.

 27
Author: Roberto,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2016-02-12 23:38:20

Parametr kontrolujący czas przed wysłaniem do brokera to linger.ms. Jego domyślną wartością jest 0 (bez opóźnienia).

 3
Author: S. Sar,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2016-01-21 21:10:07

Używam klienta Kafka Java w wersji 0.11.0.0. Zacząłem również widzieć ten sam wzór w braku konsekwentnego tworzenia dużych wiadomości. Dla niektórych przekazów było to przemijające, a dla niektórych zawodziło. W moim przypadku rozmiar każdej wiadomości wynosił około 60KB, co jest znacznie wyższe niż domyślne batch.size Kafki wynoszące 16kB, również moje linger.ms zostało ustawione na domyślne 0. Ten błąd jest wyrzucany, ponieważ klient producenta jest wyczucie czasu, zanim będzie mógł otrzymaj pomyślną odpowiedź od serwera.Zasadniczo , w moim kodzie, to połączenie było timing out : kafkaProd.send(pr).get(). Aby to naprawić, musiałem zwiększyć domyślną wartość Klienta producenta request.timeout.ms do 60000

 2
Author: Binita Bharati,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2017-10-05 09:41:02

[[4]}miał podobny problem z Kafką działającą w docker-compose. Mój docker-compose.yml został ustawiony z

 KAFKA_ADVERTISED_HOST_NAME: kafka
 ports:
        - 9092:9092

Ale kiedy próbowałem wysłać wiadomość z camel z zewnątrz docker

to("kafka:test?brokers=localhost:9092")
/ Align = "left" / Rozwiązałem to dodając
127.0.0.1 kafka

Do pliku Windows \ System32 \ drivers \ etc \ hosts, a następnie zmiana adresu URL na

to("kafka:test?brokers=kafka:9092")
 1
Author: Rory G,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2018-05-08 12:18:37

Podczas tworzenia consumer set ConsumerConfig.ENABLE_AUTO_COMMIT_CONFIG do true.

 -3
Author: sse,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2017-10-02 15:09:53