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 błąd, często identyfikowany przez kod błędu, taki jak Internal, Unavailable lub DataLoss.

Na tej stronie znajdziesz informacje o tym, jak rozwiązywać problemy 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 dwukrotnie zarejestrować dokładnie tę samą instancję pakietu usług (nazwę i identyfikator instancji).

Rozwiązanie:

Nie próbuj rejestrować tej samej instancji pakietu usług (nazwa i identyfikator instancji) dwukrotnie.

Nie można usunąć zduplikowanego 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 none.

Przyczyna:

Metoda take_publisher została wywołana dwukrotnie dla tego samego wariantu z tej samej instancji pakietu usług.

Rozwiązanie:

Nie wywołuj metody take_publisher dwukrotnie dla tego samego wariantu z tej samej instancji pakietu usług.

Nie można utworzyć subskrybenta, obserwatora, historii ani 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ć dla wydawcy Subscriber, Observer, History lub InstantReader, 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 wydawca wyrejestruje się, gdy jego czytniki są nadal aktywne.

Metoda read_next_messages subskrybenta zwraca puste listy

Błąd:

read_next_messages kończy się powodzeniem, ale zwraca puste listy.

Przyczyna:

Wydawca został wyrejestrowany, gdy jego czytelnicy byli aktywni.

Rozwiązanie:

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

Metoda next obiektu Observer zwraca błąd wewnętrzny

Błąd:

next zwraca błąd Internal.

Przyczyna:

Wydawca został wyrejestrowany, gdy jego czytelnicy byli aktywni.

Rozwiązanie:

Użyj subskrybenta lub historii ze strumieniem dostępności. Jeśli ostatnia wiadomość strumienia dostępności jest niedostępna, oznacza to, że wydawca nie jest już dostępny i nie ma nowych wiadomości.

Funkcja read_from_history nie zwraca nowych wiadomości

Błąd:

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

Przyczyna:

Wydawca został wyrejestrowany, gdy jego czytelnicy byli aktywni.

Rozwiązanie:

Użyj subskrybenta lub historii ze strumieniem dostępności. Jeśli ostatnia wiadomość strumienia dostępności jest niedostępna, oznacza to, że wydawca nie jest już dostępny i nie ma nowych wiadomości.

InstantReader read_latest_message zwraca błąd wewnętrzny

Błąd:

read_latest_message zwraca błąd Internal.

Przyczyna:

Wydawca został wyrejestrowany, gdy jego czytelnicy byli aktywni.

Rozwiązanie:

Użyj subskrybenta lub historii ze strumieniem dostępności. Jeśli ostatnia wiadomość strumienia dostępności jest niedostępna, oznacza to, że wydawca nie jest już dostępny i nie ma nowych wiadomości.

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

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

Funkcja read_next_messages subskrybenta zwraca pustą listę

Błąd:

read_next_messages zwraca pustą listę.

Przyczyna:

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

Rozwiązanie:

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

Metoda next obiektu Observer zwraca błąd wewnętrzny

Błąd:

next zwraca błąd Internal.

Przyczyna:

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

Rozwiązanie:

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

Funkcja read_from_history nie zwraca nowych wiadomości

Błąd:

read_from_history zwraca pustą listę.

Przyczyna:

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

Rozwiązanie:

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

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ł wiadomości.

Rozwiązanie:

Użyj subskrybenta lub historii ze strumieniem dostępności. Jeśli ostatnia wiadomość strumienia 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 wydawca wysyła wiadomości szybciej, niż czytelnik może je przetworzyć.

Pierwszy odczyt subskrybenta po przepełnieniu zwraca błąd DataLoss

Błąd:

read_next_messages zwraca błąd DataLoss.

Przyczyna:

Wydawca wysyła wiadomości szybciej, niż czytelnik może je przetworzyć.

Rozwiązanie:

Możliwe rozwiązania:

  • Zwiększ bufor pierścieniowy wydawcy capacity w definicji architektury VSIDL, aby kolejka mogła przyjmować serie wiadomości, zanim subskrybent je odczyta.
  • Zwiększ częstotliwość wykorzystywania wiadomości przez subskrybenta lub zmniejsz częstotliwość wysyłania wiadomości przez wydawcę.
  • Jeśli Twoja usługa potrzebuje tylko najnowszej wartości wiadomości i nie musi przetwarzać każdej aktualizacji pośredniej, użyj InstantReader zamiast Subscriber.

Pierwsza metoda 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 może je przetworzyć.

Rozwiązanie:

Możliwe rozwiązania:

  • Wydawca publikuje rzadziej. 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 maksymalnie 1 wiadomość na delta.

  • Konsument używa obiektu InstantRead zamiast obserwatora. Obiekt InstantRead nie zwraca błędów przepełnienia i zawsze zwraca ostatnią wiadomość. Jeśli interesuje Cię tylko ostatnia wiadomość, 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) może je odczytać, możesz utworzyć nowego wydawcę (P2) i obserwatora (O2), aby dostosować różnicę w szybkości publikowania i odczytywania.

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

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

    Poniższy przykładowy kod pokazuje, jak wdrożyć 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 ++;
    }
    }
    

Odczyty historii są niekompletne

Błąd:

Wiadomość została utracona przed skopiowaniem historii. Brak bezpośredniego powiadomienia o błędzie podczas odczytu.

Przyczyna:

Wydawca wysyła wiadomości szybciej, niż czytelnik może je przetworzyć.

Rozwiązanie:

Możliwe rozwiązania:

  • Zwiększ bufor pierścieniowy wydawcy capacity w definicji architektury VSIDL, aby usługa History zachowywała wystarczającą liczbę ostatnich wiadomości na potrzeby interwału odpytywania czytnika.
  • Odczytuj z History częściej lub zmniejsz częstotliwość wysyłania wiadomości przez wydawcę.

InstantReader odczytuje tylko ostatnią wiadomość

Błąd:

Wiadomość została utracona przed skopiowaniem historii. Brak bezpośredniego powiadomienia o błędzie podczas odczytu.

Przyczyna:

Wydawca wysyła wiadomości szybciej, niż czytelnik może je przetworzyć.

Rozwiązanie:

Nie dotyczy

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

Błąd:

Wywołanie metody nie powiodło się i wystąpił błąd Unavailable.

Przyczyna:

SDV nie zna nazwy serwera i zwraca błąd 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, którego klient chce używać.

Implementacja po stronie serwera zwraca błąd SdvStatus

Błąd:

Implementacja po stronie serwera zwraca błąd SdvResult zawierający błąd SdvStatus, 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 wywołuje 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.