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 producentem 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 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:forced
amqp: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:
- LinkErrorContext: błędy występujące w linku 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
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:
- Sprawdź dokładnie, czy masz poprawne parametry połączenia. Aby uzyskać więcej informacji, zobacz Get an Event Hubs parametry połączenia (Pobieranie usługi Event Hubs parametry połączenia).
- 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 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:
- Sprawdź, czy parametry połączenia lub w pełni kwalifikowana nazwa domeny określona podczas tworzenia klienta jest poprawna. Aby uzyskać więcej informacji, zobacz Get an Event Hubs parametry połączenia (Pobieranie usługi Event Hubs parametry połączenia).
- Sprawdź uprawnienia zapory i portu w środowisku hostingu i sprawdź, czy porty AMQP 5671 i 5762 są otwarte.
- Upewnij się, że punkt końcowy jest dozwolony przez zaporę.
- Spróbuj użyć obiektów WebSocket, 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 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.Closeable
programu , 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 EventHubClientBuilder
elementu 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:
- Kontrolowanie dostępu do usługi IoT Hub przy użyciu sygnatur dostępu współdzielonego
- Odczytywanie komunikatów przesyłanych z urządzeń do chmury z wbudowanego punktu końcowego
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.Identity
w 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:
- 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".
- Dodaj plik log4j2.xml do folderu src/main/resources .
Konfigurowanie logback
Aby skonfigurować rejestrowanie zwrotne, wykonaj następujące czynności:
- 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".
- 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 plikuReceiveLinkHandler
.
- Wyjątkiem jest to, że można zignorować
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.