Udostępnij za pośrednictwem


Rozwiązywanie problemów z usługą Azure Event Hubs

W tym artykule opisano techniki badania błędów, typowe błędy typów poświadczeń w bibliotece usługi Event Hubs i kroki ograniczania ryzyka w celu rozwiązania tych błędów. Oprócz ogólnych technik rozwiązywania problemów i wskazówek, które mają zastosowanie niezależnie od przypadku użycia usługi Event Hubs, w poniższych artykułach omówiono konkretne funkcje biblioteki usługi Event Hubs:

W pozostałej części tego artykułu omówiono ogólne techniki rozwiązywania problemów i wskazówki dotyczące wszystkich użytkowników biblioteki usługi Event Hubs.

Obsługa wyjątków usługi Event Hubs

Wszystkie wyjątki usługi Event Hubs są opakowane w wyjątek AmqpException. Te wyjątki często mają podstawowy kod błędu protokołu AMQP, który określa, czy należy ponowić próbę błędu. W przypadku błędów z możliwością ponawiania prób (czyli amqp:connection:forcedamqp:link:detach-forced), biblioteki klienckie próbują odzyskać z tych błędów na podstawie opcji ponawiania prób określonych podczas tworzenia wystąpienia klienta. Aby skonfigurować opcje ponawiania prób, postępuj zgodnie z przykładowymi zdarzeniami publikowania w określonej partycji. Jeśli błąd jest niemożliwy do ponawiania, występuje problem z konfiguracją, który należy rozwiązać.

Zalecanym sposobem rozwiązania konkretnego wyjątku reprezentowanego przez wyjątek AMQP jest przestrzeganie wskazówek dotyczących wyjątków obsługi komunikatów usługi Event Hubs.

Znajdowanie odpowiednich informacji w komunikatach o wyjątkach

Wyjątek AmqpException zawiera następujące trzy pola, które opisują błąd:

  • getErrorCondition: podstawowy błąd protokołu AMQP. Opis błędów można znaleźć w dokumentacji AmqpErrorCondition Enum lub specyfikacji OASIS AMQP 1.0.
  • isTransient: wartość wskazująca, czy próba wykonania tej samej operacji jest możliwa. Klienci zestawu SDK stosują zasady ponawiania próby, gdy błąd jest przejściowy.
  • getErrorContext: zawiera następujące informacje o tym, skąd pochodzi błąd protokołu AMQP:

Często spotykane wyjątki

amqp:connection:forced i amqp:link:detach-forced

Gdy połączenie z usługą Event Hubs jest bezczynne, usługa rozłącza klienta po pewnym czasie. Ten problem nie jest problemem, ponieważ klienci ponownie ustanowią połączenie po zażądaniu operacji usługi. Aby uzyskać więcej informacji, zobacz Błędy protokołu AMQP w usłudze Azure Service Bus.

Problemy z uprawnieniami

Element AmqpException z błędem AmqpErrorCondition amqp:unauthorized-access oznacza, że podane poświadczenia nie zezwalają na wykonywanie akcji (odbieranie lub wysyłanie) za pomocą usługi Event Hubs. Aby rozwiązać ten problem, spróbuj wykonać następujące zadania:

Aby uzyskać inne możliwe rozwiązania, zobacz Rozwiązywanie problemów z uwierzytelnianiem i autoryzacją w usłudze Event Hubs.

Problemy z połączeniem

Limit czasu podczas nawiązywania połączenia z usługą

Aby rozwiązać problemy z przekroczeniem limitu czasu, spróbuj wykonać następujące zadania:

Błędy uzgadniania protokołu TLS/SSL

Ten błąd może wystąpić, gdy jest używany przechwytujący serwer proxy. Aby to sprawdzić, zalecamy testowanie w środowisku hostingu z wyłączonym serwerem proxy.

Błędy wyczerpania gniazd

Aplikacje powinny preferować traktowanie klientów usługi Event Hubs jako pojedynczego, tworzenia i używania pojedynczego wystąpienia przez cały okres istnienia aplikacji. To zalecenie jest ważne, ponieważ każdy typ klienta zarządza jego połączeniem. Podczas tworzenia nowego klienta usługi Event Hubs następuje nowe połączenie protokołu AMQP, które używa gniazda. Ponadto ważne jest, aby klienci dziedziczyli z java.io.Closeableprogramu , dlatego aplikacja jest odpowiedzialna za wywołanie close() po zakończeniu korzystania z klienta.

Aby użyć tego samego połączenia AMQP podczas tworzenia wielu klientów, możesz użyć EventHubClientBuilder.shareConnection() flagi , przytrzymaj odwołanie do tego EventHubClientBuilderelementu i utwórz nowych klientów z tego samego wystąpienia konstruktora.

Połączenie przy użyciu parametry połączenia IoT

Ponieważ tłumaczenie parametry połączenia wymaga wykonania zapytań względem usługi IoT Hub, biblioteka klienta usługi Event Hubs nie może jej używać bezpośrednio. W przykładzie IoT Połączenie ionString.java opisano sposób wykonywania zapytań w usłudze IoT Hub w celu tłumaczenia parametry połączenia IoT na przykład, który może być używany z usługą Event Hubs.

Aby uzyskać więcej informacji, zobacz następujące artykuły:

Nie można dodać składników do parametry połączenia

Starsi klienci usługi Event Hubs mogli dodawać składniki do parametry połączenia pobranych z witryny Azure Portal. Starsi klienci znajdują się w pakietach com.microsoft.azure:azure-eventhubs i com.microsoft.azure:azure-eventhubs-eph. Bieżąca generacja obsługuje parametry połączenia tylko w postaci opublikowanej przez witrynę Azure Portal.

Dodaj "TransportType=AmqpWebSockets"

Aby użyć gniazd internetowych, zobacz przykład PublishEventsWithSocketsAndProxy.java .

Dodaj "Authentication=Managed Identity"

Aby uwierzytelnić się przy użyciu tożsamości zarządzanej, zobacz przykład PublishEventsWithAzureIdentity.java.

Aby uzyskać więcej informacji na temat biblioteki, zapoznaj się z wpisem Azure.Identityw blogu Authentication and the Azure SDK (Uwierzytelnianie i zestaw Azure SDK ).

Włączanie i konfigurowanie rejestrowania

Zestaw Azure SDK dla języka Java oferuje spójny scenariusz rejestrowania, który pomaga w rozwiązywaniu problemów z błędami aplikacji i pomaga przyspieszyć ich rozwiązywanie. Dzienniki utworzone przechwytują przepływ aplikacji przed dotarciem do stanu terminalu, aby ułatwić zlokalizowanie głównego problemu. Aby uzyskać wskazówki dotyczące rejestrowania, zobacz Konfigurowanie rejestrowania w zestawie Azure SDK dla języka Java i Omówienie rozwiązywania problemów.

Oprócz włączania rejestrowania należy ustawić poziom dziennika na VERBOSE lub DEBUG zapewnić wgląd w stan biblioteki. W poniższych sekcjach przedstawiono przykładowe konfiguracje log4j2 i logback, aby zmniejszyć nadmierne komunikaty po włączeniu pełnego rejestrowania.

Konfigurowanie usługi Log4J 2

Aby skonfigurować usługę Log4J 2, wykonaj następujące kroki:

  1. Dodaj zależności w pliku pom.xml przy użyciu tych z przykładowego pliku pom.xml rejestrowania w sekcji "Zależności wymagane dla usługi Log4j2".
  2. Dodaj plik log4j2.xml do folderu src/main/resources .

Konfigurowanie logback

Aby skonfigurować rejestrowanie zwrotne, wykonaj następujące czynności:

  1. Dodaj zależności w pliku pom.xml przy użyciu tych z przykładowego pliku pom.xml rejestrowania w sekcji "Zależności wymagane do powrotu dzienników".
  2. Dodaj plik logback.xml do folderu src/main/resources .

Włączanie rejestrowania transportu protokołu AMQP

Jeśli włączenie rejestrowania klienta nie wystarczy do zdiagnozowania problemów, możesz włączyć rejestrowanie w pliku w podstawowej bibliotece protokołu AMQP, Qpid Proton-J. Technologia Qpid Proton-J używa elementu java.util.logging. Rejestrowanie można włączyć, tworząc plik konfiguracji z zawartością pokazaną w następnej sekcji. Możesz też ustawić proton.trace.level=ALL i dowolną opcję konfiguracji dla implementacji java.util.logging.Handler . Aby zapoznać się z klasami implementacji i ich opcjami, zobacz Package java.util.logging w dokumentacji zestawu Java 8 SDK.

Aby śledzić ramki transportu AMQP, ustaw zmienną PN_TRACE_FRM=1 środowiskową.

Przykładowy plik "logging.properties"

Następujący plik konfiguracji rejestruje dane wyjściowe na poziomie TRACE z pliku Proton-J do pliku proton-trace.log :

handlers=java.util.logging.FileHandler
.level=OFF
proton.trace.level=ALL
java.util.logging.FileHandler.level=ALL
java.util.logging.FileHandler.pattern=proton-trace.log
java.util.logging.FileHandler.formatter=java.util.logging.SimpleFormatter
java.util.logging.SimpleFormatter.format=[%1$tF %1$tr] %3$s %4$s: %5$s %n

Zmniejszanie rejestrowania

Jednym ze sposobów zmniejszenia rejestrowania jest zmiana szczegółowości. Innym sposobem jest dodanie filtrów wykluczających dzienniki z pakietów nazw rejestratorów, takich jak com.azure.messaging.eventhubs lub com.azure.core.amqp. Aby zapoznać się z przykładami, zobacz pliki XML w sekcjach Konfigurowanie dziennika 4J 2 i Konfigurowanie logback .

Podczas przesyłania usterki komunikaty dziennika z klas w następujących pakietach są interesujące:

  • com.azure.core.amqp.implementation
  • com.azure.core.amqp.implementation.handler
    • Wyjątkiem jest to, że można zignorować onDelivery komunikat w pliku ReceiveLinkHandler.
  • com.azure.messaging.eventhubs.implementation

Następne kroki

Jeśli wskazówki dotyczące rozwiązywania problemów w tym artykule nie pomogą rozwiązać problemów podczas korzystania z bibliotek klienckich zestawu Azure SDK dla języka Java, zalecamy zgłoszenie problemuw repozytorium GitHub zestawu Azure SDK dla języka Java.