Rozwiązywanie problemów z interfejsem API oprogramowania pośredniczącego

Większość interfejsów API oprogramowania pośredniczącego zwraca obiekt SdvResult. W przypadku powodzenia ten obiekt zawiera oczekiwany obiekt wyniku. W przypadku niepowodzenia ten obiekt zawiera obiekt SdvStatus, który wskazuje nieoczekiwane zachowanie lub stan błędu, często identyfikowany przez kod błędu, np. Internal, Unavailable lub DataLoss.

Na tej stronie znajdziesz informacje, które pomogą Ci rozwiązać problemy związane z tymi kodami błędów.

Rozwiązywanie problemów z rejestracją i tworzeniem

Błędy rejestracji i tworzenia zwykle występują, gdy próbujesz utworzyć lub zarejestrować nieprawidłową usługę.

Nie można utworzyć drugiej usługi

Błąd:

Internal błąd.

Przyczyna:

Próbujesz zarejestrować dokładnie tę samą instancję pakietu usług (nazwę i identyfikator instancji) dwa razy.

Rozwiązanie:

Nie próbuj rejestrować dokładnie tej samej instancji pakietu usług (nazwy i identyfikatora instancji) dwa razy.

Nie można usunąć duplikatu pakietu usług

Błąd:

Status(-3, EX_ILLEGAL_ARGUMENT)

Przyczyna:

Próbujesz usunąć zduplikowany pakiet usług, który nie istnieje.

Rozwiązanie:

Nie próbuj usuwać zduplikowanego pakietu usług, który nie istnieje.

Nie można pobrać instancji wydawcy do wysyłania wiadomości

Błąd:

Wywołanie funkcji take_publisher() zwraca wartość none.

Przyczyna:

Dwukrotnie wywołałeś(-aś) funkcję take_publisher() dla tego samego wariantu z tej samej instancji pakietu usług.

Rozwiązanie:

Nie wywołuj funkcji take_publisher() 2 razy w przypadku tej samej odmiany z tej samej instancji pakietu usług.

Nie można utworzyć subskrybenta, obserwatora, historii ani czytnika InstantReader

Błąd:

Unavailable błąd.

Przyczyna:

Próbowano utworzyć Subscriber, Observer, History lub InstantReader dla wydawcy, który nie istnieje lub został wyrejestrowany.

Rozwiązanie:

Zanim spróbujesz utworzyć Subscriber, Observer, History lub InstantReader dla wydawcy, sprawdź, czy wydawca istnieje lub jest zarejestrowany.

Nie można utworzyć klienta RPC

Błąd:

Unavailable błąd

Przyczyna:

Próbowano utworzyć klienta RPC dla nazwy jednostki serwera, która nie istnieje lub nie jest zarejestrowana.

Rozwiązanie:

Przed utworzeniem klienta RPC sprawdź, czy serwer istnieje i jest zarejestrowany.

Rozwiązywanie problemów z komunikacją

Błędy komunikacji mogą wystąpić po wykonaniu usługi i rozpoczęciu komunikacji z innymi usługami.

Rozwiązywanie problemów z wyrejestrowaniem wydawcy

Błędy mogą wystąpić, gdy serwer publikujący wyrejestruje się, a jego czytniki są nadal aktywne.

Funkcja read_next_messages() subskrybenta zwraca puste listy

Błąd:

read_next_messages() się powiedzie, ale zwróci puste listy.

Przyczyna:

Wydawca zostanie wyrejestrowany, gdy jego czytelnicy będą aktywni.

Rozwiązanie:

Użyj subskrybenta lub historii ze strumieniem dostępności. Jeśli ostatnia wiadomość w strumieniu dostępności jest niedostępna, wydawca zostanie wyrejestrowany i nie będą dostępne żadne nowe wiadomości.

Metoda next() obserwatora zwraca błąd wewnętrzny

Błąd:

next() zwraca błąd Internal.

Przyczyna:

Wydawca zostanie wyrejestrowany, gdy jego czytelnicy będą aktywni.

Rozwiązanie:

Użyj subskrybenta lub historii ze strumieniem dostępności. Jeśli ostatnia wiadomość w strumieniu dostępności jest niedostępna, wydawca zniknął i nie ma nowych wiadomości.

Funkcja read_from_history() w historii nie zwraca nowych wiadomości

Błąd:

read_from_history() nie zwraca żadnych nowych wiadomości, tylko starsze.

Przyczyna:

Wydawca zostanie wyrejestrowany, gdy jego czytelnicy będą aktywni.

Rozwiązanie:

Użyj subskrybenta lub historii ze strumieniem dostępności. Jeśli ostatnia wiadomość w strumieniu dostępności jest niedostępna, wydawca zniknął i nie ma nowych wiadomości.

Funkcja InstantReader read_latest_message() zwraca błąd wewnętrzny

Błąd:

read_latest_message() zwraca błąd Internal.

Przyczyna:

Wydawca zostanie wyrejestrowany, gdy jego czytelnicy będą aktywni.

Rozwiązanie:

Użyj subskrybenta lub historii ze strumieniem dostępności. Jeśli ostatnia wiadomość w strumieniu dostępności jest niedostępna, wydawca zniknął i nie ma nowych wiadomości.

Rozwiązywanie problemów z pustą kolejką wiadomości

Błędy mogą wystąpić podczas próby odczytu z pustej kolejki wiadomości.

Funkcja read_next_messages() subskrybenta zwraca pustą listę

Błąd:

read_next_messages() zwraca pustą listę.

Przyczyna:

Wydawca jest aktywny, ale nie wysłał żadnych wiadomości.

Rozwiązanie:

Użyj subskrybenta lub historii ze strumieniem dostępności. Jeśli ostatnia wiadomość w strumieniu dostępności jest dostępna, wydawca jest aktywny i nie ma nowych wiadomości.

Metoda next() obserwatora zwraca błąd wewnętrzny

Błąd:

next() zwraca błąd Internal.

Przyczyna:

Wydawca jest aktywny, ale nie wysłał żadnych wiadomości.

Rozwiązanie:

Użyj subskrybenta lub historii ze strumieniem dostępności. Jeśli ostatnia wiadomość w strumieniu dostępności jest dostępna, wydawca jest aktywny i nie ma nowych wiadomości.

Funkcja read_from_history() w historii nie zwraca nowych wiadomości

Błąd:

read_from_history() zwraca pustą listę.

Przyczyna:

Wydawca jest aktywny, ale nie wysłał żadnych wiadomości.

Rozwiązanie:

Użyj subskrybenta lub historii ze strumieniem dostępności. Jeśli ostatnia wiadomość w strumieniu dostępności jest dostępna, wydawca jest aktywny i nie ma nowych wiadomości.

Funkcja InstantReader read_latest_message() zwraca błąd wewnętrzny

Błąd:

read_latest_message() zwraca błąd Internal.

Przyczyna:

Wydawca jest aktywny, ale nie wysłał żadnych wiadomości.

Rozwiązanie:

Użyj subskrybenta lub historii ze strumieniem dostępności. Jeśli ostatnia wiadomość w strumieniu dostępności jest dostępna, wydawca jest aktywny i nie ma nowych wiadomości.

Rozwiązywanie problemów z przepełnieniem bufora lub utratą danych

Błędy mogą wystąpić, gdy serwer publikujący wysyła wiadomości szybciej niż czytnik jest w stanie je przetwarzać.

Pierwsze odczytanie przez subskrybenta po przepełnieniu zwraca błąd DataLoss

Błąd:

read_next_message() zwraca błąd DataLoss.

Przyczyna:

Wydawca wysyła wiadomości szybciej, niż czytelnik jest w stanie je przetworzyć.

Rozwiązanie:

Pierwsze wywołanie next() obserwatora po przepełnieniu zwraca błąd DataLoss

Błąd:

next() zwraca błąd DataLoss.

Przyczyna:

Wydawca wysyła wiadomości szybciej, niż czytelnik jest w stanie je przetworzyć.

Rozwiązanie: możliwe poprawki to:

  • Wydawca publikuje z mniejszą częstotliwością. Możesz na przykład mieć zmienną z sygnaturą czasową ostatniej wiadomości. Jeśli bieżący czas jest mniejszy niż ostatni czas publikacji plus delta, nie publikujesz wiadomości. Dzięki temu mechanizmowi publikowana jest co najwyżej 1 wiadomość na zmianę.

  • Zamiast obserwatora użytkownik korzysta z obiektu InstantRead. Obiekt InstantRead nie zwraca błędów przepełnienia i zawsze zwraca ostatnią wiadomość. Jeśli zależy Ci tylko na ostatniej wiadomości, możesz użyć obiektu InstantRead zamiast obserwatora.

  • Konsument wdraża próbkowanie. Jeśli Twoje rozwiązanie ma wydawcę (P1), który publikuje wiadomości szybciej niż obserwator (O1) jest w stanie je odczytać, możesz utworzyć nowego wydawcę (P2) i obserwatora (O2), aby uwzględnić różnicę w szybkości publikowania i odczytywania.

    Załóżmy na przykład, że proces P1 publikuje wiadomość co 10 ms, ale proces O1 może odczytać tylko jedną wiadomość co 100 ms i odrzuca pozostałe 9 wiadomości. Aby rozwiązać tę rozbieżność, utwórz rozwiązanie, które będzie wykonywać te czynności:

    1. P1 publikuje wiadomości w O2.
    2. O2 odczytuje jedną wiadomość i odrzuca dziewięć.
    3. O2 wysyła do P2 jedną odczytaną wiadomość.
    4. P2 wysyła do O1 1 przeczytaną wiadomość.
    5. O1 odczytuje jedną wiadomość co 10 sekund.

    Poniższy przykładowy kod pokazuje, jak zaimplementować ten scenariusz próbkowania:

    int discarded_message = 10;
    
    while (true) {
    message m = O2.read_message();
    if discarded_message == 10 {
      discarded_message = 0;
      P2.publish(m);
    } else {
     discarded_message ++;
    }
    }
    

Historia jest niekompletna

Błąd:

Wiadomość zostanie utracona przed skopiowaniem historii. Brak bezpośredniego powiadomienia o błędzie podczas odczytywania.

Przyczyna:

Wydawca wysyła wiadomości szybciej, niż czytelnik jest w stanie je przetworzyć.

Rozwiązanie:

Instant Reader odczytuje tylko ostatnią wiadomość

Błąd:

Wiadomość zostanie utracona przed skopiowaniem historii. Brak bezpośredniego powiadomienia o błędzie podczas odczytywania.

Przyczyna:

Wydawca wysyła wiadomości szybciej, niż czytelnik jest w stanie je przetworzyć.

Rozwiązanie:

Nie dotyczy

Klient RPC wywołuje metodę, która jest niedostępna

Błąd:

Wywołanie metody kończy się niepowodzeniem z błędem Unavailable.

Przyczyna:

SDV nie zna nazwy serwera i zwraca Unavailable. Ten błąd jest zwracany przez oprogramowanie pośredniczące, jeśli wykrywanie usług nie zwraca prawidłowej nazwy serwera.

Rozwiązanie:

Uruchom pakiet usług, który definiuje server dla danego interfejsu, z którego klient chce korzystać.

Implementacja po stronie serwera zwraca błąd SdvStatus

Błąd:

Implementacja po stronie serwera zwraca obiekt SdvResult zawierający SdvStatus błąd, np. SdvStatusCode::NotFound. Błąd jest przekazywany z powrotem do klienta wywołującego.

Przyczyna:

SDV i system komunikacji między klientem a serwerem działają zgodnie z oczekiwaniami, ale klient wysłał żądanie, które spowodowało błąd na serwerze.

Rozwiązanie:

Wyślij prawidłowe żądanie za pomocą klienta lub napraw serwer, aby mógł prawidłowo odpowiadać na te żądania.