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:
- Rozwiązywanie problemów z producenta usługi Azure Event Hubs
- Rozwiązywanie problemów z procesorem zdarzeń usługi Azure Event Hubs
- Rozwiązywanie problemów z wydajnością usługi Azure 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 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 możliwych do ponownego próbowania (czyli amqp:connection:forced
lub amqp:link:detach-forced
) biblioteki klienckie próbują ponowić operacje po tych błędach na podstawie opcji powtarzania określonych podczas instancjonowania klienta. Aby skonfigurować opcje ponawiania prób, postępuj zgodnie z przykładowym publikowania zdarzeń do 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 określonego wyjątku reprezentowanego przez wyjątek AMQP jest postępowanie zgodnie z wytycznymi dotyczącymi wyjątków w przesyłaniu komunikatów przez Event Hubs .
Znajdowanie odpowiednich informacji w komunikatach o wyjątkach
AmqpException zawiera następujące trzy pola, które opisują błąd:
- getErrorCondition: podstawowy błąd protokołu AMQP. Aby uzyskać opis błędów, zobacz dokumentację AmqpErrorCondition Enum lub OASIS AMQP 1.0 spec.
- 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:
- LinkErrorContext: błędy występujące w łączu wysyłania lub odbierania.
- SessionErrorContext: błędy występujące w sesji.
- amqpErrorContext: błędy występujące w połączeniu lub ogólny 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
AmqpException
z AmqpErrorConditionamqp:unauthorized-access
oznacza, że dostarczone poświadczenia nie umożliwiają wykonania działania (odbierania lub wysyłania) w usłudze Event Hubs. Aby rozwiązać ten problem, spróbuj wykonać następujące zadania:
- Sprawdź dokładnie, czy masz poprawne parametry połączenia. Aby uzyskać więcej informacji, zobacz Pobierz parametr połączenia Event Hubs.
- Upewnij się, że token sygnatury dostępu współdzielonego (SAS) jest generowany poprawnie. Aby uzyskać więcej informacji, zobacz Autoryzowanie dostępu do zasobów usługi Event Hubs przy użyciu sygnatur dostępu współdzielonego.
Aby uzyskać inne możliwe rozwiązania, zobacz Rozwiązywanie problemów z uwierzytelnianiem i autoryzacją w usłudze Event Hubs.
Problemy z łącznością
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:
- Sprawdź, czy parametry połączenia lub w pełni kwalifikowana nazwa domeny określone podczas tworzenia klienta są poprawne. Aby uzyskać więcej informacji, zobacz Pobieranie parametrów połączenia usługi Event Hubs.
- Sprawdź uprawnienia zapory i portu w środowisku hostingu i sprawdź, czy porty AMQP 5671 i 5762 są otwarte.
- Upewnij się, że punkt końcowy ma dostęp przez zaporę ogniową.
- Spróbuj użyć WebSocketów, które łączą się na porcie 443. Aby uzyskać więcej informacji, zobacz przykład PublishEventsWithWebSocketsAndProxy.java.
- Sprawdź, czy sieć blokuje określone adresy IP. Aby uzyskać więcej informacji, zobacz Jakie adresy IP muszę zezwolić?
- Jeśli ma to zastosowanie, sprawdź konfigurację serwera proxy. Aby uzyskać więcej informacji, zobacz przykład PublishEventsWithWebSocketsAndProxy.java.
- Aby uzyskać więcej informacji na temat rozwiązywania problemów z łącznością sieciową, zobacz Rozwiązywanie problemów z łącznością — Azure Event Hubs.
Błędy uścisku ręki 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 wynikające z wyczerpania zasobów gniazd
Aplikacje powinny dążyć do traktowania klientów usługi Event Hubs jako singletonu, tworząc i używając jednego wystąpienia przez cały czas działania 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.Closeable
, dlatego aplikacja jest odpowiedzialna za wywoływanie close()
, kiedy zakończy korzystanie z klienta.
Aby użyć tego samego połączenia AMQP podczas tworzenia wielu klientów, możesz użyć flagi EventHubClientBuilder.shareConnection()
, zachowaj odniesienie do tego EventHubClientBuilder
i utwórz nowych klientów z tego samego obiektu kreatora.
Nawiązywanie połączenia przy użyciu parametrów połączenia IoT
Ponieważ tłumaczenie parametrów połączenia wymaga wykonania zapytania względem usługi IoT Hub, biblioteka klienta usługi Event Hubs nie może jej używać bezpośrednio. W przykładzie IoTConnectionString.java opisano, jak zapytać IoT Hub, aby przekonwertować ciąg połączenia IoT na taki, który może być używany z Event Hubs.
Aby uzyskać więcej informacji, zobacz następujące artykuły:
- kontrola dostępu do usługi IoT Hub przy użyciu sygnatur dostępu współdzielonego
- Odczytuj komunikaty z urządzeń do chmury z wbudowanego punktu końcowego
Nie można dodać składników do parametrów połączenia
Starsi klienci usługi Event Hubs mogli dodawać składniki do parametrów 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 w PublishEventsWithAzureIdentity.java.
Aby uzyskać więcej informacji na temat biblioteki Azure.Identity
, zapoznaj się z naszym wpisem w blogu dotyczącym uwierzytelniania i zestawu 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 Configure logging in the Azure SDK for Java i Omówienie rozwiązywania problemów.
Oprócz włączania rejestrowania ustawienie poziomu dziennika na VERBOSE
lub DEBUG
zapewnia wgląd w stan biblioteki. W poniższych sekcjach przedstawiono przykładowe konfiguracje log4j2 i logback, w celu zmniejszenia liczby nadmiernych komunikatów po włączeniu logowania szczegółowego.
Konfigurowanie usługi Log4J 2
Aby skonfigurować usługę Log4J 2, wykonaj następujące kroki:
- Dodaj zależności w pom.xml, korzystając z tych z przykładu logowania pom.xml, w sekcji "Zależności wymagane dla Log4j2".
- Dodaj
log4j2.xml do folderusrc/main/resources.
Skonfiguruj logback
Aby skonfigurować rejestrowanie zwrotne, wykonaj następujące czynności:
- Dodaj zależności w pom.xml przy użyciu tych z przykładu rejestrowania pom.xml, w sekcji "Zależności wymagane dla logback".
- Dodaj
logback.xml do folderusrc/main/resources.
Włącz logowanie transportu 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. Proton-J Qpid używa 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 dowolne opcje 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ą środowiskową PN_TRACE_FRM=1
.
Przykładowy plik "logging.properties"
Następujący plik konfiguracji rejestruje dane wyjściowe na poziomie TRACE z 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
Zmniejszenie wycinki drzew
Jednym ze sposobów zmniejszenia logowania 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 Log4J 2 i Konfigurowanie logback.
Podczas przesyłania usterki, komunikaty dziennika z klas w następujących pakietach są przydatne:
com.azure.core.amqp.implementation
com.azure.core.amqp.implementation.handler
- Wyjątkiem jest to, że można zignorować komunikat
onDelivery
wReceiveLinkHandler
.
- Wyjątkiem jest to, że można zignorować komunikat
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, aby zgłosić problem w repozytorium Azure SDK for Java w usłudze GitHub.