미들웨어 API 실패 문제 해결

대부분의 미들웨어 API는 SdvResult 객체를 반환합니다. 성공하면 이 객체에 예상 결과 객체가 포함됩니다. 실패 시 이 객체에는 예상치 못한 동작이나 오류 상태를 나타내는 SdvStatus 객체가 포함됩니다. 오류 상태는 Internal, Unavailable, DataLoss과 같은 오류 코드로 식별되는 경우가 많습니다.

이 페이지는 이러한 오류 코드를 해결하는 데 도움이 됩니다.

등록 및 생성 실패 문제 해결

등록 및 생성 실패는 일반적으로 잘못된 서비스를 만들거나 등록하려고 할 때 발생합니다.

두 번째 서비스를 만들 수 없음

오류:

오류 Internal개가 있습니다.

원인:

정확히 동일한 서비스 번들 인스턴스 (이름 및 인스턴스 ID)를 두 번 등록하려고 하고 있습니다.

해결

정확히 동일한 서비스 번들 인스턴스 (이름 및 인스턴스 ID)를 두 번 등록하려고 시도하지 마세요.

중복 서비스 번들을 삭제할 수 없음

오류:

Status(-3, EX_ILLEGAL_ARGUMENT)

원인:

존재하지 않는 중복 서비스 번들을 삭제하려고 합니다.

해결

존재하지 않는 중복 서비스 번들을 삭제하려고 하지 마세요.

메시지 전송을 위한 게시자 인스턴스를 가져올 수 없음

오류:

take_publisher() 호출은 none를 반환합니다.

원인:

동일한 서비스 번들 인스턴스에서 동일한 변형에 대해 take_publisher()를 두 번 호출했습니다.

해결

동일한 서비스 번들 인스턴스에서 동일한 변형에 대해 take_publisher()를 두 번 호출하지 마세요.

Subscriber, Observer, History 또는 InstantReader를 만들 수 없음

오류:

오류 Unavailable개가 있습니다.

원인:

존재하지 않거나 등록이 취소된 게시자의 Subscriber, Observer, History 또는 InstantReader를 만들려고 했습니다.

해결

게시자의 Subscriber, Observer, History 또는 InstantReader를 만들기 전에 게시자가 있는지 또는 등록되어 있는지 확인하세요.

RPC 클라이언트를 만들 수 없음

오류:

Unavailable 오류

원인:

존재하지 않거나 등록되지 않은 서버 단위 이름의 RPC 클라이언트를 만들려고 했습니다.

해결

RPC 클라이언트를 만들기 전에 서버가 존재하고 등록되었는지 확인합니다.

통신 실패 문제 해결

서비스가 실행되고 다른 서비스와 통신하기 시작한 후 통신 오류가 발생할 수 있습니다.

게시자 등록 해제 문제 해결

게시자가 리더가 아직 활성 상태인 동안 등록 해제하면 오류가 발생할 수 있습니다.

구독자의 read_next_messages()가 빈 목록을 반환함

오류:

read_next_messages()는 성공하지만 빈 목록을 반환합니다.

원인:

독자가 활성 상태인 동안 게시자가 등록 취소됩니다.

해결

가용성 스트림과 함께 구독자 또는 기록을 사용합니다. 가용성 스트림의 마지막 메시지를 사용할 수 없는 경우 게시자가 등록 해제되고 새 메시지가 없습니다.

관찰자의 next()가 내부 오류를 반환함

오류:

next()에서 Internal 오류를 반환합니다.

원인:

독자가 활성 상태인 동안 게시자가 등록 취소됩니다.

해결

가용성 스트림과 함께 구독자 또는 기록을 사용합니다. 가용성 스트림의 마지막 메시지를 사용할 수 없는 경우 게시자가 사라졌으며 새 메시지가 없습니다.

기록의 read_from_history()가 새 메시지를 반환하지 않음

오류:

read_from_history()는 새 메시지를 반환하지 않고 이전 메시지만 반환합니다.

원인:

독자가 활성 상태인 동안 게시자가 등록 취소됩니다.

해결

가용성 스트림과 함께 구독자 또는 기록을 사용합니다. 가용성 스트림의 마지막 메시지를 사용할 수 없는 경우 게시자가 사라졌으며 새 메시지가 없습니다.

InstantReader read_latest_message()가 내부 오류를 반환함

오류:

read_latest_message()에서 Internal 오류를 반환합니다.

원인:

독자가 활성 상태인 동안 게시자가 등록 취소됩니다.

해결

가용성 스트림과 함께 구독자 또는 기록을 사용합니다. 가용성 스트림의 마지막 메시지를 사용할 수 없는 경우 게시자가 사라졌으며 새 메시지가 없습니다.

빈 메시지 대기열 문제 해결

빈 메시지 대기열에서 읽으려고 하면 오류가 발생할 수 있습니다.

구독자의 read_next_messages()가 빈 목록을 반환함

오류:

read_next_messages()이 빈 목록을 반환합니다.

원인:

게시자가 활성 상태이지만 메시지를 전송하지 않았습니다.

해결

재고 스트림이 있는 구독자 또는 기록을 사용합니다. 재고 스트림의 마지막 메시지를 사용할 수 있는 경우 게시자가 활성 상태이며 새 메시지가 없습니다.

관찰자의 next()가 내부 오류를 반환함

오류:

next()에서 Internal 오류를 반환합니다.

원인:

게시자가 활성 상태이지만 메시지를 전송하지 않았습니다.

해결

재고 스트림이 있는 구독자 또는 기록을 사용합니다. 재고 스트림의 마지막 메시지를 사용할 수 있는 경우 게시자가 활성 상태이며 새 메시지가 없습니다.

기록의 read_from_history()가 새 메시지를 반환하지 않음

오류:

read_from_history()이 빈 목록을 반환합니다.

원인:

게시자가 활성 상태이지만 메시지를 전송하지 않았습니다.

해결

재고 스트림이 있는 구독자 또는 기록을 사용합니다. 재고 스트림의 마지막 메시지를 사용할 수 있는 경우 게시자가 활성 상태이며 새 메시지가 없습니다.

InstantReader read_latest_message()가 내부 오류를 반환함

오류:

read_latest_message()에서 Internal 오류를 반환합니다.

원인:

게시자가 활성 상태이지만 메시지를 전송하지 않았습니다.

해결

재고 스트림이 있는 구독자 또는 기록을 사용합니다. 재고 스트림의 마지막 메시지를 사용할 수 있는 경우 게시자가 활성 상태이며 새 메시지가 없습니다.

버퍼 오버플로 또는 데이터 손실 문제 해결

게시자가 리더가 소비할 수 있는 것보다 빠른 속도로 메시지를 전송하면 오류가 발생할 수 있습니다.

오버플로 후 구독자의 첫 번째 읽기에서 DataLoss 오류가 반환됨

오류:

read_next_message()에서 DataLoss 오류를 반환합니다.

원인:

게시자가 리더가 소비할 수 있는 것보다 빠른 속도로 메시지를 전송합니다.

해결

오버플로 후 옵저버의 첫 번째 next()가 DataLoss 오류를 반환함

오류:

next()에서 DataLoss 오류를 반환합니다.

원인:

게시자가 리더가 소비할 수 있는 것보다 빠른 속도로 메시지를 전송합니다.

해결 방법: 가능한 해결 방법은 다음과 같습니다.

  • 게시자가 더 느린 속도로 게시합니다. 예를 들어 최신 메시지의 타임스탬프가 있는 변수가 있을 수 있습니다. 현재 시간이 최신 게시 시간 + 델타보다 작으면 메시지를 게시하지 않습니다. 이 메커니즘을 사용하면 델타당 최대 하나의 메시지가 게시됩니다.

  • 소비자가 관찰자 대신 InstantRead 객체를 사용합니다. InstantRead 객체는 오버플로 오류를 반환하지 않으며 항상 마지막 메시지를 반환합니다. 마지막 메시지만 중요한 경우 관찰자 대신 InstantRead 객체를 사용할 수 있습니다.

  • 소비자가 샘플링을 구현합니다. 관찰자 (O1)가 메시지를 읽을 수 있는 속도보다 더 빠르게 메시지를 게시하는 게시자 (P1)가 솔루션에 있는 경우 게시 및 읽기 속도의 차이를 수용하기 위해 새 게시자 (P2)와 관찰자 (O2)를 만들 수 있습니다.

    예를 들어 P1이 10ms마다 메시지를 게시하지만 O1은 100ms마다 하나의 메시지만 읽을 수 있고 나머지 9개 메시지는 삭제한다고 가정해 보겠습니다. 불일치를 해결하려면 다음 단계에 따라 솔루션을 만드세요.

    1. P1이 O2에 메시지를 게시합니다.
    2. O2는 메시지 하나를 읽고 9개를 삭제합니다.
    3. O2가 하나의 읽은 메시지를 P2에 전송합니다.
    4. P2가 O1에 하나의 읽음 메시지를 전송합니다.
    5. O1은 10초마다 메시지 하나를 읽습니다.

    다음 예시 코드는 이 샘플링 시나리오를 구현하는 방법을 보여줍니다.

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

기록의 읽기가 불완전함

오류:

기록 복사 전에 메시지가 손실됩니다. 읽기 시 직접 오류 알림이 없습니다.

원인:

게시자가 리더가 소비할 수 있는 것보다 빠른 속도로 메시지를 전송합니다.

해결

InstantReader가 마지막 메시지만 읽음

오류:

기록 복사 전에 메시지가 손실됩니다. 읽기 시 직접 오류 알림이 없습니다.

원인:

게시자가 리더가 소비할 수 있는 것보다 빠른 속도로 메시지를 전송합니다.

해결

해당 사항 없음

RPC 클라이언트가 메서드를 호출했지만 메서드를 사용할 수 없음

오류:

Unavailable 오류와 함께 메서드 호출이 실패합니다.

원인:

SDV는 서버 이름을 알지 못하므로 Unavailable를 반환합니다. 서비스 검색에서 유효한 서버 이름을 반환하지 않으면 이 오류가 미들웨어에 의해 반환됩니다.

해결

클라이언트가 사용하려는 지정된 인터페이스의 server를 정의하는 서비스 번들을 시작합니다.

서버 측 구현에서 SdvStatus 오류가 반환됨

오류:

서버 측 구현은 SdvStatusCode::NotFound와 같은 SdvStatus 오류가 포함된 SdvResult를 반환합니다. 오류는 호출 클라이언트에 다시 전파됩니다.

원인:

SDV와 클라이언트-서버 간 통신 시스템은 예상대로 작동하지만 클라이언트가 서버에서 오류를 트리거하는 요청을 했습니다.

해결

클라이언트로 유효한 요청을 하거나 서버를 수정하여 이러한 요청에 성공적으로 응답하세요.